nf_conntrack_count が nf_conntrack_max よりはるかに小さいにもかかわらず、「nf_conntrack: テーブルがいっぱいです。パケットをドロップします」

nf_conntrack_count が nf_conntrack_max よりはるかに小さいにもかかわらず、「nf_conntrack: テーブルがいっぱいです。パケットをドロップします」

クラスタ内に、syslog に「nf_conntrack: テーブルがいっぱい、パケットをドロップしています」というメッセージが大量に表示されるノードがあります。nf_conntrack_count をチェックしたところ、nf_conntrack_max とちょうど同じ値に達していました。テーブルを調べると、エントリのほとんどが DNS 要求であることがわかったので、これらのルールを「raw」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 のままにしています。しかし、ドロップされたパック メッセージは引き続き受信されます。

ここから最大値を上げると、ドロップされたパケット メッセージが停止しますが、それが必要な理由がわかりません。

私は docker を実行しており、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

では、カウントが最大値よりはるかに少ないのに、なぜパケットがドロップされるのでしょうか?

答え1

少し前に Squid システムで同じ問題が発生しました。

conntrack のサイズを減らすために私が見つけた最も効果的な方法の 1 つは、カーネル内のデフォルトの TCP タイムアウトを減らすことでした。

デフォルトでは 432000 に設定されていますnet.netfilter.nf_conntrack_tcp_timeout_established。そうです...5 日間です。

値を設定するには、次のコマンドを発行します。

sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=X

その変更を永続的にしたい場合は、 の行を追加する必要があります/etc/sysctl.conf

その値を 600 に減らした後、conntrack 数は数日にわたって着実に減少しました。

値を取得するためにsysctl net.netfilter.nf_conntrack_maxと を使用しました。sysctl net.netfilter.nf_conntrack_count

関連情報