高并发下 nf_conntrack 表耗尽会引发内核丢包、oom;需通过 /proc/sys/net/netfilter/nf_conntrack_count、slabinfo、meminfo 等指标确认内存危机,并用 notrack、调参、ebpf 等手段分级止血与根治。

高并发下 iptables 连接跟踪表(nf_conntrack)耗尽,直接引发内核丢包、连接失败,严重时还会触发系统级 OOM ——不是应用层内存溢出,而是内核 slab 分配器(如 kmalloc-64)持续膨胀,挤占可用内存,最终触发 oom_killer 杀死关键进程。这不是配置疏忽,而是高流量场景下内核资源与规则设计不匹配的必然结果。
确认 conntrack 表是否真满且正在拖垮内存
别只看日志刷屏“nf_conntrack: table full, dropping packet”,要验证它是否已演变为内存危机:
- 实时查表使用率:
cat /proc/sys/net/netfilter/nf_conntrack_count对比/proc/sys/net/netfilter/nf_conntrack_max,超过 90% 就危险 - 盯紧 slab 内存:
grep "kmalloc-64" /proc/slabinfo,若第二列(active_objs)持续上涨且远高于第三列(num_objs),说明连接跟踪对象分配后未及时释放,存在泄漏倾向 - 检查内存压力:
free -h和cat /proc/meminfo | grep -E "(MemFree|SReclaimable|Slab)",若Slab占用突增、MemFree锐减,OOM 风险已迫在眉睫 - 确认丢包源头:
iptables -L -v -n -t raw | grep -i "CT\|NOTRACK",看是否有大量连接被强制进入 conntrack(比如漏掉了-j NOTRACK)
立即止血:绕过或收缩 conntrack 负担
生产环境不能等调参生效,需快速切断 conntrack 的恶性循环:
- 对明确不需要状态跟踪的流量,加
NOTRACK规则到raw表最前:iptables -t raw -I PREROUTING -p tcp --dport 80 -j NOTRACK(适用于透传型反向代理、CDN 回源等) - 停用无实际防护意义的
state匹配:iptables -D INPUT -m state --state INVALID -j DROP等规则,改用更轻量的connlimit或五元组精确匹配 - 临时关闭 conntrack 模块(仅限测试/边缘节点):
modprobe -r nf_conntrack_ipv4 nf_conntrack(注意:会同时卸载依赖模块如ipt_MASQUERADE,慎用于 NAT 场景) - 若使用了
-m connlimit限速规则(尤其 UDP),立即删除——该模块在 kernel 5.10+ 特定版本中已被证实会引发kmalloc-64持续增长,且无法自动回收
根治调优:从参数、协议、架构三端协同
单靠调大 nf_conntrack_max 是饮鸩止渴,必须配合连接生命周期管理:
- 精准调参:
echo 131072 > /proc/sys/net/netfilter/nf_conntrack_max(建议设为预期峰值连接数的 1.5 倍),同时缩短超时:echo 30 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established(从默认 432000 秒压到 30 秒,适用于短连接服务) - 强制连接复用:后端服务(如 Nginx、Envoy)开启
keepalive,客户端走 HTTP/1.1 +Connection: keep-alive或 HTTP/2,大幅降低新建连接频率 - 分离连接跟踪路径:将负载均衡器(如 LVS、IPVS)置于前端,用 DR/TUN 模式转发,让真实服务器跳过 conntrack;或改用 eBPF 替代 iptables(如 Cilium),完全绕过 netfilter 状态跟踪开销
- 清理陈旧条目:
conntrack -F清空全表(慎用),或定期执行conntrack -D --src-nat 192.168.0.0/16清理特定网段残留连接
长期规避:用更现代的机制替代传统 iptables 状态防火墙
conntrack 是为有状态 NAT 设计的,不是为百万级短连接优化的。生产级高并发系统应逐步迁移:
- 用
ipset替代海量 IP 规则:ipset create blacklist hash:ip+iptables -A INPUT -m set --match-set blacklist src -j DROP,性能提升一个数量级 - 接入 eBPF 工具链:用
bpftool查看 map 使用,用tc+ eBPF 实现无状态限速、DDoS 过滤,彻底摆脱 conntrack 锁竞争 - 容器平台统一纳管:Kubernetes 中启用
ConntrackMaxPerCore并设合理上限,禁用NodePort的 conntrack(通过externalTrafficPolicy: Local) - 核心服务去 iptables 化:API 网关、微服务 Sidecar 直接处理 ACL 和限流,主机层 iptables 只保留基础安全策略(如禁止非 22/443 入向)










