上线优惠价:每个套餐的价格都比我们追踪的最便宜的离岸竞争对手低 30%。 查看价格对比所有套餐价格均比最便宜的离岸主机服务商低 30%

知识库 · VPS

如何使用 WireGuard 在 VPS 上自建 VPN

使用 WireGuard 在 VPS 上自建 VPN:在 Ubuntu 24.04 或 Debian 上安装,编写带 NAT 的 wg0.conf,在 UFW 中放行端口,通过二维码添加客户端并进行泄漏测试。

更新于 阅读约 11 分钟

本指南要点

  • WireGuard 运行在 Linux 内核中,因此最小的 VPS 套餐就足以承载个人 VPN。
  • 使用 umask 077 创建密钥,然后编写 /etc/wireguard/wg0.conf,并在实际的网络接口上配置 NAT。
  • 开启 IP 转发,在 UFW 中放行 51820/udp 和隧道的路由,并首先确保 SSH 保持放行。
  • 为每台设备分配独立的密钥对和地址;手机通过扫描二维码导入配置。
  • 在正式依赖隧道之前,请在已连接的设备上检查公网 IP、DNS 和 IPv6。
VPS13 个章节
全部指南
本页内容
  1. 开始之前:WireGuard VPS 需要什么
  2. 在 Ubuntu 或 Debian 上安装 WireGuard
  3. 生成服务器和客户端密钥
  4. 编写 WireGuard 服务器配置
  5. 启用 IP 转发
  6. 配置防火墙放行规则
  7. 启动隧道并设置开机自启
  8. 添加客户端
  9. 添加 IPv6(可选)
  10. 检查泄漏
  11. 保持 WireGuard VPS 更新并添加更多客户端
  12. 故障排查
  13. 常见问题

要使用 WireGuard 在 VPS 上自建 VPN,请安装 wireguard 软件包,为服务器和每台设备创建密钥对,在 /etc/wireguard/wg0.conf 中定义隧道并配置到服务器网络接口的 NAT,开启 IP 转发,开放 UDP 端口 51820,然后启动 wg-quick@wg0。每台设备使用各自的配置文件或二维码进行连接。

以下步骤将在运行 Ubuntu 24.04 LTS、Debian 12 或 Debian 13 的离岸 VPS 上搭建 WireGuard VPS,并按照快速入门中的说明通过 SSH 获得 root 权限。请将 SERVER_IP 替换为您服务器的 IPv4 地址,将 eth0 替换为您的网络接口名称。

开始之前:WireGuard VPS 需要什么

  • 一台拥有公网 IPv4 地址的 VPS。每个套餐都包含一个独立 IPv4 地址和一个 /64 IPv6 地址段。
  • 通过 SSH 登录的 root 权限。
  • 每台设备上的 WireGuard 应用。WireGuard 安装页面列出了适用于 Windows、macOS、iOS 和 Android 的官方应用;Linux 电脑使用 wireguard-tools 软件包。

最小的套餐就够用。WireGuard 运行在 Linux 内核中,占用内存很少,因此 Dinghy 套餐(1 个 vCPU、1 GB 内存,每月 $2.39)即可承载个人 VPN。加密需要消耗 CPU:如果会有很多设备同时传输大量数据,请选择更多 vCPU。带宽在合理使用范围内不限流量。

选择离您较近的地区可以保持浏览速度;选择其他国家的地区则会改变服务器所适用的法律。选择之前,请在网络页面比较延迟,并阅读我们关于用离岸 VPS 搭建 VPN 的指南。与所有无需 KYC 的 VPS 一样,您的账户只需邮箱地址和密码,并使用加密货币付款。

我们的可接受使用政策将 VPN 列为受欢迎的用途之一。您设备的流量会以服务器的 IP 地址发出,因此通过隧道发出的滥用行为会被视为来自您的服务器:请只向您信任的人提供访问权限。出站 25 端口默认关闭。

在 Ubuntu 或 Debian 上安装 WireGuard

要在 Ubuntu 24.04 或 Debian 上设置 WireGuard,请安装三个软件包并检查版本:

apt update
apt install -y wireguard ufw qrencode
wg --version

wireguard 软件包会安装 wg 和 wg-quick 工具。在 Ubuntu 24.04 以及 Debian 12 和 13 上,隧道本身已是内核的一部分,无需编译任何内容。ufw 会带来 NAT 规则所用的 iptables 命令;如果您使用 nftables 管理防火墙,可以不安装它。qrencode 用于为手机生成二维码。

生成服务器和客户端密钥

cd /etc/wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee laptop.key | wg pubkey > laptop.pub

