路由追踪工具 traceroute 使用技巧
Dec 16, 2018 23:00 · 1455 words · 3 minute read
有时候人们想知道一个数据包从出发地到目的地所遵循的路由,即所有转发实体(中间的路由器)的 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
,也就是从第二跳开始抓取。