路由追踪工具 traceroute 使用技巧

Dec 16, 2018 23:00 · 1455 words · 3 minute read Unix Network

有时候人们想知道一个数据包从出发地到目的地所遵循的路由,即所有转发实体(中间的路由器)的 IP 地址。虽然不能保证所有数据包都走相同的路线,但通常都是一样的。路由信息非常有助于调试网络相关的问题。

使用 traceroute 工具能够输出数据包到特定目的地的完整路径。

路由追踪工作原理

traceroute 工具使用 IP 包头中的 TTL 字段来实现。而 TTL 字段表示数据包在网络中经过多少跳(中转)到达目的地。所以这就有效地描述了数据包在网络上的生命周期。这个字段通常设置为32或64。数据包每经过一个中间路由器,TTL 会减1。当某个路由器在接收到数据包后发现 TTL 值为1,这个数据包不会被转发而是被丢弃。

在丢包后,路由器丢包的同时也会对数据包来源发送一个 ICMP TTL Exceeded 的信息。这个被发回的 ICMP 包携带了此路由器的 IP 地址。

所以通过每次发送 TTL 值从1开始递增的数据包来实现路由追踪。每当一个路由器收到了数据包,例行检查 TTL 字段,如果 TTL 值为1就丢包并向源 IP 地址发送 ICMP 错误信息。traceroute 就这样逐步获取到起始地和目的地之间所有路由器的 IP。

路由追踪实例

1. 如何运行 traceroute

$ traceroute <server-name>

server-name 是目标名称或者 IP 地址。举个例子,使用 traceroute 来找出我的机器到 blog.crazytaxii.com 的网络路径:

$ traceroute blog.crazytaxii.com
traceroute to blog.crazytaxii.com (47.97.185.8), 64 hops max, 52 byte packets
1  10.0.0.1 (10.0.0.1)  1.353 ms  1.027 ms  0.937 ms
 2  221.131.124.13 (221.131.124.13)  2.464 ms  2.508 ms  1.918 ms
 3  221.130.63.133 (221.130.63.133)  24.893 ms  3.561 ms  2.842 ms
 4  221.183.47.21 (221.183.47.21)  7.523 ms  6.425 ms  7.126 ms
 5  221.183.40.137 (221.183.40.137)  12.262 ms  12.411 ms  12.463 ms
 6  221.183.39.138 (221.183.39.138)  12.760 ms  40.522 ms  12.237 ms
 7   (211.136.189.6)  11.832 ms  11.513 ms  11.907 ms
 8   (117.185.3.226)  14.172 ms  19.383 ms
     (117.185.3.230)  14.526 ms
 9  42.120.241.34 (42.120.241.34)  15.138 ms
    116.251.113.210 (116.251.113.210)  15.006 ms
    140.205.50.254 (140.205.50.254)  13.680 ms
10  * * 42.120.239.165 (42.120.239.165)  16.864 ms
11  * 42.120.244.238 (42.120.244.238)  14.637 ms *
12  * * *
13  * * *
14  * * *
15  * * *

每行提供了与中间路由器交互的详细信息,不仅有路由器的 IP 地址,还有此路由器的三个往返时间,因为 traceroute 命令每次发了三包数据。

有时候输出 *,表示无法获取所需的字段。可能是从反向 DNS 查询失败、没有命中目标路由器甚至在回程中丢包。虽然可能有多种失败原因,但是 traceroute 统统输出 *

2. 禁用 IP 地址和主机名映射

traceroute 提供选项 -n 来禁用 IP 地址与主机名映射。

$ traceroute -n blog.crazytaxii.com
traceroute to blog.crazytaxii.com (47.97.185.8), 64 hops max, 52 byte packets
1  10.0.0.1  1.941 ms  0.871 ms  0.812 ms
 2  221.131.124.13  2.123 ms  1.913 ms  1.960 ms
 3  221.130.63.133  3.114 ms  2.772 ms  3.986 ms
 4  221.183.47.21  6.280 ms  5.762 ms  6.466 ms
 5  221.183.40.137  12.621 ms  21.356 ms  14.034 ms
 6  221.183.39.138  17.120 ms  12.249 ms  11.870 ms
 7  211.136.189.6  11.556 ms  12.361 ms  12.174 ms
 8  117.185.3.230  16.584 ms  14.171 ms
    117.185.3.226  22.271 ms
 9  140.205.50.242  13.292 ms *
    116.251.88.114  19.051 ms
10  * * *
11  140.205.27.185  19.391 ms * *
12  * * *

然后我们在输出中就看不到主机名了。

3. 配置回复等待时间

还可以配置 traceroute 工具在发包后的等待时间,-w 选项带上值。下面例子中,等待时间设置为1秒。

