首页/网络/网络排障速查/conntrack 表满导致随机丢包

conntrack 表满导致随机丢包

使用 NAT 或状态防火墙的主机,连接跟踪表满会静默丢弃新连接:症状是随机超时、无应用日志;dmesg 里的 nf_conntrack: table full 是确诊依据。

网络排障速查网络更新于 2026-10-13

连接跟踪表满为什么难查

启用地址转换或状态防火墙的主机,内核会为每条连接维护一条跟踪表项。表满时新连接不会被正常建立,而是被静默丢弃:客户端看到的是超时重试,服务端日志里什么都没有,因此极易被误判为链路问题或对端故障。确诊依赖内核侧的证据:当前条目数与上限的比较,以及内核日志里关于连接跟踪表已满的告警。

基本信息

适用平台Linux 内核的 netfilter 连接跟踪模块
查看计数net.netfilter.nf_conntrack_count 与 nf_conntrack_max
统计工具conntrack 命令行,查看总数、分类统计与条目列表
确诊证据内核日志中出现连接跟踪表满、丢弃报文的告警
代价调大上限会同步增加内核内存占用,需要评估内存

典型使用场景

  • 大量地址转换的主机上出现随机超时:优先怀疑连接跟踪表满
  • 新连接成功率下降:对比条目数与上限的接近程度
  • 排查丢弃原因:查看分类统计中的插入失败与丢弃计数
  • 应急恢复:清理陈旧条目争取时间,同时制定扩容方案
  • 容量规划:按峰值并发连接数设定上限与老化时间

检查与确诊

检查与确诊
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
conntrack -C            # 当前条目数
conntrack -S            # 分类统计:插入失败、丢弃等
dmesg | grep -i conntrack | tail -5
conntrack -L -p tcp --dport 443 | head -20   # 查看某类连接条目

缓解参数(评估内存后调整)

缓解参数(评估内存后调整)
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
# 写入 /etc/sysctl.d/ 下的文件后执行 sysctl --system 生效
# 应急清理陈旧条目(会短暂影响对应连接):
# conntrack -D -p tcp --state TIME_WAIT

指标与处置

观察含义处置
条目数接近上限表将满,新连接开始被丢评估内存后调大上限
分类统计有丢弃计数已发生静默丢包调参并排查异常连接来源
短连接数量极高老化时间与业务模型不匹配调整老化时间,优化连接复用
内存吃紧跟踪表占用过大降低上限并排查连接泄漏
日志仅有内核告警应用日志完全干净以内核证据为准,别只看应用
表满的表现是丢包而不是报错,极易误判为链路问题;调大上限会同步增加内核内存占用,需结合内存评估,应急时可先清理陈旧条目。

易错点

  • 表满时按链路故障排查,方向完全跑偏:先看内核计数与日志
  • 盲目调大上限不评估内存:连接跟踪表吃内核内存,可能引发内存不足
  • 只看应用日志:表满导致的失败在应用侧没有任何记录
  • 长期依赖应急清理条目:不解决容量与连接泄漏,故障会周期性复现

数据来源与参考

  • Linux 内核文档:nf_conntrack sysctl
  • man 8 conntrack(conntrack-tools)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