我知道 BSD 中的 traceroute 默认使用 UDP,并在 TTL 递减并发现为 0 时从中间跃点获取 ICMP 错误消息。我的问题是 - 如果我们跟踪到下一跃点路由器的路由怎么办: - 路由器是否应该以无法访问的端口响应信息?
“跟踪路由”到下一跳作为目的地
正如 Ron 所说,这是一个非常简单的测试 - 如果您还没有尝试过,那么您应该尝试一下。
在 BSD 系统中,traceroute 将使用一系列高的、未注册的 UDP 端口号以及 TTL。发起探测的设备将发送 3 个探测,它们看起来像这样:
注意:端口号在您的测试中不一定准确。
- 探测 1: TTL = 1 UDP 端口 = 33434
- 探针 2: TTL = 1 UDP 端口 = 33435
- 探针 3: TTL = 1 UDP 端口 = 33436
在我们没有跟踪到下一个跃点的情况下,您将看到来自下一个设备的以下消息:
超过生存时间
这是我们所期望的,随着 traceroute 的进行,下一个设备的探测器将如下所示:
- 探针 1: TTL = 2 UDP 端口 = 33437
- 探针 2: TTL = 2 UDP 端口 = 33438
- 探针 3: TTL = 2 UDP 端口 = 33439
现在假设第二组探测器将到达我们的预定目的地。我们将得到的响应是(这是直接来自 tcpdump 的一部分):
udp 端口 33437 无法访问
现在这是什么意思?这意味着我们已经到达目的地,因为只有我们的目的地可以说“不,此端口不可用”(正如我们对更高未注册 UDP 端口范围所期望的那样)。
我的问题是 - 如果我们跟踪到下一跳路由器的路由怎么办: - 路由器是否应该以端口不可达消息响应?
traceroute 很酷的一点是,它不知道你是要在 20 跳外还是仅仅 1 跳外打东西——它需要能够适应任何这些情况。
因此,它的行为与 20 跳跟踪路由中的最后一跳没有什么不同。
如果你跟踪你的下一跳,你的探测看起来是一样的:
- 探测 1: TTL = 1 UDP 端口 = 33434
- 探针 2: TTL = 1 UDP 端口 = 33435
- 探针 3: TTL = 1 UDP 端口 = 33436
但不同的是,TTL 为 1 足以到达您的下一跳。所以你会马上看到“udp port XXXXX unreachable”消息,暗示traceroute已经完成。而不是看到“超过生存时间”消息。
我希望这有助于澄清问题,如果您有任何其他与此相关的问题 - 请发表评论,我很乐意更新我的答案。
路由器将执行其配置的任何操作。ICMP 消息是一种礼貌,可以静默丢弃流量或提供 ICMP 响应。这是协议的可选部分。关于路由器是否应该发送 ICMP 响应有两种观点。第一个是它允许对网络的可见性并允许您解决问题,而第二个则认为它是一种安全风险,认为掩盖您对设备的可见性可以提供安全性。
Traceroute 用于查找您与目的地之间的跃点。在跳数之间,无论 TTL 不受影响的跳数是多少,TTL 都与路由协议有关。如果您执行跟踪路由并且无法访问,则意味着您(主机)和目的地之间将出现连接问题。尝试检查物理层、第 2 层,当然还有第 3 层(因为我怀疑你甚至可以 ping)。