15.7. 使用 MSS 钳制绕过路径 MTU 发现问题(适用于 ADSL、有线、PPPoE 和 PPtP 用户)

如上所述,路径 MTU 发现不再像以前那样有效。如果您确切知道网络中某个跃点的 MTU 有限(<1500),则不能依赖 PMTU 发现来找出这一点。

除了 MTU 之外,还有另一种设置最大数据包大小的方法,即所谓的最大分段大小 (MSS)。这是 SYN 数据包的 TCP 选项部分中的一个字段。

最新的 Linux 内核和一些 PPPoE 驱动程序(特别是出色的 Roaring Penguin 驱动程序)具有“钳制 MSS”的可能性。

这样做的好处是,通过设置 MSS 值,您可以明确地告诉远程端“永远不要尝试向我发送大于此值的数据包”。无需 ICMP 流量即可使其工作。

坏处是这是一个明显的 hack - 它通过修改数据包来破坏“端到端”。话虽如此,我们在许多地方都使用了这个技巧,并且效果非常好。

为了使此方法有效,您至少需要 iptables-1.2.1a 和 Linux 2.4.3 或更高版本。基本命令行是
# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS  --clamp-mss-to-pmtu

这会计算您的链接的正确 MSS。如果您感到大胆,或者认为自己最了解,您也可以这样做

# iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 128

这将传递的 SYN 数据包的 MSS 设置为 128。如果您使用 VoIP 和微小的数据包,以及导致语音通话中断的大型 http 数据包,请使用此设置。