排查网络问题,请务必掌握这款工具

2021-05-17 12:42:09 浏览数 (1)

traceroute 介绍

traceroute 就如同它的名字一样,能够追踪到一个网络数据包传输经过的路由器路径。这是 Linux 上的一个命令,Windows 上类似的命令是 tracert。

tracert 默认使用 ICMP 包探测,traceroute 使用 UDP 包,也可以使用 ICMP 和 TCP 包探测,分别带上参数 -I-T 即可。

traceroute 主要用途

traceroute 利用 ICMP 差错报文,主要用来确定这几件事:

  • 确定通信双方路径上经过的路由器设备
  • 确定 UDP 包是否成功达到目的地
  • 发现路径 MTU

确定通信双方路径上经过的路由器设备 。利用 IP 包的 TTL 字段和超时类型的 ICMP 报文来实现。首先, traceroute 向目的地发送 IP 包,刚开始的时候,将 TTL 设置为 1,当经过第一个路由器时,TTL -1 = 0 引发超时错误,第一个路由器回复 ICMP 超时报文,源主机就可以知道路径第一个路由器的信息,随后 TTL 被设置为 2、3、4, ...,直到到达目的地,这样,沿途每个路由器都会向源主机回复 ICMP 超时报文, traceroute 就可以拿到所有的路由器信息了。

不过这里要 注意 ,并不是所有路由器都会返回 ICMP 报文,因为出于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器都默认配置为不返回任何 ICMP 报文,管理员也会主动配置,所以这时使用 traceroute 就不一定能拿到所有路由器信息了。

确定包是否成功达到目的地 。使用上面的方法能拿到路由器信息,但并不能确定发的包是否到达目的地。traceroute 通过设置所发 UDP 包的端口号来解决了这个问题,因为 UDP 包的可用端口号范围 <3000,只要在发送 UDP 包的时候填入一个 >3000 的端口号,当包到达了目的地,但是由于端口不匹配,就会返回一个端口不可达的 ICMP 报文,这样源主机就可以确定包确实到了目的地了。

发现路径 MTU 。利用了 “需要分片但设置了不分片位” 类型的 ICMP 报文,如果某个源主机在发送一个 IP 包之前,对该 IP 包中的首部字段 DF 位设为 1,也就是“分片禁止位=1”,表示该包在传输的过程中不允许分片,如果中间某个路由器允许传输的最大路径 MTU 小于该包大小,就需要分片才能传输,但是由于设置了不分片位,路由器会将该包丢弃,并向源主机发送一个携带 MTU 信息的 ICMP 包,提醒源主机下次发包的大小不应超过该 MTU 的值。traceroute 就可以利用这种类型报文来逐一地确认传输路径上各个路由器之间的 MTU 值。

常用命令案例

traceroute 使用格式是:

traceroute「参数」「主机」

代码语言:javascript复制
  1. # traceroute --help
  2. Usage:
  3. traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,... ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w MAX,HERE,NEAR ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ --fwmark=num ] host [ packetlen ]

其中,选项主要有:

  • -4:使用 IPv4
  • -6:使用 IPv6
  • -d:开启 socket 层的debug
  • -F:设置不分片位
  • -f first_ttl:设置第一跳 TTL 值,默认是1
  • -g gate:指定网关 gate 可路由的最大数据包数
  • -I:使用 ICMP echo 包探测
  • -T:使用 TCP SYN 包探测
  • -m max_ttl:设置 TTL 最大跳数,默认是 30
  • -N squeries:同时发送探测包的数量
  • -n:不进行 IP 到域名的解析
  • -p port:设置目的端口的值(默认是 33434),ICMP 就是设置初始序列号(默认为1 )
  • -t tos:设置 TOS 值(IPv6 是 TC 值)
  • -w max,here,near:设置等待每一跳响应的时间,有三个值,max表示最大不能超过的时间(默认是5s),here表示同一跳时间的参考因子,near表示下一跳参考因子(这两个值意义不大)
  • -q nqueries:设置每一跳探测的次数,默认是 3
  • -r:绕过中间的路由探测,直接将包送达目的地
  • -s srcaddr:使用 srcaddr 作为发送包的源地址
  • --mtu:发现路径 MTU,等价于参数 -F-N1

① 最简单的用法

traceroute www.baidu.com

