Linux traceroute命令
Linux traceroute命令用于显示数据包到主机间的路径。
traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是60Bytes,用户可另行设置。
traceroute的原理是试图以最小的TTL(存活时间)发出探测包来跟踪数据包到达目标主机所经过的网关,然后监听一个来自网关ICMP的应答。
traceroute 语法
traceroute [-dFlnrvx][-f<存活数值>][-g<网关>...][-i<网络界面>][-m<存活数值>][-p<通信端口>][-s<来源地址>][-t<服务类型>][-w<超时秒数>][主机名称或IP地址][数据包大小]
参数说明:
-
-d 使用Socket层级的排错功能。
-
-f<存活数值> 设置第一个检测数据包的存活数值TTL的大小。
-
-F 设置勿离断位。
-
-g<网关> 设置来源路由网关,最多可设置8个。
-
-i<网络界面> 使用指定的网络界面送出数据包。
-
-I 使用ICMP回应取代UDP资料信息。
-
-s<来源地址> 设置本地主机送出数据包的IP地址。
-
-t<服务类型> 设置检测数据包的TOS数值。
-
-v 详细显示指令的执行过程。
-
-x 开启或关闭数据包的正确性检验。
traceroute原理:
程序利用增加存活时间(TTL)来实现其功能。每当数据包(3个数据包包括源地址,目的地址和包发出的时间标签)经过一个路由器,其存活时间就会减1。当其存活时间是0时,主机便取消数据包,并传送一个ICMP(Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。) TTL数据包给原数据包的发出者。
traceroute程序完整过程:
首先它发送一份TTL字段为1的IP数据包给目的主机,处理这个数据包的第一个路由器将TTL值减1,然后丢弃该数据报,并给源主机发送一个ICMP报文(“超时”信息,这个报文包含了路由器的IP地址,这样就得到了第一个路由器的地址),然后traceroute发送一个TTL为2的数据报来得到第二个路由器的IP地址,继续这个过程,直至这个数据报到达目的主机。
如果执行 traceroute 提示下面的错误,则说明没有安装次命令
CentOS Linux Error: -bash: traceroute: command not found
[root@xinbiancheng.cn]$ traceroute -m 10 www.baidu.com
-bash: traceroute: command not found
traceroute 命令安装如下:
[root@xinbiancheng.cn]$ yum install traceroute
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base | 3.6 kB 00:00:00
......显示信息省略
---> Package traceroute.x86_64 3:2.0.22-2.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
......显示信息省略
Installed:
traceroute.x86_64 3:2.0.22-2.el7
Complete!
traceroute 实例
[root@xinbiancheng.cn]$ traceroute www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets
1 * * *
2 11.63.128.153 (11.63.128.153) 7.449 ms 11.63.124.217 (11.63.124.217) 5.086 ms 4.983 ms
......省略显示信息
30 * * *
说明:
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果您用 traceroute -q 4 www.baidu.com ,表示向每个网关发送4个数据包。见下图:
[root@xinbiancheng.cn]$ traceroute -q 4 www.baidu.com
traceroute to www.baidu.com (220.181.38.150), 30 hops max, 60 byte packets
1 * * * *
2 11.63.125.25 (11.63.125.25) 4.581 ms 11.63.128.217 (11.63.128.217) 3.646 ms 11.63.128.153 (11.63.128.153) 4.210 ms 11.63.128.217 (11.63.128.217) 3.745 ms
......省略显示信息
30 * * *
去掉ip地址之后分别是 4.581 ms 3.646 ms 4.210 ms 3.745 ms 4个时间,则说明向每个网关发送4个数据包
有时我们traceroute 一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n 参数来避免DNS解析,以IP格式输出数据。
如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。
traceroute -m 跳数设置
[root@xinbiancheng.cn]$ traceroute -m 3 www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 3 hops max, 60 byte packets
1 * * *
2 11.63.128.153 (11.63.128.153) 4.082 ms * *
3 11.63.128.82 (11.63.128.82) 9.683 ms 11.63.128.98 (11.63.128.98) 7.502 ms 11.63.128.66 (11.63.128.66) 10.118 ms
说明:通过结果可以看到存活数值=3,当存活数值=0时,主机便取消数据包
traceroute -p 探测包使用的基本UDP端口设置6888
[root@xinbiancheng.cn]$ traceroute -p 6888 www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets
1 * * *
2 11.63.128.217 (11.63.128.217) 3.751 ms 11.63.128.153 (11.63.128.153) 3.470 ms 11.63.128.217 (11.63.128.217) 3.584 ms
......省略显示信息
30 * * *
traceroute -w 把对外发探测包的等待响应时间设置为3秒
[root@xinbiancheng.cn]$ traceroute -w 3 www.baidu.com
traceroute to www.baidu.com (220.181.38.149), 30 hops max, 60 byte packets
1 * * *
2 11.63.125.25 (11.63.125.25) 5.725 ms 5.496 ms 5.649 ms
......省略显示信息
30 * * *
traceroute -n 显示IP地址,不查主机名
[root@xinbiancheng.cn]$ traceroute -n www.baidu.com
traceroute to www.baidu.com (220.181.38.150), 30 hops max, 60 byte packets
1 * * *
2 11.63.125.25 4.885 ms 5.052 ms 11.63.128.217 6.051 ms
......省略显示信息
30 * * *
traceroute -r 绕过正常的路由表,直接发送到网络相连的主机
[root@xinbiancheng.cn]$ traceroute -r www.baidu.com
traceroute to www.baidu.com (220.181.38.150), 30 hops max, 60 byte packets
connect: Network is unreachable
windows之tracert:
格式:
tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name
参数说明:
tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
该诊断实用程序通过向目的地发送具有不同生存时间 (TL) 的 Internet 控制信息协议 (CMP) 回应报文,以确定至目的地的路由。路径上的每个路由器都要在转发该 ICMP 回应报文之前将其 TTL 值至少减 1,因此 TTL 是有效的跳转计数。当报文的 TTL 值减少到 0 时,路由器向源系统发回 ICMP 超时信息。通过发送 TTL 为 1 的第一个回应报文并且在随后的发送中每次将 TTL 值加 1,直到目标响应或达到最大 TTL 值,Tracert 可以确定路由。通过检查中间路由器发发回的 ICMP 超时 (ime Exceeded) 信息,可以确定路由器。注意,有些路由器“安静”地丢弃生存时间 (TLS) 过期的报文并且对 tracert 无效。
参数:
-d 指定不对计算机名解析地址。
-h maximum_hops 指定查找目标的跳转的最大数目。
-jcomputer-list 指定在 computer-list 中松散源路由。
-w timeout 等待由 timeout 对每个应答指定的毫秒数。
target_name 目标计算机的名称。
C:\Users\Administrator>tracert www.baidu.com
通过最多 30 个跃点跟踪
到 www.baidu.com [36.152.44.96] 的路由:
1 <1 毫秒 <1 毫秒 <1 毫秒 192.168.0.1
2 1 ms <1 毫秒 <1 毫秒 RTK_GW.bbrouter [192.168.1.1]
3 3 ms 3 ms 2 ms 100.64.0.1
4 4 ms 3 ms 3 ms 111.47.31.205
5 4 ms 4 ms 4 ms 221.183.58.101
6 * * * 请求超时。
7 29 ms 29 ms 27 ms 221.183.59.54
8 * * * 请求超时。
9 21 ms 20 ms 33 ms LZD-20191216MZD [182.61.216.72]
10 * * * 请求超时。
11 27 ms 27 ms 27 ms www.baidu.com [36.152.44.96]
跟踪完成。
知识扩展:
目的主机接受在接收到TTL值为1的IP数据包是不会丢失的吧,这样也不会产生一个超时的ICMP数据报文了,那么程序如何判断是否已经到达目的主机了呢?
在Linux下,traceroute程序发送一个UDP数据报给目的主机,但是它选择一个不可能的值作为UDP端口号(大于30000),使目的主机的任何一个应用程序都不可能使用该端口,因此该数据报到达目的主机时,目的主机会产生一个“端口不可达”错误的ICMP报文,这样traceroute程序要做的就是区分接收到的ICMP报文是超时还是端口不可达,从而来区分是路由器还是目的主机