一、基本介绍
路由跟踪命令(traceroute或tracepath)是在网络环境故障排除时常用的命令之一。它会追踪从本机发送到目标主机的数据包在网络中传输时所经过的所有路由跳点,以及在每个路由跳点上由于各种原因不能继续向目标主机传输的数据包丢失情况。
在Linux系统下,路由跟踪命令可以使用traceroute或tracepath命令来执行,其主要参数如下:
traceroute [ -dnrv ] [ -f first_ttl ] [ -m max_ttl ] [ -w timeou
其中常用的选项参数说明如下:
- -n 禁用反向域名查找,使用IP地址代替所有节点的主机名
- -v 输出详细的调试信息
- -m max_ttl 设置最多跨越的路由跳点数,即“最大跳数”
二、示例1:使用traceroute命令
首先,我们以网站www.baidu.com为例,使用traceroute命令来查看它所经过的路由跳点:
$ traceroute www.baidu.com
traceroute to www.baidu.com (220.181.38.148), 30 hops max, 60 byte packets
1 192.168.0.1 (192.168.0.1) 0.661 ms 1.550 ms 2.143 ms
2 223.223.219.1 (223.223.219.1) 2.133 ms 2.277 ms 2.421 ms
3 183.56.5.153 (183.56.5.153) 5.420 ms 5.562 ms 5.706 ms
4 10.0.80.13 (10.0.80.13) 3.385 ms 3.250 ms 3.335 ms
5 140.207.96.129 (140.207.96.129) 6.407 ms 6.544 ms 6.689 ms
6 202.97.46.57 (202.97.46.57) 12.670 ms 12.520 ms 12.656 ms
7 202.97.90.254 (202.97.90.254) 11.535 ms 11.691 ms 11.836 ms
8 220.181.16.42 (220.181.16.42) 31.419 ms 220.181.38.148 (220.181.38.148) 22.188 ms 22.330 ms
由上面的结果可以看出,traceroute先尝试向目标主机发送跨越1个路由跳点的数据包,如果成功,则返回跨越该路由跳点所需的时间;否则,在该路由跳点上发送3个数据包,选择其中最快的包所需时间作为该路由跳点的测量值。之后重复上述步骤,累加路由途经的跳点数,直到到达目标主机,或超过设定的最大跳数(默认为30)。同时,可以通过公网地址查询得知www.baidu.com对应的IP地址为220.181.38.148。
三、示例2:使用tracepath命令
tracepath和traceroute类似,不同之处就在于它利用的是ICMP的错误信息,而不是UDP数据包。下面,我们通过tracepath命令来查看www.baidu.com所经过的路由跳点:
$ tracepath www.baidu.com
1?: [LOCALHOST] pmtu 1500
1: router.asus.com 3.202ms
1: router.asus.com 3.163ms
2: 119.84.76.41 6.551ms asymm 3
3: 183.56.5.153 4.604ms
4: 10.253.89.93 3.745ms
5: 140.207.96.129 2.228ms
6: 202.97.46.57 8.116ms
7: 202.97.90.254 8.037ms asymm 6
8: 220.181.16.42 7.761ms
9: no reply
10: 220.181.38.148 8.202ms reached
Resume: pmtu 1500 hops 10 back 9
从上述结果可以看出,tracepath先执行一个路径MTU发现过程,获得TCP最大段。在traceroute中,这个阶段是不必要的,因为UDP数据包很少会大于路由过程中的MTU。之后,tracepath发送一个带TTL值为1的ICMP ECHO请求报文,获取经过第一个路由跳点所需的时间和返回的ICMP差错报文(路由器地址)。然后迭代继续向下跳,直到目标主机被找到或者达到最大TTL值(默认为30)。
四、常见问题及解决方案
1. 遇到 “TTL exceeded” 错误怎么办?
如果在使用traceroute或tracepath命令时出现”TTL exceeded”错误,这说明数据包已经到达了TTL设定的最大跳数,并被丢弃。这时需要增加TTL跳数限制。
$ traceroute -m 100 www.baidu.com
2. 路由器不响应ICMP怎么办?
有些路由器配置禁止 ICMP 封包通过,这会导致使用 traceroute 或 tracepath 命令不能正常工作。一种解决方案是使用将 UDP 封装在 IP 数据报的方法,通常这被称为“tracerroute”命令。
$ sudo tracepath -U www.baidu.com
3. 输出信息不太明确怎么办?
有些输出信息可能会不太明确,可以结合增加 -v 调试信息选项来查看具体的跟踪信息:
$ traceroute -n -m 10 -q 1 -w 1 -v www.baidu.com
...
1 192.168.1.1 (192.168.1.1) 3.895 ms 4.053 ms 4.211 ms
2 123.126.201.209 (123.126.201.209) 11.840 ms 11.942 ms 11.972 ms
3 123.125.239.210 (123.125.239.210) 11.406 ms 10.267 ms 10.048 ms
...
4. 如何绕过NAT查看远程IP?
在进行远程连接时,往往我们想查看远程容器的IP地址。但是由于NAT的存在,我们往往只能看到NAT网关的IP地址。我们可以使用如下方法,通过路由跟踪来查看容器的IP地址:
$ traceroute -m 1 1.1.1.1
1 192.168.65.1 (192.168.65.1) 2.688 ms
$ traceroute -m 1 google.com
1 172.17.0.1 (172.17.0.1) 0.148 ms
通过查看上述两条命令的输出,我们可以得到容器的IP地址为172.17.0.1。