SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-07

WireGuard vs OpenVPN:自托管 VPN 选哪个?

自托管 VPS 的 VPN 应优先选 WireGuard:约 4,000 行代码、配置约十行、连接不到一秒。仅在 TCP 443、证书颁发机构、密码或二因素认证、Layer 2 桥接等四种需求下考虑 OpenVPN。

简短结论

对于个人在自己的 VPS 上运行 VPN 服务器这一场景,WireGuard 和 OpenVPN 并不是势均力敌的选择:应选择 WireGuard。WireGuard 代码更少,运行在 Linux 内核中,连接只需不到一秒,正常工作的客户端配置大约只有十行。如果以下四项实际需求都与您无关,就不需要 OpenVPN。

这四项需求分别是:绕过只允许 TCP 443 端口的网络限制,接入现有的证书颁发机构,使用密码或第二因素验证指定用户,以及在 Layer 2 层进行桥接。下面的内容将给出支持上述建议的证据,并明确说明每个例外从什么情况下开始适用于您。

自托管用户选择 WireGuard 的原因

代码库足够小,便于审查。 WireGuard 项目的协议实现约有 4,000 行代码。算上 OpenVPN 依赖的 OpenSSL 库,以及该库用于所有加密操作的代码后,OpenVPN 的代码量达到六位数。代码规模很重要,因为每一行代码都可能扩大攻击面,而且您和审查人员都不可能阅读 100,000 行代码。但 4,000 行是可以审查的。

它运行在内核中。 自 Linux 5.6 起,WireGuard 已进入 Linux 主线内核,因此 Ubuntu 24.04 和 Debian 13 无需编译即可使用。数据包会在内核空间中直接加密,无需复制到用户空间进程再复制回来。先执行以下检查:

sudo modprobe wireguard && echo ok

在 KVM VPS 上,该命令会输出 ok。在 OpenVZ 或 LXC 等共享宿主机内核的容器虚拟化环境中,该命令会失败并输出 Operation not supported,因为您无法将模块加载到不属于您的内核中。

无需协商参数。 WireGuard 只有一个固定的密码套件:数据使用 ChaCha20-Poly1305,密钥使用 Curve25519。没有可降级的版本,也没有容易配置错误的选项。OpenVPN 会与每个客户端协商密码算法和 TLS(传输层安全)版本。这提供了灵活性,但错误配置也由此产生。服务器如果保留 data-ciphers AES-256-GCM:AES-128-CBC,当客户端没有提供更好的选项时,就会顺利回退到 CBC 密码算法,而且日志不会将此记录为问题。

端口不会响应。 WireGuard 数据包未通过消息身份验证检查时会直接丢弃,完全不发送响应。因此,无论是否有服务监听,nmap -sU -p 51820 都会返回 open|filtered。TCP 模式下的 OpenVPN 服务器会先完成 TCP 握手,然后才判断不接受该连接。扫描器因此足以确认该端口上存在服务。使用 tls-crypt 的 UDP 模式 OpenVPN 几乎同样安静。因此,这一点是反对通过 TCP 运行 OpenVPN,而不是反对 OpenVPN 本身。

漫游无需额外配置。 WireGuard 对等端通过公钥而不是地址进行标识。您的笔记本电脑从家庭网络切换到移动热点后,会从新地址发送一次握手,服务器随后更新用于回复的端点。不会发生重新连接,因为连接本身从未建立。OpenVPN 也可以通过 float 实现类似功能,但客户端通常会断开并重新建立完整的 TLS 会话。因此,打开笔记本电脑上盖后,OpenVPN 会出现明显的暂停,而 WireGuard 不会。

2026 年的速度:差距已经缩小

多年来,关于速度的真实说法是:OpenVPN 会将每个数据包复制到用户空间,在那里加密后再复制回来,而 WireGuard 从不离开内核。现在情况已经不完全如此,忽略这一点的比较已经过时。

OpenVPN 2.7 于 2026 年 2 月发布,支持上游的 ovpn 内核模块。该模块已合并到 Linux 6.16 中。这就是 DCO(数据通道卸载):控制通道仍在用户空间中运行,而大部分数据路径移入内核,其工作方式大致与 WireGuard 一直采用的方式相同。在内核和 OpenVPN 版本都足够新、可以使用该功能时,两者的吞吐量处于同一水平,而不是一个快、一个慢很多。检查实际环境:

