跳至主要内容
五折优惠 全部方案,限时优惠。起价 $2.48/mo
12 min left
安全与网络

如何在 VPS 上搭建 WireGuard VPN

Pius Bodenmann 作者 Pius Bodenmann 12 分钟阅读 更新者 Mir 4d ago
WireGuard VPN tunnel active on an Ubuntu VPS terminal and a phone client

自建的 WireGuard VPN 让你的笔记本和手机通过加密通道连接到你自己掌控的服务器。当你需要固定的出口 IP、在不可信的 Wi-Fi 上安全上网,或者需要一条通往另一个网络的私有路由时,它很有用。但它不会让你匿名:网站看到的仍然是同一个 VPS 地址,主机服务商也依然在运营底层网络。

本指南在 Ubuntu Server 上搭建一条 IPv4 全局隧道 VPN。你将安装 WireGuard、以严格权限生成密钥、启用路由、添加防火墙与 NAT 规则、连接桌面和移动客户端,并验证隧道。同样的架构也能支持 IPv6,但前提是 VPS 已获得可路由的 IPv6 地址段,并且你单独配置了 IPv6 转发和防火墙规则。

WireGuard 是什么?

WireGuard 是一个现代化的跨平台 VPN 协议及其实现,通过 UDP 传输加密的 IP 数据包。 WireGuard 协议规范 规定了一组固定的密码学原语,包括 ChaCha20-Poly1305、Curve25519、BLAKE2s、SipHash24 和 HKDF。这种刻意精简的设计,使配置和审计都比那些提供大量可互换加密套件的协议更简单。

WireGuard 没有中央账户系统,也没有内置的用户目录。每台设备都是一个 peer,拥有自己的密钥对、隧道地址和 AllowedIPs 规则。在 VPS 上,通常由一个 peer 充当面向互联网的网关,而笔记本和手机则主动向它发起连接。

为什么要在 VPS 上使用 WireGuard?

  • 简单的对等模型: 每台设备获得一个密钥对和一条 peer 记录。
  • 攻击面小: WireGuard 采用精简的协议和固定的加密套件,而不是提供一长串遗留选项。
  • 性能良好: Linux 上的内核集成加上高效的加密实现,可以带来很高的吞吐量,不过实际结果仍取决于 CPU、网络容量、延迟和数据包大小。
  • 跨平台客户端: Windows 10 和 11、macOS、Android、iOS 都有官方客户端,Linux 和多个 BSD 系统则提供原生工具或软件包。
  • 漫游: peer 可以更换网络和源 IP 地址,而不需要新的 WireGuard 身份;服务器会记住最近一次通过认证的端点。
  • 清晰的路由控制: AllowedIPs 既决定哪些目标走隧道,也决定每个 peer 拥有哪些隧道地址。

延伸阅读: Cloudzy 的 VPN 用 VPS 指南。对于较早的部署,请参阅 Cloudzy 的 PPTP 配置指南;不要为新建的、注重安全的 VPN 选择 PPTP。

跳过手动配置:一键部署 WireGuard

如果你没有技术背景,或者不想自己动手配置,Cloudzy 提供一键部署 WireGuard VPN。本指南其余部分讲的是手动搭建,而这一节讲的是捷径。

  1. 登录 Cloudzy 控制面板。
  2. 在应用列表中选择 WireGuard。
  3. 在你想要的地区,用你选择的套餐创建一台 VPS。一台基础配置的 Ubuntu 机器就够了。

VPS 就绪后,登录并运行以下命令来显示你的配置:

cat client.conf

你会看到类似这样的界面:

Terminal output of cat client.conf on a one-click WireGuard VPS, showing the Interface and Peer blocks with the keys and endpoint redacted

用这份配置在电脑上的 WireGuard 客户端里新建一条隧道,连接就绪。如果你更想弄懂每一个环节,或者需要一键镜像覆盖不到的架构,请继续往下看手动搭建部分。

立即设置 WireGuard VPN

如何在 Ubuntu 上搭建 WireGuard

Six-step WireGuard setup cycle around a VPS: install, generate keys, configure wg0 with 10.8.0.1/24, enable forwarding between wg0 and eth0, add firewall and NAT rules on UDP 51820, then start and verify the interface

