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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

 

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

забить её.

 

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

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


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

connlimit - ограничивает кол-во одновременных конектов, оно не поможет

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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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


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

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

 

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

 

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

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


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

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

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

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


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

disappointed

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

 

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

 

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

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


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

70к это нет нагрузки, оно спокойно и при 4М живет...

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


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

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

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

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

 

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

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


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

динамически поменять кол-во бакетов в хэше можно вот так:

 

echo N > /sys/module/nf_conntrack/parameters/hashsize

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


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

Join the conversation

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

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

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

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

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

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

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