VPN 为什么容易出现 MTU 问题?MSS Clamping 是怎么解决大包卡住的?
简化版
VPN 会在原始 IP 包外再加一层或多层封装,额外头部会占用 MTU,导致有效载荷变小。如果还按以太网 1500 字节发送大包,就可能需要分片;如果路径 MTU 探测被 ICMP 拦截,就会出现“小包通、大包卡、部分网页打不开”。MSS Clamping 会在 TCP 握手时把 MSS 调小,让双方一开始就发送适合隧道的包,避免分片和黑洞。
详细版
典型现象:
ping 小包通
SSH 能连
打开某些 HTTPS 网站卡住
上传文件或访问大响应失败
原因是 VPN 封装增加开销。例如以太网 MTU 1500,IPSec/UDP/NAT-T 可能额外占 6080 字节,实际可承载的内层包只有约 14201440 字节。TCP MSS 默认常按 1500 - 20(IP) - 20(TCP) = 1460 计算,超过隧道可用载荷就会出问题。
MSS Clamping 通常在 VPN 网关或防火墙上改写 TCP SYN 包里的 MSS,例如改成 1360 或 1380,让双方发送更小 TCP 段。
完整版教学
一、MTU 是链路一次能承载的最大包
MTU 表示一条链路层帧里能放的最大网络层包大小。普通以太网常见 MTU 是 1500 字节。超过 MTU 的 IP 包要么分片,要么被丢弃并依赖 ICMP 告诉发送方“包太大”。
以太网 MTU 1500
IP 头 20 + TCP 头 20 + TCP 数据 1460 = 1500
在没有隧道时,TCP MSS 1460 很常见,因为它刚好适配 1500 MTU。但 VPN 不是普通路径,它会额外包一层外壳。
VPN MTU 问题的本质是“外面多套了一层壳,里面能装的数据就少了”。
二、VPN 封装为什么会降低有效 MTU
VPN 会把原始包作为载荷,再加外层 IP、UDP、ESP、WireGuard、GRE 等头部。外层头部也要占 MTU,所以内层包必须变小。不同协议开销不同,具体值要按实现计算。
| 封装 | 额外开销特点 |
|---|---|
| GRE | 增加外层 IP 和 GRE 头 |
| IPSec ESP | 增加 ESP 头、尾、认证数据 |
| IPSec NAT-T | 额外 UDP 4500 |
| WireGuard | UDP 加 WireGuard 头 |
| OpenVPN UDP | UDP 加 TLS/加密封装 |
如果外层链路 MTU 仍是 1500,内层还发 1500,就会超过外层承载能力,必须分片或丢弃。
三、为什么会出现“小包通、大包不通”
小包没有超过隧道有效 MTU,所以能正常通过;大包超过后需要分片或路径 MTU 探测。如果中间设备丢弃了 ICMP Fragmentation Needed,发送端不知道应该变小,就会一直发过大的包,形成 PMTUD 黑洞。
小 ping 64 bytes -> 通过
大 HTTPS 响应 1460 MSS -> VPN 封装后超过 MTU -> 被丢
ICMP 太大提示被拦 -> 发送端不知道要降 MSS
这就是为什么有些网站能打开,有些卡住;有些命令能执行,小文件能传,大文件失败。问题不是应用协议,而是包大小触发了路径限制。
四、MSS 和 MTU 是什么关系
MSS 是 TCP 层每个段能承载的最大应用数据大小,不包含 IP 头和 TCP 头。通常:
MSS = MTU - IP头 - TCP头
以 IPv4 + TCP 无选项为例,1500 - 20 - 20 = 1460。如果 VPN 后有效内层 MTU 只有 1400,那么 MSS 应该不超过 1400 - 20 - 20 = 1360。这就是很多 VPN 网关把 MSS clamp 到 1360 左右的原因。
五、MSS Clamping 怎么工作
TCP 在三次握手的 SYN 包里会声明自己的 MSS。MSS Clamping 会在 VPN 网关或防火墙经过 SYN 包时,把 MSS 改小。这样连接双方都以较小段发送数据,不需要等路径 MTU 探测。
Client SYN: MSS=1460
VPN Gateway 改写: MSS=1360
Server 收到: MSS=1360
后续 Server 发送 TCP 段 <= 1360
它只对 TCP 有效,因为 MSS 是 TCP 选项。UDP 业务仍需要应用自己控制包大小,或依赖协议层分片和重传机制。
六、如何定位 VPN MTU 问题
排查可以从“禁止分片的大 ping”开始。Windows 可以用 ping -f -l,Linux 可以用 ping -M do -s。逐步调整 payload 大小,找到路径能通过的最大值,再加上 IP/ICMP 头估算路径 MTU。
ping -M do -s 1372 10.10.1.1
IPv4 ICMP payload 1372 加 28 字节 IP/ICMP 头,约等于 1400 MTU。如果 1372 能通、1400 不通,说明路径 MTU 大概在 1400 附近。再结合抓包看 ICMP too big 是否回来。
七、不同 VPN 协议的处理方式不同
WireGuard 通常建议显式配置接口 MTU,例如 1420 或更低;OpenVPN 常见 mssfix、fragment 等参数;IPSec 可以在防火墙上做 MSS clamping;GRE over IPSec 要特别小心双重封装开销。
| 场景 | 常见处理 |
|---|---|
| IPSec NAT-T | TCP MSS clamp |
| WireGuard | 设置接口 MTU |
| OpenVPN | mssfix 或调整 tun MTU |
| GRE over IPSec | 计算双层封装后 MTU |
不要盲目把 MTU 调得极低。过低会增加包数量和头部开销,影响吞吐。应该根据路径和封装开销选择合理值。
八、常见误区与追问
- 误区:VPN 能连上就不会有 MTU 问题。 控制面小包能通,不代表大数据包能稳定通过。
- 误区:MTU 问题只影响 ping。 HTTPS、文件传输、数据库同步、视频会议都可能受影响。
- 误区:MSS Clamping 能解决所有协议。 它只影响 TCP,UDP 仍要应用或协议自己处理包大小。
- 误区:把 MTU 调得越小越安全。 太小会增加包数量和协议开销,降低吞吐。
- 追问:为什么 ICMP 被拦会导致黑洞? 发送方收不到“需要分片但 DF 已设置”的提示,就不知道该降低包大小。
- 追问:如何估算 MSS? 用有效 MTU 减去 IP 头和 TCP 头,IPv4 常用
MTU - 40粗算。 - 追问:为什么 GRE over IPSec 更容易踩 MTU? GRE 和 IPSec 都增加封装头,内层可用 MTU 被双重压缩。
九、加强记忆
VPN MTU 问题按“封装变厚、有效 MTU 变小、大包触发、ICMP 被拦就黑洞”来记。TCP 用 MSS Clamping 在握手时把段大小调小,UDP 要靠应用或协议控制。排查看到小包通、大包卡、部分网页打不开时,要第一时间想到 MTU/PMTUD。