Contents

Linux中Traceroute命令简介

1. 简介

通常,当我们连接到远程主机时,我们的流量不会直接到达所需的机器。相反,它通过网络上的多个路由器。 要跟踪给定数据包的确切路由,我们可以充分利用*traceroute *命令。

2.安装

如果我们还没有安装traceroute,我们需要先安装。例如,在 Ubuntu 中,安装traceroute的命令是:

$ sudo apt install traceroute

3. 例子

让我们从一个简单的例子开始——让我们为blogdemo.com域执行traceroute命令:

$ traceroute blogdemo.com

输出应如下所示:

traceroute: Warning: blogdemo.com has multiple addresses; using 104.18.62.78
traceroute to blogdemo.com (104.18.62.78), 30 hops max, 60 byte packets
 1  192.168.100.1 (192.168.100.1)  5.810 ms  0.791 ms  0.704 ms
 2  10.100.0.1 (10.100.0.1)  1.854 ms  2.031 ms  1.775 ms
 3  10.30.140.1 (10.30.140.1)  1.906 ms  2.216 ms  1.896 ms
 4  60.184.246.94.ip4.epix.net.pl (94.246.184.60)  5.068 ms  5.190 ms  5.205 ms
 5  ae48-48.r7.poland-rs.thinx.atman.pl (212.91.0.10)  5.219 ms  5.394 ms  5.244 ms
 6  cloudflare.thinx.pl (212.91.0.28)  5.787 ms  6.500 ms  6.107 ms
 7  104.18.63.78 (104.18.63.78)  5.379 ms  5.238 ms  5.219 ms

第一行告诉我们这个测试将使用什么目标地址。

其次,我们知道两件事:数据包到达目的地的最大跳数和数据包大小。在我们的例子中,我们有最多 30 跳和一个大小为 60 字节的数据包。默认情况下,traceroute每跳使用三个探测数据包。

输出的其余部分显示了我们的数据包经过的所有路由器。在每一行中,我们都可以找到有关主机名称和 IP 地址的信息。接下来的三个值表示给定路由器的往返时间。

在我们的例子中,要连接到blogdemo.com,请求需要通过七个不同的路由器。在输出中,我们可以看到第一个是本地网络 (192.168.100.1) 中的路由器,最后一个 (104.18.62.78) 是blogdemo.com域的目标主机。

请注意,根据我们的位置,结果可能会有所不同,即使不更改位置,结果也可能会发生变化。路由器协议可以基于例如路由器可用性和使用度量来选择不同的数据包路径。

4. 使用 IPv4 或 IPv6

默认情况下,traceroute命令使用 IPv4 地址来跟踪请求。我们可以通过在主机名前添加-6参数来告诉它使用 IPv6 地址。等效的 tor traceroute -6traceroute6 命令:

$ traceroute6 blogdemo.com

输出应如下所示:

traceroute to blogdemo.com (2606:4700:3030::6812:3e4e), 30 hops max, 80 byte packets
 1  2001:2e8:665:0:2:2:0:1 (2001:2e8:665:0:2:2:0:1)  0.083 ms  0.048 ms  0.044 ms
 2  2001:2e8:22:204::2 (2001:2e8:22:204::2)  25.128 ms  25.047 ms  25.025 ms
 3  2001:2e8:20::22:11 (2001:2e8:20::22:11)  1.106 ms  25.830 ms  1.007 ms
 4  xe-0-0-14-1.a02.tokyjp05.jp.bb.gin.ntt.net (2001:218:2000:5000::305)  0.908 ms  1.197 ms  1.097 ms
 5  ae-25.r02.tokyjp05.jp.bb.gin.ntt.net (2001:218:0:2000::59)  1.515 ms 1.744 ms  1.785 ms
 6  ae-4.r30.tokyjp05.jp.bb.gin.ntt.net (2001:218:0:2000::11a)  1.466 ms 1.538 ms ae-4.r30.tokyjp05.jp.bb.gin.ntt.net (2001:218:0:2000::11a)  1.337 ms
 7  ae-3.r00.tokyjp08.jp.bb.gin.ntt.net (2001:218:0:2000::2d7)  1.857 ms 1.839 ms ae-3.r00.tokyjp08.jp.bb.gin.ntt.net (2001:218:0:2000::2d7)  1.901 ms
 8  as7515.ntt.net (2001:218:2000:5000::26)  2.717 ms  2.419 ms  2.325 ms
 9  2400:cb00:22:1024::a29e:759c (2400:cb00:22:1024::a29e:759c)  2.115 ms 1.985 ms 2400:cb00:22:1024::a29e:759f (2400:cb00:22:1024::a29e:759f)  2.272 ms

正如我们所看到的,结果与使用 IPv4 时的结果非常相似。这次我们有九个路由器。对于它们中的每一个,我们得到主机名、IPv6 地址和三个往返时间。

请注意,互联网服务提供商可能会禁用 IPv6 连接。例如,AWS 在其实例上不支持 IPv6。在这种情况下,我们将看到以下输出:

traceroute6: Warning: blogdemo.com has multiple addresses; using 2606:4700:3036::6812:3f4e
connect: No route to host

我们可以通过使用在线跟踪路由 工具来解决这个问题。

5. 附加选项

该命令为我们提供了许多其他选项。我们可以在Linux 手册页 上找到所有这些内容以及说明。让我们来看看其中的几个。

5.1. 最大跳数

通过添加额外的*-m参数,我们可以**指定traceroute*将探测的最大跳数**:

$ traceroute -m 3 blogdemo.com

现在,输出将仅包含前三个路由器:

...
1  192.168.100.1 (192.168.100.1)  1.446 ms  0.765 ms  0.653 ms
2  10.100.0.1 (10.100.0.1)  2.131 ms  1.982 ms  1.877 ms
3  10.30.140.1 (10.30.140.1)  1.844 ms  2.121 ms  2.181 ms

-m参数的默认值为30。请确保在跃点数可能超过 30 的情况下增加它。

5.2. 偏移跟踪开始

除了设置最大跳数外,我们还可以指定要在哪个主机上开始跟踪。

默认情况下,traceroute总是从第一个 host 开始。我们可以用*-f*参数来改变它:

$ traceroute -f 6 blogdemo.com

现在我们只有blogdemo.com域的最后两个路由器:

...
6  cloudflare.thinx.pl (212.91.0.28)  6.732 ms  6.287 ms  6.271 ms
7  104.18.63.78 (104.18.63.78)  6.518 ms  5.390 ms  5.590 ms

5.3. 每跳探测包数

**默认情况下,traceroute 会为每个网络主机发送三个探测数据包。*这可以通过设置-q*参数来定制:

$ traceroute -q 5 blogdemo.com

现在该命令应该为每个主机发送五个探测数据包:

...
7  104.18.63.78 (104.18.63.78)  5.453 ms  5.446 ms  5.359 ms  5.447 ms  5.406 ms
...

5.4. 探测包大小

** Traceroute的探测包对于 IPv4 是 60 字节,对于 IPv6 是 80 字节。**要跟踪具有不同探测大小的数据包路由,我们可以在主机之后指定所需的值:

$ traceroute blogdemo.com 512

增加traceroute数据包大小的最常见原因是调试 MTU(最大传输单元)问题。除此之外,默认值应该没问题。