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

Защита conntrack от переполнения

Около полуночи один из клиентов флуданул на днс сервера,

по моему недосмотру его пакеты в сетку серверов влетали в conntrack таблицу браса,

чем быстро привели его в состояние полулежания.

Это я пофиксил.

 

Но, заметил одну штуку, у меня для заблоченных клиентов с серыми адресами делается нат на всякие плат. системы итд,

так вот, в этих правилах я зарезаю коннекты до 250 (да, много, но пусть),

и заметил, когда экстренно пытался блокнуть флудящего клиента, что он точно также укладывает conntrack

и с серого адреса, несмотря на выставленный лимит через connlimit.

Я вроде и понимал, что сначала пакет трассируется и только потом уходит в подсистему iptables,

но вот когда писал эти политики, в голове было только то, что 250 соединений никак не сможет быть превышено.

 

Оказалось ошибся.

 

Вопрос - как защитить conntrack от переполнения, чтобы на современных скоростях клиенты не могли так легко

забить её.

 

P.S. Таймаут для udp понизил до 5сек., и на udp_stream до 10сек. Но это слабо спасло при флуде.

Share this post


Link to post
Share on other sites

Какое кол-во записей в 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 by Tamahome

Share this post


Link to post
Share on other sites

Какое кол-во записей в conntrack было?

Рекомендации, увеличить и согласовать с объемом памяти, добавив память при необходимости.

если conntrack не нужен, то отключить его для тех направлений, которые не нужны.

Выставить таймауты, если только для редиректа нужно, то по минимуму.

Если он нужен только для редиректа при блокировке, то в RAW добавляем -j CT --notrack на все, что не требуется отслеживать.

Трэкинг и так отключён в raw почти для всего, но стояло исключение на сетку с серваками, а флуд был направлен именно на днс.

Порядка 70к записей было, вроде мало совсем, но при этом сервер вставал раком, пинг до 900мс, потери, обрывы ssh с ним.

Запросов в днс-ы летело около 11тысяч в секунду.

Таймауты - 1сек для udp не маловато? Резолвер может не успеть ответить, и обратный пакетик продропается в INPUT.

Share this post


Link to post
Share on other sites

70к записей да это вообще смешно. Увеличьте хеш conntack (параметр модуля ядра nf_conntrack) до миллиона записей и максимальное количество записей до 8 миллионов

 

P.S. это не отменяет того, что нужно делать per-subscriber лимит, но нормальный лимит это минимум 5К сессий, так что 70К всё равно смешное значение

 

P.P.S. в dmesg были записи о переполнении conntrack?

Share this post


Link to post
Share on other sites

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 гига, это чисто брас под пппое.

Может дело в скорости помещения/удаления записей в контрак?

Share this post


Link to post
Share on other sites

disappointed

Да потому что нельзя тупо увеличивать conntrack_max, нужно чтобы размер хеш-таблицы был сопоставим с conntrack_max, по дефолту размер хеш-таблицы 16К или 64К, не помню точно

 

см. hashsize тут https://wiki.archlinux.org/index.php/High_Performance_Firewall

 

Динамически у меня не менялся, только как параметр модуля ядра при загрузке модуля

Share this post


Link to post
Share on other sites

nf_conntrack_buckets стоит в 16384, попробую увеличить.

Машина тормозила так, что не снимались графики с snmpd,

и профайлер то там есть.. не додумался глянуть при ситуации.

 

Но всяко из-за conntrack, т.к. как только я поправил raw проблема сразу исчезла.

Share this post


Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.