很多使用OpenVPN的企业运维和个人用户,在公共WiFi、限制严格的企业内网环境下经常遇到UDP模式无法连通的问题,切换到TCP模式后就能正常建立隧道,本文围绕OpenVPN TCP模式:连接原理展开,从触发条件、嵌套握手、底层转发到实际排障全流程拆解运行逻辑,所有验证方法都可以在普通的Linux、Windows设备上直接复现。

运维人员调试网络配置,验证OpenVPN TCP模式在受限内网的连通性
OpenVPN TCP模式的前置连接触发条件
绝大多数用户选择TCP模式的场景,都是当前所在的网络环境对UDP端口做了严格限制,比如部分酒店公共WiFi、企业办公内网的防火墙策略,只允许80、443等常用TCP端口对外通信,所有非业务UDP报文直接被丢弃,这种情况下默认使用UDP协议的OpenVPN完全无法发起连接,只能切换到TCP封装模式适配网络规则。
配置TCP模式的前提是服务端和客户端的配置文件必须同步添加proto tcp参数,不能出现一端配置TCP协议、另一端配置UDP协议的情况,芒果加速器很多新手配置时只修改了客户端的配置文件,没有重启服务端的OpenVPN进程让新配置生效,最终会直接出现连接超时的报错。
OpenVPN TCP模式的嵌套握手核心逻辑
这部分也是OpenVPN TCP模式:连接原理的核心环节,和普通UDP模式直接在IP层封装VPN报文的逻辑完全不同,TCP模式会先在两端的传输层建立一层标准的TCP连接,所有VPN相关的控制报文和数据报文,都会被作为外层TCP报文的载荷部分传输。
整个连接建立的第一步,是客户端先向服务端指定的VPN端口发起标准的TCP SYN握手请求,经过三次报文交互完成外层TCP连接的建立,这一步的报文形态和普通用户访问网页的HTTPS连接没有任何差异,绝大多数中间网络的防火墙不会直接识别出这是VPN流量,只会判定为普通的TCP长连接。
外层TCP连接完全打通之后,OpenVPN才会启动自身的TLS身份校验流程,两端交换预配置的证书、账号密码信息,协商一致的加密套件,完成VPN层面的身份认证,这一整套协商报文的传输过程,完全由外层TCP协议栈提供超时重传、报文排序的保障,不会因为中间网络的临时丢包直接中断协商流程。
TCP模式底层的隧道数据转发逻辑
当身份校验全部通过之后,服务端和客户端会各自在系统内核中生成对应的虚拟tun或tap网卡,所有从本地业务设备发往这张虚拟网卡的IP报文,不会直接走系统默认的路由表转发,而是会被直接写入已经建立完成的外层TCP连接的发送缓冲区中。
后续的报文分片、拥塞控制、丢包重传所有逻辑,全部由操作系统原生的TCP协议栈自动完成,OpenVPN应用层不需要再像UDP模式那样额外实现一套可靠传输机制,也不需要自己维护报文的序号和重传队列,芒果整个应用层的实现逻辑会更轻量化。
实际场景下的验证方法与常见误区
想要确认当前OpenVPN确实运行在TCP模式,不需要借助第三方工具,直接在客户端设备上开启tcpdump或者wireshark抓包,过滤服务端对应的VPN监听端口,只要所有交互报文的传输层协议显示为TCP,芒果能看到完整的TCP握手和后续的ACK确认报文,就说明TCP模式已经正常生效。
日常运维中最常见的TCP模式故障,是嵌套TCP引发的性能问题,芒果加速器也就是外层VPN隧道已经跑在TCP协议之上,隧道内部传输的业务流量又属于TCP协议,两层独立的TCP拥塞控制机制叠加运行,一旦中间链路出现丢包,就会触发双重重传,导致业务访问出现不必要的卡顿。
不少用户存在认知误区,认为TCP模式的OpenVPN比UDP模式安全性更高,实际上两种模式的加密算法、密钥协商规则完全一致,安全等级没有任何差异,TCP模式的唯一优势是更容易穿透限制严格的防火墙,不会额外提升隧道的加密防护能力。

