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

traceroute 介绍

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

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

traceroute 主要用途

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

  • 确定通信双方路径上经过的路由器设备

  • 确定 UDP 包是否成功达到目的地

  • 发现路径 MTU

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

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

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

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

常用命令案例

traceroute 使用格式是:

traceroute「参数」「主机」

# traceroute --help
Usage:
  traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,... ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w MAX,HERE,NEAR ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ --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 ~]# traceroute www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
 192.168.74.2 (192.168.74.2)  2.606 ms  2.771 ms  2.950 ms
 211.151.56.57 (211.151.56.57)  0.596 ms  0.598 ms  0.591 ms
 211.151.227.206 (211.151.227.206)  0.546 ms  0.544 ms  0.538 ms
 210.77.139.145 (210.77.139.145)  0.710 ms  0.748 ms  0.801 ms
 202.106.42.101 (202.106.42.101)  6.759 ms  6.945 ms  7.107 ms
 61.148.154.97 (61.148.154.97)  718.908 ms * bt-228-025.bta.net.cn (202.106.228.25)  5.177 ms
 124.65.58.213 (124.65.58.213)  4.343 ms  4.336 ms  4.367 ms
 202.106.35.190 (202.106.35.190)  1.795 ms 61.148.156.138 (61.148.156.138)  1.899 ms  1.951 ms
 * * *
 * * *
[root@localhost ~]#

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

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

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

默认 TTL 是 30 跳。

traceroute-m10www.baidu.com

[root@localhost ~]# traceroute -m 10 www.baidu.com
traceroute to www.baidu.com (61.135.169.105), 10 hops max, 40 byte packets
 192.168.74.2 (192.168.74.2)  1.534 ms  1.775 ms  1.961 ms
 211.151.56.1 (211.151.56.1)  0.508 ms  0.514 ms  0.507 ms
 211.151.227.206 (211.151.227.206)  0.571 ms  0.558 ms  0.550 ms
 210.77.139.145 (210.77.139.145)  0.708 ms  0.729 ms  0.785 ms
 202.106.42.101 (202.106.42.101)  7.978 ms  8.155 ms  8.311 ms
 bt-228-037.bta.net.cn (202.106.228.37)  772.460 ms bt-228-025.bta.net.cn (202.106.228.25)  2.152 ms 61.148.154.97 (61.148.154.97)  772.107 ms
 124.65.58.221 (124.65.58.221)  4.875 ms 61.148.146.29 (61.148.146.29)  2.124 ms 124.65.58.221 (124.65.58.221)  4.854 ms
 123.126.6.198 (123.126.6.198)  2.944 ms 61.148.156.6 (61.148.156.6)  3.505 ms 123.126.6.198 (123.126.6.198)  2.885 ms
 * * *
 * * *
[root@localhost ~]#

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

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

traceroute-n www.baidu.com

[root@localhost ~]# traceroute -n www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
 211.151.74.2  5.430 ms  5.636 ms  5.802 ms
 211.151.56.57  0.627 ms  0.625 ms  0.617 ms
 211.151.227.206  0.575 ms  0.584 ms  0.576 ms
 210.77.139.145  0.703 ms  0.754 ms  0.806 ms
 202.106.42.101  23.683 ms  23.869 ms  23.998 ms
 202.106.228.37  247.101 ms * *
 61.148.146.29  5.256 ms 124.65.58.213  4.386 ms  4.373 ms
 202.106.35.190  1.610 ms 61.148.156.138  1.786 ms 61.148.3.34  2.089 ms
 * * *
 * * *
[root@localhost ~]#

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

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

traceroute-p6666www.baidu.com

