“nf_conntrack:表已滿,丟棄資料包”,即使 nf_conntrack_count 遠小於 nf_conntrack_max

“nf_conntrack:表已滿,丟棄資料包”,即使 nf_conntrack_count 遠小於 nf_conntrack_max

我的叢集中有一個節點,它在系統日誌中收到大量「nf_conntrack:表已滿,丟棄資料包」訊息。我檢查了 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。

從這裡開始,如果我提高最大值,它將停止丟棄的資料包訊息,但是我不明白為什麼這是必要的。

我正在運行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 大小的最有效方法之一是減少核心中的預設 TCP 逾時。

net.netfilter.nf_conntrack_tcp_timeout_established預設為 432000 。沒錯……就是5天。

要設定該值,您可以發出以下命令;

sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=X

如果您希望該變更持久存在,則需要將該行新增至/etc/sysctl.conf.

將該值減少到 600 後,連續追蹤計數在幾天內穩定下降。

我使用sysctl net.netfilter.nf_conntrack_maxandsysctl net.netfilter.nf_conntrack_count來獲取值。

相關內容