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 查看更多的用法。
转载请注明:IT运维空间 » 运维技术 » 排查网络问题,请务必掌握这款工具
发表评论