uname -r
openvpn --version | head -n 1
modinfo ovpn 2>/dev/null | head -n 3

截至 2026 年 7 月,标准 Ubuntu 24.04 LTS 提供的是 OpenVPN 2.6,而不是 2.7,并且 ovpn 模块需要 2.7。在该版本中,只有通过较旧的 openvpn-dco-dkms 软件包才能使用卸载功能。该软件包会针对当前运行的内核构建一个树外模块,因此每次升级内核时都需要重新构建。这是 WireGuard 不需要处理的额外环节。

在将 DCO 视为继续使用 OpenVPN 的理由之前,请先阅读其限制。它只支持 Layer 3 隧道,只接受 AEAD 密码(带关联数据的认证加密:AES-GCM 或 ChaCha20-Poly1305),不支持压缩,并且在服务器上只能与 topology subnet 配合使用。这些限制中的每一项都会削弱 OpenVPN 最初主打的灵活性。经过快速配置的 OpenVPN,本质上是被配置得类似 WireGuard 的 OpenVPN。

不要相信任何人发布的吞吐量数据,包括本页面的数据。VPS 的性能上限通常由 CPU 配额或网络配额决定,而不是由协议决定。使用运行在隧道中的 iperf3 测量自己的速度,然后在隧道外再次测量,并比较两者。

OpenVPN 仍然适用的场景

您需要通过 TCP 443 端口访问外部网络。 WireGuard 仅支持 UDP,这是有意的设计,并且不会提供 TCP 模式。酒店网络或企业代理如果只允许 TCP 443,配置了 proto tcp-serverport 443 的 OpenVPN 可以通过,因为这类流量看起来像普通的 TLS 会话。WireGuard 需要使用 wstunneludp2raw 等封装方式才能通过同一网络,这会增加一个需要运行和及时修补的进程。请注意端口冲突:如果该 IP 地址上的 Web 服务器已经占用 TCP 443,其中一个服务必须更换端口。

您已经在运行证书颁发机构。 OpenVPN 使用 X.509 证书进行身份验证,因此可以直接接入您已经运行的 PKI(公钥基础设施)。证书会自行过期;要撤销证书,只需将其加入证书吊销列表,服务器通过 crl-verify 读取该列表。WireGuard 没有证书、过期机制或证书吊销列表。移除对等端意味着编辑服务器配置并重新加载。对 10 个对等端来说,这没有问题。对 400 个对等端来说,如果还有审计要求,证书模型就能切实减少管理工作。

您需要命名用户,而不只是密钥。 OpenVPN 可以通过 auth-user-pass-verifyopenvpn-plugin-auth-pam.so 等插件,将身份验证交给外部系统;这也是接入 LDAP 或一次性密码第二因素的方式。WireGuard 完全没有用户这一概念。密钥要么存在于配置中,要么不存在。如果您的要求是“Sara 必须输入手机收到的代码”,WireGuard 本身无法实现这一点。

您需要二层网络,或需要支持某种老旧客户端。 OpenVPN 配合 dev tap 可以桥接以太网帧,这对广播协议和老旧局域网游戏很重要。WireGuard 仅支持三层网络,并且始终如此。OpenVPN 还支持一些硬件和操作系统,而这些平台永远不会提供 WireGuard 应用。这两个理由的重要性都在降低;此外,dev tap 与 DCO 不兼容,因此使用桥接时必须采用较慢的路径。

两个方案的实际成本

WireGuard 身份只需执行一条命令。括号很重要,因为它会在密钥生成前设置文件模式:

(umask 077; wg genkey > private.key)
wg pubkey < private.key > public.key

OpenVPN 的等价操作是创建一个由您负责维护的证书颁发机构。只要 VPN 继续运行,您就必须维护它:

sudo apt install -y easy-rsa
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-req server nopass
./easyrsa sign-req server server

这两份清单都没有偏袒任何一方。CA 提供了过期和吊销机制,但您需要保护一个必须保存多年的私钥,记得续期,并在丢失私钥后重新构建整个体系。如果您不需要这些功能,就等于为没有使用的功能付费。完整的 WireGuard 配置流程包括转发、NAT(网络地址转换),以及可能浪费一下午时间的握手失败排查,详见 在 VPS 上自行托管 WireGuard VPN 的指南

