伺服器 CPU、記憶體、磁碟 IO 均正常,但網站訪問極慢或連線逾時。/var/log/messages 反覆出現:
kernel: ip_conntrack table full dropping packet
ip_conntrack 模組在記憶體中維護連線追蹤表,每條連線佔用一個條目。正常情況下,連線關閉時雙方交換 FIN/RST 封包,條目即被釋放。但遭遇 SYN Flood 攻擊、路由環路、網卡故障 導致 RST 封包丟失,條目無法老化釋放,逐漸填滿表空間,新連線被丟包。
cat /proc/sys/net/ipv4/ip_conntrack_max
cat /proc/sys/net/ipv4/ip_conntrack_count
編輯 /etc/sysctl.conf:
# 連線追蹤表最大條目數 (預設 65536,建議 2^20 = 1048576)
net.ipv4.ip_conntrack_max = 1048576
# 哈希桶大小 = ip_conntrack_max / 8 (i386 架構)
net.ipv4.ip_conntrack_buckets = 131072
套用:sysctl -p
編輯 /etc/modprobe.conf (或 /etc/modprobe.d/ip_conntrack.conf):
options ip_conntrack hashsize=131072
重啟 iptables 使模組重載:
service iptables restart
驗證 dmesg | grep conntrack 確認新參數生效。
每條目約 300-400 Bytes。1048576 條目約需 300-400 MB 記憶體,請依實體 RAM 調整,避免 OOM。
# 立即清空表 (會斷開所有現有連線,極度謹慎)
echo 1 > /proc/sys/net/ipv4/ip_conntrack_flush