显示数据包到主机间的路径
traceroute 是一个用于追踪网络数据包的路由途径的命令,它可以显示数据包从本地主机到目的主机经过的所有中间节点,以及每个节点的响应时间。
traceroute 命令可以帮助我们诊断网络连接的问题,比如延迟、丢包、路由环路等。traceroute 命令使用的协议是 TCP/IP,它发送 UDP 数据包,并利用 TTL(Time to Live)字段和 ICMP(Internet Control Message Protocol)消息来实现路由跟踪的功能。
traceroute 命令在大多数 Linux 发行版中都是预装的,可以直接使用。如果没有安装,可以使用以下命令进行安装:
对于基于 Debian 的 Linux 系统,如 Ubuntu
apt-get install traceroute
对于基于 Red Hat 的 Linux 系统,如 CentOS
yum install traceroute
对于基于 Arch 的 Linux 系统,如 Manjaro
pacman -S traceroute
traceroute [选项] [主机名称或IP地址] [数据包大小]
其中,主机名称或IP地址是必须指定的参数,表示要跟踪的目的主机。数据包大小是可选的参数,表示要发送的UDP数据包的大小,默认是40字节。
| 选项 | 说明 |
|---|---|
| -d | 开启Socket层级的排错功能 |
| -f <存活数值> | 设置第一个检测数据包的存活数值TTL的大小 |
| -F | 设置勿离断位,防止数据包被分片 |
| -g <网关> | 设置来源路由网关,最多可设置8个 |
| -i <网络界面> | 使用指定的网络界面送出数据包 |
| -I | 使用ICMP回应取代UDP数据包 |
| -m <存活数值> | 设置检测数据包的最大存活数值TTL的大小 |
| -n | 直接使用IP地址而非主机名称 |
| -p <通信端口> | 设置UDP传输协议的通信端口 |
| -r | 忽略普通的路由表,直接将数据包送到远端主机上 |
| -s <来源地址> | 设置本地主机送出数据包的IP地址 |
| -t <服务类型> | 设置检测数据包的TOS数值 |
| -v | 详细显示指令的执行过程 |
| -w <超时秒数> | 设置等待远端主机回报的时间 |
| -x | 开启或关闭数据包的正确性检验 |
$ traceroute www.58.com
traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets
1 unknown (192.168.2.1) 3.453 ms 3.801 ms 3.937 ms
2 221.6.45.33 (221.6.45.33) 7.768 ms 7.816 ms 7.840 ms
3 221.6.0.233 (221.6.0.233) 13.784 ms 13.827 ms 221.6.9.81 (221.6.9.81) 9.758 ms
4 221.6.2.169 (221.6.2.169) 11.777 ms 122.96.66.13 (122.96.66.13) 34.952 ms 221.6.2.53 (221.6.2.53) 41.372 ms
5 219.158.96.149 (219.158.96.149) 39.167 ms 39.210 ms 39.238 ms
6 123.126.0.194 (123.126.0.194) 37.270 ms 123.126.0.66 (123.126.0.66) 37.163 ms 37.441 ms
7 124.65.57.26 (124.65.57.26) 42.787 ms 42.799 ms 42.809 ms
8 61.148.146.210 (61.148.146.210) 30.176 ms 61.148.154.98 (61.148.154.98) 32.613 ms 32.675 ms
9 202.106.42.102 (202.106.42.102) 44.563 ms 44.600 ms 44.627 ms
10 210.77.139.150 (210.77.139.150) 53.302 ms 53.233 ms 53.032 ms
11 211.151.104.6 (211.151.104.6) 39.585 ms 39.502 ms 39.598 ms
12 211.151.111.30 (211.151.111.30) 35.161 ms 35.938 ms 36.005 ms
记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果用traceroute -q 4 www.58.com,表示向每个网关发送4个数据包。
有时我们traceroute一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。
有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会有延时长的现象;您可以加-n参数来避免DNS解析,以IP格式输出数据。
如果在局域网中的不同网段之间,我们可以通过 traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到 traceroute 追踪数据包所经过的网关,提交 IDC 服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC 服务商也不可能帮助我们解决。
$ traceroute www.google.com 100
traceroute: Warning: www.google.com has multiple addresses; using 142.250.67.228
traceroute to www.google.com (142.250.67.228), 30 hops max, 100 byte packets
1 192.168.0.1 (192.168.0.1) 0.867 ms 1.103 ms 1.352 ms
2 10.0.0.1 (10.0.0.1) 2.439 ms 2.692 ms 2.955 ms
3 100.64.0.1 (100.64.0.1) 4.307 ms 4.569 ms 4.831 ms
4 202.97.33.1 (202.97.33.1) 6.175 ms 6.438 ms 6.700 ms
...
$ traceroute -m 15 www.example.com
traceroute to www.example.com (93.184.216.34), 15 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.123 ms 1.456 ms
2 10.0.0.1 (10.0.0.1) 5.678 ms 5.789 ms 5.890 ms
3 203.0.113.1 (203.0.113.1) 10.123 ms 10.234 ms 10.345 ms
...
$ traceroute -w 2000 www.example.com
traceroute to www.example.com (93.184.216.34), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.123 ms 1.456 ms
2 10.0.0.1 (10.0.0.1) 5.678 ms 5.789 ms 5.890 ms
3 203.0.113.1 (203.0.113.1) 10.123 ms 10.234 ms 10.345 ms
...
$ traceroute -U -p 1234 www.example.com
traceroute to www.example.com (93.184.216.34), 30 hops max, 60 byte packets
1 192.168.1.1 (192.168.1.1) 1.234 ms 1.123 ms 1.456 ms
2 10.0.0.1 (10.0.0.1) 5.678 ms 5.789 ms 5.890 ms
3 203.0.113.1 (203.0.113.1) 10.123 ms 10.234 ms 10.345 ms
...