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模块(需评估安全性影响)










