traceroute 在 linux 中(在虚拟机中)只显示 * * *,但在 windows 中可以正确显示所有 IP

traceroute 在 linux 中(在虚拟机中)只显示 * * *,但在 windows 中可以正确显示所有 IP

我使用 Windows PowerShell 对 google 进行了 tracert,所有站点的 IP 地址都显示正确。

但是,如果我在虚拟机中的 Linux 中对同一台服务器执行相同操作,我只会看到 * * * 。

 1  _gateway (10.0.2.2)  5.955 ms  5.568 ms  5.228 ms
 2  * * *
 3  * * *
 4  * * *
 5  * * *
 6  * * *
 7  * * *
 8  * * *
 9  * * *
10  * * *
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
22  * * *
23  * * *
24  * * *
25  * * *
26  * * *
27  * * *
28  * * *
29  * * *
30  * * *

为什么这个?

答案1

tracertWindows和 Linuxtraceroute默认使用的数据包不同。Windowstracert发送 ICMP 数据包,而 Linuxtraceroute发送 UDP 数据包。在您的示例中,UDP 端口在每个跃点处都被阻止,但 ICMP 是允许的,因此这解释了您看到的差异。

维基百科:跟踪路由

在类 Unix 操作系统上,traceroute 默认发送一系列用户数据报协议 (UDP) 数据包,其目标端口号范围从 33434 到 33534;Linux、FreeBSD、NetBSD、OpenBSD、DragonFly BSD 和 macOS 附带的 traceroute 实现包括使用 ICMP 回显请求数据包 (-I) 或任何任意协议 (-P)(例如 UDP、使用 TCP SYN 数据包的 TCP 或 ICMP)的选项。

在 Windows 上,tracert 发送 ICMP Echo Request 数据包,而不是 traceroute 默认发送的 UDP 数据包。

您可以traceroute通过添加该选项在 Linux 中使用 ICMP 数据包-I

跟踪路由

路由追踪

打印数据包到达网络主机所经过的路由。

句法
traceroute [options] host [packetsize]

选项:

 -I    Use ICMP ECHO for probes

答案2

总结完全禁用 Windows 防火墙,或者允许 ICMP 超时数据包通过 WF。

我有一篇更详细、更透彻的文章我的博客

问题

这就是答案

如果您的主机上的 Windows 防火墙已打开,您将看到此行为 - 只有第一个和最后一个设备响应。如果已关闭,则它可以正常工作(至少对我来说)。

详细原因是,traceroute通过发送 ICMP Echo 请求,TTL 从 1 开始增加,因此当它们“死亡”时,中间路由器会发回ICMP 时间已超出数据包Windows 防火墙意外

解决方案

显而易见的解决方案是完全关闭 Windows 防火墙,但这对某些用户来说可能不安全。

解决方案无需关闭 Windows 防火墙是明确允许 ICMP 时间超出 (ICMPv4 类型 11 / ICMPv6 类型 3) 进入。可以按如下方式完成:

  • 打开Windows防火墙:开始Windows 管理工具具有高级安全性的 Windows Defender 防火墙(是的,这个名字很冗长)

  • 选择入境规则在左侧

  • 选择新规则...在右侧

    图像

  • 按照提示操作。按顺序选择以下选项:

    • 规则类型:风俗
    • 程序:所有程序(只需点击下一个
    • 协议和端口:
      • 协议类型:ICMPv4
      • (选修的)Internet 控制消息协议 (ICMP) 设置:单击定制→ 选择特定 ICMP 类型并勾选超出时间
    • 范围:任何 IP 地址对于两者(只需点击下一个
    • 行动:允许(只需点击下一个
    • 个人资料:选择全部(只需单击下一个
    • 姓名:核心网络 - 超时 (ICMPv4-In)(显然您喜欢的任何名称)
  • 点击结束如果你使用mtr(我的跟踪路由)

  • (选修的)重复上述步骤,但选择ICMPv6为了协议类型如果您想启用 IPv6 跟踪路由。

相关内容