代码语言:javascript复制
  1. [root@localhost ~]# traceroute www.baidu.com
  2. traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
  3. 192.168.74.2 (192.168.74.2) 2.606 ms 2.771 ms 2.950 ms
  4. 211.151.56.57 (211.151.56.57) 0.596 ms 0.598 ms 0.591 ms
  5. 211.151.227.206 (211.151.227.206) 0.546 ms 0.544 ms 0.538 ms
  6. 210.77.139.145 (210.77.139.145) 0.710 ms 0.748 ms 0.801 ms
  7. 202.106.42.101 (202.106.42.101) 6.759 ms 6.945 ms 7.107 ms
  8. 61.148.154.97 (61.148.154.97) 718.908 ms * bt-228-025.bta.net.cn (202.106.228.25) 5.177 ms
  9. 124.65.58.213 (124.65.58.213) 4.343 ms 4.336 ms 4.367 ms
  10. 202.106.35.190 (202.106.35.190) 1.795 ms 61.148.156.138 (61.148.156.138) 1.899 ms 1.951 ms
  11. * * *
  12. * * *
  13. [root@localhost ~]#

可以看到,第一行输出探测的主机名和对应 IP,允许探测的最大跳数,以及发送的数据包字节数,后面每一行表示每一跳的信息,包括 IP 信息,3 个时延值(因为每一跳默认会发 3 次探测包)。

最后还会看到三个 ***,表示当前这一跳被防火墙过滤,探测包被丢弃。

② 设置 TTL 最大跳数:-m max_ttl

默认 TTL 是 30 跳。

traceroute-m10www.baidu.com

代码语言:javascript复制
  1. [root@localhost ~]# traceroute -m 10 www.baidu.com
  2. traceroute to www.baidu.com (61.135.169.105), 10 hops max, 40 byte packets
  3. 192.168.74.2 (192.168.74.2) 1.534 ms 1.775 ms 1.961 ms
  4. 211.151.56.1 (211.151.56.1) 0.508 ms 0.514 ms 0.507 ms
  5. 211.151.227.206 (211.151.227.206) 0.571 ms 0.558 ms 0.550 ms
  6. 210.77.139.145 (210.77.139.145) 0.708 ms 0.729 ms 0.785 ms
  7. 202.106.42.101 (202.106.42.101) 7.978 ms 8.155 ms 8.311 ms
  8. bt-228-037.bta.net.cn (202.106.228.37) 772.460 ms bt-228-025.bta.net.cn (202.106.228.25) 2.152 ms 61.148.154.97 (61.148.154.97) 772.107 ms
  9. 124.65.58.221 (124.65.58.221) 4.875 ms 61.148.146.29 (61.148.146.29) 2.124 ms 124.65.58.221 (124.65.58.221) 4.854 ms
  10. 123.126.6.198 (123.126.6.198) 2.944 ms 61.148.156.6 (61.148.156.6) 3.505 ms 123.126.6.198 (123.126.6.198) 2.885 ms
  11. * * *
  12. * * *
  13. [root@localhost ~]#

可以看到,最大跳数被该为 10 跳。

③ 每一跳不进行 DNS 解析,不显示主机名:-n

traceroute-n www.baidu.com

代码语言:javascript复制
  1. [root@localhost ~]# traceroute -n www.baidu.com
  2. traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
  3. 211.151.74.2 5.430 ms 5.636 ms 5.802 ms
  4. 211.151.56.57 0.627 ms 0.625 ms 0.617 ms
  5. 211.151.227.206 0.575 ms 0.584 ms 0.576 ms
  6. 210.77.139.145 0.703 ms 0.754 ms 0.806 ms
  7. 202.106.42.101 23.683 ms 23.869 ms 23.998 ms
  8. 202.106.228.37 247.101 ms * *
  9. 61.148.146.29 5.256 ms 124.65.58.213 4.386 ms 4.373 ms
  10. 202.106.35.190 1.610 ms 61.148.156.138 1.786 ms 61.148.3.34 2.089 ms
  11. * * *
  12. * * *
  13. [root@localhost ~]#

可以看到相关的主机名已经去除。

④ 设置 UDP 端口号为 6666:-p

traceroute-p6666www.baidu.com

代码语言:javascript复制
  1. [root@localhost ~]# traceroute -p 6888 www.baidu.com
  2. traceroute to www.baidu.com (220.181.111.147), 30 hops max, 40 byte packets
  3. 211.151.74.2 (211.151.74.2) 4.927 ms 5.121 ms 5.298 ms
  4. 211.151.56.1 (211.151.56.1) 0.500 ms 0.499 ms 0.509 ms
  5. 211.151.224.90 (211.151.224.90) 0.637 ms 0.631 ms 0.641 ms
  6. * * *
  7. 220.181.70.98 (220.181.70.98) 5.050 ms 5.313 ms 5.596 ms
  8. 220.181.17.94 (220.181.17.94) 1.665 ms !X * *
  9. [root@localhost ~]#

可以看到,报文到达了目的地,但是显示 !X,意思是“管理禁止通信”,对应 ICMP type=3,code=13 的报文。除此之外,还有以下这些标志:

  • !H、!N 、!P:分别表示 host、network、protocol 不可达
  • !S:源路由抑制(source route failed)
  • !F:需要分片但是没分片(fragmentation needed)
  • !V:违反主机优先级(host precedence violation)
  • !C:优先级终止生效(precedence cutoff in effect)
  • !:ICMP 不可达代码(ICMP unreachable code )

⑤ 设置探测包的个数:-q

traceroute-q4www.baidu.com

代码语言:javascript复制
  1. [root@localhost ~]# traceroute -q 4 www.baidu.com
  2. traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
  3. 211.151.74.2 (211.151.74.2) 40.633 ms 40.819 ms 41.004 ms 41.188 ms
  4. 211.151.56.57 (211.151.56.57) 0.637 ms 0.633 ms 0.627 ms 0.619 ms
  5. 211.151.227.206 (211.151.227.206) 0.505 ms 0.580 ms 0.571 ms 0.569 ms
  6. 210.77.139.145 (210.77.139.145) 0.753 ms 0.800 ms 0.853 ms 0.904 ms
  7. 202.106.42.101 (202.106.42.101) 7.449 ms 7.543 ms 7.738 ms 7.893 ms
  8. 61.148.154.97 (61.148.154.97) 316.817 ms bt-228-025.bta.net.cn (202.106.228.25) 3.695 ms 3.672 ms *
  9. 124.65.58.213 (124.65.58.213) 3.056 ms 2.993 ms 2.960 ms 61.148.146.29 (61.148.146.29) 2.837 ms
  10. 61.148.3.34 (61.148.3.34) 2.179 ms 2.295 ms 2.442 ms 202.106.35.190 (202.106.35.190) 7.136 ms
  11. * * * *
  12. * * * *
  13. [root@localhost ~]#

可以看到,每一跳探测输出了 4 个时延值。

⑥ 设置探测包的等待响应时间:-w

traceroute-w3www.baidu.com

代码语言:javascript复制
  1. [root@localhost ~]# traceroute -w 3 www.baidu.com
  2. traceroute to www.baidu.com (61.135.169.105), 30 hops max, 40 byte packets
  3. 211.151.74.2 (211.151.74.2) 2.306 ms 2.469 ms 2.650 ms
  4. 211.151.56.1 (211.151.56.1) 0.621 ms 0.613 ms 0.603 ms
  5. 211.151.227.206 (211.151.227.206) 0.557 ms 0.560 ms 0.552 ms
  6. 210.77.139.145 (210.77.139.145) 0.708 ms 0.761 ms 0.817 ms
  7. 202.106.42.101 (202.106.42.101) 7.520 ms 7.774 ms 7.902 ms
  8. bt-228-025.bta.net.cn (202.106.228.25) 2.890 ms 2.369 ms 61.148.154.97 (61.148.154.97) 471.961 ms
  9. 124.65.58.221 (124.65.58.221) 4.490 ms 4.483 ms 4.472 ms
  10. 123.126.6.198 (123.126.6.198) 2.948 ms 61.148.156.6 (61.148.156.6) 7.688 ms 7.756 ms
  11. * * *
  12. * * *
  13. [root@localhost ~]#

⑦ 绕过中间的路由探测,直接将包送达目的地

traceroute-r www.baidu.com

代码语言:javascript复制
  1. [root@localhost ~]# traceroute -r www.baidu.com
  2. traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
  3. Network is unreachable
  4. [root@localhost ~]#

可以看到,直接显示网络不可达。

⑧ 探测路径 MTU

traceroute--mtu www.baidu.com

代码语言:javascript复制
  1. root@pclcache:~# traceroute --mtu www.baidu.com
  2. traceroute to www.baidu.com (14.215.177.39), 30 hops max, 65000 byte packets
  3. 1 192.168.109.1 (192.168.109.1) 3.063 ms F=1500 2.908 ms *
  4. 2 192.168.98.36 (192.168.98.36) 1.686 ms 1.422 ms *
  5. 3 113.98.59.57 (113.98.59.57) 7.075 ms 7.544 ms 5.851 ms

可以看到,探测到 MTU F=1500。

OK,除此之外,还有更多的用法,大家有兴趣可以通过 man traceroute 查看更多的用法。


0 人点赞