在VPS Ubuntu上搭建WireGuard VPN服务器:完整步骤指南

在VPS上搭建自己的VPN服务器,可以让您完全掌控隐私,在全球任何地方安全访问私有网络,并在不受信任的公共网络上保护您的流量。WireGuard 是当今最受推荐的现代VPN协议——它比OpenVPN更快、配置更简单,同时采用前沿的加密算法。本指南将带您一步步完成在Ubuntu VPS上运行WireGuard VPN服务器的全部设置。

WireGuard是什么?为何优于OpenVPN?

WireGuard是一个专为简洁、速度和安全而设计的现代VPN协议。其代码量约4,000行,远少于OpenVPN的60万行以上,因此更易于审计和维护。

WireGuard相较于OpenVPN的核心优势:

前提条件

开始之前,请确保已具备以下条件:

第一步:安装 WireGuard

通过 SSH 登录您的 VPS,运行以下命令:

sudo apt update
sudo apt install wireguard -y

验证安装是否成功:

wg --version

第二步:生成服务器密钥对

WireGuard 使用椭圆曲线密码学(Curve25519)进行密钥交换。为服务器生成密钥对:

cd /etc/wireguard
wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key
sudo chmod 600 /etc/wireguard/server_private.key

查看并记录私钥——下一步将会用到:

sudo cat /etc/wireguard/server_private.key

同时记录服务器公钥,客户端配置时需要:

sudo cat /etc/wireguard/server_public.key

第三步:配置服务器接口(wg0.conf)

为 wg0 接口创建配置文件:

sudo nano /etc/wireguard/wg0.conf

添加以下内容,将 YOUR_SERVER_PRIVATE_KEY 替换为您的实际服务器私钥:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = YOUR_SERVER_PRIVATE_KEY

# IP Forwarding and NAT rules
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

注意:如果您的 VPS 网络接口不是 eth0,请用 ip route show default 确认正确的接口名称,并在 PostUp/PostDown 行中替换。

第四步:启用 IP 转发并配置 UFW

启用 IP 转发,使 VPS 能够将客户端流量路由至互联网:

echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

在 UFW 中开放 WireGuard UDP 端口,并确保 SSH 保持可访问:

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

第五步:生成客户端密钥对

为每个客户端设备分别生成独立的密钥对。每添加一台设备重复此过程:

wg genkey | sudo tee /etc/wireguard/client1_private.key | wg pubkey | sudo tee /etc/wireguard/client1_public.key

记录客户端私钥:

sudo cat /etc/wireguard/client1_private.key

记录客户端公钥(服务器配置中需要):

sudo cat /etc/wireguard/client1_public.key

第六步:在服务器配置中添加对等节点(客户端)

打开 /etc/wireguard/wg0.conf,追加一个 Peer 块:

[Peer]
# Client 1 - My Laptop
PublicKey = CLIENT1_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32

将 CLIENT1_PUBLIC_KEY 替换为上一步生成的客户端公钥。AllowedIPs 字段为该客户端分配固定的 VPN IP 地址。

第七步:创建客户端配置文件

为客户端设备创建配置文件(保存为 client1.conf):

[Interface]
PrivateKey = CLIENT1_PRIVATE_KEY
Address = 10.0.0.2/32
DNS = 1.1.1.1

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

将占位符替换为您的实际密钥和 VPS IP 地址。设置 AllowedIPs = 0.0.0.0/0 会将所有流量通过 VPN 路由(全隧道模式)。如需分流隧道,仅指定需要通过 VPN 路由的 IP 范围即可。

第八步:启动 WireGuard 并测试连接

在服务器上启动 WireGuard 接口:

sudo wg-quick up wg0

检查接口状态,确认对等节点已列出:

sudo wg show

连接客户端设备后,通过 ping 测试与服务器 VPN 地址的连通性:

ping 10.0.0.1

验证公网 IP 已变更为 VPS 的 IP:

curl ifconfig.me

设置 WireGuard 开机自动启动
运行以下命令,确保 VPS 重启后 WireGuard 自动启动:

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

随时通过以下命令查看服务状态:sudo systemctl status wg-quick@wg0

管理多个对等节点与密钥轮换

在实际部署中,您通常需要连接多台设备——例如笔记本电脑、智能手机和平板电脑。WireGuard 处理这种情况非常干净:每个对等节点都有自己的 VPN IP 地址和独立密钥对,因此一台设备被攻破不会影响其他设备。

为每台额外设备分别生成密钥对:

wg genkey | sudo tee /etc/wireguard/client2_private.key | wg pubkey | sudo tee /etc/wireguard/client2_public.key
wg genkey | sudo tee /etc/wireguard/client3_private.key | wg pubkey | sudo tee /etc/wireguard/client3_public.key

在 /etc/wireguard/wg0.conf 中为每台设备追加一个 [Peer] 块:

[Peer]
# Client 2 - Mobile Phone
PublicKey = CLIENT2_PUBLIC_KEY
AllowedIPs = 10.0.0.3/32

[Peer]
# Client 3 - Tablet
PublicKey = CLIENT3_PUBLIC_KEY
AllowedIPs = 10.0.0.4/32

可以在运行时动态添加对等节点,无需重启接口:

sudo wg set wg0 peer CLIENT2_PUBLIC_KEY allowed-ips 10.0.0.3/32

如需永久更改,请编辑 wg0.conf 并重新加载:sudo wg-quick down wg0 && sudo wg-quick up wg0。要撤销某台设备的访问权限,只需删除其 [Peer] 块并重新加载即可。

WireGuard vs OpenVPN vs IPsec:功能对比

