SSD Nodes Learn 8GB 内存 — 每年 $66
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-01

WireGuard 与 OpenVPN:自托管 VPN 该选哪个

自托管 VPN 优先选 WireGuard:代码约 4,000 行、连接不到 1 秒、配置约 10 行。了解 TCP 443、证书、密码认证和二层桥接这 4 个仍应选 OpenVPN 的场景。

简短结论

对于个人在自己的 VPS 上运行 VPN 服务器这一场景,WireGuard 与 OpenVPN 并不是势均力敌的选择:请选择 WireGuard。它的代码规模更小,运行在 Linux 内核中,连接只需不到一秒,正常工作的客户端配置大约只有十行。OpenVPN 仍有 4 项实际用途;如果这些用途都不适用于您,就不需要使用它。

这 4 项用途是:从只允许 TCP 端口 443 的网络中连接出去,接入现有的证书颁发机构,使用密码或第二因素验证指定用户,以及在 Layer 2 上进行桥接。以下内容将提供支持这一建议的证据,并明确说明每个例外从何处开始适用于您。

自托管用户选择 WireGuard 的原因

代码库足够小,便于审阅。 WireGuard 项目将其协议实现控制在约 4,000 行代码内。计算 OpenVPN 依赖的 OpenSSL 库(用于执行所有加密操作)后,代码量达到 6 位数。规模很重要,因为每一行代码都是攻击面,而您和审阅者都不可能阅读 100,000 行代码。4,000 行则可以审阅。

它在内核中运行。 WireGuard 自 5.6 起进入 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 通过公钥而不是地址标识对等端。您的笔记本从家庭网络切换到移动热点后,会从新地址发送一次握手,服务器随后更新用于回复的 endpoint。不会发生重新连接,因为连接从未保持建立状态。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 的理由之前,请先了解其限制。它只支持第3层隧道,只接受 AEAD 密码(带有关联数据的身份验证加密:AES-GCM 或 ChaCha20-Poly1305),不支持压缩,而且在服务器上只能与 topology subnet 配合使用。这些限制中的每一项都会减少 OpenVPN 原本提供的灵活性。所谓高速 OpenVPN,就是将 OpenVPN 配置成类似 WireGuard。

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

OpenVPN 仍然适用的场景

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

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

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

您需要第 2 层网络,或需要支持旧设备的客户端。 使用 dev tap 的 OpenVPN 可以桥接以太网帧。这对于广播协议和旧版 LAN 游戏很重要。WireGuard 仅支持第 3 层,并且始终如此。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 后,无法在该 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 现在不安全吗?

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

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

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