下面的命令针对当前版本的 Ubuntu Server。请通过 SSH 以具有 sudo 权限的用户执行。在确认防火墙配置无误之前,不要关闭 SSH 会话;如果服务商支持,建议先给 VPS 打一个快照。

先决条件

  • 一台带公网 IPv4 地址的 Ubuntu VPS
  • 一个具有 sudo 权限的非 root 账户
  • SSH 访问权限,以及 VPS 服务商的救援控制台信息
  • 一台安装了 WireGuard 官方客户端或命令行工具的客户端设备

你不需要第二台 Ubuntu 服务器。客户端可以是 Windows 电脑、Mac、Linux 笔记本、Android 手机或 iPhone。

第 1 步:安装 WireGuard

sudo apt update
sudo apt install wireguard -y

确认工具已可用:

wg --version

第 2 步:安全地生成服务器密钥

创建 WireGuard 目录,并在严格的 umask 下生成密钥对。私钥绝不能复制到客户端,也不能出现在日志里。

sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key; wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'

需要把密钥粘贴到配置文件时,再把它们显示出来:

sudo cat /etc/wireguard/server.key
sudo cat /etc/wireguard/server.pub

第 3 步:创建服务器配置

打开接口配置文件:

sudo nano /etc/wireguard/wg0.conf

粘贴以下内容,并把 SERVER_PRIVATE_KEY 替换为上一步生成的私钥:

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

10.8.0.0/24 这个隧道网段只是示例。如果它和你需要访问的家庭、办公室或云网络重叠,请换一个私有网段。不要加上 SaveConfig = true:接口关闭时它可能重写该文件,把你手动改的内容抹掉。

sudo chmod 600 /etc/wireguard/wg0.conf

第 4 步:启用 IPv4 转发

VPS 必须在 wg0 和它的公网网卡之间转发数据包。把这个设置写进一个专用的 sysctl 文件:

sudo nano /etc/sysctl.d/70-wireguard-routing.conf
net.ipv4.ip_forward = 1

应用并验证:

sudo sysctl -p /etc/sysctl.d/70-wireguard-routing.conf
sysctl net.ipv4.ip_forward

这遵循的是 Ubuntu 的 WireGuard 网关指南。IPv6 需要可路由的 IPv6 前缀、单独的隧道地址、IPv6 转发以及 IPv6 防火墙规则;在这条链路完全就绪之前,不要把客户端流量指向 ::/0。

第 5 步:添加防火墙和 NAT 规则

找出 VPS 公网网卡的名称。在下面的输出里,注意 dev 后面的值;常见的名称有 eth0、ens3 和 enp1s0。

ip route show default

重新打开 wg0.conf,在 [Interface] 下添加以下几行。如果你的公网网卡是别的名字,请把所有 eth0 都替换掉:

PostUp = iptables -I FORWARD 1 -i %i -o eth0 -j ACCEPT; iptables -I FORWARD 1 -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PreDown = iptables -D FORWARD -i %i -o eth0 -j ACCEPT; iptables -D FORWARD -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

如果 UFW 处于启用状态,先放行 SSH 再去改动它的状态,然后打开 WireGuard 的 UDP 端口:

sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw status

如果 UFW 当前是关闭的而你想启用它,请先确认 OpenSSH 规则已经存在。不要仅仅为了让这些规则生效,就通过 SSH 关闭再重新启用 UFW,那会带来本可避免的失联风险。

第 6 步:启动 WireGuard 接口

sudo systemctl enable --now wg-quick@wg0
sudo systemctl status wg-quick@wg0 --no-pager
sudo wg show

如果服务启动失败,先运行 journalctl,再去改动其他内容:

sudo journalctl -u wg-quick@wg0 -n 50 --no-pager

添加 WireGuard 客户端

A VPS at 10.8.0.1/32 holding separate peer entries for a laptop, tablet, and phone, each with its own keypair and /32 tunnel address, its private key staying on the device, and a QR code marked as containing a private key

每台设备都需要独立的密钥对和隧道 IP。绝不要把同一份客户端配置用在两台设备上:密钥和地址重复会让路由变得不可预测,也无法干净地吊销某台设备。

第 1 步:生成客户端密钥

官方的桌面端和移动端应用在你新建一条空隧道时就能生成密钥。在 Linux 客户端上,请使用:

umask 077
wg genkey | tee client.key | wg pubkey > client.pub

