VPN 协议按代梳理,附选择协议的 6 个判断条件

VPN 协议是应用与服务器共同遵守的一套规则。这套规则规定密钥如何交换、流量如何封装,以及流量如何穿过其他网络送达。协议决定连接建立的快慢,也影响从 Wi-Fi 切换到移动数据时连接能否保持。协议还关系到 VPN 在沿途网络中有多显眼。每种协议都是为解决当时的问题而设计的。1990年代要解决的,是通过拨号接入办公室网络。如今要解决的,是穿过凭最初几个字节识别 VPN 的网络。下文按代介绍各协议,文末的 6 个判断条件用于选择协议。
协议的差别在于握手、传输和特征
本站的 VPN 入门文章介绍了适配器、隧道和服务器。每种协议建立隧道的方式各不相同,差别体现在 3 个方面。
握手确定会话密钥
传输任何数据之前,应用和服务器先互相验证身份,并商定会话密钥。WireGuard 每个方向各需 1 条消息,IKEv2 总共需要 4 条。OpenVPN 在自己的控制通道内完成一次完整的 TLS 握手。在每次应答都很慢的链路上,往返次数越少,连接就越快。卫星互联网和拥塞的移动网络就是这类链路的典型例子。
丢包会拖慢基于 TCP 的隧道
UDP 每个数据包只发送一次,不检查是否送达。TCP 发出数据后会等待确认。如果没有及时收到确认,TCP 会重发数据并降低速率。基于 TCP 的隧道里,这样的机制有 2 层,一层套着另一层。隧道层重发丢失的数据包需要时间。与此同时,隧道内的浏览器连接会判定这个数据包已经丢失。于是浏览器连接也重发一份,同样降低速率。结果是页面加载时断时续,反复停顿。因此,WireGuard 只使用 UDP。WireGuard 的开发者表示不会增加 TCP 模式,因为 TCP-over-TCP 的性能很差。缺点是 WireGuard 在屏蔽 UDP 的网络上无法连接。
网络看到的是特征,而不是内容
网络运营商读不到隧道里的内容,但能看到端口、最初几条消息的大小,以及头部中未加密的字段。这些信息合在一起,就构成了协议的特征。有些过滤系统还会主动探测可疑服务器,查看服务器如何应答。早期协议在设计时没有考虑这类检测。较新的协议则把特征纳入了核心设计。
1990年代至 2020年代的 10 种 VPN 协议
新协议并没有取代旧协议。路由器固件里至今仍有 PPTP,Windows 和 macOS 也内置了 L2TP 和 IKEv2。下表列出每种协议出现的年代和最初的设计目的。
| 协议 | 出现时间 | 最初的设计目的 |
|---|---|---|
| PPTP | 1990年代 | 通过互联网承载通往办公室网络的拨号连接 |
| L2TP/IPsec | 2000年前后 | 以开放标准取代专有的 PPTP,加密交给 IPsec |
| OpenVPN | 2000年代 | 让任何系统都能在单个端口上建立 TLS 隧道 |
| IKEv2/IPsec | 2000年代 | 更快地协商密钥,网络切换时保持会话 |
| SSTP | 2000年代 | 穿过只放行 HTTPS 的网络 |
| Shadowsocks | 2010年代 | 让流量不带任何特征 |
| WireGuard | 2010年代 | 保持隧道简单,代码量小到足以审计 |
| VLESS + REALITY | 2020年代 | 看起来像访问真实知名网站的 HTTPS 连接 |
| Hysteria2 | 2020年代 | 在丢包多的链路上保持速度,看起来像 HTTP/3 |
| XHTTP | 2020年代 | 以普通 HTTP 请求传输数据,也能经过 CDN |
PPTP 和 L2TP/IPsec 诞生于拨号上网时代
PPTP
PPTP 的设计初衷,是让用调制解调器上网的员工经由互联网连入办公室网络。PPTP 用隧道承载 PPP,也就是当年拨号连接网络运营商所用的协议。PPTP 的规范 RFC 2637 发布于 1999年。控制通道使用 TCP 1723 端口,数据在 GRE 中传输。GRE 没有端口,所以家用路由器至今仍有“PPTP Passthrough”选项。
Bruce Schneier 和 Peiter Zatko(Mudge)在 1998年和 1999年先后指出了 PPTP 的弱点。2012年,DEF CON 大会上的一场演讲表明,截获的 MS-CHAPv2 认证只靠单个 DES 密钥保护。这种长度的密钥可以在实际可行的时间内暴力破解。MPPE 加密密钥由同一份认证数据导出,所以 128 位的密钥长度并没有增加任何保护。随后,微软发布安全公告,警告不要在没有额外保护的情况下使用 MS-CHAPv2。此后,PPTP 一直不算安全协议。
L2TP/IPsec
L2TP(RFC 2661,1999年)结合了 PPTP 和思科 L2F 协议的思路。L2TP 本身不加密,所以几乎总是运行在 IPsec(RFC 3193,2001年)之内。每个数据包要套 2 层,先是 L2TP,再是 IPsec。两层都会增加额外的字节,也都需要配置。密钥交换使用 UDP 500 端口,数据走 UDP 4500 端口或单独的 ESP 协议。这些固定端口让这对组合很显眼,几条防火墙规则就能屏蔽它。
2008年,微软推出 SSTP。SSTP 用 TCP 443 端口上的 HTTPS 承载同样的 PPP。从外面看,这种连接和普通的网页浏览没有区别。SSTP 能穿过只开放网页访问的防火墙。在桌面和移动系统中,只有 Windows 内置 SSTP 客户端。
IKEv2、OpenVPN 和 WireGuard 加密可靠,但特征明显
这 3 种协议都能可靠地保护数据,在普通网络上使用也没有问题。它们的共同弱点在于,网络能够识别其特征。在过滤 VPN 连接的网络上,这个弱点比加密强度更关键。
IKEv2/IPsec
IKEv2 用 4 条消息协商密钥,而 IKEv1 的初始交换有 8 种变体。在手机和笔记本电脑上,IKEv2 因 MOBIKE 扩展(RFC 4555)而受青睐。有了 MOBIKE,笔记本电脑可以从办公室 Wi-Fi 切换到手机热点。隧道会随之转移到新地址,无需重新认证。iOS、macOS、Windows 和 Android 11 或更高版本都内置 IKEv2 客户端。在这些系统上使用 IKEv2,无须另装软件。网络识别 IKEv2 靠的也是 UDP 500 和 4500 端口。
OpenVPN
OpenVPN 是开源项目,协议由项目自己定义,没有对应的 RFC。握手使用 TLS,数据通常由 AES-GCM 保护。OpenVPN 可在任意端口上通过 UDP 或 TCP 运行,IANA 为它登记的端口是 1194。许多路由器内置 OpenVPN,配置通常以单个 .ovpn 文件提供。弱点在于 OpenVPN 给每个数据包加上的头部。头部中的消息类型不加密,每个会话的开头也都一样。2022年,研究人员在一家网络运营商的真实网络中验证了这一点。他们没有解密任何一个字节,就从流量中识别出了 OpenVPN。
WireGuard
Jason Donenfeld 于 2017年在 NDSS 会议上介绍了 WireGuard。2020年,WireGuard 随 5.6 版进入 Linux 内核。WireGuard 只使用一组固定的密码算法(Noise 握手中的 Curve25519、ChaCha20-Poly1305 和 BLAKE2s),因此不可能误选弱算法。服务器不回应没有有效密钥的数据包。从外部看,没有任何迹象表明那里有服务器。
不过,客户端流量的特征很明显。第一条握手消息总是 148 字节,回复总是 92 字节。消息类型以明文发送。WireGuard 官网说明,该协议不以混淆为重点。混淆要由 WireGuard 之上单独的一层来完成。WireGuard 在开放网络上表现良好,在有过滤的网络上则很快暴露。
VLESS + REALITY、XHTTP、Hysteria2 和 Shadowsocks 隐藏 VPN 特征
这些协议是为会检测并屏蔽 VPN 连接的网络设计的。它们的加密强度与上文的协议相当,但主要目标是让特征接近普通流量。这些协议在设计上以代理方式工作,VPN 应用通过它们传输设备的所有流量。VPN 与代理对比一文解释了两者的区别。
VLESS + REALITY
VLESS 是一种精简的协议,目前由 Xray 项目开发。VLESS 向服务器发送客户端 ID 和目标地址。数据加密通常交给 TLS。REALITY 让连接看起来像在访问某个真实的第三方网站。观察者能在第一个数据包中看到该网站的名称。随后是普通的 TLS 1.3 握手,其中的证书已经加密。服务器不需要自己的域名和证书。过滤系统如果不带密钥探测服务器,收到的会是那个真实网站的应答。REALITY 会把这类连接直接转发给该网站。
XHTTP
XHTTP 是 Xray 中的一种传输方式,早期版本名为 SplitHTTP。XHTTP 把数据切成小块,放在 HTTP 请求里传输。在其中一种模式下,上传的数据以一连串 POST 请求发出。同一模式下,下载的数据则作为单个 GET 请求的长响应返回。HTTP 代理或内容分发网络(CDN)会把这些看作普通网页流量。因此,服务器可以像许多网站一样,放在第三方基础设施后面运行。
Hysteria2
Hysteria2 运行在 QUIC(RFC 9000)之上,QUIC 是 HTTP/3 底层基于 UDP 的传输协议。连接时,客户端会报告自己链路的带宽。Hysteria2 按这个速率发送数据,重发丢失的数据包时也不降低速率。在丢包频繁的链路上,例如火车上的移动数据,这一点很有帮助。没有密码的访问者看到的是普通的 HTTP/3 网站。根据设置,服务器会返回 404 页面、文件或另一个网站。在没有 UDP 的网络上,Hysteria2 无法工作。
Shadowsocks
Shadowsocks 于 2012年问世,是这 4 种协议中最早、也最简单的一种。Shadowsocks 是加密代理,从第一个字节起就没有头部,也没有可识别的握手。Ben's VPN 应用基于 Jigsaw 的 Outline 项目,而 Outline 运行在 Shadowsocks 之上。这一组的另外 3 种协议模仿普通网页流量的特征。Shadowsocks 的流量则不像任何已知协议。毫无规律本身也是一种特征。2023年,研究人员描述了一种只做几项简单检查就屏蔽这类连接的过滤系统。这些检查只看第一个数据包。因此,在过滤严格的网络上,单靠 Shadowsocks 是不够的。
选择协议的 6 个判断条件
没有一种 VPN 协议适合所有情况,合适的协议取决于所用的网络和用途。按从上到下的顺序逐条对照。第一条符合实际情况的条件,通常就决定了该用哪种协议。
先由服务器的所有者决定
在单位或学校的网络上,使用管理员提供的 VPN 配置。自建服务器时,WireGuard 配置起来最简单,一对密钥加一份简短的配置文件就够了。VPN 服务商通常让自家应用选择协议。
网络有过滤时,排除 IKEv2、OpenVPN 和 WireGuard
检查 VPN 特征的网络能识别出 IKEv2、OpenVPN 和 WireGuard。在这类网络上,改用看起来像普通流量的协议,例如 VLESS + REALITY、XHTTP 和 Hysteria2。在开放网络上,IKEv2、OpenVPN 和 WireGuard 都能正常工作。
没有 UDP 的网络需要基于 TCP 的协议
有些公司和大学的防火墙只放行网站访问。典型的表现是网页能打开,但 WireGuard 或 IKEv2 始终连不上。在这类网络上可用的协议包括 VLESS + REALITY、XHTTP,以及 443 端口上基于 TCP 的 OpenVPN。
网络频繁切换时,IKEv2 和 WireGuard 更合适
手机每天会在 Wi-Fi 和移动数据之间切换很多次。支持 MOBIKE 的 IKEv2 能在切换时保持隧道。WireGuard 同样能应对切换,并会自动记下客户端的新地址。VPN 服务商的应用通常会在每次切换后重新连接。
通话和游戏更适合走 UDP
通话中丢掉一小段声音几乎听不出来,延迟却马上就能听出来。适合通话和游戏的 UDP 协议有 WireGuard 和 Hysteria2 等。TCP 在丢失的数据包重发之前会阻塞后续的全部数据,所以声音会滞后。
路由器只能运行固件支持的协议
固件支持 OpenVPN 时,选 OpenVPN 而不是 PPTP。只有固件不支持其他协议时,才用 PPTP。即便如此,也只在电视等设备需要连接其他国家或地区时使用。
Ben's VPN 应用自动选择协议
应用使用 4 种协议:VLESS + REALITY、XHTTP、Hysteria2 和 Shadowsocks。选择协议的同时,应用也会选择路径。界面上没有协议选项,要选择的只有位置。网络运营商能看到与服务器的连接,但看不到其中的流量。其他系统的版本见 VPN 应用页面。