umask 077 让您在当前 shell 中创建的文件仅 root 可读,而 /etc/wireguard 目录本身已禁止其他用户访问。wg genkey 会输出一个随机私钥,wg pubkey 则根据私钥推导出对应的公钥,与 WireGuard 快速入门中的做法相同。任何持有私钥的人都能以该设备的身份连接,因此请妥善保密。

每台设备使用一个以设备命名的密钥对,这样可以单独吊销某台设备,而不影响其他设备。您也可以在设备本机上生成其密钥,只将公钥复制到服务器。

编写 WireGuard 服务器配置

WireGuard 服务器的全部配置都在一个文件中。首先找出承载服务器互联网流量的网络接口:

ip route show default

dev 后面的词就是接口名称,例如 eth0、ens3 或 enp1s0:请在两行 NAT 规则中都使用该名称。其中的 $(cat ...) 部分会将密钥内容复制到文件中:

cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = $(cat /etc/wireguard/server.key)
PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

[Peer]
# laptop
PublicKey = $(cat /etc/wireguard/laptop.pub)
AllowedIPs = 10.8.0.2/32
EOF
chmod 600 /etc/wireguard/wg0.conf
地址
服务器在隧道内的地址。私有地址段 10.8.0.0/24 可容纳 253 台设备。
ListenPort
设备连接的 UDP 端口;51820 是 WireGuard 官方示例中使用的端口。
PrivateKey
服务器的私钥,因此该文件必须保持仅 root 可读。
PostUp 和 PostDown
隧道启动和停止时由 wg-quick 通过 bash 执行的命令,详见其手册页。这里用它们添加和删除 NAT 规则,使设备以服务器的 IPv4 地址访问互联网。
[Peer]
每台设备一个配置段。对于源地址不在其 AllowedIPs 范围内的设备数据包,WireGuard 一律丢弃,并将这种设计称为加密密钥路由(Cryptokey Routing)。

启用 IP 转发

只有在开启转发后,Linux 才会在网络接口之间传递数据包,而根据内核文档,转发默认是关闭的。请立即开启,并设置为每次启动时自动开启:

echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-wireguard.conf
sysctl --system
sysctl net.ipv4.ip_forward

最后一条命令必须输出 net.ipv4.ip_forward = 1。sysctl --system 会加载 /etc/sysctl.d 以及其手册页中列出的其他位置中的文件,每次启动时同样会再次应用这些文件。

配置防火墙放行规则

先放行 SSH,以免启用 UFW 后连接被切断,然后放行 WireGuard 端口和隧道的出站路由:

ufw allow 22/tcp
ufw allow 51820/udp
ufw route allow in on wg0 out on eth0
ufw enable
ufw status verbose

如果您已按照加固指南更改了 SSH 端口,请放行您自己的 SSH 端口,而不是 22。ufw enable 会警告可能中断现有 SSH 连接;请回答 y。UFW 默认会丢弃转发流量,其状态显示为 deny (routed),因此正是 route 这条规则让隧道流量得以经由 eth0 发出。回程流量会自动放行,而且每条规则同样适用于 IPv6。

使用 nftables 代替 UFW

如果您沿用加固指南中自己的 /etc/nftables.conf,请跳过 UFW,从 wg0.conf 中删除 PostUp 和 PostDown 行,在 input 链中添加 udp dport 51820 accept,并在文件末尾添加以下表:

table inet wg-nat {
  chain postrouting {
    type nat hook postrouting priority srcnat;
    ip saddr 10.8.0.0/24 oifname "eth0" masquerade
  }
}

检查文件,然后加载:

nft -c -f /etc/nftables.conf
nft -f /etc/nftables.conf

写在文件中的 NAT 规则在重新加载后依然有效。如果由 PostUp 添加,那么每当文件中的 flush ruleset 行执行时,该规则就会消失。

启动隧道并设置开机自启

systemctl enable --now wg-quick@wg0
wg show

wg-quick@wg0 会读取 wg0.conf,创建 wg0 接口,执行 PostUp 命令,并在每次开机时自动启动。wg show 会显示 listening port: 51820,并将您的笔记本电脑列为对等端,在笔记本电脑连接之前不会有握手。如果服务启动失败,请使用 journalctl -u wg-quick@wg0 -b 查看其日志。

添加客户端

笔记本或台式电脑:使用配置文件

在服务器上编写笔记本电脑的配置文件,并用您服务器的 IPv4 地址替换 SERVER_IP:

umask 077
cat > /etc/wireguard/laptop.conf <<EOF
[Interface]
PrivateKey = $(cat /etc/wireguard/laptop.key)
Address = 10.8.0.2/32
DNS = 9.9.9.9

