返回首页

ping 通但 tracert 不通?一个真实案例,教你用 8 种命令定位网络故障

ping 通但 tracert 不通?一个真实案例,教你用 8 种命令定位网络故障

ping 通但 tracert 不通?一个真实案例,教你用 8 种命令定位网络故障

大家好,我是老张。

📌 本文基于真实生产案例,为保护环境信息,文中 IP 地址已做脱敏替换。

前两天遇到一个经典的甩锅现场——安全厂商的人在客户群里说"tracert 不通,最后一条是云内地址,要问云老师"。

翻译一下就是:这锅是云平台的。

结果呢?20 分钟排查完,甩出去的锅自己飞回来了——防火墙 traceroute 功能没开。

今天把这个案例完整复盘,文末附上我用了 多年的网络诊断命令大全(Windows+Linux+交换机全覆盖),建议收藏。


📊 先看结果

测试方式目标TCP tracertUDP tracertICMP tracertping
交换机目标地址❌ 全 *✅ 通
交换机防火墙互联❌ 全 *✅ 通
云主机防火墙互联✅ 7 跳直达❌ 第 6 跳后 *✅ 通
云主机目标地址✅ 7 跳直达❌ 第 6 跳后 *

规律极度明确:TCP 全通、UDP/ICMP 全断。不是网络问题,是防火墙协议级拦截。


一、问题背景

项目组反馈:从堡垒机 tracert 目标地址(防火墙上配置的地址),在交换机网关处中断,后续路径未知。安全厂商判断"最后一条是云内地址,需要问云老师"。

网络链路:

堡垒机 → 交换机 → 防火墙(互联地址) → 目标地址

两个关键 IP:

  • 交换机与防火墙互联地址
  • 目标地址:配置在防火墙上

二、交换机侧验证——路由通,ping 通,tracert 全 *

2.1 先看路由

<交换机>dis ip routing-table protocol static
172.20.6.0/24  Static  60  0  172.20.21.1  RAGG13

✅ 静态路由正确:目标网段 → 下一跳 防火墙互联地址 → 出接口 RAGG13

2.2 ping 测试

<交换机>ping 172.20.6.3
Ping 172.20.6.3: 56 data bytes, press CTRL+C to break
56 bytes from 172.20.6.3: icmp_seq=0 ttl=64 time=0.512 ms
56 bytes from 172.20.6.3: icmp_seq=1 ttl=64 time=0.962 ms
56 bytes from 172.20.6.3: icmp_seq=2 ttl=64 time=0.830 ms
56 bytes from 172.20.6.3: icmp_seq=3 ttl=64 time=0.878 ms
56 bytes from 172.20.6.3: icmp_seq=4 ttl=64 time=0.378 ms
--- Ping statistics ---
5 packet(s) transmitted, 5 received, 0.0% packet loss
round-trip min/avg/max = 0.378/0.712/0.962 ms

✅ 全通,0% 丢包,延迟 <1ms。

2.3 tracert——全部 *

<交换机>tracert 172.20.6.3
traceroute to 172.20.6.3, 30 hops max
1 * * *
2 * * *
3 * * *
...(全 *,超时)

<交换机>tracert 172.20.21.1
...(同样全 *,超时)

⚠️ 连第一跳都是 *——连交换机自己与防火墙直连的这一跳都追踪不到。

关键判断:ping 通 + tracert 全 * = 不是网络断,是中间设备不响应 traceroute。交换机与防火墙是直连的,第一跳就 *,说明问题在防火墙上。


三、云主机侧验证——TCP/UDP/ICMP 三协议对比

在云平台内找了台 VM,对同一目标做三种协议的 traceroute。

3.1 TCP traceroute(SYN 包,端口 443)

root@云主机:~# traceroute -T -p 443 172.20.6.3
traceroute to 172.20.6.3, 30 hops max, 60 byte packets
 1  * * *                       
 2  * * *                       
 3  172.20.0.1        0.264 ms    
 4  172.20.16.207        0.393 ms   
 5  172.20.16.5         0.238 ms    
 6  172.20.16.99        0.237 ms    ← 出口路由层
 7  172.20.6.3        0.235 ms    ← 🎯 目标地址!直达!

7 跳完美到达,延迟 <1ms。路径完整可见。

3.2 UDP traceroute(默认方式,同一端口 443)

root@云主机:~# traceroute -p 443 172.20.6.3
traceroute to 172.20.6.3, 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  172.20.0.1        0.261 ms
 4  172.20.16.207        0.337 ms
 5  172.20.16.5         0.212 ms
 6  172.20.16.99        0.219 ms
 7  * * *                       ← 断了!
...(之后全 *,30 跳超时)

❌ 同一个端口,UDP 方式第 7 跳后全 *

3.3 铁证

协议目标结果
TCP (-T -p 443)目标地址✅ 7 跳直达
UDP (-p 443)目标地址❌ 第 7 跳断
ICMP(默认)目标地址❌ 第 7 跳断

同一目标、同一端口、同一路径,换了个协议,结果天差地别。这就钉死了:是防火墙协议级拦截,不是网络故障。