防火墙需要为每种协议配置什么

WireGuard 只需要一条入站规则,允许 ListenPort 中端口上的 UDP 流量:

sudo ufw allow 51820/udp
sudo ufw status verbose

OpenVPN 默认需要开放 UDP 1194;如果选择该方案,也可以使用 TCP 443。之后,两者都需要启用 IP 转发,并配置源 NAT 规则,因为 Linux 主机会丢弃目标地址不是本机的数据包。这部分配置对两种协议完全相同,也是大多数“隧道已连接但无法访问互联网”问题的来源。如果您不熟悉 ufw,请先阅读 VPS 上的 ufw 防火墙基础知识。还要注意,大多数服务商会在控制面板中提供第二层网络防火墙:如果数据包根本没有到达服务器,您在服务器上添加的规则不会生效。了解端口是什么以及 Linux 如何监听端口,可以更快完成这两项检查。

如何选择:一段话说明

除非您能明确说出 WireGuard 无法满足的具体需求,否则请使用 WireGuard。如果需要通过 TCP 443 绕过网络限制,请在该端口运行 OpenVPN;也可以考虑同时运行两者:它们使用不同端口,可以在同一台服务器上共存,不会发生冲突。如果需要按用户管理账户或添加第二因素,请不要强行让 WireGuard承担这些功能,而应在其上层部署身份管理层。自托管 Headscale 控制服务器底层使用 WireGuard,并增加账户模型、密钥分发和设备审批功能;这些工作在使用原生 WireGuard 时需要您自行处理。

无中断迁移 OpenVPN

不存在转换过程。OpenVPN 的 PKI 不会转换为 WireGuard 密钥,因为 WireGuard 没有可供转换的证书。每个客户端都需要一对新的密钥,生成方式与服务器密钥对相同。

不要直接切换,而应并行迁移。WireGuard 使用 UDP 51820 端口,OpenVPN 使用 1194 端口,两者可以同时运行在同一台服务器上。因此,先启动 wg0,再通过 sudo wg show 确认其状态,检查是否列出了最近的 latest handshake,然后逐个迁移客户端。当 OpenVPN 对等端列表不再变化后,使用 sudo systemctl disable --now openvpn-server@server 停止服务。确认不再需要 CA 文件之前,请保留这些文件,因为删除 CA 后,无法重新构建已撤销客户端的配置。

有一项内容确实无法迁移:用户名和密码账户,以及与其关联的撤销记录。应在关闭旧服务器之前决定这些内容存放在哪里,而不是关闭之后再处理。

FAQ

WireGuard 比 OpenVPN 更快吗?

在原装配置的 Ubuntu 24.04 服务器上,是的,而且快很多。原因是 WireGuard 在内核中执行加密,而 OpenVPN 2.6 会让每个数据包都经过用户空间进程。使用 OpenVPN 2.7 和 Linux 6.16 提供的 ovpn 内核模块后,数据路径也在内核中,两者属于同一水平。请使用 iperf3 测量您自己的隧道性能,不要盲信博客中的数字,因为在 VPS 上,瓶颈通常是 CPU 或带宽配额。

WireGuard 可以通过 TCP 443 端口运行吗?

不能单独实现。WireGuard 按设计仅支持 UDP,也没有计划增加 TCP 模式。要穿过只允许 TCP 443 的网络,您需要使用 wstunneludp2raw 等方式将其封装在隧道中。这会要求在两端运行并维护额外进程。如果这种限制是您日常工作的网络环境,使用 proto tcp-serverport 443 配置 OpenVPN 会更简单。

OpenVPN 现在不安全吗?

不是。当前版本的 OpenVPN 使用 AES-256-GCM 等 AEAD 加密算法,并启用 tls-crypt 时,是可靠的 VPN。选择 WireGuard 的理由在于其他方面:OpenVPN 包含更多代码和更多选项,因此管理员更容易错误配置。选项越少,配置错误的可能性越低。

在 VPS 上搭建个人 VPN,我应该选择哪个?

WireGuard。每台设备使用一对密钥,一个大约十行的配置文件,只需开放一个 UDP 端口,握手在您察觉之前就已完成。只有在您经常从阻止 UDP 的网络连接,或者必须接入现有的证书颁发机构或用户目录时,才选择 OpenVPN。