nf_conntrack表满需三步处理:秒级止血(临时扩容+清理INVALID/UNREPLIED连接)、精准定位(查源IP、端口、状态分布)、长效防复发(调参+NOTRACK绕过+禁用ALG+架构优化)。

直接调大 nf_conntrack_max 参数就能扩大连接跟踪表容量,但必须同步调整哈希桶数量、缩短超时时间,并清理无效连接,否则扩容效果有限甚至引发哈希冲突加剧。
查当前状态和瓶颈
先确认是不是真满了,而不是其他限制卡住:
- 运行
cat /proc/sys/net/netfilter/nf_conntrack_count查当前已跟踪连接数 - 运行
cat /proc/sys/net/netfilter/nf_conntrack_max查当前上限值 - 对比两者:若前者接近或等于后者,且系统日志(
dmesg | grep "table full")出现nf_conntrack: table full, dropping packet,就是它了 - 别漏掉其他限制:
ulimit -n(进程级)、fs.file-max(系统级)、ip_local_port_range(客户端端口范围),实际并发上限取这四者最小值
临时扩容并快速释放空间
故障期间优先秒级恢复,不重启、不等:
- 扩大最大连接数(按内存估算:每 GB 内存 ≈ 16 万条;32GB 机器建议设为
524288):sudo sysctl -w net.netfilter.nf_conntrack_max=524288 - 同步调大哈希桶数量(推荐为
max的 1/4,避免桶链过长):sudo sysctl -w net.netfilter.nf_conntrack_buckets=131072 - 安全清理无效连接(不中断业务):
sudo conntrack -D --state INVALID,UNREPLIED
永久生效与防复发调优
改完临时值后,必须写入配置并重载,否则重启失效:
- 编辑
/etc/sysctl.conf,追加以下内容:net.netfilter.nf_conntrack_max = 524288net.netfilter.nf_conntrack_buckets = 131072net.netfilter.nf_conntrack_tcp_timeout_established = 3600(从默认 5 天缩至 1 小时)net.netfilter.nf_conntrack_tcp_timeout_time_wait = 60(建议 60–120 秒) - 执行
sudo sysctl -p加载新配置 - 对明确无需跟踪的流量绕过(如本机通信):
sudo iptables -t raw -A PREROUTING -i lo -j NOTRACKsudo iptables -t raw -A OUTPUT -o lo -j NOTRACK - 禁用无关 ALG 模块(如不用 FTP/SIP):
在/etc/modprobe.d/blacklist.conf中添加:install nf_conntrack_ftp /bin/trueinstall nf_conntrack_sip /bin/true
验证与观察
调参后不是万事大吉,要持续盯住实际效果:
- 用
conntrack -L | awk '{print $4}' | sort | uniq -c | sort -nr看连接状态分布,确认TIME_WAIT和UNREPLIED是否明显下降 - 定期检查
/proc/sys/net/netfilter/nf_conntrack_count,观察峰值是否稳定在新上限 70% 以内 - 如果仍频繁接近上限,说明有异常连接源(如爬虫、健康检查风暴),需结合
conntrack -L | awk '{print $7}' | cut -d= -f2 | sort | uniq -c | sort -nr | head -10定位源 IP 进一步治理


