$ traceroute -w 1 blog.crazytaxii.com
traceroute to blog.crazytaxii.com (47.97.185.8), 64 hops max, 52 byte packets
 1  10.0.0.1 (10.0.0.1)  1.770 ms  1.688 ms  0.873 ms
 2  221.131.124.13 (221.131.124.13)  2.806 ms  2.374 ms  1.971 ms
 3  221.130.63.133 (221.130.63.133)  2.995 ms  3.064 ms  2.930 ms
 4  221.183.47.21 (221.183.47.21)  7.049 ms  6.941 ms  6.541 ms
 5  221.183.40.137 (221.183.40.137)  12.656 ms  14.224 ms  12.256 ms
 6  221.183.39.138 (221.183.39.138)  12.245 ms  13.162 ms  11.904 ms
 7   (211.136.189.6)  28.462 ms  11.238 ms  12.004 ms
 8   (117.185.3.226)  13.626 ms  13.170 ms  13.097 ms
 9  42.120.241.46 (42.120.241.46)  14.760 ms
    42.120.241.34 (42.120.241.34)  32.554 ms
    116.251.113.210 (116.251.113.210)  19.245 ms
10  123.56.34.241 (123.56.34.241)  15.395 ms *
    42.120.239.177 (42.120.239.177)  20.929 ms
11  * * *
12  * * *

4. 配置每一跳的查询次数

traceroute 工具默认每跳发送3包数据来得到3次来回时间。选项 -q 需要带上整数。

$ traceroute -q 5 blog.crazytaxii.com
traceroute to blog.crazytaxii.com (47.97.185.8), 64 hops max, 52 byte packets
 1  10.0.0.1 (10.0.0.1)  2.021 ms  0.952 ms  0.820 ms  0.796 ms  0.833 ms
 2  221.131.124.13 (221.131.124.13)  2.840 ms  3.282 ms  2.396 ms  2.033 ms  2.023 ms
 3  221.130.63.133 (221.130.63.133)  2.956 ms  4.355 ms  4.339 ms  3.568 ms  2.929 ms
 4  221.183.47.21 (221.183.47.21)  6.430 ms  6.048 ms  5.793 ms  7.639 ms  11.856 ms
 5  221.183.40.137 (221.183.40.137)  13.448 ms  12.493 ms  12.692 ms  17.751 ms  12.766 ms
 6  221.183.39.138 (221.183.39.138)  12.217 ms  12.900 ms  12.840 ms  12.571 ms  12.496 ms
 7   (211.136.189.6)  13.012 ms  11.406 ms  12.174 ms  12.324 ms  11.593 ms
 8   (117.185.3.230)  14.449 ms  13.706 ms
     (117.185.3.226)  29.122 ms
     (117.185.3.230)  13.492 ms
     (117.185.3.226)  14.561 ms
 9  * 140.205.50.250 (140.205.50.250)  20.705 ms *  13.273 ms
    116.251.113.210 (116.251.113.210)  15.079 ms
10  * 140.205.27.18 (140.205.27.18)  17.204 ms
    140.205.24.29 (140.205.24.29)  16.682 ms  17.248 ms
    123.56.34.241 (123.56.34.241)  16.326 ms
11  * * * * *
12  * * * * *

5. 配置 TTL 值

traceroute 可以根据用户的需求灵活改变初始 TTL 值。默认为1意味着从第一个路由器就开始,使用 -f 选项来设置一个自定义的值。

$ traceroute -f 2 blog.crazytaxii.com
traceroute to blog.crazytaxii.com (47.97.185.8), 64 hops max, 52 byte packets
 2  221.131.124.13 (221.131.124.13)  3.268 ms  2.838 ms  2.890 ms
 3  221.130.63.133 (221.130.63.133)  15.193 ms  3.792 ms  3.805 ms
 4  221.183.47.21 (221.183.47.21)  6.464 ms  5.971 ms  6.466 ms
 5  221.183.40.137 (221.183.40.137)  12.316 ms  13.050 ms  12.652 ms
 6  221.183.39.138 (221.183.39.138)  17.945 ms  12.289 ms  13.274 ms
 7   (211.136.189.6)  11.773 ms  11.384 ms  12.396 ms
 8   (117.185.3.226)  13.237 ms
     (117.185.3.230)  14.304 ms
     (117.185.3.226)  16.125 ms
 9  * 42.120.241.38 (42.120.241.38)  18.295 ms *
10  * 140.205.24.29 (140.205.24.29)  18.299 ms
    140.205.27.18 (140.205.27.18)  16.012 ms
11  * * 42.120.244.238 (42.120.244.238)  15.117 ms
12  * * *

看到相比于之前的输出少了第一跳 10.0.0.1,也就是从第二跳开始抓取。