
在VPS上搭建自己的VPN服务器,可以让您完全掌控隐私,在全球任何地方安全访问私有网络,并在不受信任的公共网络上保护您的流量。WireGuard 是当今最受推荐的现代VPN协议——它比OpenVPN更快、配置更简单,同时采用前沿的加密算法。本指南将带您一步步完成在Ubuntu VPS上运行WireGuard VPN服务器的全部设置。
WireGuard是什么?为何优于OpenVPN?
WireGuard是一个专为简洁、速度和安全而设计的现代VPN协议。其代码量约4,000行,远少于OpenVPN的60万行以上,因此更易于审计和维护。
WireGuard相较于OpenVPN的核心优势:
- 更高吞吐量 — WireGuard在Linux内核内部运行,延迟更低、吞吐量远高于OpenVPN的用户态实现。
- 配置更简单 — 使用类似SSH的公私钥对,无需复杂的证书颁发机构(CA)。
- 快速重连 — 握手在毫秒内完成,非常适合频繁切换网络的移动设备。
- 现代加密算法 — 使用Curve25519进行密钥交换、ChaCha20加密、Poly1305认证,均为经过验证的高性能算法。
- 内置于Linux内核 — 从内核5.6起原生支持(Ubuntu 20.04+),无需额外安装内核模块。
前提条件
开始之前,请确保已具备以下条件:
- 运行 Ubuntu 20.04 或 22.04、具有 root 或 sudo 权限的 VPS。
- VPS 的静态公网 IP 地址(可用
curl ifconfig.me确认)。 - UDP 端口 51820 未被 VPS 提供商的上游防火墙封锁。
- 能够修改内核参数(
net.ipv4.ip_forward)。
第一步:安装 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 均提供官方应用。您可以通过两种方式导入客户端配置:
- 导入 .conf 文件 — 将
client1.conf文件传输到手机,直接导入 WireGuard 应用。 - 扫描二维码 — 在服务器上安装
qrencode(sudo apt install qrencode),然后用qrencode -t ansiutf8 < client1.conf生成二维码,用 WireGuard 应用扫码导入。
导入后,开启隧道开关,验证网络连接正常,并确认您的 IP 地址已变更为 VPS 所在位置的 IP。
密钥轮换与撤销客户端访问
在任何生产级 WireGuard 部署中,妥善管理密钥至关重要。当需要撤销某客户端的访问权限时——例如设备丢失或员工离职——只需从 wg0.conf 中删除该客户端的 [Peer] 块并重新加载接口,该客户端将立即被锁定,不影响其他对等节点。
定期轮换密钥时,按以下顺序操作以避免中断连接:
- 为客户端生成新密钥对。
- 在吊销旧密钥之前先下发新客户端配置——避免出现连接中断的空窗期。
- 将
wg0.conf中旧的[Peer]块替换为新的公钥。 - 无需完全重启即可应用更改:
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 服务器,请执行以下安全加固措施:
- 限制密钥文件权限 — 私钥必须仅限 root 读取。用
ls -la /etc/wireguard/*.key确认,权限应显示-rw-------(600)。 - 安全备份 wg0.conf — 将加密副本存储在密码管理器或安全保险库中。如果私钥丢失,每个客户端都必须使用新密钥对重新配置。
- 审计不活跃的对等节点 — 任何超过 7 天未完成握手的节点很可能已过期。删除它以保持
wg0.conf整洁并缩小攻击面。 - 同时保护 SSH — 安装 Fail2ban 或类似工具限制 SSH 登录尝试频率。WireGuard 本身无法被暴力破解(加密握手,无用户名/密码),但 22 端口的 SSH 仍是常见攻击目标。
- 保持内核更新 — WireGuard 从 Linux 内核 5.6 起成为内置组件,定期更新内核可直接获取 WireGuard 相关的安全补丁。
- 一设备一密钥对 — 切勿跨设备共享私钥。如有新设备需要 VPN 访问,应生成新密钥对并作为独立节点添加。
- 最小化开放端口 — 在专用 VPN VPS 上,只需开放 UDP 51820(WireGuard)和 TCP 22(SSH)。其余端口通过 UFW 全部关闭。
常见问题排查
- 无法 ping 通服务器 VPN IP — 检查 UFW 中 51820/udp 规则是否已激活(
sudo ufw status),以及 wg0 接口是否已启动(sudo wg show)。 - 通过 VPN 无法上网 — 确认 IP 转发已启用(
sysctl net.ipv4.ip_forward应返回 1),并检查 PostUp 中的 iptables 规则是否已生效。 - PostUp 中网络接口名称错误 — 如果 eth0 不是您的主接口,请用
ip route show default | awk '{print $5}'找到正确的接口名称。 - 客户端显示握手完成但无流量 — 确保客户端设置了
AllowedIPs = 0.0.0.0/0,并确认 DNS 可通过 VPN 访问。
原生支持 WireGuard 内核的 VPS
AsiaGB 的 Ubuntu VPS 方案原生支持 WireGuard,无需额外配置。获得公网 IP、完整 root 权限和不限量带宽——月租低至 500 泰铢,并享有 99% 运行时间保证。
查看 VPS 方案