Linux服务器出现“nf_conntrack: table full”怎么办?连接跟踪表排查与安全扩容教程

Linux服务器日志出现“nf_conntrack: table full”时,新连接可能被丢弃,网站、容器出网和NAT转发会间歇性异常。本文按确认占用、分析来源、临时扩容、持久化配置和业务验证的顺序,给出一套可执行且风险可控的排查方法。

Linux 服务器日志里出现 nf_conntrack: table full, dropping packet,说明内核用于记录网络连接状态的 conntrack 表已经达到上限,新连接可能被丢弃。网站会因此偶发超时,反向代理可能报 502/504,容器访问外网、DNS 查询或 NAT 转发也可能出现间歇性失败。

这个问题不能只靠调大 nf_conntrack_max 解决。正确顺序是先确认表是否真的满了,再找出连接由谁产生,最后根据内存和业务特征决定扩容、调整超时还是限制异常流量。

Linux服务器出现“nf_conntrack: table full”怎么办?连接跟踪表排查与安全扩容教程

一、先确认是不是连接跟踪表已满

先查看内核日志。不同发行版可任选一种命令:

sudo dmesg -T | grep -i conntrack
sudo journalctl -k --since "30 minutes ago" | grep -i conntrack

如果反复看到类似信息,就继续检查当前条目数和上限:

sysctl net.netfilter.nf_conntrack_count
sysctl net.netfilter.nf_conntrack_max

也可以直接读取 /proc。其中 nf_conntrack_count 是当前条目数,nf_conntrack_max 是最大条目数:

cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
watch -n 2 'printf "count="; cat /proc/sys/net/netfilter/nf_conntrack_count; printf "max="; cat /proc/sys/net/netfilter/nf_conntrack_max'

如果 count 长时间贴近 max,并且同一时段出现丢包日志,基本可以确认 conntrack 容量不足。若只偶发出现一次,也要结合业务峰值、容器发布、扫描攻击或上游重试情况判断。

二、判断连接是正常增长还是异常堆积

Debian、Ubuntu 可安装 conntrack,RHEL、Rocky Linux、AlmaLinux 可安装 conntrack-tools

sudo apt update && sudo apt install conntrack
# 或
sudo dnf install conntrack-tools

先查看统计,不要一上来打印全部连接:

sudo conntrack -S
sudo conntrack -C

条目很多时,conntrack -L 会产生大量输出。需要进一步分析,可先写入临时文件,再观察源地址和目标地址分布:

sudo conntrack -L -o extended > /tmp/conntrack-list.txt
sudo conntrack -L -o extended 2>/dev/null \
  | grep -oE 'src=[^ ]+' | sort | uniq -c | sort -nr | head -20
sudo conntrack -L -o extended 2>/dev/null \
  | grep -oE 'dst=[^ ]+' | sort | uniq -c | sort -nr | head -20

同时查看主机连接状态:

ss -s
ss -ant | awk 'NR>1 {count[$1]++} END {for (s in count) print s, count[s]}' | sort

重点检查以下情况:

  • 某个公网 IP 在短时间内建立大量连接,可能是扫描、爬虫、攻击或失控客户端。
  • 某个本地服务不断访问同一目标,可能是程序重试、连接池失效或健康检查过密。
  • Docker、Kubernetes、网关或 NAT 服务器承担大量转发,conntrack 压力通常高于普通 Web 主机。
  • TIME_WAIT 很多不等于 conntrack 一定满,但短连接高峰会同时推高两类状态数量。
  • UDP、DNS 或无响应连接长期存在时,应检查业务行为和对应超时,而不是直接删除全部记录。

三、先做低风险止损

如果连接表已满并影响线上业务,可以在确认可用内存后临时提高上限,为排查争取时间。例如把当前值提高到原来的两倍:

current=$(sysctl -n net.netfilter.nf_conntrack_max)
sudo sysctl -w net.netfilter.nf_conntrack_max=$((current * 2))

这是临时调整,重启后通常会恢复。执行后立即检查:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
sudo dmesg -T | tail -n 50

不要在不了解内存余量和流量来源时连续翻倍。每个 conntrack 条目都会占用内核内存,实际占用与内核版本、协议、扩展信息和系统架构有关,不能用一个固定字节数套用所有服务器。

如果是明显的单一来源异常,应优先在云防火墙、安全组、负载均衡或主机防火墙上限速、封禁或收敛入口。只扩表不处理异常流量,往往只是延后再次被填满的时间。

