快速止血需先清空连接表或清理异常条目,并临时扩大nf_conntrack_max;精准定位要分析协议分布、高频源IP及idle连接;长效减压须缩短超时、禁用非必要ALG、绕过无需跟踪流量;高并发加固需匹配hashsize、限制kube-proxy单核连接数并防止模块被卸载。

快速止血:清空与临时扩容
生产环境出现 nf_conntrack: table full, dropping packet 时,新连接被内核静默丢弃,业务已受影响。优先恢复通信:
- 用
sudo conntrack -F清空全部连接记录(注意:会中断所有 NAT 和依赖状态的规则,如 SNAT/DNAT、--state ESTABLISHED规则) - 更稳妥的做法是清理异常条目:
sudo conntrack -D --state INVALID或按端口清理:sudo conntrack -D -p tcp --dport 8080 - 立即临时扩大上限防二次满:
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576(1GB内存约支撑200万条,按实际内存线性估算) - 执行后验证:
conntrack -C查当前用量,cat /proc/sys/net/netfilter/nf_conntrack_max确认是否生效
精准定位:查清连接堆积源头
盲目调大上限只是掩耳盗铃。必须知道哪些连接在“占坑不走”:
- 看协议分布:
conntrack -L | awk '{print $3}' | sort | uniq -c | sort -nr,重点关注tcp、udp占比是否失衡 - 查高频源IP:
conntrack -L | awk '{print $6}' | cut -d= -f2 | sort | uniq -c | sort -nr | head -10 - 识别长时 idle 连接:
conntrack -L | grep "timeout=" | awk '{print $NF}' | sort -n | tail -10,若大量超 3600 秒,说明 established 超时过长 - 检查是否误跟踪非必要流量(如纯路由转发、健康探针包),这些本不该进 conntrack 表
长效减压:缩超时 + 减跟踪 + 控入口
真正降低压力靠三类协同动作,而非单点扩容:
-
缩短关键超时:将默认 5 天的 established 超时大幅下调,例如设为
net.netfilter.nf_conntrack_tcp_timeout_established = 3600(1 小时);time_wait 缩至60秒;fin_wait 设为30秒 -
禁用非必要 ALG 和协议跟踪:若不用 SIP/FTP/TFTP,卸载对应模块:
sudo modprobe -r nf_conntrack_sip nf_conntrack_ftp,并在/etc/modprobe.d/blacklist.conf中禁用 -
绕过无需跟踪的流量:对后端健康检查、内部服务通信等固定流量,在 raw 表跳过跟踪:
iptables -t raw -A PREROUTING -s 10.0.0.0/8 -j NOTRACK
高并发加固:哈希结构与容器适配
仅调 nf_conntrack_max 不够,底层哈希桶(hashsize)必须匹配,否则性能反而下降:
- 设置哈希桶大小为 2 的幂,建议从
131072起步:echo 'options nf_conntrack hashsize=131072' > /etc/modprobe.d/iptables.conf - 重启模块生效:
modprobe -r nf_conntrack && modprobe nf_conntrack(注意:sysctl -p不重载该参数) - Kubernetes 场景下,kube-proxy 需限制单核承载量:
--conntrack-max-per-core=131072,避免单个 Pod 打爆整机表 - 确认
nf_conntrack模块不被 init 脚本强制卸载(如 CentOS 的 iptables service),移除nf_conntrack从NF_MODULES_COMMON列表中