如果连接较差,应用会显示“连接不佳”提示和“解决问题”按钮。轻点这个按钮,会看到 2 个选项:换一个位置,或查找可用服务器。查找时,应用会再次检测当前服务器,并获取新的 IP 地址。如果没有改善,应用会启用多跳,经由第三国的中转服务器连接。整个查找最多需要 2 分钟。同样的“查找可用服务器”按钮也在“账户” → “设置”中。
Keenetic、OpenWrt 和 MikroTik 路由器本身就能运行 Ben's VPN 应用。其他路由器只能使用固件自带的协议。为此,账户页面的“路由器” → “其他路由器”中有 PPTP 和 OpenVPN 设置。两种协议通用同一组登录名和密码,这组凭据同一时间只能用于一台路由器。路由器设置页面逐步说明了配置过程。
问题与解答
什么是 VPN 混淆,它和加密有什么不同?
加密隐藏的是内容,没有密钥就无法读取数据包。混淆隐藏的是“这是 VPN 连接”这一事实。混淆让数据包的大小、顺序和形式接近普通流量。WireGuard 加密可靠,但不对流量做混淆。REALITY 和 Hysteria2 在加密之外还做了混淆。
自建服务器应该用 WireGuard 还是 OpenVPN?
在允许 UDP 和 VPN 的网络上,WireGuard 配置更简单,连接也更快。OpenVPN 更灵活,可以在任意端口上通过 UDP 或 TCP 运行,这在只允许 TCP 的网络上很有用。有过滤的网络能凭特征识别出这两种协议。
多跳是一种单独的协议吗?
不是。多跳是一种路由方式,而非协议。流量先到达第三国的中转服务器,再从那里到达所选位置的服务器。多跳改变的是流量的路径,而不是加密方式。在 Ben's VPN 应用中,“自动”模式会在需要保持稳定连接时启用多跳。
如果网站已经使用 HTTPS,VPN 协议还能多做什么?
HTTPS 加密页面,但网络仍能看出访问的是哪个网站。网络能看到网站的 IP 地址,以及连接开始时的网站名称。VPN 协议把这些信息也隐藏起来。这时,网络运营商只看得到与服务器之间的连接。请求离开服务器后,在隧道外前往网站。在这段路径上,HTTPS 仍然保护着请求。