把 client.key 留在那台设备上,只把 client.pub 复制到服务器。

第 2 步:在服务器上添加 peer

sudo nano /etc/wireguard/wg0.conf

追加一个 peer 配置块,并把 CLIENT_PUBLIC_KEY 替换为客户端的公钥:

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32

Address = 10.8.0.2/32 这一行在客户端上分配隧道地址。而在服务器的 [Peer] 块里,AllowedIPs = 10.8.0.2/32 把该地址与这个 peer 关联起来,用于路由和源地址校验。下一台设备用 10.8.0.3/32,之后依次递增,不要重复。

sudo systemctl restart wg-quick@wg0

第 3 步:编写客户端配置

在客户端上创建 client.conf,并替换其中所有占位符:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.8.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = VPS_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

AllowedIPs = 0.0.0.0/0 会让它变成 IPv4 全局隧道。如果只想访问 VPN 网段,请改用 AllowedIPs = 10.8.0.0/24。PersistentKeepalive 适合位于 NAT 后、需要在空闲时保持映射可达的客户端; WireGuard 快速入门指南 WireGuard 快速入门指南指出,大多数 peer 并不需要它。

第 4 步:导入配置

使用 WireGuard 客户端安装指南 ,获取适用于你所在平台的受支持客户端。

  • Windows: 选择 Add Tunnel,然后导入 client.conf。
  • macOS: 选择 Import tunnel(s) from file,然后选中 client.conf。
  • Android 或 iOS: 导入该文件,或扫描由它生成的二维码。

在保存着 client.conf 的 Ubuntu 或 Debian 客户端上安装 qrencode,并在该客户端的终端里渲染这个文件:

sudo apt install qrencode -y
qrencode -t ansiutf8 < client.conf

二维码里包含客户端的私钥。只在可信的终端上显示它,不要保存截图,手机导入完成后请清空终端。

第 5 步:验证隧道

启用隧道,从客户端产生一些流量,然后在 VPS 上运行以下检查:

sudo wg show
ip -brief address show wg0

最近一次握手以及不断增长的收发计数,说明 WireGuard 确实在交换数据包。接着从客户端验证全局隧道的出口:

curl -4 https://api.ipify.org; echo

这条命令应该返回 VPS 的公网 IPv4 地址。如果始终没有握手,请检查端点地址、UDP 端口、云防火墙、UFW 规则以及密钥。如果握手成功但上不了网,请检查 IP 转发、公网网卡名称、NAT 规则和 DNS。

可以把 WireGuard 放在 Nginx 后面吗?

那位 NGINX stream 模块文档 说明了 NGINX 如何把 UDP 从一个端口转发到另一个端口,因此可以把 UDP/80 或 UDP/443 转发给监听 UDP/51820 的 WireGuard。但那只是 UDP 转发,而不是 HTTP 反向代理。它不会把 WireGuard 变成 TCP 或 HTTPS,也不会让这个协议看起来像普通的网页流量。

对大多数部署来说,改掉 WireGuard 的 ListenPort 并放行对应的 UDP 端口,比额外引入 NGINX 更省事。如果某个网络彻底封禁 UDP,或者启用了深度包检测,用 NGINX 做 UDP 转发也解决不了问题。 WireGuard 已知限制文档 明确指出,流量混淆不在该协议的职责范围内。

把 VPS 接入家庭网络

A VPS hub relaying a roaming laptop and phone to a home gateway over WireGuard, with full-tunnel 0.0.0.0/0 and split-tunnel 192.168.1.0/24 paths, PersistentKeepalive on the home peer, and a warning that two overlapping 192.168.1.0/24 networks cannot route cleanly

VPS 可以充当漫游客户端与你家中某台设备之间的中枢。家里那一侧的 peer 会主动向 VPS 发起出站的 WireGuard 连接,因此家里不需要公网 IP。如果这个家庭 peer 位于 NAT 之后,请为它设置 PersistentKeepalive。

