WireGuard 是一种轻量、现代、配置相对简洁的 VPN 协议。这篇教程会从 0 开始带你在 Ubuntu 云服务器上完成部署,包括安装、开启转发、放行端口、管理多个客户端,以及让 iPhone 通过配置文件或二维码接入。
说明:本文中的公网 IP、用户名和网段均为文档示例。请根据自己的环境替换,不要把真实私钥、API 密钥或客户端配置发布到公开网站。
一、准备工作
开始之前,需要准备以下内容:
- 一台具有公网 IPv4 地址的 Ubuntu 服务器;
- root 权限,或能够使用 sudo 的管理员账户;
- 云平台安全组允许一个 UDP 端口,例如
51820; - iPhone、Mac、Windows 或 Android 上的 WireGuard 客户端。
本文使用如下示例参数:
| 项目 | 示例值 |
|---|---|
| 服务器公网 IP | 203.0.113.10 |
| 公网网卡 | eth0 |
| WireGuard 接口 | wg0 |
| WireGuard 端口 | 51820/UDP |
| VPN 网段 | 10.66.66.0/24 |
| 服务器 VPN 地址 | 10.66.66.1 |
公网网卡名称不一定是 eth0。可以先执行下面两条命令确认:
ip -brief address
ip route show default
默认路由里的 dev 后面就是公网网卡名称,例如 eth0、ens3 或 ens18。
二、安装 WireGuard
更新软件索引并安装 WireGuard、二维码工具和 iptables:
sudo apt-get update
sudo apt-get install -y wireguard-tools qrencode iptables
创建配置目录,并限制访问权限:
sudo install -d -m 700 /etc/wireguard
sudo install -d -m 700 /root/wireguard-clients
生成服务器私钥和公钥:
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key'
sudo sh -c 'wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'
私钥只能由 root 读取,不能复制到公开文档、代码仓库或聊天记录中。
三、配置服务器接口
创建 /etc/wireguard/wg0.conf:
[Interface]
Address = 10.66.66.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
将 <SERVER_PRIVATE_KEY> 替换为 /etc/wireguard/server.key 中的值,并把 eth0 改成实际公网网卡。
设置文件权限:
sudo chmod 600 /etc/wireguard/wg0.conf
四、开启 IPv4 转发
创建 sysctl 配置:
sudo tee /etc/sysctl.d/99-wireguard-forward.conf >/dev/null <<'EOF'
net.ipv4.ip_forward=1
EOF
加载配置:
sudo sysctl --system
确认结果:
sysctl net.ipv4.ip_forward
预期输出:
net.ipv4.ip_forward = 1
五、开放 UDP 端口
如果服务器启用了 UFW:
sudo ufw allow 51820/udp
sudo ufw status
如果使用 AWS、Vultr、DigitalOcean、Azure 或其他云平台,还要在云平台的安全组或防火墙中允许入站 UDP 51820。
只配置 UFW 而没有配置云防火墙,或者只配置云防火墙而被本机防火墙拦截,都可能导致客户端无法握手。
六、启动 WireGuard
启动接口并设置开机自动运行:
sudo systemctl enable --now wg-quick@wg0
检查服务状态:
sudo systemctl status wg-quick@wg0
sudo wg show wg0
sudo ss -lunp | grep 51820
wg show 不会显示服务器私钥,只会显示监听端口、公钥和客户端 Peer。
七、创建第一个客户端
下面以客户端 alice 为例,为它分配地址 10.66.66.2。
生成客户端密钥和预共享密钥:
sudo sh -c 'umask 077; wg genkey > /root/wireguard-clients/alice.key'
sudo sh -c 'wg pubkey < /root/wireguard-clients/alice.key > /root/wireguard-clients/alice.pub'
sudo sh -c 'wg genpsk > /root/wireguard-clients/alice.psk'
在服务器的 /etc/wireguard/wg0.conf 末尾加入:
# user:alice
[Peer]
PublicKey = <ALICE_PUBLIC_KEY>
PresharedKey = <ALICE_PRESHARED_KEY>
AllowedIPs = 10.66.66.2/32
然后创建客户端配置 /root/wireguard-clients/alice.conf:
[Interface]
PrivateKey = <ALICE_PRIVATE_KEY>
Address = 10.66.66.2/32
DNS = 1.1.1.1, 1.0.0.1
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
PresharedKey = <ALICE_PRESHARED_KEY>
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
其中:
PrivateKey是客户端私钥;PublicKey是服务器公钥;Endpoint是服务器公网地址和端口;AllowedIPs = 0.0.0.0/0, ::/0表示所有客户端流量都走 VPN;PersistentKeepalive = 25有助于移动网络和 NAT 环境保持连接。
重新加载配置,无需停止接口:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
客户端配置相当于登录凭证。任何获得该文件的人都可能冒充对应客户端,因此必须使用安全渠道传输。
八、在 iPhone 上配置
- 在 App Store 安装官方 WireGuard App;
- 使用 AirDrop、加密文件传输或其他安全方式把
alice.conf发送到 iPhone; - 打开 WireGuard,选择“从文件或归档创建隧道”;
- 导入配置文件;
- 打开隧道开关;
- 使用 Face ID 或锁屏密码允许 iOS 添加 VPN 配置。
也可以在服务器终端生成二维码:
sudo qrencode -t ANSIUTF8 < /root/wireguard-clients/alice.conf
然后在 iPhone 的 WireGuard App 中选择“从二维码创建”。二维码包含完整客户端私钥,不要截图上传到云相册、社交媒体或公开工单。
九、验证 VPN 是否正常
客户端连接后,在服务器执行:
sudo wg show wg0
正常情况下,可以看到:
latest handshake:最近一次握手时间;transfer:接收和发送的数据量;- 客户端的
allowed ips。
在客户端访问公网 IP 查询服务。如果显示的是 VPN 服务器公网 IP,说明全局流量已经通过隧道。
还可以测试:
ping 10.66.66.1
十、多用户管理原则
每个设备或用户都应使用独立密钥和独立 VPN 地址,例如:
alice → 10.66.66.2/32
bob → 10.66.66.3/32
iphone → 10.66.66.4/32
不要让多台设备共享同一个客户端配置。独立配置的好处包括:
- 可以单独撤销某个设备;
- 容易识别最后握手和流量;
- 单个配置泄露时无需更换全部客户端;
- 避免相同
AllowedIPs导致路由冲突。
撤销用户时,需要同时从服务器配置删除对应 [Peer],重新同步 WireGuard,并删除服务器上保存的客户端配置。
十一、常见故障排查
1. 客户端没有握手
检查:
sudo wg show
sudo ss -lunp | grep 51820
sudo systemctl status wg-quick@wg0
重点确认公网地址、UDP 端口、云防火墙和本机防火墙。
2. 有握手但不能访问互联网
通常与网络转发或 NAT 有关:
sysctl net.ipv4.ip_forward
sudo iptables -t nat -S POSTROUTING
ip route show default
确认 PostUp 中的公网网卡名称正确。
3. 可以访问 IP,但域名无法打开
检查客户端配置中的 DNS:
DNS = 1.1.1.1, 1.0.0.1
4. 手机切换 Wi‑Fi 和蜂窝网络后断开
保留:
PersistentKeepalive = 25
5. 修改配置后服务启动失败
先检查:
sudo wg-quick strip wg0
sudo journalctl -u wg-quick@wg0 --no-pager -n 100
常见原因包括私钥格式错误、重复地址、iptables 命令中的网卡错误,或配置文件权限不安全。
十二、安全建议
- 不要公开服务器或客户端私钥;
- 不要把
.conf文件提交到 Git; - 每个设备使用独立 Peer;
- 丢失设备后立即撤销对应 Peer;
- 定期安装 Ubuntu 安全更新;
- SSH 建议禁用密码登录并使用密钥认证;
- VPN 端口可以修改,但修改端口本身不能替代密钥安全;
- 修改防火墙前保留当前 SSH 会话,避免把自己锁在服务器外;
- 备份服务器配置时使用加密存储。
总结
WireGuard 的核心结构并不复杂:服务器维护一个接口,每个客户端对应一个独立 Peer,双方通过公钥识别身份。真正容易出错的部分通常不是密钥生成,而是公网网卡、IP 转发、NAT、云防火墙和客户端路由。
完成部署后,建议先创建一个测试客户端,确认握手、DNS 和公网出口都正常,再逐个添加其他设备。这样既方便排错,也能避免一次性暴露过多配置。
