当前位置: 首页 > 科技观察

排查网络问题,一定要掌握这个工具

时间:2023-03-17 11:58:34 科技观察

traceroute简介traceroute,顾名思义,可以追踪网络数据包传输的路由器路径。这是Linux上的一个命令,在Windows上相当于tracert。tracert默认使用ICMP包检测,traceroute使用UDP包检测,也可以分别使用参数-I和-T进行ICMP和TCP包检测。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,即“分片”分片禁止bit=1”,表示数据包在传输过程中不允许分片。如果中间路由器允许的最大路径MTU小于数据包大小,则需要分片传输。但是,由于nofragmentationbit的设置,路由器会丢弃该数据包,并向源主机发送一个携带MTU信息的ICMP数据包,提醒源主机下一个数据包的大小不要超过MTU值。Traceroute可以使用这种类型的消息来逐一确认传输路径上各路由器之间的MTU值。常用命令案例traceroute的格式为:traceroute「参数」「主机」#traceroute--helpUsage: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层调试-F:设置非分片位-ffirst_ttl:设置第一跳的TTL值,默认为1-ggate:指定最大可路由网关gate数据包数-I:使用ICMPecho包检测-T:使用TCPSYN包检测-mmax_ttl:设置最大TTL跳数,默认为30-Nsqueries:数量检测同时发送的包-n:没有IP到域名解析-pport:设置目的端口的值(默认是33434),ICMP是设置初始序列号(默认是1)-ttos:设置TOS值(IPv6是TC值)-wmax,这里是near:设置每一跳响应的等待时间,有三个值。max表示不能超过的最长时间(默认5s),这里表示同一跳时间的参考因子,near表示下一跳参考因子(这两个值意义不大)-qnqueries:设置每跳探测数,默认为3-r:绕过中间路由探测,直接将数据包投递到目的地-ssrcaddr:使用srcaddr作为发送数据包的源地址--mtu:发现路径MTU,相当于参数-F-N1①最简单的用法traceroutewww.baidu.com[root@localhost~]#traceroutewww.baidu.comtraceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets192.168.74.2(192.168.74.2)2.606ms2.771ms2.950ms211.151.56.57(211.151.56.57)0.596ms0.598ms0.591ms211.151.227.206(211.151.227.206)0.546ms0.544ms0.538ms210.77.139.145(210.77.139.145)0.710MS0.748MS0.801MS202.106.42.101(202.106.42.101)6.759ms6.945ms7.107ms61.148.148.154.97(61.148.154.154.97)718.97)718.9708MS*BIT5.18.908.BIT.BIT*BIT.BIT65.58.213(124.65.58.213)4.343ms4.336ms4.367ms202.106.35.190(202.106.35.190)1.795ms61.148.156.138(61.6898.1**1**1ms)1**1ms*[root@localhost~]#可以看到第一行输出检测到的主机名和对应的IP,允许检测的最大跳数,发送的数据包字节数,后面的每一行代表每一跳的信息,包括IP信息,3个延迟值(因为默认每一跳会发3个检测包),最后会看到三个***,说明本跳被防火墙过滤,检测包被丢弃。②设置TTL最大跳数:-mmax_ttl默认TTL为30跳。[root@localhost~]#traceroute-m10www.baidu.comtraceroutetowww.baidu.com(61.135.169.105),10hopsmax,40bytepackets192.168.74.2(192.168.74.2)1.534ms1.775ms1.961ms211.151.56.1(1)156.10.508MS??0.514MS0.507MS211.151.227.206(211.151.227.206)0.571MS0.558MS0.550MS210.77.139.145(210.77.77.139.145311msbt-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.124.7.ms1221(124.65.58.221)4.875ms61.148.146.29(61.148.146.29)2.124MS124.65.58.221(124.65.58.221)3.505ms123.126.6.198(123.126.6.198)2.885ms******[root@localhost~]#可见最大跳数应该是10跳。③每一跳不做DNS解析,不显示主机名:-ntraceroute-nwww.baidu.com[root@localhost~]#traceroute-nwww.baidu.comtraceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets211.151.74.25.430ms5.636ms5.802ms211.151.56.570.627ms0.625ms0.617ms211.151.227.2060.575ms0.584ms0.576ms210.77.139.1450.703ms0.754ms0.806ms202.106.42.10123.683ms23.869ms23.998ms202.106.228.37247.101ms**61.148.146.295.256ms124.65.58.2134.386ms4.373ms202.106.35.1901.610ms61.148.156.1381.786ms61.148.3.342.089#你可以看到那个***#相关的主机名已被删除。④设置UDP端口号为6666:-ptraceroute-p6666www.baidu.com[root@localhost~]#traceroute-p6888www.baidu.comtraceroutetowww.baidu.com(220.181.111.147),30hopsmax,40bytepackets211.151.74.2(211.15174.2)4.927MS5.121MS5.298MS211.151.56.1(211.151.56.1)0.500MS0.499MS0.509MS211.151.224.90(211.151.151.224.90)5.050ms5.313ms5.596ms220.181.17.94(220.181.17.94)1.665ms!X**[root@localhost~]#可以看到消息已经到达目的地,但是显示!X,意思是“管理prohibitscommunication”,对应ICMPtype=3,code=13的数据包。此外还有以下标志:!H,!N,!P:分别表示主机、网络、协议不可达!S:Sourceroutefailed(源路由失败)!F:Fragmentationisrequiredbutnotfragmented(需要分片)!V:Hostprecedenceviolation!C:Precedencecutoffineffect!\:ICMPunreachablecode(ICMP不可达代码\)⑤设置检测包数:-qtraceroute-q4www.baidu.com[root@localhost~]#traceroute-q4www.baidu.comtraceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets211.151.74.2(211.151.74.2)40.633ms40.819ms41.004ms.188ms211.151.56.57(211.151.56.57)0.637ms0.633ms0.627ms0.619ms211.151.227.206(211.151.227.206)0.505ms0.580ms0.571ms0.569ms210.77.139.145(210.77.139.145)0.753ms0.800ms0。853MS0.904MS202.106.42.101(202.106.42.101)7.449MS7.543MS7.738MS7.738MS7.893MS61.148.154.97(61.148.154.97)58.213)3.056MS2.993MS2.960MS61.148.146.29(61.148.146.29)2.837ms61.148.3.34(61.148.3.34***[root@localhost~]#可以看出每一跳检测输出4个延迟值⑥设置检测包的等待响应时间:-wtraceroute-w3www.baidu.com[root@localhost~]#traceroute-w3www。baidu.comtraceroutetowww.baidu.com(61.135.169.105),30hopsmax,40bytepackets211.151.74.2(211.151.74.2)2.306ms2.469ms2.650ms211.151.56.1(211.151.56.1)0.621ms0.613ms0.603ms211.151.227.206(211.151.227.206)0.557ms0.560ms0.552ms210.77.139.145(210.77.139.145)0.708ms0.761ms0.817ms202.106.42.101(202.106.42.101)7.520ms7.9228ms-net.cn-ta.2(202.106.228.25)2.890MS2.369MS61.148.154.97(61.148.154.97)471.961MMS1MS124.65.58.221(124.65.58.221)156.6)7.688ms7.756ms******[root@localhost~]#⑦绕过中间的路由检测,直接将包发往目的地traceroute-rwww.baidu.com[root@localhost~]#traceroute-rwww.baidu.comtraceroutetowww.baidu.com(61.135.169.125),30hopsmax,40bytepackets网络不可达[root@localhost~]#可以直接看到网络不可达。⑧检测路径MTUtraceroute--mtuwww.baidu.comroot@pclcache:~#traceroute--mtuwww.baidu.comtraceroutetowww.baidu.com(14.215.177.39),30hopsmax,65000bytepackets1192.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可见检测到MTUF=1500。OK,除了这个,还有更多的用法。有兴趣的可以通过mantraceroute查看更多用法。