[Peer]
PublicKey = $(cat /etc/wireguard/server.pub)
Endpoint = SERVER_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
AllowedIPs = 0.0.0.0/0, ::/0
所有流量都经过隧道。即使服务器没有 IPv6,也请保留 ::/0:这样 IPv6 流量会进入隧道并在其中被丢弃,而不会绕过隧道泄漏出去。
DNS
9.9.9.9 是 Quad9,它会拦截恶意软件域名并验证 DNSSEC;您也可以使用任何您信任的解析器。DNS 查询在隧道内传输。
PersistentKeepalive = 25
防止家用路由器和移动网络断开连接。WireGuard 快速入门将 25 秒称为“一个合理的间隔,适用于各种各样的防火墙”。

在笔记本电脑上复制该文件(如果加固后已禁止 root 登录,请通过您的 sudo 用户复制),然后从服务器上删除笔记本电脑的私钥和配置文件,服务器只需要公钥:

scp root@SERVER_IP:/etc/wireguard/laptop.conf .
rm /etc/wireguard/laptop.key /etc/wireguard/laptop.conf

在 Windows 和 macOS 上,在 WireGuard 应用中导入该文件。在 Linux 上,将其复制到 /etc/wireguard/ 并运行 wg-quick up laptop;DNS 行需要 resolvconf,在 Ubuntu 上由 systemd-resolved 提供,在 Debian 上由 openresolv 软件包提供。

手机:扫描二维码

手机需要在服务器上拥有自己的密钥、地址和 [Peer] 配置段:

cd /etc/wireguard
umask 077
wg genkey | tee phone.key | wg pubkey > phone.pub
cat >> /etc/wireguard/wg0.conf <<EOF

[Peer]
# phone
PublicKey = $(cat /etc/wireguard/phone.pub)
AllowedIPs = 10.8.0.3/32
EOF
systemctl reload wg-quick@wg0

仿照 laptop.conf 编写 phone.conf,改用 phone.key 和 10.8.0.3/32,然后在终端中显示:

qrencode -t ansiutf8 < /etc/wireguard/phone.conf

使用 WireGuard 应用的扫描二维码功能进行扫描,然后从服务器上删除 phone.key 和 phone.conf。

添加 IPv6(可选)

为设备提供 IPv6 最简单的方法,是在隧道内使用私有地址段,并像 IPv4 一样将其转换为服务器的公网 IPv6 地址;这样所有设备会共享该地址。私有地址段以 fd 开头,后接随机数字(RFC 4193),因此请自行选择一个,而不要照搬 fd8c:5e2a:91b4::/64。使用 systemctl stop wg-quick@wg0 停止隧道,然后在 wg0.conf 中替换 Address 行,并在 IPv4 的 NAT 行下方添加 IPv6 的 NAT 行:

Address = 10.8.0.1/24, fd8c:5e2a:91b4::1/64
PostUp = ip6tables -t nat -A POSTROUTING -s fd8c:5e2a:91b4::/64 -o eth0 -j MASQUERADE
PostDown = ip6tables -t nat -D POSTROUTING -s fd8c:5e2a:91b4::/64 -o eth0 -j MASQUERADE

在两端都为每台设备分配 IPv6 地址,例如在其 [Peer] 配置段中写入 AllowedIPs = 10.8.0.2/32, fd8c:5e2a:91b4::2/128,在设备自己的配置文件中写入 Address = 10.8.0.2/32, fd8c:5e2a:91b4::2/128。然后启用 IPv6 转发并重新启动隧道:

echo 'net.ipv6.conf.all.forwarding = 1' >> /etc/sysctl.d/99-wireguard.conf
sysctl --system
systemctl start wg-quick@wg0

如果使用 nftables,请改为在 wg-nat 表中添加 ip6 saddr fd8c:5e2a:91b4::/64 oifname "eth0" masquerade。也可以使用您 /64 地址段中的公网地址,但视该地址段路由到服务器的方式而定,通常需要配置邻居发现(NDP)代理。

检查泄漏

在已连接的设备上(而不是在服务器上)检查以下三项:

  1. 公网 IP。IP 查询网站显示的必须是您服务器的 IPv4 地址(如果添加了 IPv6,还包括其 IPv6 地址),绝不能是您家中的地址。
  2. DNS。DNS 泄漏测试列出的必须只有您在 DNS 行中所填服务的解析器,而不是您互联网服务提供商的解析器。
  3. IPv6.如果隧道中没有配置 IPv6,则根本不应出现任何 IPv6 地址。如果显示了您家中的 IPv6 地址,请检查设备的 AllowedIPs 是否包含 ::/0。