四、traceroute 为什么"断"了?(原理)

很多人不知道 traceroute 是怎么工作的,这里快速讲一下:

traceroute 原理:
1. 发送 TTL=1 的探测包 → 第一跳路由器 TTL 归零 → 回 ICMP Time Exceeded
2. 发送 TTL=2 的探测包 → 第二跳路由器 TTL 归零 → 回 ICMP Time Exceeded
3. ...
N. 直到到达目标,目标回 ICMP Port Unreachable(UDP 模式)或 TCP RST/SYN-ACK

所以 traceroute 依赖一个关键假设:中间设备愿意回 ICMP Time Exceeded 消息。

问题来了——安全设备(防火墙/IPS/WAF)的默认策略通常不回应 ICMP Time Exceeded,目的是减少信息泄露。你不回 → traceroute 看到 * * * → 误以为"断了"。

后面防火墙的人也确认了这一点:

"tracert 没回显是因为防火墙上的这个功能没开,后面启用一下就行了。"


五、网络诊断命令大全(建议收藏)

这次排查能快速定位,核心就一个技巧:换协议对比。 下面把工作中常用的网络诊断命令整理出来,覆盖 Windows、Linux、交换机三种环境。

⚠️ 以下示例中 <目标> 代表目标 IP 或域名,生产环境请替换为实际值。


1. ping —— 最基础的连通性测试

原理:发送 ICMP Echo Request,目标回 ICMP Echo Reply。测的是三层(网络层)可达性。

返回值解读

现象含义
Reply from ... time<1ms通,同网段或直连
Reply from ... time=XXms通,延迟正常
Request timed out不通或防火墙拦截 ICMP
TTL expired in transit路由环路
Destination host unreachable无路由/ARP 失败

⚠️ 常见误区:ping 不通 ≠ 网络不通。很多安全设备禁 ping,但业务端口正常。

通用(所有设备)

ping <目标>

Windows 指定次数

ping -n 10 <目标>

Linux 指定次数

ping -c 10 <目标>

交换机(华为/华三)

ping -c 10 <目标>

本次排查中的使用:交换机 ping 目标地址全通 → 排除三层路由问题。


2. tracert / traceroute —— 路径追踪

原理:利用 IP 头中的 TTL 字段,逐跳发送 TTL=1,2,3... 的探测包,中间路由器 TTL 归零时回 ICMP Time Exceeded,从而拼出完整路径。

不同系统的默认协议

系统命令默认协议
WindowstracertICMP Echo
LinuxtracerouteUDP(高端口)
交换机tracertUDP 或 ICMP(看厂商)

返回值解读

现象含义
1 192.168.1.1 1ms正常,第一跳
5 * * *该跳不响应,可能是安全设备或丢包
5 * * * 之后全 *后面路径不可追踪,不一定是断了
!H(Linux)Host unreachable
!N(Linux)Network unreachable
!X(Linux)Communication administratively prohibited

⚠️ 切记:tracert 全 * 不代表不通!ping 先确认三层可达性。

Windows

tracert <目标>
tracert -d <目标>                    # 不做 DNS 解析,更快

Linux

traceroute <目标>                    # 默认 UDP
traceroute -I <目标>                 # ICMP 方式
traceroute -T -p 80 <目标>           # TCP SYN,指定端口
traceroute -n <目标>                 # 不解析 DNS

交换机(华为/华三)

tracert <目标>
tracert -q 1 <目标>                  # 每跳只发 1 个包,更快

本次排查中的使用:ICMP/UDP tracert 全 * → 换 TCP tracert 正常 → 确认防火墙协议级拦截。


3. tcping —— 端口级连通性(TCP 握手)

原理:尝试 TCP 三次握手,能 SYN-ACK 回来就是通的。比 ping 更准确——ping 可能被禁,但业务端口必须通。

返回值解读

现象含义
Port is open / Connected端口通
Port is closed / Connection refused端口不通(目标回了 RST)
No response / timeout端口不通(无响应,可能被拦截)

⚠️Connection refusedtimeout 有本质区别——前者是目标机器明确拒绝(RST),后者是包被丢弃(可能防火墙拦了)。

Windows(需安装 tcping.exe 或用 PowerShell):

Test-NetConnection <目标> -Port 443

Linux(需安装 tcping):

tcping <目标> 443
tcping -c 5 <目标> 443              # 5 次后停止

本次排查中的补充用法:如果 TCP tracert 正常但怀疑业务端口有问题,用 tcping 直接测。


4. telnet —— 最原始的端口探测

原理:主动发起 TCP 连接,能连上说明端口通。比 tcping 更直观——能看到应用层是否有响应。

返回值解读

现象含义
黑屏/光标闪烁端口通,等待输入
Connected to ... Escape character is '^]'端口通
Connection refused端口不通(目标明确拒绝)
长时间无响应后 timeout端口不通(被丢弃/拦截)
看到乱码或字符端口通,服务有响应(如 SSH banner)

通用

telnet <目标> <端口>

Windows

