Linux网络排查故障路由扫描traceroute命令详解

版权声明:本文为博主原创文章,未经博主允许不得转载。原创不易,各位勉之。 https://blog.csdn.net/LL845876425/article/details/80150390

Linux网络排查故障路由扫描traceroute命令详解

前言

在运维工作中,总是会遇到网络故障的情况,在这样的情况,我们就需要需要trace这个命令来进行路由扫描,通过扫描的过程中查看各个路由节点,根据该节点进行网络问题的分析,其中Linux平台下,就是traceroute命令。这里以CentOS 7.X 系列主机为例来进行具体的说明。

实现原理和功能介绍

traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。

Traceroute最简单的基本用法是:traceroute hostname

Traceroute程序的设计是利用ICMP及IP header的TTL(Time To Live)栏位(field)。首先,traceroute送出一个TTL是1的IP datagram(其实,每次送出的为3个40字节的包,包括源地址,目的地址和包发出的时间标签)到目的地,当路径上的第一个路由器(router)收到这个datagram时,它将TTL减1。此时,TTL变为0了,所以该路由器会将此datagram丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),traceroute 收到这个消息后,便知道这个路由器存在于这个路径上,接着traceroute 再送出另一个TTL是2 的datagram,发现第2 个路由器…… traceroute 每次将送出的datagram的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个datagram 抵达目的地。当datagram到达目的地后,该主机并不会送回ICMP time exceeded消息,因为它已是目的地了,那么traceroute如何得知目的地到达了呢?

Traceroute在送出UDP datagrams到目的地时,它所选择送达的port number 是一个一般应用程序都不会用的号码(30000 以上),所以当此UDP datagram 到达目的地后该主机会送回一个「ICMP port unreachable」的消息,而当traceroute 收到这个消息时,便知道目的地已经到达了。所以traceroute 在Server端也是没有所谓的Daemon 程式。

Traceroute提取发 ICMP TTL到期消息设备的IP地址并作域名解析。每次 ,Traceroute都打印出一系列数据,包括所经过的路由设备的域名及 IP地址,三个包每次来回所花时间。

常用选项实例

# 可直接使用yum进行安装
[root@python-0308 ~]# yum -y install traceroute
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * epel: ftp.jaist.ac.jp
 * extras: mirrors.tuna.tsinghua.edu.cn
 * updates: mirrors.neusoft.edu.cn
Package 3:traceroute-2.0.22-2.el7.x86_64 already installed and latest version
Nothing to do

默认用法:
traceroute [IP/hostname]
操作实例:

[root@python-0308 ~]# traceroute www.baidu.com
traceroute to www.baidu.com (220.181.111.188), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  100.86.0.1 (100.86.0.1)  8.679 ms  8.748 ms  8.916 ms
 4  10.39.3.177 (10.39.3.177)  9.017 ms  9.069 ms  9.250 ms
 5  192.168.10.2 (192.168.10.2)  8.564 ms  8.488 ms  8.682 ms
 6  * * *
 7  10.44.3.196 (10.44.3.196)  7.778 ms  7.834 ms  7.901 ms
 8  10.44.3.205 (10.44.3.205)  2.293 ms * *
 9  10.44.2.18 (10.44.2.18)  2.347 ms  2.154 ms  2.189 ms
10  10.1.0.146 (10.1.0.146)  2.539 ms  2.539 ms  2.573 ms
11  10.1.0.117 (10.1.0.117)  3.057 ms 10.1.0.105 (10.1.0.105)  2.849 ms 10.1.0.117 (10.1.0.117)  2.922 ms
12  106.120.190.117 (106.120.190.117)  13.507 ms 10.1.0.1 (10.1.0.1)  3.910 ms 106.120.190.121 (106.120.190.121)  10.949 ms
13  218.30.104.61 (218.30.104.61)  72.186 ms 106.120.190.121 (106.120.190.121)  11.269 ms  9.933 ms
14  220.181.16.153 (220.181.16.153)  4.900 ms * *
15  * * 220.181.182.38 (220.181.182.38)  3.761 ms
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *
[root@python-0308 ~]# 

说明:
traceroute 默认是使用udp协议,端口选取30000以上的。
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果您用 traceroute -q 4 www.baidu.com ,表示向每个网关发送4个数据包。

有时我们traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了返回信息,所以我们得不到什么相关的数据包返回数据。

有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n 参数来避免DNS解析,以IP格式输出数据。

扫描二维码关注公众号,回复: 3054191 查看本文章

如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题。

-T 表示使用TCP协议进行路由扫描:
使用实例如下:

[root@python-0308 ~]# traceroute -T www.baidu.com
traceroute to www.baidu.com (220.181.111.188), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  100.86.0.1 (100.86.0.1)  9.565 ms  9.473 ms  9.327 ms
 4  10.39.3.177 (10.39.3.177)  9.110 ms  9.194 ms  9.339 ms
 5  192.168.10.2 (192.168.10.2)  9.138 ms  9.325 ms  8.859 ms
 6  * * *
 7  10.44.3.196 (10.44.3.196)  7.804 ms  8.025 ms  8.102 ms
 8  10.44.3.205 (10.44.3.205)  2.232 ms  7.364 ms  7.258 ms
 9  10.44.2.18 (10.44.2.18)  2.012 ms  2.188 ms  1.782 ms