四、确认后再持久化参数

观察一个真实业务周期,确认新上限能够覆盖正常峰值且系统内存稳定后,再写入独立的 sysctl.d 配置文件:

sudo tee /etc/sysctl.d/90-nf-conntrack.conf >/dev/null <<'EOF'
net.netfilter.nf_conntrack_max = 262144
EOF
sudo sysctl --system

这里的 262144 只是配置示例,不是所有服务器的推荐值。正式设置时应根据正常峰值、增长速度、内存余量和故障缓冲空间确定。

sysctl net.netfilter.nf_conntrack_max
grep -R "nf_conntrack_max" /etc/sysctl.conf /etc/sysctl.d 2>/dev/null

如果多个文件重复设置同一参数,应只保留明确的一处,避免重启或执行 sysctl --system 后出现与预期不一致的值。

五、不要随意清空连接跟踪表

conntrack -F 会清空当前网络命名空间中的连接跟踪条目,可能中断现有 NAT、状态防火墙和业务连接,不应作为常规清理命令。

只有在明确知道影响范围、已有维护窗口并准备好回滚方案时,才考虑删除特定条目。例如按源地址删除:

sudo conntrack -D -s 198.51.100.10

示例地址必须替换为实际确认的异常来源。生产环境应先使用 conntrack -L 验证匹配范围,避免误删正常连接。

六、超时参数要按协议和状态调整

conntrack 为不同协议和 TCP 状态设置了不同超时。可以先查看当前配置:

sysctl -a 2>/dev/null | grep '^net.netfilter.nf_conntrack_.*timeout'

不建议把所有超时统一调小。超时过短可能让仍在使用的连接提前失去状态,影响 NAT、防火墙判断和长连接业务。只有连接样本显示某类无效状态大量堆积且业务允许时,才针对具体协议或状态小幅调整,并记录修改前的值:

sysctl -a 2>/dev/null | grep '^net.netfilter.nf_conntrack_.*timeout' \
  | sudo tee /root/nf-conntrack-timeout-before.txt >/dev/null

调整后至少观察连接数、丢包日志、业务成功率以及 NAT/防火墙行为,不要只以 count 下降作为成功标准。

七、容器和 NAT 主机要额外检查什么

Docker、Kubernetes 节点、软路由和网关往往会为转发连接维护 conntrack 状态。排查时还应检查:

sudo nft list ruleset
sudo iptables-save
docker stats --no-stream

如果主机上存在多个网络命名空间,要确认故障发生在哪个命名空间,以及规则是否由 Docker、Kubernetes、firewalld 或其他组件管理,不要直接覆盖自动生成的防火墙规则。

还应检查 HTTP keep-alive 是否合理复用、连接池是否失效、健康检查是否过密、失败重试是否缺少退避,以及 NAT 出口是否过度集中在单台小规格服务器上。

八、修复后怎样验证

完成流量治理或参数调整后,建议连续观察至少一个真实业务高峰:

watch -n 5 'cat /proc/sys/net/netfilter/nf_conntrack_count; cat /proc/sys/net/netfilter/nf_conntrack_max'
sudo journalctl -k --since "10 minutes ago" | grep -i conntrack

还要从业务侧验证网站访问、API 成功率、DNS、容器出网和 NAT 转发。连接表不再满,只能证明容量告警缓解;程序仍超时时,还需要继续检查应用、网络、上游服务和防火墙规则。

长期监控建议包含 conntrack 占用比例、连接增长速度、内核告警、内存与网络错误,以及主要来源、目标和协议分布。

结语

遇到 nf_conntrack: table full,先确认连接表占用,再定位连接来源。线上已经受影响时,可以在确认内存余量后临时扩容,但持久化前必须经过峰值观察;异常流量、短连接设计和重试风暴则要从源头处理。

最稳妥的路径是:确认告警与占用率、分析连接构成、低风险止损、治理异常来源、持久化合理上限,最后通过内核日志和真实业务共同验证。

参考资料

资料核验日期:2026年8月28日

实操指南知识库

云服务器本地盘和云硬盘有什么区别?性能、可靠性与数据迁移选择指南

2026-8-27 17:01:54

实操指南知识库

云服务器换机怎么保留公网IP?EIP解绑、迁移与费用检查指南

2026-8-28 17:01:35