Web訪問超時且系統日志打印:nf_conntrack: table full, dropping packet
更新時間 2023-09-04 18:09:57
最近更新時間: 2023-09-04 18:09:57
分享文章
本文介紹如何處理“訪問Web時超時且系統日志打印kernel: nf_conntrack: table full, dropping packet”故障。當您出現類似問題時可參考本文。
故障描述
客戶端訪問Web時出現超時(time out);服務端的系統日志/var/log/messages打印“kernel: nf_conntrack: table full, dropping packet”。
故障原因
iptables的connection-tracking模塊使用一部分系統內存來跟蹤表中的連接。系統日志打印的“nf_conntrack: table full, dropping packet”表明連接跟蹤表conntrack已滿,無法為新連接創建條目并記錄跟蹤,進而出現“dropping packet”丟包問題。
解決步驟
解決方案是為連接跟蹤表增加條目容量。
CentOS 6系列操作系統解決步驟
- 查看連接跟蹤表conntrack的容量參數nf_conntrack_max。執行以下命令:
sysctl net.netfilter.nf_conntrack_max - 檢查當前跟蹤的連接數參數,如果該值達到nf_conntrack_max值則會出現丟包現象。執行以下命令:
cat /proc/sys/net/netfilter/nf_conntrack_count - 增加連接跟蹤表的容量參數(以內存為64G,net.netfilter.nf_conntrack_max值2097152為例)。
- 執行以下命令,使配置即時生效。
sysctl -w net.netfilter.nf_conntrack_max=2097152 - 執行以下命令,確保系統重啟后配置仍生效。
echo "net.netfilter.nf_conntrack_max = 2097152" >> /etc/sysctl.conf - 如果conntrack表中容量顯著增加,則還應增加存儲conntrack的哈希表大小以提高效率。CentOS 6及以上版本中,計算公式是hashsize = conntrack_max/4。設置哈希大小,執行以下命令:
echo "options nf_conntrack expect_hashsize=524288 hashsize=524288" >> /etc/modprobe.conf - 重啟iptables,執行以下命令:
service iptables restart
CentOS 7系列操作系統解決步驟
- 在/etc/modprobe.d/firewalld-sysctls.conf中設置conntrack的哈希值,執行以下命令:
echo "options nf_conntrack expect_hashsize=131072 hashsize=131072" >> /etc/modprobe.d/firewalld-sysctls.conf - 重啟firewalld,執行以下命令:
systemctl restart firewalld - 確認參數修改成功,執行以下命令:
sysctl -a |grep nf_conntrack_max
其他說明
- 本文操作適用于CentOS系統,且系統已開啟主機防火墻。其他Linux系統可能存在差異。
- 本文操作涉及修改CentOS系統內核參數。在線修改內核參數可能會使內核不穩定,建議修改后重啟系統。請評估風險后再操作。
注意.net.netfilter.nf_conntrack_max并不是越高越好,通常需要根據內存大小進行設置。nf_conntrack_max計算公式(64位)為:CONNTRACK_MAX = RAMSIZE (in bytes)/16384/2。