10  10.1.0.146 (10.1.0.146)  3.197 ms  2.831 ms  2.480 ms
11  10.1.0.117 (10.1.0.117)  3.154 ms 10.1.0.105 (10.1.0.105)  3.843 ms  3.757 ms
12  10.1.0.1 (10.1.0.1)  3.887 ms 106.120.190.121 (106.120.190.121)  5.496 ms 10.1.0.1 (10.1.0.1)  3.423 ms
13  220.181.16.153 (220.181.16.153)  5.007 ms  4.329 ms  3.608 ms
14  * 220.181.16.153 (220.181.16.153)  4.159 ms *
15  * * 220.181.17.18 (220.181.17.18)  3.822 ms
16  * 220.181.182.38 (220.181.182.38)  4.703 ms *
17  * * *
18  * * *
19  220.181.111.188 (220.181.111.188)  3.809 ms *  4.739 ms

这里在添加-n选项,表示不进行DNS解析,再次运行命令查看运行结果,就发现在路由扫描中节点就会出现差异。

[root@python-0308 ~]# traceroute -Tn www.baidu.com
traceroute to www.baidu.com (220.181.112.244), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  100.86.0.1  8.939 ms  8.863 ms  8.757 ms
 4  10.39.3.177  8.455 ms  8.732 ms  8.297 ms
 5  192.168.10.2  8.975 ms  8.123 ms  9.541 ms
 6  * * *
 7  10.44.3.196  10.148 ms  9.544 ms  10.255 ms
 8  10.44.3.205  7.173 ms  7.106 ms  2.275 ms
 9  10.44.2.18  1.959 ms  1.970 ms  1.847 ms
10  10.1.0.146  4.027 ms  3.941 ms  2.588 ms
11  10.1.0.117  19.537 ms  18.332 ms 10.1.0.105  2.778 ms
12  106.120.190.117  6.280 ms 10.1.0.1  21.312 ms 218.30.104.61  6.847 ms
13  106.120.190.121  7.447 ms  6.742 ms 106.120.190.117  6.554 ms
14  220.181.16.153  4.783 ms  3.800 ms *
15  * 220.181.17.90  3.700 ms  3.644 ms
16  220.181.17.146  4.224 ms 220.181.182.38  4.717 ms *
17  * * 220.181.112.244  3.617 ms
[root@python-0308 ~]# 

还可以添加端口进行具体的端口进行路由扫描,添加-p选项,查看结果:

[root@python-0308 ~]# traceroute -Tn -p 80 www.baidu.com
traceroute to www.baidu.com (220.181.112.244), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  100.86.0.1  8.258 ms  8.166 ms  8.152 ms
 4  10.39.3.177  11.111 ms  11.217 ms  11.894 ms
 5  192.168.10.2  11.410 ms  11.526 ms  11.453 ms
 6  * * *
 7  10.44.3.196  8.028 ms  5.662 ms  5.315 ms
 8  10.44.3.205  3.587 ms  3.536 ms  3.463 ms
 9  10.44.2.18  2.417 ms  1.676 ms  1.625 ms
10  10.1.0.146  3.137 ms  3.243 ms  2.933 ms
11  10.1.0.105  2.464 ms  2.444 ms 10.1.0.117  2.716 ms
12  10.1.0.1  3.499 ms  2.909 ms 218.30.104.61  13.199 ms
13  106.120.190.117  12.811 ms 220.181.16.153  3.787 ms 106.120.190.121  13.037 ms
14  220.181.16.153  4.490 ms  3.830 ms *
15  220.181.17.22  4.203 ms 220.181.17.150  3.616 ms 220.181.17.22  3.626 ms
16  220.181.17.22  5.035 ms 220.181.17.90  4.290 ms *
17  * 220.181.112.244  3.564 ms *
[root@python-0308 ~]# 

以上是在网络排障时,比较常见的几种应用场景,可根据不同的业务场景,选取不同的参数来进行路由扫描,以做到问题明确定位。

其他参数选项

  • -d:使用Socket层级的排错功能;
  • -f<存活数值>:设置第一个检测数据包的存活数值TTL的大小;
  • -F:设置勿离断位;
  • -g<网关>:设置来源路由网关,最多可设置8个;
  • -i<网络界面>:使用指定的网络界面送出数据包;
  • -I:使用ICMP回应取代UDP资料信息;
  • -m<存活数值>:设置检测数据包的最大存活数值TTL的大小;
  • -n:直接使用IP地址而非主机名称;
  • -p<通信端口>:设置UDP传输协议的通信端口;
  • -r:忽略普通的Routing Table,直接将数据包送到远端主机上。
  • -s<来源地址>:设置本地主机送出数据包的IP地址;
  • -t<服务类型>:设置检测数据包的TOS数值;
  • -v:详细显示指令的执行过程;
  • -w<超时秒数>:设置等待远端主机回报的时间;
  • -x:开启或关闭数据包的正确性检验。

猜你喜欢

转载自blog.csdn.net/LL845876425/article/details/80150390