Перейти к содержимому
Калькуляторы

Настройка фаервола, 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 подскакивает и система тупит очень сильно.
Может у кого-то есть идеи как можно оптимизировать и куда можно посмотреть еще, чтобы понять что именно убивает?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Изменено пользователем Megas

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

On 7/31/2019 at 11:07 AM, Megas said:

 


reject-with icmp-port-unreachable

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.