telnet 172.20.6.3 443

⚠️ Windows 默认未安装 telnet 客户端

# PowerShell 管理员
Enable-WindowsOptionalFeature -Online -FeatureName TelnetClient

本次排查中的补充用法:如果别人反馈"应用发布服务器端口不通",telnet 是第一选择——快速判断是网络问题还是应用问题。


5. nc(netcat)—— 瑞士军刀

原理:TCP/UDP 通吃,能做端口扫描、数据传输、监听。排查时主要用 -z 模式测端口。

返回值解读

现象含义
Connection to ... port [tcp/http] succeeded!端口通
无输出(-z 模式下连接成功)端口通
Connection refused端口不通
无响应/超时端口不通或被拦截

Linux

nc -zv <目标> 443                  # TCP 端口探测,verbose
nc -zv <目标> 22-25                # 端口范围扫描
nc -zuv <目标> 53                  # UDP 端口探测
nc -zv -w 2 <目标> 443             # 超时 2 秒

Windows(需下载 nc.exe 或 ncat):

nc -zv <目标> 443

本次排查中的补充用法:如果有多个目标需要批量测端口,nc 比 telnet 高效——一行命令出结果。


6. nmap —— 端口扫描 + 服务识别

原理:发送各种探测包(SYN/ACK/UDP/ICMP),根据响应判断端口状态和服务类型。比 nc 强大在能识别服务版本。

返回值解读

状态含义
open端口开放,有服务在监听
closed端口可达,但无服务监听(回了 RST)
filtered无法判断,可能被防火墙拦截
unfiltered端口可达,但无法确定是否开放
`openfiltered`

Linux

nmap -p 443 <目标>                  # 单端口扫描
nmap -p 22,80,443 <目标>            # 多端口扫描
nmap -p 1-1000 <目标>               # 端口范围扫描
nmap -sV -p 443 <目标>              # 服务版本识别
nmap -Pn <目标>                     # 跳过 ping 探测(目标禁 ping 时用)

⚠️ Windows 和 Linux 都需要安装 nmap,非系统自带。

本次排查中的补充用法:如果怀疑多个端口被防火墙策略拦截,nmap 的 filtered 状态能直接指出来。


7. mtr —— ping + traceroute 二合一

原理:持续逐跳发送探测包,实时统计每跳的丢包率和延迟。比 traceroute 强在能看到每跳的持续性表现,而不是 3 个包的快照。

返回值解读

含义
Loss%该跳丢包率
Snt已发送包数
Last最后一个包的延迟
Avg/Best/Wrst平均/最好/最差延迟
StDev延迟抖动

⚠️ 关键判读技巧:某跳 Loss% 高但后续跳 Loss% 恢复 → 不是真丢包,是该跳不响应探测包(跟本次案例一样)。只有最后跳 Loss% 也高 → 才是真丢包。

Linux

mtr <目标>                           # 交互式界面
mtr -r -c 10 <目标>                  # 报告模式,发 10 个包后退出
mtr -T -P 443 <目标>                 # TCP 模式,端口 443
mtr -n <目标>                        # 不解析 DNS

Windows:需下载 WinMTR(GUI 工具)。

本次排查中的补充用法:如果用 mtr 测这个案例,会看到第 7 跳 Loss% 高但后续没数据显示 → 一眼就能判断是安全设备不响应,不是网络丢包。


🧠 快速诊断决策树

遇到网络问题时,按这个顺序来:

ping <目标>
├─ 通 → 三层可达 ✅ → telnet/nc/tcping <目标> <端口>
│   ├─ 通 → 应用层可达 ✅ → 没问题
│   └─ 不通 → 检查防火墙策略/服务监听
└─ 不通 → traceroute <目标>
    ├─ 中间某跳断 → 定位故障设备
    └─ 全程 `*` → 换 TCP traceroute
        ├─ TCP 通 → 防火墙拦截 ICMP/UDP TTL exceeded
        └─ TCP 也不通 → 真网络故障


💡 老张的几点总结

  1. "tracert 不通"不等于"网络不通":这次的教训——交换机 ping 全通、TCP tracert 全通,ICMP tracert 全 *。三个证据互相印证,才能下结论
  2. 换协议对比是最快的定位方法:ICMP 不通就换 TCP,TCP 不通就换 UDP。防火墙拦截通常是按协议策略的,换个协议大概率能绕过去
  3. mtr 比 tracert 更靠谱:tracert 只发 3 个包,mtr 持续发。遇到偶尔丢包或不稳定延迟的问题,mtr 是唯一选择

💬 互动话题

  • 你遇到过类似"ping 通但 tracert 不通"的情况吗?最后怎么定位的?
  • 日常排查你最喜欢用哪个命令?我投 mtr 一票
  • 还有什么网络诊断工具你觉得好用但上面没列?欢迎评论区补充
A

Admin

用文字记录生活与思考。

评论 (0)
暂无评论,来抢沙发吧
ping 通但 tracert 不通?一个真实案例,教你用 8 种命令定位网络故障 | 山外云的Vlog