linux conntrack 表满会导致新连接拒绝、nat 失效、防火墙异常,需通过调大 nf_conntrack_max、缩短 tcp 超时、禁用无关 alg、绕过非必要跟踪等手段优化。

Linux 连接跟踪表(conntrack)满会导致新连接被拒绝、NAT 失效、防火墙规则异常,常见于高并发短连接场景。核心是合理扩大表容量、加快连接回收、减少无效跟踪。
查看当前 conntrack 状态
确认是否真满及资源占用情况:
- 查表大小和使用量:
cat /proc/sys/net/netfilter/nf_conntrack_max和cat /proc/sys/net/netfilter/nf_conntrack_count - 看实时连接分布:
conntrack -L | head -20或按协议统计:conntrack -L | awk '{print $3}' | sort | uniq -c | sort -nr - 检查丢包原因:若出现
nf_conntrack: table full, dropping packet,说明已触发丢包
调大连接跟踪表上限
默认值通常偏小(如 65536),需根据内存和业务规模调整:
- 估算公式:每条连接约占用 300–400 字节,1GB 内存可支撑约 200 万条连接
- 临时生效:
echo 1048576 > /proc/sys/net/netfilter/nf_conntrack_max - 永久生效:在
/etc/sysctl.conf中添加
net.netfilter.nf_conntrack_max = 1048576
然后运行sysctl -p
优化连接超时与回收策略
缩短非活跃连接的生存时间,加速表项释放:
- 对短连接密集的服务(如 HTTP API),降低 TCP 相关超时:
net.netfilter.nf_conntrack_tcp_timeout_established = 432000(原值通常为 432000 秒 = 5 天,可缩至 3600–36000 秒)
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120(建议 60–300 秒) - 启用连接跟踪哈希自动伸缩(内核≥4.18):
net.netfilter.nf_conntrack_hashsize = 0(设为 0 表示由内核按内存自动计算) - 避免开启不必要的协议跟踪(如不需 SIP/FTP 等 ALG):
modprobe -r nf_conntrack_sip nf_conntrack_ftp,并在/etc/modprobe.d/blacklist.conf中禁用
规避或绕过 conntrack 的场景
并非所有流量都需要连接跟踪,合理绕过可大幅减负:
- 纯路由转发且无 NAT/firewalld 规则时,可通过
iptables -t raw -A PREROUTING -j NOTRACK跳过特定流量 - Docker/Kubernetes 环境:若使用 Cilium、eBPF 替代 iptables,可关闭 conntrack(需确认网络插件支持)
- 负载均衡器后端节点:若仅作 L4 转发且不依赖 stateful 防火墙,可考虑关闭 conntrack 模块(需评估安全性影响)






























