一、traceroute 做什么(原理概述)
-
作用:发现从本机到目标主机经过的每一跳路由节点(每一跳的 IP)并测量到这些跳的延迟(往返时间)。
-
基本原理:发送一系列带有不同 TTL(Time To Live,生存时间)值的数据包。第 1 个包 TTL=1,会在第 1 路由器被丢弃并返回「超时」类型的 ICMP 响应;第 2 个包 TTL=2,在第 2 路由器时被丢弃并返回,以此类推。通过接收到的 ICMP 超时/响应,可以知道每一跳的 IP 与时延。
-
协议差异:不同实现默认使用不同协议:
-
Linux 下常见的
traceroute(由traceroute包提供)默认发送 UDP 到高端口(超高端口,通常不会在目标上被接受)。 -
Windows
tracert使用 ICMP Echo Request(类似 ping)。 -
现代工具通常支持 TCP(
-T)/ICMP(-I)/UDP 选项,可按需切换(例如用于穿过只允许 80/443 的防火墙时用 TCP 端口 80)。
-
二、常见实现与平台差异
-
Linux(多数发行版):命令通常叫
traceroute;需要安装包(例如traceroute或inetutils-traceroute)。支持-I(ICMP)、-T(TCP)、-p(端口)、-n(不解析 DNS)等。 -
macOS:也有
traceroute,参数略有差异,但总体行为相似。 -
Windows:命令名
tracert,语法不同,选项更少(使用 ICMP)。 -
注意:不同发行版或软件包(
traceroute、iputils-tracepath、tracepath、paris-traceroute)的选项会有差别,请以man traceroute/tracert /?为准。
三、常用参数(Linux traceroute 的常见选项,供参考)
不同实现参数略有差异,请用
man traceroute验证本机可用选项。
-
-n:不进行 DNS 反查,只显示 IP(通常更快)。 -
-m <max_ttl>:设置最大跳数(默认 30)。 -
-f <first_ttl>:从某个 TTL 开始(例如只查看第 10~20 跳)。 -
-q <nqueries>:对每个 TTL 发送的探测包数(默认 3)。 -
-w <wait>:每个探测的超时时间(秒)。 -
-p <port>:指定目标端口(当使用 UDP/TCP 时)。 -
-I:使用 ICMP ECHO 而不是默认 UDP。 -
-T:使用 TCP SYN(常用于穿越防火墙,需 root 权限或特殊支持)。 -
-4/-6:强制使用 IPv4 或 IPv6。 -
-s <srcaddr>:指定源地址(多网卡场景下有用)。 -
-A、-S等:某些实现支持显示 AS 信息或 TTL 控制(实现相关)。
四、示例与解释
- 基本(Linux):
bash
traceroute example.com
- 更快(不做 DNS 解析):
bash
traceroute -n 8.8.8.8
- 降低超时时间并只发送 1 次探测(快速扫描):
bash
traceroute -q 1 -w 2 -n 8.8.8.8
- 使用 ICMP(类似 Windows):
bash
sudo traceroute -I example.com
- 使用 TCP 端口 80(穿透只允许 TCP 80/443 的网络):
bash
sudo traceroute -T -p 80 example.com
- Windows(命令不同):
bash
tracert example.com
五、输出字段如何解读(典型输出示例)
bash
1 192.168.1.1 1.234 ms 1.345 ms 1.290 ms
2 10.0.0.1 10.123 ms 10.234 ms 10.111 ms
3 * * *
4 203.0.113.5 50.321 ms 50.102 ms 50.213 ms
-
左侧数字:跳数(TTL 值)。
-
紧接 IP/主机名:该跳路由器的 IP(若 DNS 可解析,可能显示主机名)。
-
后面三个值:针对该跳发送的 3 次探测的往返时间(RTT),单位毫秒(具体 probe 数由
-q决定)。 -
*:超时或没有返回(常见原因:防火墙丢弃 ICMP 超时/拒绝响应,或路由器限流)。 -
如果最后一跳显示
*或不同于目标,可能目标主机对探测协议不回应(例如目标丢弃 UDP 到高端口),但路径仍然可能连通。
六、常见问题与排查建议
-
输出大量
*:-
可能节点对 ICMP(或探测协议)不回应或限流------不一定代表路径断开。
-
试试
-I(ICMP)、-T -p 80(TCP),或-n(关闭 DNS 反查减少延迟)来判断。
-
-
到某跳后 RTT 突增:
- 可能中间某链路拥塞或路由器 CPU 高负载导致转发延迟;不是一定是目标服务器问题。
-
到目标最后一跳高延迟但中间跳正常:
- 目标主机负载高或防火墙对探测包优先级低。
-
traceroute 显示路径与生产流量不一致:
- 路由器对不同协议/端口可能走不同路径(路由基于策略或 ECMP),使用 TCP traceroute 可更接近实际业务流。
-
无法运行 traceroute:
- 某些环境缺少
traceroute包,或需要 root 权限(尤其使用原始套接字或 TCP 时)。可安装traceroute或使用tracepath(通常不需 root)。
- 某些环境缺少
七、进阶与替代工具
-
mtr(my traceroute):集成 ping 与 traceroute,实时显示每跳的丢包率与延迟变化,适合持续观测网络质量。- 使用示例:
mtr -n 8.8.8.8
- 使用示例:
-
tracepath:类似 traceroute,但通常不需要 root 权限,自动选择路径 MTU 探测。- 使用示例:
tracepath example.com
- 使用示例:
-
tcptraceroute/traceroute -T:通过 TCP(SYN)进行跟踪,更接近真实 TCP 连接路径(穿透防火墙时有用)。 -
paris-traceroute:为避免负载均衡导致结果不准确而设计(在多路径环境下更准确)。 -
ping:用于判断目标是否可达与稳定性(不是路径诊断工具)。
八、实用排查流程(快速模板)
-
基础连通性:
ping -c 4 <目标IP或域名>。若 ping 不通,继续 traceroute。 -
路径跟踪:
traceroute -n <目标IP>(或tracert在 Windows)。 -
若大量
*:改用sudo traceroute -I -n <目标>或sudo traceroute -T -p 80 -n <目标>。 -
若怀疑中间节点丢包:使用
mtr -n <目标>观察每跳丢包/延迟趋势。 -
确认本机路由与出接口:
ip route/route -n/ip addr。 -
检查防火墙/安全组(服务器端与中间设备)是否丢弃 ICMP/UDP/TCP 探测包。
-
如果需要获取 AS/运营商信息,可结合
whois或在线工具(注意隐私与合规)。
九、权限与安全注意
-
某些 traceroute 模式(例如使用原始套接字或发送 ICMP)需要 root 权限。
-
在公司/敏感网络中运行 traceroute 之前确认是否允许(部分网络安全策略不允许随意探测)。
-
traceroute 输出可泄露网络拓扑信息,分享时注意脱敏。
十、快速备忘(常用命令汇总)
-
Linux:
traceroute -n -q 1 -w 2 8.8.8.8 -
Linux(ICMP):
sudo traceroute -I example.com -
Linux(TCP 80):
sudo traceroute -T -p 80 example.com -
macOS:同
traceroute(参数可能略有差异) -
Windows:
tracert -d example.com(-d不做 DNS 解析) -
实时分析:
mtr -n example.com -
无需 root 的替代:
tracepath example.com