操作系统版本:windows 10 21H2 LTSC
VPN: L2TP Over IPSec
故障描述:
前置条件: 建立VPN后,取消VPN生成默认路由(也可以不取消,不是造成故障的原因),手动添加目标网段的路由: 管理员cmdroute add x.x.x.x mask x.x.x.x x.x.x.x
。
使用命令行终端 可以ping通多个不同系统版本的服务器,并确认有线以太网网段与VPN非同网段,目标网段也非公网地址,tracert也是通过VPN接口地址转发,但是使用浏览器访问服务器提供的web服务(使用IP地址的方式非域名)均不能打开网页。
环境对比测试: |
---|
1.已经确认内网PC可以访问WEB服务; |
2.使用同一网络环境下的macOS系统终端拨入VPN后也可以访问WEB服务; |
3.非同一网络环境非同一windows版本下的windows终端拨入VPN后也可以访问WEB服务; |
4.相同PC终端,不使用有线连接,连接手机热点后拨入VPN,也可以访问WEB服务。 |
解决思路:
登录WEB服务器,tcpdump抓包查看到在PC终端与WEB服务器段在进行到HTTP报文传输请求后,随即出现大量TCP DUP ACK和TCP Retransmission(即服务器的响应client未收到,需要服务端重新发送响应报文,但client始终未收到)。
对比正常访问WEB服务的client交付的报文,未出现TCP DUP ACK。随即猜测是否是服务器到Client之间的链路丢失了报文。结合既往经验,中间链路丢包极有可能是链路MTU限制导致,虽然有TCP协商MSS,但有可能是中间链路小于两端MTU,那样MSS就无法探测到最小值(猜测,知识原理掌握不够)。所以在发送ICMP包能够通,WEB业务请求时丢包的原因(WEB业务数据大于默认ICMP包size)。
通过ping x.x.x.x -l 1500
来测试发现到达某个值果然就丢包了。
通过cmd命令查看各个接口的MTU值:netsh interface ipv4 show subinterfaces
可以看到如图(示例)
虽然VPN的MTU小于以太网的MTU,但是在添加了PPP的报头后,就超过了以太网的MTU,进而导致丢包。
解决办法:
使用命令:管理员CMD运行netsh interface ipv4 set subinterface "VPN连接名称" mtu=1280 store=persistent
永久修改VPN接口的MTU值。