nf_conntrack表满导致syn包被静默丢弃,需分三步处理:秒级止血(临时扩容+清理invalid/unreplied连接)、精准定位(查源ip、端口、状态分布)、长效防复发(调参+notrack绕过+禁用alg+架构优化)。

遇到 nf_conntrack: table full, dropping packet,说明内核连接跟踪表已满,新连接首包(尤其是SYN)被静默丢弃,表现为大量超时、502、curl失败等——这不是警告,是硬性拦截。处理需分三步:秒级止血、精准定位、长效防复发。
一、5秒内恢复业务:临时扩容 + 安全清理
别重启、别等,立刻执行:
- 临时扩大上限(推荐值按内存估算:每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
(比conntrack -F安全,不破坏 ESTABLISHED/NAT 状态)
二、快速定位根因:查连接分布与异常源头
表满很少是单纯流量大,多是连接滞留或异常行为:
- 看当前占用和峰值:
cat /proc/sys/net/netfilter/nf_conntrack_count和cat /proc/sys/net/netfilter/nf_conntrack_max - 统计连接最多的源IP(常为爬虫、健康检查风暴或攻击):
conntrack -L | awk '{print $7}' | cut -d= -f2 | sort | uniq -c | sort -nr | head -10 - 查高频端口(如DNS、HTTP短连接):
conntrack -L | grep "dport=53" | wc -l或grep "dport=80\|dport=443" - 确认是否真有大量 TIME_WAIT 或 UNREPLIED 残留:
conntrack -L | awk '{print $4}' | sort | uniq -c | sort -nr
三、防复发调优:改参数 + 绕跟踪 + 关模块
永久生效必须写入配置并重载:
- 在
/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秒) - 对明确无需跟踪的流量跳过(如本机通信、监控上报):
iptables -t raw -A PREROUTING -i lo -j NOTRACKiptables -t raw -A OUTPUT -o lo -j NOTRACK - 禁用无关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 nf_conntrack_sip
四、架构级规避(高并发场景必看)
长期靠调参治标不治本:
- 负载均衡后端节点若仅做L4转发且无状态防火墙需求,可评估关闭 conntrack(需确认网络插件支持,如 Cilium/eBPF)
- Docker/K8s环境优先使用无 conntrack 依赖的 CNI(如 Cilium),或启用
--disable-conntrack(Kube-proxy v1.22+) - 对外服务启用 HTTP Keep-Alive、gRPC 连接复用,从源头减少短连接数量
- 关键链路(如 DNS 解析)确保 NetworkPolicy 和安全组放行 53/udp,避免因策略误拦导致重试风暴











