disappointed Posted December 14, 2016 · Report post Около полуночи один из клиентов флуданул на днс сервера, по моему недосмотру его пакеты в сетку серверов влетали в conntrack таблицу браса, чем быстро привели его в состояние полулежания. Это я пофиксил. Но, заметил одну штуку, у меня для заблоченных клиентов с серыми адресами делается нат на всякие плат. системы итд, так вот, в этих правилах я зарезаю коннекты до 250 (да, много, но пусть), и заметил, когда экстренно пытался блокнуть флудящего клиента, что он точно также укладывает conntrack и с серого адреса, несмотря на выставленный лимит через connlimit. Я вроде и понимал, что сначала пакет трассируется и только потом уходит в подсистему iptables, но вот когда писал эти политики, в голове было только то, что 250 соединений никак не сможет быть превышено. Оказалось ошибся. Вопрос - как защитить conntrack от переполнения, чтобы на современных скоростях клиенты не могли так легко забить её. P.S. Таймаут для udp понизил до 5сек., и на udp_stream до 10сек. Но это слабо спасло при флуде. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
kamae1ka Posted December 14, 2016 · Report post connlimit - ограничивает кол-во одновременных конектов, оно не поможет Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Tamahome Posted December 14, 2016 (edited) · Report post Какое кол-во записей в conntrack было? Рекомендации, увеличить и согласовать с объемом памяти, добавив память при необходимости. если conntrack не нужен, то отключить его для тех направлений, которые не нужны. Выставить таймауты, если только для редиректа нужно, то по минимуму. Если он нужен только для редиректа при блокировке, то в RAW добавляем -j CT --notrack на все, что не требуется отслеживать. К примеру такой конфиг давно работает стабильно: (не претендует на истину, но работает стабильно) ppsabove - служит для логирования флудеров и передачу на обработку группе мониторинга, как правило это участники ботнетов. # iptables-save # Generated by iptables-save v1.4.21 on *nat :PREROUTING ACCEPT [249412:20623343] :INPUT ACCEPT [272:64779] :OUTPUT ACCEPT [926998:472205904] :POSTROUTING ACCEPT [2228038:547820795] :nat_auth_redir - [0:0] :nat_blk_redir - [0:0] -A PREROUTING -m mark --mark 0x8 -j nat_blk_redir -A PREROUTING -m mark --mark 0x7 -j nat_auth_redir -A nat_auth_redir -m set --match-set services dst,dst -j ACCEPT -A nat_auth_redir -p tcp -m tcp --dport 80 -j DNAT --to-destination #REDIRECTOR_IP#:81 -A nat_auth_redir -p tcp -m tcp --dport 443 -j DNAT --to-destination #REDIRECTOR_IP#:82 -A nat_blk_redir -p tcp -m tcp --dport 80 -j DNAT --to-destination #REDIRECTOR_IP#:88 -A nat_blk_redir -p tcp -m tcp --dport 443 -j DNAT --to-destination #REDIRECTOR_IP#:89 COMMIT # Completed on # Generated by iptables-save v1.4.21 *raw :PREROUTING ACCEPT [2452265:294154280] :OUTPUT ACCEPT [11767797:15383899167] :authorized - [0:0] :authorized_blk - [0:0] :authorized_chk - [0:0] :backtraffic - [0:0] :bblk - [0:0] :ppsabove - [0:0] :telephony - [0:0] -A PREROUTING ! -p tcp -j CT --notrack -A PREROUTING -i eth0 -j backtraffic -A PREROUTING -m hashlimit --hashlimit-above 10000/sec --hashlimit-burst 500 --hashlimit-mode srcip --hashlimit-name ppslimit -j ppsabove -A PREROUTING -j authorized_chk -A PREROUTING -j MARK --set-xmark 0x3/0xffffffff -A PREROUTING -p tcp -m multiport --dports 80,443 -j MARK --set-xmark 0x7/0xffffffff -A authorized -j MARK --set-xmark 0x1/0xffffffff -A authorized -m set --match-set bblocked src -j bblk -A authorized -j CT --notrack -A authorized -j ACCEPT -A authorized_chk -m set --match-set auth_172 src,src -j authorized -A authorized_chk -m set --match-set auth_89 src,src -j authorized -A authorized_chk -m set --match-set auth_95 src,src -j authorized -A authorized_chk -m set --match-set auth_78 src,src -j authorized -A authorized_chk -m set --match-set auth_185 src,src -j authorized -A authorized_chk -m set --match-set auth_100 src,src -j authorized -A authorized_chk -m set --match-set auth_192 src,src -j authorized -A authorized_chk -m set --match-set auth_98 src,src -j telephony -A backtraffic ! -s #REDIRECTOR_IP#/32 -j CT --notrack -A backtraffic -j ACCEPT -A bblk -j MARK --set-xmark 0x4/0xffffffff -A bblk -p tcp -m multiport --dports 80,443 -j MARK --set-xmark 0x8/0xffffffff -A bblk -m set --match-set exceptions dst,dst -j MARK --set-xmark 0x2/0xffffffff -A bblk -m set --match-set voip dst -j MARK --set-xmark 0x2/0xffffffff -A bblk -j ACCEPT -A ppsabove -m limit --limit 1/sec -j LOG --log-prefix "PPSABOVE: " -A ppsabove -j DROP -A telephony -m set ! --match-set voip dst -j DROP -A telephony -j MARK --set-xmark 0x5/0xffffffff -A telephony -j CT --notrack -A telephony -j ACCEPT COMMIT # Completed on Wed Dec 14 11:17:46 2016 # Generated by iptables-save v1.4.21 on Wed Dec 14 11:17:46 2016 *mangle :PREROUTING ACCEPT [11150691435:11339532477748] :INPUT ACCEPT [2558368:344200303] :FORWARD ACCEPT [11146894520:11339108854065] :OUTPUT ACCEPT [11768210:15383978649] :POSTROUTING ACCEPT [11158036355:11354446685686] COMMIT # Completed on Wed Dec 14 11:17:46 2016 # Generated by iptables-save v1.4.21 on Wed Dec 14 11:17:46 2016 *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [11767819:15383904123] :mgmt_check - [0:0] :netflow - [0:0] :outchk - [0:0] :wtf - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -j mgmt_check -A FORWARD -o mgmt -j DROP -A FORWARD -i eth0 -j outchk -A FORWARD -m mark --mark 0x1 -j netflow -A FORWARD -m mark --mark 0x2 -j netflow -A FORWARD -m mark --mark 0x7 -j netflow -A FORWARD -m mark --mark 0x8 -j netflow -A FORWARD -m mark --mark 0x5 -j netflow -A FORWARD -m mark --mark 0x3 -j wtf -A FORWARD -m mark --mark 0x4 -j DROP -A FORWARD -j DROP -A mgmt_check -p icmp -j ACCEPT -A mgmt_check -m set --match-set mgmt src -j ACCEPT -A mgmt_check -m state --state RELATED,ESTABLISHED -j ACCEPT -A mgmt_check -j DROP -A netflow -j NETFLOW -A netflow -j ACCEPT -A outchk -m set --match-set backauth dst -j netflow -A outchk -m set --match-set services src,src -j netflow -A outchk -m set --match-set exceptions src,src -j netflow -A outchk -m set --match-set voip src -j netflow -A outchk -j DROP -A wtf ! -s 100.99.0.0/16 -m hashlimit --hashlimit-upto 1/min --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-name nlograd -j NFLOG --nflog-group 1 -A wtf -m set --match-set services dst,dst -j netflow -A wtf ! -s 100.99.0.0/16 -p tcp -j REJECT --reject-with tcp-reset -A wtf ! -s 100.99.0.0/16 -p icmp -j REJECT --reject-with icmp-net-prohibited -A wtf ! -s 100.99.0.0/16 -j DROP -A wtf -j REJECT --reject-with icmp-net-prohibited COMMIT # Completed on ## conntrack net.netfilter.nf_conntrack_acct = 0 net.netfilter.nf_conntrack_expect_max = 256 net.netfilter.nf_conntrack_generic_timeout = 60 net.netfilter.nf_conntrack_helper = 0 net.netfilter.nf_conntrack_icmp_timeout = 2 net.netfilter.nf_conntrack_max = 65536 net.netfilter.nf_conntrack_tcp_max_retrans = 3 net.netfilter.nf_conntrack_tcp_timeout_close = 5 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10 net.netfilter.nf_conntrack_tcp_timeout_established = 600 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 10 net.netfilter.nf_conntrack_tcp_timeout_last_ack = 10 net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 30 net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 10 net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 15 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10 net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 3 net.netfilter.nf_conntrack_udp_timeout = 1 net.netfilter.nf_conntrack_udp_timeout_stream = 2 Edited December 14, 2016 by Tamahome Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted December 14, 2016 · Report post Какое кол-во записей в conntrack было? Рекомендации, увеличить и согласовать с объемом памяти, добавив память при необходимости. если conntrack не нужен, то отключить его для тех направлений, которые не нужны. Выставить таймауты, если только для редиректа нужно, то по минимуму. Если он нужен только для редиректа при блокировке, то в RAW добавляем -j CT --notrack на все, что не требуется отслеживать. Трэкинг и так отключён в raw почти для всего, но стояло исключение на сетку с серваками, а флуд был направлен именно на днс. Порядка 70к записей было, вроде мало совсем, но при этом сервер вставал раком, пинг до 900мс, потери, обрывы ssh с ним. Запросов в днс-ы летело около 11тысяч в секунду. Таймауты - 1сек для udp не маловато? Резолвер может не успеть ответить, и обратный пакетик продропается в INPUT. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
s.lobanov Posted December 14, 2016 · Report post 70к записей да это вообще смешно. Увеличьте хеш conntack (параметр модуля ядра nf_conntrack) до миллиона записей и максимальное количество записей до 8 миллионов P.S. это не отменяет того, что нужно делать per-subscriber лимит, но нормальный лимит это минимум 5К сессий, так что 70К всё равно смешное значение P.P.S. в dmesg были записи о переполнении conntrack? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted December 14, 2016 · Report post 70к записей да это вообще смешно. Увеличьте хеш conntack (параметр модуля ядра nf_conntrack) до миллиона записей и максимальное количество записей до 8 миллионов P.S. это не отменяет того, что нужно делать per-subscriber лимит, но нормальный лимит это минимум 5К сессий, так что 70К всё равно смешное значение P.P.S. в dmesg были записи о переполнении conntrack? table full были, я сразу увеличил conntrack_max, но не помогло, всё равно был эффект укладывания сервера, сам не понимаю почему, ядро 3.2.0, 4 ядерник, памяти правда 2 гига, это чисто брас под пппое. Может дело в скорости помещения/удаления записей в контрак? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
s.lobanov Posted December 14, 2016 · Report post disappointed Да потому что нельзя тупо увеличивать conntrack_max, нужно чтобы размер хеш-таблицы был сопоставим с conntrack_max, по дефолту размер хеш-таблицы 16К или 64К, не помню точно см. hashsize тут https://wiki.archlinux.org/index.php/High_Performance_Firewall Динамически у меня не менялся, только как параметр модуля ядра при загрузке модуля Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Tamahome Posted December 14, 2016 · Report post 70к это нет нагрузки, оно спокойно и при 4М живет... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted December 14, 2016 · Report post nf_conntrack_buckets стоит в 16384, попробую увеличить. Машина тормозила так, что не снимались графики с snmpd, и профайлер то там есть.. не додумался глянуть при ситуации. Но всяко из-за conntrack, т.к. как только я поправил raw проблема сразу исчезла. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
kisa Posted December 14, 2016 · Report post динамически поменять кол-во бакетов в хэше можно вот так: echo N > /sys/module/nf_conntrack/parameters/hashsize Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...