MTU 是一条链路一次能传送的最大 IP 包大小,以太网通常是 1500 字节。VPN 隧道会把原始包再包一层新的头部,内层包能用的空间就被挤小了。这个差值处理不好,就会出现“小网页能打开、大网页和 HTTPS 握手卡住”的典型症状。

封装开销怎么算
每种隧道都要在内层包前面加头部。WireGuard 在 IPv4 上的开销是 60 字节(20 字节 IP 头、 8 字节 UDP 头、 32 字节 WireGuard 头和认证标签),在 IPv6 上是 80 字节。内层 MTU 的上限就是外层链路 MTU 减去这个开销。默认值 1420 是按 1500 减 80 预留的,保证外层是 IPv4 或 IPv6 都能用。
MSS 和 MTU 有什么关系
MSS 是 TCP 在握手时宣布的最大段长度,大致等于 MTU 减去 20 字节 IP 头和 20 字节 TCP 头。MTU 管的是任何 IP 包的大小,MSS 只管 TCP。把 MSS 调小可以让 TCP 主动发更小的包,绕开分片问题,但对 UDP 没有帮助。

PMTUD 黑洞是怎么回事
大包超过链路 MTU 且设置了不分片标志(DF)时,路由器会丢弃它并回一个 ICMP “需要分片”消息,发送方收到后把包变小,这个过程叫路径 MTU 发现。如果中间某台防火墙把 ICMP 整个丢了,发送方永远收不到这个消息,表现就是大包永远发不过去,小包却一切正常。
为什么 HTTPS 尤其容易受影响
TLS 握手里的证书消息往往超过一个包。小的 HTTP 请求能过,证书链这样的大包被丢弃,页面就一直卡在“正在连接”。
UDP 大包怎么办
MSS 钉制帮不了 UDP。DNS 的大响应和 QUIC 要靠降低隧道 MTU,让内层根本不产生超长的包。
修法和验证
两种常用的修法:直接把隧道网卡的 MTU 调小,或在转发路径上做 MSS 钉制。后者的 iptables 写法如下:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu验证方法是用带不分片标志的 ping 探测路径:Linux 用 ping -M do -s 1372 8.8.8.8,Windows 用 ping -f -l 1372 8.8.8.8,数值逐步减小直到能通。用探测到的最大负载加 28 得到路径 MTU,再减去隧道开销就是应该设置的内层 MTU。
两种修法的对照
| 方式 | 影响范围 | 适合场景 |
|---|---|---|
| 调小隧道 MTU | 所有流量,包括 UDP | 终端设备或单一隧道 |
| MSS 钉制 | 只影响经过的 TCP | 网关、路由器批量处理 |
| 修复被丢弃的 ICMP | 源头解决 PMTUD | 能控制中间防火墙时 |




