在网络故障排查中,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 进行状态分析:
场景一:排查 ping (ICMP) 不通
- 在一个终端启动监控:
|
|
- 在另一个终端执行
ping <目标IP>。 - 观察监控终端:
- 无任何输出:报文未到达
conntrack模块,问题可能在路由或出站防火墙之前。 - 出现
[NEW]事件:请求已发出,被内核跟踪。 - 随后出现
[UPDATE]事件:收到回复,连接建立成功。若只有[NEW]无[UPDATE],则回复未被收到,问题可能在对方主机、中间网络或本机入站规则。
- 无任何输出:报文未到达
场景二:排查 TCP/UDP 服务不通(如SSH、Web)
- 监控相关连接:
|
|
- 尝试建立连接(如
ssh命令)。 - 观察状态:
- 理想情况:看到
[NEW]->[UPDATE](状态变为ESTABLISHED)。 - 只有
[NEW]:你的请求出去了,但对方回复没回来。检查对方服务、中间网络及本机INPUT链/安全组入方向。 - 无事件:报文在到达
conntrack前被丢弃。检查本机OUTPUT** 链/安全组出方向**、路由。
- 理想情况:看到
场景三:诊断 conntrack 表满导致的丢包
这是经典故障,症状为连接随机超时或中断。
- 检查日志:
|
|
- 查看当前计数与上限:
|
|
- 临时解决方案:
|
|
💎 核心要点总结
conntrack -E** 是你的“第一双眼睛”**:在测试前打开,直接观察连接是否被内核成功跟踪。- 状态是关键:
NEW表示请求已发出;ESTABLISHED表示双向通信已得到内核放行;UNREPLIED通常意味着只有单边流量。 conntrack** 与tcpdump是黄金组合**:conntrack看状态,tcpdump抓报文,两者结合可以精确定位报文是在哪一层被丢弃。- 表满是常见病:在网关、高连接数服务器上,务必监控
nf_conntrack_count,并适当调整max值。
下次遇到“时通时不通”或“特定协议不通”的诡异问题时,首先运行 conntrack -E 进行实时监控,它能为你提供最直接的线索。