网络排障工具conntrack

在网络故障排查中,conntrack 是洞察内核连接跟踪状态的核心工具。它不直接配置网络,而是像 “网络连接监控器”,通过显示连接状态帮助你判断报文在何处被处理或丢弃。

📊 Conntrack 核心价值:连接状态视角

传统工具(如 ping, tcpdump)告诉你报文“到哪里”,而 conntrack 告诉你内核认为某个连接“处于什么状态”。这对于诊断防火墙、NAT和状态化过滤引起的问题至关重要。

🛠️ 常用命令与实战解读

以下命令需 root 权限(sudo)。

命令 用途 关键输出解读与示例
conntrack -L 列出当前所有连接跟踪条目。 查看所有被跟踪的连接(TCP/UDP/ICMP)。 conntrack -L -o extended (显示更详细字段)
conntrack -E 实时监控新连接事件。 故障排查首选。实时观察新连接是否被创建。 conntrack -E -p tcp --dport 80 (监控特定流量)
conntrack -L -p icmp 查看特定协议(如ICMP)的连接。 检查 ping 产生的跟踪条目。**状态应为 **ESTABLISHED
conntrack -L -p udp 查看UDP“连接”(如DNS)。 UDP虽无状态,但内核仍会跟踪会话。用于检查DNS查询。
conntrack -L -s <IP> 过滤查看指定源IP的连接。 定位来自特定主机的所有连接状态。
conntrack -D 手动删除连接跟踪条目。 强制清除某条过期或僵死的连接,常用于测试。 conntrack -D -p tcp --orig-port-dst 80

🔍 经典故障排查场景与命令流

当网络不通时,可按此流程使用 conntrack 进行状态分析:

image.png

场景一:排查 ping (ICMP) 不通

  1. 在一个终端启动监控:
1
conntrack -E -p icmp
  1. 在另一个终端执行 ping <目标IP>
  2. 观察监控终端:
    • 无任何输出:报文未到达 conntrack 模块,问题可能在路由出站防火墙之前。
    • 出现 [NEW] 事件:请求已发出,被内核跟踪。
    • 随后出现 [UPDATE] 事件:收到回复,连接建立成功。若只有 [NEW][UPDATE],则回复未被收到,问题可能在对方主机、中间网络或本机入站规则。

场景二:排查 TCP/UDP 服务不通(如SSH、Web)

  1. 监控相关连接:
1
conntrack -E -p tcp --dport 22  # 监控SSH
  1. 尝试建立连接(如 ssh 命令)。
  2. 观察状态:
    • 理想情况:看到 [NEW] -> [UPDATE](状态变为 ESTABLISHED)。
    • 只有 [NEW]:你的请求出去了,但对方回复没回来。检查对方服务、中间网络及本机 INPUT 链/安全组入方向
    • 无事件:报文在到达 conntrack 前被丢弃。检查本机 OUTPUT** 链/安全组出方向**、路由。

场景三:诊断 conntrack 表满导致的丢包

这是经典故障,症状为连接随机超时或中断

  1. 检查日志
1
2
dmesg | grep "conntrack"
# 关键信息:`nf_conntrack: table full, dropping packet`
  1. 查看当前计数与上限
1
2
3
sysctl net.netfilter.nf_conntrack_count
sysctl net.netfilter.nf_conntrack_max
# 如果 count 接近 max,则表将满
  1. 临时解决方案
1
2
3
4
# 增大表上限
sysctl -w net.netfilter.nf_conntrack_max=524288
# 缩短某些超时时间,加速条目回收(谨慎调整)
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=1200

💎 核心要点总结

  • conntrack -E** 是你的“第一双眼睛”**:在测试前打开,直接观察连接是否被内核成功跟踪。
  • 状态是关键NEW 表示请求已发出;ESTABLISHED 表示双向通信已得到内核放行;UNREPLIED 通常意味着只有单边流量。
  • conntrack** 与 tcpdump 是黄金组合**:conntrack状态tcpdump报文,两者结合可以精确定位报文是在哪一层被丢弃。
  • 表满是常见病:在网关、高连接数服务器上,务必监控 nf_conntrack_count,并适当调整 max 值。

下次遇到“时通时不通”或“特定协议不通”的诡异问题时,首先运行 conntrack -E 进行实时监控,它能为你提供最直接的线索。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus