Molet

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

Molet 运维技术 2022-11-12 573浏览 0

traceroute 介绍

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

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

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

traceroute 主要用途

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

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

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

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

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

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

常用命令案例

traceroute 使用格式是:

traceroute「参数」「主机」

#traceroute--help
Usage:
traceroute[-46dFITnreAUDV][-ffirst_ttl][-ggate,...][-idevice][-mmax_ttl][-Nsqueries][-pport][-ttos][-lflow_label][-wMAX,HERE,NEAR][-qnqueries][-ssrc_addr][-zsendwait][--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

[root@localhost~]#traceroutewww.baidu.com
traceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets
192.168.74.2(192.168.74.2)2.606ms2.771ms2.950ms
211.151.56.57(211.151.56.57)0.596ms0.598ms0.591ms
211.151.227.206(211.151.227.206)0.546ms0.544ms0.538ms
210.77.139.145(210.77.139.145)0.710ms0.748ms0.801ms
202.106.42.101(202.106.42.101)6.759ms6.945ms7.107ms
61.148.154.97(61.148.154.97)718.908ms*bt-228-025.bta.net.cn(202.106.228.25)5.177ms
124.65.58.213(124.65.58.213)4.343ms4.336ms4.367ms
202.106.35.190(202.106.35.190)1.795ms61.148.156.138(61.148.156.138)1.899ms1.951ms
***
***
[root@localhost~]#

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

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

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

默认 TTL 是 30 跳。

[root@localhost~]#traceroute-m10www.baidu.com
traceroutetowww.baidu.com(61.135.169.105),10hopsmax,40bytepackets
192.168.74.2(192.168.74.2)1.534ms1.775ms1.961ms
211.151.56.1(211.151.56.1)0.508ms0.514ms0.507ms
211.151.227.206(211.151.227.206)0.571ms0.558ms0.550ms
210.77.139.145(210.77.139.145)0.708ms0.729ms0.785ms
202.106.42.101(202.106.42.101)7.978ms8.155ms8.311ms
bt-228-037.bta.net.cn(202.106.228.37)772.460msbt-228-025.bta.net.cn(202.106.228.25)2.152ms61.148.154.97(61.148.154.97)772.107ms
124.65.58.221(124.65.58.221)4.875ms61.148.146.29(61.148.146.29)2.124ms124.65.58.221(124.65.58.221)4.854ms
123.126.6.198(123.126.6.198)2.944ms61.148.156.6(61.148.156.6)3.505ms123.126.6.198(123.126.6.198)2.885ms
***
***
[root@localhost~]#

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

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

traceroute-n www.baidu.com

[root@localhost~]#traceroute-nwww.baidu.com
traceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets
211.151.74.25.430ms5.636ms5.802ms
211.151.56.570.627ms0.625ms0.617ms
211.151.227.2060.575ms0.584ms0.576ms
210.77.139.1450.703ms0.754ms0.806ms
202.106.42.10123.683ms23.869ms23.998ms
202.106.228.37247.101ms**
61.148.146.295.256ms124.65.58.2134.386ms4.373ms
202.106.35.1901.610ms61.148.156.1381.786ms61.148.3.342.089ms
***
***
[root@localhost~]#

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

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

traceroute-p6666www.baidu.com

[root@localhost~]#traceroute-p6888www.baidu.com
traceroutetowww.baidu.com(220.181.111.147),30hopsmax,40bytepackets
211.151.74.2(211.151.74.2)4.927ms5.121ms5.298ms
211.151.56.1(211.151.56.1)0.500ms0.499ms0.509ms
211.151.224.90(211.151.224.90)0.637ms0.631ms0.641ms
***
220.181.70.98(220.181.70.98)5.050ms5.313ms5.596ms
220.181.17.94(220.181.17.94)1.665ms!X**
[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

[root@localhost~]#traceroute-q4www.baidu.com
traceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets
211.151.74.2(211.151.74.2)40.633ms40.819ms41.004ms41.188ms
211.151.56.57(211.151.56.57)0.637ms0.633ms0.627ms0.619ms
211.151.227.206(211.151.227.206)0.505ms0.580ms0.571ms0.569ms
210.77.139.145(210.77.139.145)0.753ms0.800ms0.853ms0.904ms
202.106.42.101(202.106.42.101)7.449ms7.543ms7.738ms7.893ms
61.148.154.97(61.148.154.97)316.817msbt-228-025.bta.net.cn(202.106.228.25)3.695ms3.672ms*
124.65.58.213(124.65.58.213)3.056ms2.993ms2.960ms61.148.146.29(61.148.146.29)2.837ms
61.148.3.34(61.148.3.34)2.179ms2.295ms2.442ms202.106.35.190(202.106.35.190)7.136ms
****
****
[root@localhost~]#

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

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

traceroute-w3www.baidu.com

[root@localhost~]#traceroute-w3www.baidu.com
traceroutetowww.baidu.com(61.135.169.105),30hopsmax,40bytepackets
211.151.74.2(211.151.74.2)2.306ms2.469ms2.650ms
211.151.56.1(211.151.56.1)0.621ms0.613ms0.603ms
211.151.227.206(211.151.227.206)0.557ms0.560ms0.552ms
210.77.139.145(210.77.139.145)0.708ms0.761ms0.817ms
202.106.42.101(202.106.42.101)7.520ms7.774ms7.902ms
bt-228-025.bta.net.cn(202.106.228.25)2.890ms2.369ms61.148.154.97(61.148.154.97)471.961ms
124.65.58.221(124.65.58.221)4.490ms4.483ms4.472ms
123.126.6.198(123.126.6.198)2.948ms61.148.156.6(61.148.156.6)7.688ms7.756ms
***
***
[root@localhost~]#

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

traceroute-r www.baidu.com

[root@localhost~]#traceroute-rwww.baidu.com
traceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets
Networkisunreachable
[root@localhost~]#

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

⑧ 探测路径 MTU

traceroute–mtu www.baidu.com

root@pclcache:~#traceroute--mtuwww.baidu.com
traceroutetowww.baidu.com(14.215.177.39),30hopsmax,65000bytepackets
1192.168.109.1(192.168.109.1)3.063msF=15002.908ms*
2192.168.98.36(192.168.98.36)1.686ms1.422ms*
3113.98.59.57(113.98.59.57)7.075ms7.544ms5.851ms

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

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

继续浏览有关 Linux 的文章
发表评论