今天仍然需要手动设置 MTU?

网络工程 网络发现 包路径
2021-07-05 12:12:12

症状

  • ssh 到远程主机的工作原理。
  • ls作品一样简单的输出
  • 但是更多的输出像find /失败了。

解决方案

在我们的例子中,我们将 eth0 (IPv4) 上的 MTU 减少到 1200,症状消失了。

问题

AFAIK 有一种叫做路径 MTU 发现的东西

来自维基百科:

许多网络安全设备为了安全利益而阻止所有 ICMP 消息

如果这是原因,如何调试?

1个回答

路径 MTU 发现通过将不同大小的数据包发送到启用了 DF(不分片)位的目标来工作。如果路径中的路由器具有较小的 MTU,它的行为应该是发回 ICMP 消息,说明数据包需要被分段,但 DF 位设置为 1。通常这个数据包甚至包括需要分段的链路 MTU 的大小。

要对此进行调试,您只需手动进行路径 MTU 发现。

向目标发送 ping,在我的示例中,我将使用 Google 的 DNS 服务器 (8.8.8.8)。将 ping 中的 DF 位设置为 on,以防止 ping 被碎片化。将您的数据包大小设置为某个较大的数字,或 1500 的标准 MTU。请注意,某些 ping 实现仅设置有效负载的大小,这意味着您必须考虑 8 字​​节 ICMP 标头和 20 字节 IP 标头。

在 Windows PC 上,这是命令:

C:\Users\eddie>ping -f -l 1472 -i 1 8.8.8.8

Pinging 8.8.8.8 with 1472 bytes of data:
Reply from 10.200.192.1: TTL expired in transit.
Reply from 10.200.192.1: TTL expired in transit.
Reply from 10.200.192.1: TTL expired in transit.
Reply from 10.200.192.1: TTL expired in transit.

Ping statistics for 8.8.8.8:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss)

请注意,我从我的第一个路由器收到 TTL 过期。这就是我想要看到的,它告诉我在我和我的第一个路由器之间的路径中没有任何内容需要分段。

如果是这样,它看起来像这样:

C:\Users\eddie>ping -f -l 1473 -i 1 8.8.8.8

Pinging 8.8.8.8 with 1473 bytes of data:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.

Ping statistics for 8.8.8.8:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss)

无论哪种方式,逐步执行此操作,每次将 TTL 增加 1。在路径中的某个点,您会遇到上面的错误消息(数据包需要由 DF 集分段)。发生这种情况时,您将确切知道您和目标之间的哪个路由器具有较小的链接大小。

如果它发生在 TTL 设置为 8 时,那么您可以运行到目标的跟踪路由,第 8 跳将是无法对数据包进行分片的路由器。

如果在任何时候,而不是获取Packet needs to be fragmented but DF setor TTL expired in transit,那么您还知道防火墙存在于路径中的哪个位置并阻止返回的 ICMP 数据包。

编辑:从评论中添加有用的信息:

@YLearn 补充说:

请注意,返回数据包可能会采用不同的路由返回,并且返回路径上可能存在问题,而不是传出路径上的防火墙/ACL

@ guettli (楼主)补充说:

在 linux 上需要这些选项:ping -M do -s 1472 8.8.8.8在此处输入链接描述