Linux 出现 “nf_conntrack: table full, dropping packet” 如何秒级缓解并永久调优

10次阅读

立即缓解需动态调大nf_conntrack_max并同步调整nf_conntrack_buckets,比例建议1:4;永久生效须写入sysctl.conf并执行sysctl -p;根因需排查连接泄漏或攻击,而非仅扩容。

Linux 出现 “nf_conntrack: table full, dropping packet” 如何秒级缓解并永久调优配置文件

临时设置在 reboot 或模块重载后失效。永久生效需两步落盘:

  • 编辑 /etc/sysctl.conf,追加两行(示例值适配中等负载):
    .net.netfilter.nf_conntrack_max = 131072
    net.netfilter.nf_conntrack_buckets = 32768
  • 运行 sysctl -p 加载,验证是否生效
  • ⚠️ 关键细节:某些发行版(如 centos 7+、ubuntu 20.04+)使用 systemd-sysctl,需确保 /etc/sysctl.d/ 下无同名参数覆盖(例如 99-sysctl.conf 优先级高于 sysctl.conf
  • 如果使用容器(docker/podman),宿主机参数生效,但容器内默认不加载 conntrack 模块;kubernetes 节点需在 kubelet 启动前完成 sysctl 配置

根因排查:不是所有“表满”都该盲目扩容

持续触发该告警,往往说明存在连接泄漏、扫描攻击或协议异常,扩容只是止痛,不是治病:

  • 查当前连接数:cat /proc/sys/net/netfilter/nf_conntrack_count(实时值),对比 nf_conntrack_max 判断饱和度
  • 看连接分布:conntrack -L | awk '{print $5}' | sort | uniq -c | sort -nr | head -10(快速识别高频 src/dst 或状态)
  • 典型隐患:TIME_WaiT 连接长期不回收(可能因未启用 net.ipv4.tcp_tw_reuse)、udp 碎片洪泛、大量短连接 + 防火墙规则含 ctstate INVALID 导致无效连接滞留
  • 若发现某 IP 占用数千连接且状态多为 UNREPLIED,大概率是端口扫描或 UDP 反射攻击,应结合 iptables -A input -s x.x.x.x -j DROP 临时封禁

高级调优:减少 conntrack 开销,而非一味大小

对高并发小包场景(如 API 网关、LB),单纯扩表会增加内存与 CPU 开销(每个 conntrack 条目约 300–400 字节),更优策略是精简跟踪范围:

  • 对明确不需要连接跟踪的流量,跳过 nf_conntrack:在 raw 表中插入规则,例如
    iptables -t raw -A PREROUTING -p tcp --dport 8080 -j NOTRACK
    iptables -t raw -A OUTPUT -p tcp --sport 8080 -j NOTRACK
  • 关闭非必要协议跟踪:modprobe -r nf_conntrack_ftp nf_conntrack_tftp nf_conntrack_sip(若未用 FTP/TFTP/SIP)
  • 缩短超时时间(谨慎!):sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=43200(默认 432000 秒 → 12 小时),避免长连接占位;但对 ssh数据库连接等需保持稳定的场景要评估影响

真正难处理的是混合负载:既有海量短连接,又有少量关键长连接。这时 nf_conntrack_buckets 的哈希分布质量、NUMA 节点内存局部性、以及是否启用了 CONFIG_NF_CONNTRACK_ZONES(用于隔离不同 zone 的连接条目),都会影响实际吞吐。这些细节在 /proc/sys/net/netfilter/ 下有对应接口,但改前务必压测。

text=ZqhQzanResources