此时在服务器上,wg show 会列出该设备的 latest handshake,以及随着您浏览而不断增长的 transfer 行。隧道改变的是网站看到的地址,而不是您登录的账户。

保持 WireGuard VPS 更新并添加更多客户端

WireGuard 的更新随内核和 wireguard-tools 一起发布。加固指南中配置的自动安全更新会安装这些更新;新内核在重启后生效,wg-quick@wg0 会自动启动。请备份 /etc/wireguard,其中保存着服务器的私钥。

  • 添加其他设备:使用下一个空闲地址(10.8.0.4/32,依此类推)重复手机的步骤。
  • 应用对等端变更:systemctl reload wg-quick@wg0 会执行 wg syncconf,根据 wg 手册,这样做“具有不中断当前对等端会话的好处”。
  • 移除设备:删除其 [Peer] 配置段并重新加载。其密钥会立即失效。
  • 可选:使用 wg genpsk 生成一个 PresharedKey,并在对等端的两侧同时设置,即可增加对称密钥加密,“以实现后量子抗性”。

故障排查

没有握手

如果 wg show 中某台设备没有 latest handshake,说明密钥交换从未完成。请检查:

  • 服务正在运行:systemctl status wg-quick@wg0;
  • UFW 已放行 51820/udp。有些网络会封锁 UDP,而 WireGuard 没有 TCP 模式,因此也请通过移动数据网络进行测试;
  • 设备的 Endpoint 中地址和端口正确;
  • 密钥已交叉配置:设备的配置文件中是服务器的公钥,而服务器的 [Peer] 配置段中是设备的公钥。

有握手但没有流量

有握手但无法访问网站,说明服务器没有转发流量或没有进行地址转换。请检查:

  • sysctl net.ipv4.ip_forward 输出 1;
  • NAT 规则中的接口名称与 ip route show default 显示的一致。名称错误恰恰会导致这种症状,iptables -t nat -L POSTROUTING -n -v 中的计数器可以显示规则是否匹配。请按上文所述,在停止隧道后再进行修正;
  • UFW 中有 route allow 规则;
  • 设备的 Address 与服务器上为其配置的 AllowedIPs 一致;
  • 域名解析正常。如果 ping 9.9.9.9 能通,但网站无法访问,请修正 DNS 行。

部分网站能打开,部分卡住:MTU 问题

wg-quick 会将隧道的 MTU 设置为比本地网络低 80 字节:在常规的 1500 字节链路上为 1420。如果路径更远处存在更小的 MTU,例如您路由器后方使用 PPPoE 的 DSL 线路,大数据包就会丢失:小页面可以加载,而下载和部分网站会卡住。请在设备的 [Interface] 配置段中添加 MTU = 1380 并重新连接。如果仍不够,请尝试 1280,这是 IPv6 允许的最小 MTU。

常见问题

为自己运行 VPN 是服务器的一种普通用途,我们的可接受使用政策也将 VPN 列为所有套餐都欢迎的用途之一。您可以通过它做什么,取决于您所在地以及服务器所在地的法律,因此请了解您所在司法管辖区的规定。来自隧道的流量会以您服务器的 IP 地址发出。

一台 WireGuard 服务器能支持多少台设备?

本指南中的 10.8.0.0/24 地址段除服务器外还可容纳 253 台设备。实际上,限制因素是加密所占用的 CPU 时间和您的带宽,而不是协议本身。请在高峰时段观察 top,如果 CPU 持续接近 100%,请升级到更高一档的套餐。

WireGuard 会保留日志吗?

WireGuard 不写入任何连接日志。隧道运行期间,它会在内存中保存每台设备最近一次的 IP 地址和端口(可通过 wg show 查看),journald 也会记录 wg-quick 的启动和停止时间。我们不记录也不检查客户服务器的流量,因此不会保留任何经过您隧道的内容的记录。

WireGuard 使用哪个端口?

使用您通过 ListenPort 设置的 UDP 端口;本指南使用 51820,即 WireGuard 官方示例中的端口。如需更改,请修改 ListenPort、每台设备 Endpoint 中的端口以及防火墙规则。WireGuard 仅通过 UDP 运行,因此封锁 UDP 的网络会在所有端口上封锁它。

某个步骤遇到困难?

独立服务器和 GPU 服务器客户可在客户中心提交工单,注明服务器的 IP 地址以及已尝试过的操作。首次回复目标:12 小时内。其他服务器请使用其页面上的服务器操作、指南和网络状态页面。

欢迎回来

登录以管理您的服务器和余额。

无需 KYC由 Cloudflare Turnstile 提供人机验证无跟踪