功能 WireGuard OpenVPN IPsec
代码量 约 4,000 行 >600,000 行 非常庞大
吞吐量 极高(内核态) 中等(用户态) 高(内核态)
配置复杂度 低(仅需密钥对) 高(需要 CA、证书) 非常高
握手时间 <100 毫秒 1–3 秒 0.5–1 秒
内置于 Linux 内核 是(内核 5.6+) 否(需额外安装) 部分支持

分流隧道与防止 DNS 泄漏

设置 AllowedIPs = 0.0.0.0/0 会将所有流量通过 VPN 路由(全隧道模式)。很多场景下,您可能需要分流隧道——仅将特定目标通过 VPN 路由,其他流量直接访问互联网。

分流隧道配置示例——仅路由 VPN 子网和私有网络:

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = YOUR_VPS_IP:51820
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25

使用全隧道模式时,务必指定受信任的 DNS 服务器以防止 DNS 泄漏。在客户端 [Interface] 部分设置:

[Interface]
DNS = 1.1.1.1, 8.8.8.8

连接后,请在 dnsleaktest.com 验证是否存在 DNS 泄漏——显示的 DNS 服务器应为 Cloudflare(1.1.1.1)或 Google(8.8.8.8),而非您的 ISP 解析器。

监控与调试 WireGuard

wg show 命令可实时查看所有对等节点及其连接状态:

sudo wg show

正常连接的对等节点输出如下所示:

interface: wg0
  public key: [server_public_key]
  private key: (hidden)
  listening port: 51820

peer: [client1_public_key]
  endpoint: [client_ip]:PORT
  allowed ips: 10.0.0.2/32
  latest handshake: 23 seconds ago
  transfer: 1.23 MiB received, 456 KiB sent

如果 latest handshake 显示时间很久前或缺失,说明该节点未处于活跃连接状态。使用以下命令进行诊断:

# Check firewall status
sudo ufw status verbose

# Confirm current VPS public IP
curl ifconfig.me

# View WireGuard logs
sudo journalctl -u wg-quick@wg0 -f

在 iOS 和 Android 上添加客户端

WireGuard 为 iOS 和 Android 均提供官方应用。您可以通过两种方式导入客户端配置:

  1. 导入 .conf 文件 — 将 client1.conf 文件传输到手机,直接导入 WireGuard 应用。
  2. 扫描二维码 — 在服务器上安装 qrencode(sudo apt install qrencode),然后用 qrencode -t ansiutf8 < client1.conf 生成二维码,用 WireGuard 应用扫码导入。

导入后,开启隧道开关,验证网络连接正常,并确认您的 IP 地址已变更为 VPS 所在位置的 IP。

密钥轮换与撤销客户端访问

在任何生产级 WireGuard 部署中,妥善管理密钥至关重要。当需要撤销某客户端的访问权限时——例如设备丢失或员工离职——只需从 wg0.conf 中删除该客户端的 [Peer] 块并重新加载接口,该客户端将立即被锁定,不影响其他对等节点。

定期轮换密钥时,按以下顺序操作以避免中断连接:

  1. 为客户端生成新密钥对。
  2. 在吊销旧密钥之前先下发新客户端配置——避免出现连接中断的空窗期。
  3. 将 wg0.conf 中旧的 [Peer] 块替换为新的公钥。
  4. 无需完全重启即可应用更改:sudo wg syncconf wg0 <(wg-quick strip wg0)

WireGuard 还支持预共享密钥(PSK)——一种按对等节点设置的对称密钥,在 Curve25519 之上增加第二层保护。即使椭圆曲线密码学遭到破解,PSK 也能提供额外防御。生成方式:

wg genpsk | sudo tee /etc/wireguard/client1.psk
sudo chmod 600 /etc/wireguard/client1.psk

将 PresharedKey = [psk_value] 添加到服务器和客户端配置文件中各自的 [Peer] 块里。

NAT 环境与云防火墙下的 WireGuard

如果您的 VPS 提供商使用了上游网络防火墙或安全组(AWS、DigitalOcean、GCP 等平台常见),除了在 UFW 中放行,还必须在提供商控制台中开放 UDP 端口 51820。提供商防火墙在 UFW 之前生效,会静默丢弃永远无法到达操作系统级防火墙的数据包。

验证端口 51820 是否可从公网访问:

# From a different machine — check if UDP 51820 is open
nmap -sU -p 51820 YOUR_VPS_IP

# Quick UDP reachability check (no response expected — WireGuard is silent to non-peers)
nc -vuz YOUR_VPS_IP 51820

WireGuard 故意设计为"静默"模式——它不响应来自未知公钥的数据包,因此端口扫描器可能将其显示为"filtered",但实际上它工作正常。最终的验证方法是从已配置的客户端成功完成握手。

场景 所需操作 验证方法
VPS 有直接公网 IP 仅需 UFW 放行 51820/udp sudo ufw status
云安全组(AWS/DO/GCP) 在云控制台添加入站 UDP 51820 nmap -sU -p 51820 IP
VPS 位于 NAT 之后 在路由器/网关上端口转发 UDP 51820 curl ifconfig.me 与分配 IP 对比

WireGuard 服务器安全最佳实践

让 WireGuard 运行起来只是第一步。对于生产级 VPN 服务器,请执行以下安全加固措施:

常见问题排查

原生支持 WireGuard 内核的 VPS

AsiaGB 的 Ubuntu VPS 方案原生支持 WireGuard,无需额外配置。获得公网 IP、完整 root 权限和不限量带宽——月租低至 500 泰铢,并享有 99% 运行时间保证。

查看 VPS 方案

查看泰国VPS主机全部套餐 →