[root@localhost ~]# traceroute -p 6888 www.baidu.com
traceroute to www.baidu.com (220.181.111.147), 30 hops max, 40 byte packets
 211.151.74.2 (211.151.74.2)  4.927 ms  5.121 ms  5.298 ms
 211.151.56.1 (211.151.56.1)  0.500 ms  0.499 ms  0.509 ms
 211.151.224.90 (211.151.224.90)  0.637 ms  0.631 ms  0.641 ms
 * * *
 220.181.70.98 (220.181.70.98)  5.050 ms  5.313 ms  5.596 ms
 220.181.17.94 (220.181.17.94)  1.665 ms !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 -q 4 www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
 211.151.74.2 (211.151.74.2)  40.633 ms  40.819 ms  41.004 ms  41.188 ms
 211.151.56.57 (211.151.56.57)  0.637 ms  0.633 ms  0.627 ms  0.619 ms
 211.151.227.206 (211.151.227.206)  0.505 ms  0.580 ms  0.571 ms  0.569 ms
 210.77.139.145 (210.77.139.145)  0.753 ms  0.800 ms  0.853 ms  0.904 ms
 202.106.42.101 (202.106.42.101)  7.449 ms  7.543 ms  7.738 ms  7.893 ms
 61.148.154.97 (61.148.154.97)  316.817 ms bt-228-025.bta.net.cn (202.106.228.25)  3.695 ms  3.672 ms *
 124.65.58.213 (124.65.58.213)  3.056 ms  2.993 ms  2.960 ms 61.148.146.29 (61.148.146.29)  2.837 ms
 61.148.3.34 (61.148.3.34)  2.179 ms  2.295 ms  2.442 ms 202.106.35.190 (202.106.35.190)  7.136 ms
 * * * *
 * * * *
[root@localhost ~]#

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

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

traceroute-w3www.baidu.com

[root@localhost ~]# traceroute -w 3 www.baidu.com
traceroute to www.baidu.com (61.135.169.105), 30 hops max, 40 byte packets
 211.151.74.2 (211.151.74.2)  2.306 ms  2.469 ms  2.650 ms
 211.151.56.1 (211.151.56.1)  0.621 ms  0.613 ms  0.603 ms
 211.151.227.206 (211.151.227.206)  0.557 ms  0.560 ms  0.552 ms
 210.77.139.145 (210.77.139.145)  0.708 ms  0.761 ms  0.817 ms
 202.106.42.101 (202.106.42.101)  7.520 ms  7.774 ms  7.902 ms
 bt-228-025.bta.net.cn (202.106.228.25)  2.890 ms  2.369 ms 61.148.154.97 (61.148.154.97)  471.961 ms
 124.65.58.221 (124.65.58.221)  4.490 ms  4.483 ms  4.472 ms
 123.126.6.198 (123.126.6.198)  2.948 ms 61.148.156.6 (61.148.156.6)  7.688 ms  7.756 ms
 * * *
 * * *
[root@localhost ~]#

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

traceroute-r www.baidu.com

[root@localhost ~]# traceroute -r www.baidu.com
traceroute to www.baidu.com (61.135.169.125), 30 hops max, 40 byte packets
Network is unreachable
[root@localhost ~]#  

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

⑧ 探测路径 MTU

traceroute--mtu www.baidu.com

root@pclcache:~# traceroute --mtu www.baidu.com
traceroute to www.baidu.com (14.215.177.39), 30 hops max, 65000 byte packets
 1  192.168.109.1 (192.168.109.1)  3.063 ms F=1500  2.908 ms *
 2  192.168.98.36 (192.168.98.36)  1.686 ms  1.422 ms *
 3  113.98.59.57 (113.98.59.57)  7.075 ms  7.544 ms  5.851 ms

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

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


后台回复“加群”,带你进入高手如云交流群

推荐阅读:

程序员编程时戴耳机是在听什么?

硬核!一份操作系统词典,请查收!

一文搞懂HTTP+TCP的长连接和短连接

正确理解CPU使用率和平均负载的关系

和面试官之间关于操作系统的一场对弈

Linux 系统 UDP 丢包问题分析思路

如何拥有一台属于自己的私有云!

晋升、面试中绕不开的性能优化问题
史上最全Linux面试题(2020最新版)

什么是物联网?这里有你需要了解的一切

Kubernetes的架构为什么是这个样的?

任何人都能看得懂的网络协议之ARP

用好你的网络瑞士军刀netcat

一次Linux系统被攻击的分析过程

HTTPS 的 7 次握手以及 9 倍时延

一文搞定 UDP 和 TCP 高频面试题!


喜欢,就给我一个“在看”


10T 技术资源大放送!包括但不限于:云计算、虚拟化、微服务、大数据、网络、Linux、Docker、Kubernetes、Python、Go、C/C++、Shell、PPT 等。在公众号内回复「1024,即可免费获取!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值