我的叢集中有一個節點,它在系統日誌中收到大量「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_max
andsysctl net.netfilter.nf_conntrack_count
來獲取值。