Назад | Перейти на главную страницу

«Nf_conntrack: таблица заполнена, пакет отбрасывается», хотя nf_conntrack_count намного меньше, чем nf_conntrack_max

У меня есть узел в нашем кластере, который получает много сообщений «nf_conntrack: table full, droping packet» в системном журнале. Я проверил nf_conntrack_count, и он работал прямо с nf_conntrack_max. Заглянув в таблицу, я увидел, что большинство записей были DNS-запросами, поэтому я добавил эти правила в "исходную" таблицу netfilter.

$ sudo iptables -t raw -vnL
Chain PREROUTING (policy ACCEPT 146M packets, 19G bytes)
pkts bytes target     prot opt in     out     source               destination
33M 4144M CT         udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:53 CT notrack
33M 2805M CT         udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 CT notrack
Chain OUTPUT (policy ACCEPT 73M packets, 8311M bytes)
pkts bytes target     prot opt in     out     source               destination         
10785  882K CT         udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 CT notrack
0     0 CT         udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp spt:53 CT notrack

Это оставило счетчик около 13000 или около того, а nf_conntrack_max установлен на 65535. Однако я все еще получаю сообщения об отброшенных пакетах. Большинство остальных пакетов - UDP, и я установил nf_conntrack_udp_timeout равным 1 секунде, оставив nf_conntrack_count около 1000. Однако я все равно получаю сброшенное упакованное сообщение.

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

Я запускаю докер, и есть контейнер elasticsearch (похоже, эта проблема возникает на любом узле, на котором выполняется elasticsearch). Не уверен, актуально ли это, но у узла 48 ядер.

$ uname -a
Linux qtausc-pphd0128 3.19.0-26-generic #28~14.04.1-Ubuntu SMP Wed Aug 12 14:09:17 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Так почему же он отбрасывает пакеты, если их количество намного меньше максимального?

Некоторое время назад у меня была такая же проблема в системе Squid.

Один из наиболее эффективных способов уменьшить размер conntrack - это уменьшить тайм-аут TCP по умолчанию в ядре.

В net.netfilter.nf_conntrack_tcp_timeout_established по умолчанию установлено значение 432000. Правильно ... это 5 дней.

Чтобы установить значение, вы можете выполнить следующую команду;

sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=X

И если вы хотите, чтобы это изменение было постоянным, вам нужно добавить строку в /etc/sysctl.conf.

После снижения этого значения до 600 количество подключений неуклонно снижалось в течение нескольких дней.

Я не уверен, как вы проверили настройки count и max в таблице conntrack, но я использовал sysctl netfilter.nf_conntrack_max и sysctl net.netfilter.nf_conntrack_count чтобы получить значения.