Ubuntu 搭建 WireGuard VPN 完整指南:安装、用户管理与 iPhone/iOS 接入

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 后面就是公网网卡名称,例如 eth0ens3ens18

二、安装 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 上配置

  1. 在 App Store 安装官方 WireGuard App;
  2. 使用 AirDrop、加密文件传输或其他安全方式把 alice.conf 发送到 iPhone;
  3. 打开 WireGuard,选择“从文件或归档创建隧道”;
  4. 导入配置文件;
  5. 打开隧道开关;
  6. 使用 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 和公网出口都正常,再逐个添加其他设备。这样既方便排错,也能避免一次性暴露过多配置。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注