我使用手机的无线热点通过路由器提供临时/备用互联网访问。路由器作为 Wi-Fi 客户端连接到手机,并在主有线连接发生故障时使用该 Wi-Fi 连接作为上游互联网连接。这可能至少是三重 NAT。
路由和防火墙的设置使得连接到路由器的所有客户端的 IPv4 连接都能正常工作,但我发现在 Linux 客户端上 ping 互联网主机是可行的,但在 Windows 客户端上却行不通。Windows ICMP 回应请求通过路由器的 Wi-Fi 接口发出,但从未收到任何回复。
防火墙设置为允许两个方向的所有 ICMP,使用与我的主要有线互联网连接相同的设置,这对于 ICMP 没有任何问题(尽管它只有一层 NAT。)
通过在路由器上通过 tcpdump 比较工作和非工作 ping,我发现 Linux 默认设置了 Don't Fragment 位,而 Windows 则没有。如果我为 Windows 提供ping
该-f
选项,则 Don't Fragment 位会被设置,并且我会在 Windows 上收到 ICMP 回应回复。
根据 tcpdump,Windows ping 的回显请求大小为 40 字节,Linux 的回显请求大小为 64 字节。我对此进行了一些研究,但我能找到的大多数信息都是通过发送大型 ping 数据包来发现 MTU 大小,而这些数据包很小。
为什么开启在此设置中,“不分段”位是否能使 ping 正常工作?
答案1
这不应该发生,因为小数据包即使没有 DF 标志也应该可以正常工作。
你可能正在攻击一个外部防火墙,它可以防止 ping洪水,这是一种拒绝服务攻击。
在这种攻击中,攻击者会将大消息分割成非常小的数据包,要求目标将碎片保存在内存中,以便在收到最后一个碎片时将它们组装成一个完整的数据包。通过这种方式,攻击者可以用永无止境的数据包流填满受害者的内存。
也许手机的 ISP 对没有 DF 标志的小数据包过于敏感,所以会全部拒绝它们。