关键在于分层验证:先查本地路由表(ip route get)确认选路逻辑,再用tracepath或traceroute -n跟踪实际路径,接着检查防火墙(iptables)、ip转发(sysctl net.ipv4.ip_forward)及云平台策略,最后通过tcpdump抓包比对收发行为定位拦截或变形点。

排查网络数据包的路由转发路径,关键在于分层验证:先确认系统如何决定“往哪发”,再看数据包实际“走到哪了”,最后检查中间是否被拦截或变形。整个过程不需要猜,靠几个命令就能定位卡点。
查本地路由表:数据包出发前怎么选路
Linux 发送数据包前,内核会查路由表(ip route show)匹配目标 IP。这是第一道决策逻辑:
- 运行 ip route get ,它会模拟真实发包过程,告诉你具体走哪条路由、用哪个网卡、下一跳是谁、是否需要源地址转换;
- 注意查看是否有策略路由(ip rule show)、多张路由表(如 table local/main/100),某些服务可能绕过默认路由;
- 如果目标是本机监听的地址(如 127.0.0.1 或本地 IP),路由结果会显示 dev lo 或 scope link,说明不经过物理网卡。
跟踪实际路径:数据包到底经过哪些设备
路由表只决定“应该走哪”,真正走没走、走到哪,得靠主动探测:
- tracepath :推荐首选,无需 root,自动发现路径 MTU,输出简洁,每跳带延迟和当前路径最大传输单元(PMTU);
- traceroute -n :更通用,支持指定协议(-I 用 ICMP,-T 用 TCP),-n 关闭 DNS 解析避免卡顿;
- 若某跳显示 * * * 但后续跳有响应,说明该中间设备静默丢弃 TTL 超时包(常见于防火墙或路由器配置);
- 对比 tracepath 和 traceroute 的输出差异,能快速识别是否存在非对称路由(去程和回程路径不同)。
检查转发与过滤环节:有没有被拦下来
即使路由正确、路径通畅,数据包仍可能在中途被丢弃:
- 查本机防火墙:iptables -t filter -L -v -n 看 INPUT/OUTPUT/FORWARD 链是否有 DROP/REJECT 规则匹配对应协议、端口或 IP;
- 确认内核是否开启转发:sysctl net.ipv4.ip_forward,值为 1 才允许做路由器;
- 若涉及 NAT 或端口映射,还需检查 iptables -t nat -L -v -n;
- 某些云环境或容器网络中,安全组、网络策略(NetworkPolicy)或 ebpf 规则也可能拦截,需结合平台控制台确认。
抓包验证:亲眼看到数据包行为
当以上命令无法定论时,用抓包直击现场:
- 在发出端运行 tcpdump -i any host -nn,观察是否发出探测包、是否收到 ICMP 响应;
- 在中间节点(如网关、跳板机)或目标端同步抓包,比对收发内容是否一致;
- 重点留意 ICMP Type 3 Code 4("Fragmentation Needed and DF Set")——这是 PMTU 发现失败的明确信号;
- 避免只抓 loopback 接口,确保 -i 指定的是实际出向网卡(如 eth0、ens3),或用 any 抓所有接口。











