很多企业使用IPsec或者SSL VPN跨站点传输业务数据的时候,经常遇到TCP业务卡顿、大文件传输中途中断的问题,表面看是应用层响应异常,实际根源大多是VPN隧道内的TCP重传机制出现了异常触发。这份指南围绕VPN与TCP重传:故障定位思路,给出可落地的分步排查方法,快连vpn所有操作都可以用通用网络设备和开源抓包工具完成,不需要特殊定制硬件,也不需要改动现有业务的核心架构。

运维人员在VPN两端同步定向抓包,划分TCP重传异常的故障边界。
第一步:划分故障边界,区分重传触发源
排查初期不要直接登录VPN设备修改配置,先在故障两端的终端分别做定向抓包,快连vpn一端是VPN内网侧的业务服务器,另一端是VPN隧道对端的远程接入终端,抓包过滤条件直接填写对应业务的TCP端口号,过滤掉无关的背景流量干扰。
如果内网侧服务器的抓包里,已经能看到TCP报文发出去之后,多个往返周期都没收到对端返回的ACK确认,那重传触发点大概率不在服务器本身,报文是在VPN隧道传输的中途出现了丢包。如果内网侧服务器的抓包里,第一次发完报文远早于常规等待时长就触发重传,那首先要排查本地服务器的TCP内核参数配置,有没有和VPN场景冲突的重传超时阈值自定义设置。
第二步:VPN隧道中间节点逐段校验报文完整性
完成边界划分之后,接下来把抓包点移到VPN网关的内外网接口上,分别在SSL VPN或者IPsec VPN的公网出接口、内网入接口同时抓取对应业务的TCP流,不要直接在VPN网关后台查看系统日志,日志记录的报文丢包统计往往存在延迟和漏记问题。
对比两个接口的抓包文件,如果内网入接口已经收到了完整的TCP报文,但是公网出接口完全没有对应报文的加密封装记录,说明VPN网关本身的加密队列出现了拥塞丢包,这种情况常见于VPN网关的加密引擎算力占满,或者隧道配置的MTU值和公网链路的默认承载能力不匹配。
如果公网出接口已经把加密后的ESP报文或者SSL封装报文发出去了,但是对端VPN网关的公网入接口没有收到完整的对应报文,那故障点就落在两个VPN网关之间的公网链路上,这时候可以用带TCP选项的traceroute工具逐跳排查路径上的隐形丢包点,普通的ICMP traceroute无法检测出针对TCP报文的限速丢包策略。
第三步:排查VPN配置里的TCP优化策略冲突
很多企业的VPN网关默认开启了TCP MSS钳制、TCP加速这类优化功能,这类功能本身是为了提升隧道传输效率,但很多场景下反而会触发非预期的异常重传,这类故障的隐蔽性很强,vpn加速器普通的连通性测试完全无法识别。
实际运维场景里很常见的一类故障是,部分IPsec VPN网关默认开启的TCP分段重组功能,会把超过MSS阈值的TCP报文拆分之后再封装,但是如果对端的边界防火墙配置了分片报文拦截规则,拆分后的小报文会被直接丢弃,发送端迟迟收不到ACK就会触发连续重传,这类问题普通的ping测试完全发现不了,因为ICMP分片报文很多运营商链路是默认放行的。
排查的时候可以先临时关闭VPN网关的TCP加速、快连vpn分段重组这类附加功能,观察故障现象是否消失,如果重传次数明显下降,就说明是优化策略和当前链路的适配性出了问题,不需要额外更换硬件,只需要调整优化参数适配现有链路即可。
第四步:验证故障根因的对照测试方法
定位到疑似故障点之后,不要直接修改线上业务的永久配置,先做对照测试验证结论。比如怀疑是VPN隧道MTU不匹配,就直接在两端终端上手动设置对应业务的TCP MSS值,绕过VPN网关的默认MSS钳制规则,再传输相同的业务文件,观察重传统计数据的变化。
这里要注意一个常见误区,很多运维人员遇到TCP重传第一反应就去调整终端的TCP重传超时参数,这种操作相当于掩盖了隧道本身的丢包问题,后续传输大流量业务的时候依然会出现卡顿,没有从根源解决故障。
整个VPN与TCP重传:故障定位思路的核心逻辑,就是始终把VPN隧道当成一个独立的透明传输节点,不要把公网普通TCP故障的排查思路直接套用到VPN场景里,优先区分重传是发生在VPN隧道内侧、隧道本身还是隧道外侧的公网链路,就能大幅缩短故障定位的耗时,避免无意义的配置调整操作。
快连vpn 


