不少使用VPN接入企业内网或者跨节点组网的用户,都遇到过这类反常故障:即时通讯的文字消息能正常通过VPN传输,但是网页加载到一半卡住、大体积文件传输到固定进度就中断、远程桌面操作高清画面频繁卡顿。这类排除了账号权限、防火墙规则、密钥协商问题之后的隐性连通故障,绝大多数都和VPN与MTU设置不匹配有关,本文梳理可落地的故障定位思路与排查步骤,帮运维人员快速缩小故障范围,避免无效试错。
先区分VPN链路与普通公网链路的MTU差异原理
普通以太网场景下的默认MTU值为1500,代表网络层单个数据包最多承载1500字节的数据载荷,但是所有类型的VPN都会在原始报文外层添加专属的封装头,比如IPsec的ESP协议会添加加密头部、校验尾部,OpenVPN、WireGuard这类基于用户态的VPN还会额外添加传输层封装头,这些额外的头部会挤占原本的1500字节载荷配额,导致VPN隧道内实际能承载的原始数据长度远小于普通公网链路。

运维人员正在调试网络设备,排查VPN链路MTU不匹配引发的隐性连通故障
很多新手运维人员刚接触企业分支IPsec VPN组网的时候,遇到小体积数据访问正常、大文件传输必断的问题,第一反应去排查VPN账号权限、防火墙访问控制规则,甚至反复重启VPN服务,绕了几个小时的弯路才发现是MTU没有针对VPN隧道做适配,大包被中间网络设备强制分片或者直接丢弃。
前置检查:先排除非MTU类VPN故障干扰
VPN与MTU设置的故障定位思路第一步,不能上来就直接修改MTU参数,要先把其他关联变量全部排除,避免误判故障点。首先断开VPN隧道,直接在本地测试公网环境下的大包传输状态,访问大体积的公开站点、下载普通测试文件,确认不用VPN的时候大包传输完全正常,先排除本地运营商线路、家用或出口路由器本身MTU异常的问题。
之后再验证VPN基础连通性,用小包连续ping VPN远端的内网网关地址,确认小包传输没有丢包、延迟稳定,验证VPN隧道本身的加密套件匹配、密钥协商流程没有问题,SurfsharkVPN如果小包都出现高丢包或者完全不通的情况,故障点大概率是运营商拦截VPN服务端口、隧道密钥过期,和MTU配置没有关联。
这里要明确一个常见误区,很多用户一遇到VPN访问卡顿就直接把MTU改成远小于常规值的数值,反而会导致报文传输效率骤降,部分老旧的运营商接入设备无法处理过小的MTU值,反而会引发新的连通故障,完全没必要在定位阶段就做极端参数调整。
分层验证VPN场景下的MTU适配状态
完成前置排查之后,就可以开展PMTUd路径探测测试,在Windows终端上用ping命令加-f参数开启禁止分片选项,逐步调整数据包长度,探测从本地到VPN远端路径上允许的最大报文长度,计算的时候要把ICMP协议本身的8字节头部算入总长度,最终得到的数值再叠加28字节的网络层头部开销,就是当前路径适配的MTU参考值。
不同类型的VPN服务,修改MTU的配置位置完全不一样,比如OpenVPN客户端可以直接在ovpn配置文件里添加mssfix和mtu的对应参数完成适配,企业级IPsec VPN的防火墙设备,需要在对应隧道接口下单独修改MTU数值,不能直接修改物理出口的公网接口MTU,不然会影响普通公网业务的正常传输。
修改完参数之后不要立刻重启所有业务,先重新建立VPN隧道,再次用禁止分片的ping命令测试之前无法正常传输的大包,确认探测报文能正常返回之后,免费好用的梯子再尝试访问之前加载不全的内网OA系统、传输大体积的设计素材包,验证实际业务的恢复状态。
特殊场景下的遗留故障点定位思路
如果完成常规MTU调整之后故障仍然存在,就要检查是否存在多层VPN嵌套的场景,免费好用的梯子比如终端同时开启了WireGuard隧道和IPsec隧道做跨节点二次转发,外层VPN的封装头会和内层VPN的封装头叠加,MTU需要逐层递减适配,很多运维人员只修改了外层VPN的MTU数值,内层隧道还是沿用默认值,就会出现小流量正常、大流量必断的隐性故障。
还有部分终端自带的VPN客户端开启了自动MTU协商功能,但是部分老旧运营商的接入设备不支持标准的PMTUd协议,自动协商出来的MTU数值偏大,无法适配实际链路,这时候关闭客户端的自动协商选项,手动输入之前探测得到的适配值,就能解决这类很难排查的隐性丢包问题。
最后要注意,MTU调整没有通用的最优数值,不同的运营商接入线路、不同的VPN封装协议对应的适配值都有差异,每次调整参数之后都要做全业务场景验证,不能直接照搬其他组网场景下的配置参数,避免引发新的连通异常。