要访问整个家庭局域网,光加一个 peer 还不够。VPS 上对应家庭网关的那条 peer 记录,必须在 AllowedIPs 里包含家庭子网,比如 192.168.1.0/24。使用全局隧道(AllowedIPs = 0.0.0.0/0)的远程客户端本来就会把该子网的流量送往 VPS;只有在使用分流隧道时,才需要在客户端加上 192.168.1.0/24。家庭网关同样必须在 WireGuard 与局域网之间转发流量。可以在家用路由器上加一条路由,或者在家庭网关上加一条范围收得很紧的 NAT 规则。请先检查网段是否冲突:如果客户端连着另一个 192.168.1.0/24 网络,那么不重新编址或不使用更复杂的策略路由,就无法把两个网络都干净地路由出去。

自建 WireGuard 与商业 VPN 的取舍

自建只是改变了由谁来运营 VPN,并不会自动提升匿名性。个人 VPS 给你的是一个固定的出口 IP,而它很容易被关联到某个主机托管网络。商业服务通常提供共享出口地址和便捷的地区切换,但你必须信任它的政策、运营方式,以及它公开的独立审计报告。

WireGuard 本身很轻量,一台小配置的 VPS 通常足以作为一个人加几台设备的起点。不要把某个固定的内存或 vCPU 数字当成吞吐量保证。请用你真实的设备数量、所在地区、数据包大小和预期带宽来实测,一旦 CPU 跑满、出现丢包或延迟成为瓶颈,再调整配置。

如果稳定的专属出口 IP、远程访问或对服务器的掌控,比可选地区和省心更重要,那就选自建。如果你想要众多国家节点、共享出口、广泛的消费级设备支持,并且希望由别人来处理故障,那就选商业 VPN。

决策因素自建 WireGuard商业 VPN
成本模型一台服务器,外加你自己的运维时间订阅制,长期套餐通常有折扣
出口地区每台服务器一个地区应用内提供众多可选地区
安装密钥、路由、防火墙规则和客户端都由你自己配置安装应用并登录
维护打补丁、监控、备份和排障都由你负责由服务商负责运营
隐私模型服务器由你掌控,但主机服务商依然能观察到元数据你依赖服务商的政策,以及它公开的独立审计报告
最佳匹配稳定的专属出口 IP、远程访问,以及对基础设施的掌控可切换地区、维护成本低、设备支持面广

结语

一套可靠的 WireGuard 部署,归根结底就是五件事:受保护的私钥、互不重复的 peer 地址、正确的 AllowedIPs、能正常工作的转发与 NAT,以及为监听的 UDP 端口放行的防火墙规则。在真正依赖这条隧道之前,请同时验证握手和公网出口地址;部署之后也要持续给 VPS 打补丁。

如果你想手动搭建服务器,可以从一台干净的 Cloudzy Ubuntu VPS。如果你更想跳过安装步骤,可以使用 Cloudzy 的一键 WireGuard 部署 ,直接进入客户端配置和验证环节。

常见问题

为什么 WireGuard 显示了 peer 却没有握手?

有一条 peer 记录,只能说明配置被读取了。没有握手通常意味着客户端根本没到达服务器,或者两边密钥对不上。请检查客户端的 Endpoint、服务器的公网 IP、服务商防火墙和 UFW 里的 UDP/51820,以及两侧的公钥。检查之前先从客户端产生一些流量,因为 WireGuard 在空闲时是静默的。

为什么隧道连上了,网却上不了?

握手成功却上不了网,通常是路由问题而不是加密问题。请检查 net.ipv4.ip_forward,确认 NAT 规则里的公网网卡名称是否正确,查看 FORWARD 规则,并把 DNS 和纯 IP 连通性分开测试。另外还要确认客户端上的 AllowedIPs 是否符合你想要的全局隧道或分流隧道设计。

两台设备可以共用同一份 WireGuard 配置吗?

不行。请给每台设备各自的私钥、公钥和 /32 隧道地址。重复使用同一份配置会造成端点和路由冲突,而且一旦某台设备丢失,你无法在不断开另一台的情况下单独吊销它。

每个客户端都需要 PersistentKeepalive 吗?

不需要。当位于 NAT 之后的 peer 需要在空闲期间保持映射不失效时才加上它,手机、家庭网关和某些限制较严的网络常有这种情况。如果该 peer 本来就通信频繁,或者空闲时不需要对端主动连上来,就不用加。

分享

博客更多内容

继续阅读。

准备好部署了吗? 起价 $2.48/月。

独立云厂商,自 2008 年起。AMD EPYC、NVMe、40 Gbps。14 天退款保证。