---
title: "在 VPS 上用 WireGuard 自建 VPN 教程 | OffshoreServ"
description: "在 Ubuntu 或 Debian VPS 上搭建 WireGuard：生成密钥、服务端配置、转发与 NAT、防火墙、手机扫码连接与泄漏检测。"
url: https://offshoreserv.com/zh/docs/vps/wireguard-vpn
lang: zh-Hans
updated: 2026-09-26
source: HTML page at the url above (canonical); this is its Markdown version
---

知识库 · VPS

# 如何使用 WireGuard 在 VPS 上自建 VPN

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

更新于 2026年9月26日 阅读约 11 分钟

本指南要点

- WireGuard 运行在 Linux 内核中，因此最小的 VPS 套餐就足以承载个人 VPN。
- 使用 umask 077 创建密钥，然后编写 /etc/wireguard/wg0.conf，并在实际的网络接口上配置 NAT。
- 开启 IP 转发，在 UFW 中放行 51820/udp 和隧道的路由，并首先确保 SSH 保持放行。
- 为每台设备分配独立的密钥对和地址；手机通过扫描二维码导入配置。
- 在正式依赖隧道之前，请在已连接的设备上检查公网 IP、DNS 和 IPv6。

VPS13 个章节

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

以下步骤将在运行 Ubuntu 24.04 LTS、Debian 12 或 Debian 13 的 [离岸 VPS](https://offshoreserv.com/zh/offshore-vps) 上搭建 WireGuard VPS，并按照 [快速入门](https://offshoreserv.com/zh/docs/getting-started) 中的说明通过 SSH 获得 root 权限。请将 `SERVER_IP` 替换为您服务器的 IPv4 地址，将 `eth0` 替换为您的网络接口名称。

> 在隧道正常工作之前，请保持 SSH 会话不要断开。如果防火墙配置失误导致您无法登录，仍可通过客户中心的控制台访问 VPS。

## 开始之前：WireGuard VPS 需要什么

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

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

选择离您较近的地区可以保持浏览速度；选择其他国家的地区则会改变服务器所适用的法律。选择之前，请在 [网络页面](https://offshoreserv.com/zh/network) 比较延迟，并阅读我们关于 [用离岸 VPS 搭建 VPN](https://offshoreserv.com/zh/blog/offshore-vps-for-vpn) 的指南。与所有 [无需 KYC 的 VPS](https://offshoreserv.com/zh/no-kyc-vps) 一样，您的账户只需邮箱地址和密码，并使用加密货币付款。

我们的 [可接受使用政策](https://offshoreserv.com/zh/acceptable-use-policy) 将 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 快速入门](https://www.wireguard.com/quickstart/) 中的做法相同。任何持有私钥的人都能以该设备的身份连接，因此请妥善保密。

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

## 编写 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 执行的命令，详见其 [手册页](https://manpages.ubuntu.com/manpages/noble/en/man8/wg-quick.8.html)。这里用它们添加和删除 NAT 规则，使设备以服务器的 IPv4 地址访问互联网。
- **[Peer]**: 每台设备一个配置段。对于源地址不在其 `AllowedIPs` 范围内的设备数据包，WireGuard 一律丢弃，并将这种设计称为 [加密密钥路由（Cryptokey Routing）](https://www.wireguard.com/)。

> 如果以后要修改 `Address`、`PostUp` 或 `PostDown`，请先用 `systemctl stop wg-quick@wg0` 停止隧道，编辑文件后再重新启动。`wg-quick` 停止时，会按照 `PostDown` 行在那一刻的内容删除 NAT 规则。如果在隧道运行期间编辑了这些行，它们将与已加载的规则不再匹配：停止时会记录错误，并可能留下旧规则。

## 启用 IP 转发

只有在开启转发后，Linux 才会在网络接口之间传递数据包，而根据 [内核文档](https://docs.kernel.org/networking/ip-sysctl.html)，转发默认是关闭的。请立即开启，并设置为每次启动时自动开启：

```
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` 以及其 [手册页](https://manpages.debian.org/trixie/procps/sysctl.8.en.html) 中列出的其他位置中的文件，每次启动时同样会再次应用这些文件。

## 配置防火墙放行规则

先放行 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
```

如果您已按照 [加固指南](https://offshoreserv.com/zh/docs/security/hardening) 更改了 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](https://quad9.net/service/service-addresses-and-features/)，它会拦截恶意软件域名并验证 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](https://www.rfc-editor.org/rfc/rfc4193.html)），因此请自行选择一个，而不要照搬 `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
```

> 开启转发后，Linux 会忽略路由器通告。如果 `ip -6 route show default` 显示 `proto ra`，说明您的服务器是通过这种方式获取 IPv6 路由的：请同时在同一文件中添加 `net.ipv6.conf.eth0.accept_ra = 2`，否则当该路由过期时，服务器自身的 IPv6 将无法工作。

如果使用 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 手册](https://manpages.ubuntu.com/manpages/noble/en/man8/wg.8.html)，这样做“具有不中断当前对等端会话的好处”。
- **移除设备：** 删除其 `[Peer]` 配置段并重新加载。其密钥会立即失效。
- **可选：** 使用 `wg genpsk` 生成一个 `PresharedKey`，并在对等端的两侧同时设置，即可增加对称密钥加密，“以实现后量子抗性”。

## 故障排查

### 没有握手

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

- 服务正在运行：`systemctl status wg-quick@wg0`；
- UFW 已放行 `51820/udp`。有些网络会封锁 UDP，而 WireGuard [没有 TCP 模式](https://www.wireguard.com/known-limitations/)，因此也请通过移动数据网络进行测试；
- 设备的 `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 允许](https://www.rfc-editor.org/rfc/rfc8200.html) 的最小 MTU。

## 常见问题

### 在 VPS 上自建 VPN 合法吗？

为自己运行 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 服务器客户可在 [客户中心](https://offshoreserv.com/zh/account/support) 提交工单，注明服务器的 IP 地址以及已尝试过的操作。首次回复目标：12 小时内。其他服务器请使用其页面上的服务器操作、[指南](https://offshoreserv.com/zh/docs) 和 [网络状态](https://offshoreserv.com/zh/status) 页面。

---

OffshoreServ 是一家离岸主机服务商，在七个司法管辖区（冰岛、瑞士、摩尔多瓦、罗马尼亚、荷兰、保加利亚和马来西亚）提供 VPS、独立服务器、Windows RDP 和 GPU 服务器，仅接受加密货币付款（比特币、以太坊、门罗币、泰达币（USDT）和 Solana），无需身份验证（无需 KYC）。

Prices and plans: https://offshoreserv.com/zh/pricing · Answers: https://offshoreserv.com/zh/faq · Every page: https://offshoreserv.com/llms.txt
