nf_conntrack表满导致丢包需分三阶段处理:秒级止血(清理invalid/unreplied连接并临时扩容)、精准定位(查源ip、协议及状态分布)、结构化清理(notrack绕过、缩短超时、禁用alg)。

/proc/net/ip_conntrack 已在现代 Linux 内核(2.6.30+)中被 /proc/net/nf_conntrack 取代,网关瘫痪时若日志持续出现 nf_conntrack: table full, dropping packet,说明新连接首包(尤其是 SYN 或 UDP 查询)正被内核静默丢弃——不是网络不通,是连接跟踪资源耗尽。此时需立即干预,分三阶段操作:秒级止血、精准定位、结构化清理。
立刻释放空间,恢复网关转发能力
不重启、不 reload iptables,5 秒内见效:
- 清理最危险的无效条目(不中断 ESTABLISHED 连接):
sudo conntrack -D --state INVALID,UNREPLIED
这类连接常由 DNS 轮询、健康检查超时、扫描探测或后端无响应导致,单次可释放数千至上万条。 - 临时扩容上限(按内存估算:每 GB 内存 ≈ 16 万条):
例如 32GB 内存网关:sudo sysctl -w net.netfilter.nf_conntrack_max=524288sudo sysctl -w net.netfilter.nf_conntrack_buckets=131072(哈希桶设为 max 的 1/4,降低冲突) - 验证是否生效:
conntrack -C(当前用量)与cat /proc/sys/net/netfilter/nf_conntrack_max对比。
快速锁定压占源头,避免盲目扩容
表满极少因纯流量高,多由异常行为滞留连接:
- 查占用最高的源 IP(常见于爬虫、监控探针或配置错误的上游设备):
sudo conntrack -L | awk '{print $7}' | cut -d= -f2 | sort | uniq -c | sort -nr | head -5
若 IP 属于某上游网段或已知设备,直接限速或调整其重试策略。 - 看协议分布(UDP/DNS 占比 >60% 是典型信号):
sudo conntrack -L | awk '{print $1}' | sort | uniq -c | sort -nr
高 UDP 比例往往源于容器或客户端未设 DNS 超时、频繁发起 A/AAAA 查询。 - 检查状态堆积:
sudo conntrack -L | awk '{print $4}' | sort | uniq -c | sort -nr
大量UNREPLIED表示请求发出后无响应;大量TIME_WAIT则提示短连接激增且未复用。
永久性清理与绕过,从机制上减负
单纯调大数值治标不治本,必须结构性优化:
- 对明确无需跟踪的流量打上
NOTRACK标记:sudo iptables -t raw -A PREROUTING -i lo -j NOTRACK sudo iptables -t raw -A OUTPUT -o lo -j NOTRACK sudo iptables -t raw -A OUTPUT -m conntrack ! --ctstate RELATED,ESTABLISHED -j NOTRACK
最后一条让所有新建出向连接跳过跟踪,但保留已建立连接状态,不影响 NAT 和会话保持。
- 缩短关键超时时间(防止连接长期滞留):
在/etc/sysctl.conf中添加:net.netfilter.nf_conntrack_tcp_timeout_time_wait = 60net.netfilter.nf_conntrack_tcp_timeout_established = 3600net.netfilter.nf_conntrack_udp_timeout = 30(UDP 默认 30 秒,已较短,可维持) - 禁用无用 ALG 模块(如网关不处理 FTP/SIP):
echo 'install nf_conntrack_ftp /bin/true' >> /etc/modprobe.d/blacklist.confecho 'install nf_conntrack_sip /bin/true' >> /etc/modprobe.d/blacklist.conf
之后执行sudo modprobe -r nf_conntrack_ftp(临时卸载)。
不复杂但容易忽略











