我使用 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
tracert
Windows和 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 跟踪路由。