我有一个家庭网络,多年来一直运行良好。周四晚上突然出现问题。一些设备(iPod、网络流媒体、archlinux 服务器、Windows)无法从互联网下载。所有 Google 设备(chromebook、android 手机)都可以继续正常工作(有线或无线),我的两个 linux 台式机(一个 debian,一个 archlinux)也是如此。停止工作的设备可以通过从 android 手机到 wifi 的绑定连接获得工作访问权限。出现故障的设备仍然可以从 google.com 和一两个其他网站(如维基百科)下载。
如果我使用 curl 访问无法访问的站点,事务将停止等待响应;服务器不会返回任何内容。但是,如果我使用错误的 (404) URL curl 访问同一个站点,则会正确返回错误页面。返回的数据包括“* 将包标记为不支持多用途”这一行,这可能很有趣,也可能不有趣。
我不知道发生了什么,非常希望得到一些见解。我怀疑我的 ISP 有问题,但我真的不知道该问什么问题,也不知道什么症状会引起他们的兴趣。
为什么谷歌允许自己的设备和网站继续运行,而其他的却不允许?
非常感谢大家的帮助。
答案1
“Google 可以工作,而其他网站不行”通常表示 MTU 受限且路径 MTU 发现中断。PMTUD 中断通常是由于防火墙配置错误或 NAT 存在缺陷导致阻止了所有 ICMP 消息。
Google 的服务器协商较小的 MSS,从而使 MTU 远小于以太网和 Wi-Fi 的标准 1500 字节 MTU。这样,即使您不知道您的 ISP 的 MTU 限制略低于 1500(PPPoE 常见),并且有东西阻止了 ICMP,从而破坏了 PMTUD,您仍可以访问 Google 的服务器。
作为测试,请拿一台受影响的设备并将其接口 MTU(在将其连接到家庭 LAN 的任何接口上)降低到 1300,然后查看它是否开始工作。如果可以,则将其调高,直到找到有效的最高值,然后暂时保持该值。您可以对其他设备进行相同的更改。如果您有足够灵活的 DHCP 服务器和 IPv6 路由器,您甚至可以让 DHCP 服务器和 IPv6 路由器将此 MTU 限制告知您的设备。
长期正确的解决方案是找出为什么您访问互联网的路径上存在 MTU 限制,并在可能的情况下将其删除,但至少修复开始阻止 ICMP 的任何因素,以便 PMTUD 再次正常工作。
答案2
通过将以下 iptables 规则添加到我的服务器/路由器防火墙的 LAN 接口上的转发链来解决:
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
请参阅:https://www.frozentux.net/iptables-tutorial/chunkyhtml/x4721.html
了解详情。
感谢 Spiff 提供的出色且极为有用的信息。