Jump to content
Калькуляторы

Настройка фаервола, REJECT убивает процессор.

Всем привет, похоже без вашей помощи уже никак.

Есть обычный firewall на iptables и aws linux 2, все как обычно.
Набор правил в таблице forward в обще минимальный.
 

Chain INPUT (policy ACCEPT 9174 packets, 4435K bytes)
 pkts bytes target     prot opt in     out     source               destination
2498K  728M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
  11M 1049M ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 /* fw_input_dns_udp */
    3   180 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53 /* fw_input_dns_tcp */
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9100
   14   840 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
  74M  110G ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.43.64.2           tcp dpt:53 /* fw_forward_to_vpc_dns_tcp */
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            10.43.64.2           udp dpt:53 /* fw_forward_to_vpc_dns_udp */
   14  1098 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
65455 3827K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 match-set asubnets dst /* fw_forward_to_aws_subnets_80 */
 5723  340K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 match-set asubnets dst /* fw_forward_to_aws_subnets_443 */
5211K  313M FILTER     all  --  *      *       0.0.0.0/0            0.0.0.0/0
1423K   86M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 11M packets, 3390M bytes)
 pkts bytes target     prot opt in     out     source               destination
 111K 9497K ACCEPT     udp  --  *      eth0    0.0.0.0/0            10.43.64.2           udp dpt:53 /* fw_output_to_vpc_dns_udp_eth0 */
    0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            10.43.64.2           tcp dpt:53 /* fw_output_to_vpc_dns_tcp_eth0 */
    0     0 ACCEPT     udp  --  *      eth1    0.0.0.0/0            10.43.64.2           udp dpt:53 /* fw_output_to_vpc_dns_udp_eth1 */
    0     0 ACCEPT     tcp  --  *      eth1    0.0.0.0/0            10.43.64.2           tcp dpt:53 /* fw_output_to_vpc_dns_tcp_eth1 */

Chain FILTER (1 references)
 pkts bytes target     prot opt in     out     source               destination
1423K   86M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            match-set passtraffic dst,dst
3540K  212M LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 6 prefix "[passtraffic] rejected:"
3540K  212M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* fw_dnsfilter_reject */ reject-with icmp-port-unreachable

 

Проблема возникет в правиле REJECT, 4к входящих пакетов неразрешенные сети приводит CPU idle к 40 процентам,   10к убивает ядра по SoftIRQ.
сейчас используются r5.4xlarge (127gb mem, 16core), уже пробовал разные типы инстансов, в линейке C5 которая у  AWS на KVM, сразу убивает проц процессом: softirqd
 

Понимаю что использовать REJECT очень плохо, но увы, без него просто нельзя.
Систему уже крутил, вот текущие параметры:

 

fs.file-max=2097152
net.core.netdev_max_backlog=65536
net.core.rmem_default = 31457280
net.core.rmem_max = 12582912
net.core.somaxconn=32768
net.core.wmem_default = 31457280
net.core.wmem_max = 12582912
net.ipv4.conf.all.route_localnet=1
net.ipv4.conf.all.rp_filter=2
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.route_localnet=1
net.ipv4.conf.default.rp_filter=2
net.ipv4.conf.default.send_redirects=0
net.ipv4.ip_forward=1
net.ipv4.ip_local_port_range=10240 65535
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_rmem = 16384 87380 16777216
net.ipv4.tcp_sack=0
net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_wmem = 16384 65536 16777216
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384
net.netfilter.nf_conntrack_buckets=262144
net.netfilter.nf_conntrack_generic_timeout=120
net.netfilter.nf_conntrack_max=1048576
net.netfilter.nf_conntrack_tcp_loose=0
net.netfilter.nf_conntrack_tcp_timeout_established=54000
vm.min_free_kbytes=104857

additional
sysctl net.ipv4.tcp_fin_timeout=15
sysctl net.ipv4.tcp_synack_retries=1
sysctl net.ipv4.tcp_syn_retries=1
sysctl net.ipv4.tcp_syncookies=1
sysctl net.core.somaxconn=60000
sysctl net.ipv4.tcp_fin_timeout=15

 

Трафик проходит совсем небольшой, около 10-150мегабит постоянной загрузки, но как только приходит большое количество пакетов которые попадают в REJECT, загрузка CPU подскакивает и система тупит очень сильно.
Может у кого-то есть идеи как можно оптимизировать и куда можно посмотреть еще, чтобы понять что именно убивает?

 

Share this post


Link to post
Share on other sites

dns_amplification замучал? :) откуда ж столько пакетов то c внутряны на DNS?

Share this post


Link to post
Share on other sites

Сделайте per-IP ratelimit, пока он не превышен, отправляйте reject, как превышен - DROP

Share this post


Link to post
Share on other sites
7 hours ago, Megas said:

Понимаю что использовать REJECT очень плохо, но увы, без него просто нельзя.

1) А почему нельзя? REJECT это помогать себя DDoS'ить, просто делайте DROP.

2) вы уверены что проблема именно в REJECT, а не в LOG перед ним, которое каждый пакетик старательно пишет в логи? Убрать это и посмотреть стало ли лучше.

3) если всё же правда в REJECT, попробуйте вместо него перейти на -t raw -I PREROUTING -m set ! --match-set ...  -j DROP

Share this post


Link to post
Share on other sites

Это ENI от AWS с последней версией драйвера

 

Можно попробовать log сделать лимит на количество записей и проанализировать, в ближайшие пару дней попробую все.

Edited by Megas

Share this post


Link to post
Share on other sites

Простите, а конечная задача какая ?

 

Share this post


Link to post
Share on other sites
On 7/31/2019 at 11:07 AM, Megas said:

 


reject-with icmp-port-unreachable

 

На _КАЖДЫЙ_ отвергнутый пакет система генерирует свой ICMP пакет отправителю, увеличивая тем самым зло во вселенной. Потому как вовсе не факт что исходный пакет был реально отправлен тем, кому полетел ваш ICMP.

Share this post


Link to post
Share on other sites

ТС наверное понимает разницу между дропом и режектом. Пишет же, что задача специфичная, какая не говорит)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now