# Ubuntu 22.04/24.04 搭建 WireGuard VPN 服务器完整指南
本文以 Ubuntu 22.04/24.04 服务器为例,记录从零搭建 WireGuard VPN 服务器、配置客户端、多设备使用、校园网环境下的可用性、速度影响以及卸载方法。
WireGuard 是一个轻量、高性能、配置相对简单的 VPN 方案。它基于公钥和私钥进行身份认证,适合个人远程访问服务器、家庭内网、实验环境或办公网络。
# 一、准备条件
假设服务器信息如下:
服务器公网 IP:SERVER_PUBLIC_IP
WireGuard 端口:51820/udp
VPN 网段:10.8.0.0/24
服务端 VPN 地址:10.8.0.1
第一个客户端地址:10.8.0.2
你需要准备:
- 一台 Ubuntu 22.04 或 Ubuntu 24.04 服务器
- 一个可访问的公网 IP
- SSH 登录权限
- 云服务器安全组中允许 UDP 51820 端口
如果服务器位于云厂商上,除了系统防火墙,还需要在云平台安全组里放行 UDP 51820。
# 二、安装 WireGuard
更新软件源并安装 WireGuard:
sudo apt update
sudo apt install -y wireguard
查看服务器默认出口网卡:
ip route get 1.1.1.1
输出中通常会看到类似内容:
dev eth0
这里的 eth0 就是公网出口网卡名。不同服务器可能叫 ens3、enp1s0、eth0 等,后续配置里要替换成你的真实网卡名。
# 三、开启内核转发
WireGuard 客户端要通过服务器访问外部网络,需要开启 IPv4 转发:
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
验证:
cat /proc/sys/net/ipv4/ip_forward
输出为 1 表示已经开启。
# 四、生成服务端密钥
创建 WireGuard 配置目录并生成服务端密钥:
sudo mkdir -p /etc/wireguard
cd /etc/wireguard
sudo umask 077
sudo wg genkey | sudo tee server_private.key | sudo wg pubkey | sudo tee server_public.key
查看服务端私钥:
sudo cat /etc/wireguard/server_private.key
查看服务端公钥:
sudo cat /etc/wireguard/server_public.key
服务端私钥写入服务端配置,服务端公钥写入客户端配置。
# 五、创建服务端配置
编辑服务端配置文件:
sudo nano /etc/wireguard/wg0.conf
写入以下内容:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = 服务端私钥
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
注意:
PrivateKey替换为/etc/wireguard/server_private.key里的内容eth0替换为你的真实公网出口网卡名
如果你的网卡名是 ens3,则需要改成:
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
# 六、放行防火墙端口
如果使用 UFW:
sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw enable
查看状态:
sudo ufw status
如果服务器在云厂商上,还要在安全组里放行:
UDP 51820
# 七、启动 WireGuard
启动并设置开机自启:
sudo systemctl enable --now wg-quick@wg0
查看运行状态:
sudo systemctl status wg-quick@wg0
sudo wg
如果没有报错,服务端就已经启动。
# 八、生成客户端密钥
以第一个客户端 client1 为例:
cd /etc/wireguard
sudo wg genkey | sudo tee client1_private.key | sudo wg pubkey | sudo tee client1_public.key
查看客户端私钥:
sudo cat /etc/wireguard/client1_private.key
查看客户端公钥:
sudo cat /etc/wireguard/client1_public.key
客户端私钥写入客户端配置,客户端公钥写入服务端配置。
# 九、把客户端加入服务端
编辑服务端配置:
sudo nano /etc/wireguard/wg0.conf
在文件末尾添加:
[Peer]
PublicKey = 客户端公钥
AllowedIPs = 10.8.0.2/32
这里的 客户端公钥 来自:
sudo cat /etc/wireguard/client1_public.key
重启 WireGuard:
sudo systemctl restart wg-quick@wg0
# 十、创建客户端配置文件
在客户端设备上创建 client1.conf:
[Interface]
PrivateKey = 客户端私钥
Address = 10.8.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = 服务端公钥
Endpoint = SERVER_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
其中:
客户端私钥来自:
sudo cat /etc/wireguard/client1_private.key
服务端公钥来自:
sudo cat /etc/wireguard/server_public.key
Endpoint 中的 SERVER_PUBLIC_IP 替换为服务器公网 IP。
如果希望所有流量都走 VPN:
AllowedIPs = 0.0.0.0/0
如果只想访问 VPN 内网,不接管全部流量:
AllowedIPs = 10.8.0.0/24
# 十一、多台客户端能否共用一个配置文件
不建议多台电脑共用同一个 client1.conf。
因为同一个配置文件包含同一个客户端私钥和同一个 VPN 地址:
PrivateKey = 客户端私钥
Address = 10.8.0.2/24
如果多台设备同时使用同一个配置,WireGuard 服务端会把它们当成同一个 Peer,可能出现:
- 后连接的设备抢占连接状态
- 多台设备互相挤掉
- 流量发到最后一次握手的设备
- 排查问题困难
正确做法是:每台客户端一组独立密钥,一个独立 IP,一个独立配置文件。
例如:
client1:10.8.0.2
client2:10.8.0.3
client3:10.8.0.4
服务端配置示例:
[Peer]
PublicKey = client1公钥
AllowedIPs = 10.8.0.2/32
[Peer]
PublicKey = client2公钥
AllowedIPs = 10.8.0.3/32
[Peer]
PublicKey = client3公钥
AllowedIPs = 10.8.0.4/32
第二个客户端配置示例:
[Interface]
PrivateKey = client2私钥
Address = 10.8.0.3/24
DNS = 1.1.1.1
[Peer]
PublicKey = 服务端公钥
Endpoint = SERVER_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
生成第二个客户端密钥:
cd /etc/wireguard
sudo wg genkey | sudo tee client2_private.key | sudo wg pubkey | sudo tee client2_public.key
# 十二、WireGuard 是否支持 DHCP 自动分配 IP
WireGuard 本身不支持 DHCP,也不会像某些 VPN 服务那样自动给客户端分配地址。
WireGuard 使用的是静态 Peer 模型:服务端需要知道每个客户端公钥对应哪个地址。
例如:
[Peer]
PublicKey = client2公钥
AllowedIPs = 10.8.0.3/32
所以严格来说,WireGuard 没有原生的 DHCP 自动分配 IP 功能。
比较实用的替代方案有三种。
# 方案一:手动分配固定 IP
这是最推荐、最稳定的方式。
client1 10.8.0.2
client2 10.8.0.3
client3 10.8.0.4
适合个人、小团队、设备数量不多的场景。
# 方案二:使用 wg-easy 管理面板
如果想要类似“自动分配 IP、一键生成配置、扫码导入”的体验,可以使用 wg-easy。
Docker 部署示例:
docker run -d \
--name wg-easy \
-e WG_HOST=你的服务器公网IP \
-e PASSWORD=设置一个管理密码 \
-v ~/.wg-easy:/etc/wireguard \
-p 51820:51820/udp \
-p 51821:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
ghcr.io/wg-easy/wg-easy
然后访问:
http://服务器公网IP:51821
在网页中新增客户端即可。
# 方案三:写脚本自动创建客户端
也可以写脚本自动完成:
- 生成客户端密钥
- 分配下一个可用 IP
- 写入服务端
[Peer] - 输出客户端配置文件
但本质上仍然是静态 IP,只是脚本帮你管理。
# 十三、校园网环境是否可以使用
如果 WireGuard 服务器在公网 VPS 上,客户端在校园网内,这种情况通常可以使用。
连接方向是:
校园网客户端 -> 公网 WireGuard 服务器
只要校园网允许向外访问 UDP 51820,客户端就可以连接。
如果连接不上,常见原因包括:
- 校园网屏蔽 UDP
- 校园网限制 VPN 流量
- 只允许 HTTP/HTTPS
- DNS 或防火墙限制外部连接
可以尝试把 WireGuard 端口改成更常见的端口,例如:
ListenPort = 443
客户端同步改为:
Endpoint = SERVER_PUBLIC_IP:443
注意:WireGuard 使用的是 UDP,所以这里是 UDP 443,不是 HTTPS 的 TCP 443。
如果 WireGuard 服务器放在校园网内部,想从外网连进去,大多数情况下不能直接使用。因为校园网通常是多层 NAT,外部无法直接访问内网设备。
这类场景更适合:
- 公网 VPS 中转
- Tailscale
- ZeroTier
- Headscale + Tailscale 客户端
- FRP/NPS 等反向隧道工具
建议遵守所在网络的使用规则,将其用于访问自己的服务器、实验环境或远程办公等合规用途。
# 十四、连接速度会受到影响吗
会有影响,但影响大小取决于网络环境。
主要因素包括:
# 1. VPS 带宽
如果 VPS 只有 30Mbps、50Mbps 或 100Mbps 带宽,那么 VPN 最大速度通常不会超过这个上限。
# 2. 校园网出口质量
校园网到 VPS 的路由质量非常关键。如果路由绕路、丢包或拥塞,VPN 会变慢。
# 3. UDP 是否被限速
WireGuard 默认走 UDP。如果校园网对 UDP 限速或干扰,可能出现:
能连接,但速度慢
延迟高
丢包
偶尔断开
# 4. 服务器地理位置
VPS 距离客户端越近,通常延迟越低、速度越好。
# 5. 加密开销
WireGuard 性能很高,加密开销通常不是瓶颈。普通 VPS、电脑和手机一般都能轻松跑满几十到几百 Mbps。
# 6. MTU 问题
如果出现网页打开慢、部分网站卡住,可以在客户端配置中添加:
MTU = 1420
如果仍然不稳定,可以尝试:
MTU = 1380
测试命令:
ping 10.8.0.1
curl ifconfig.me
ping SERVER_PUBLIC_IP
mtr SERVER_PUBLIC_IP
如果 curl ifconfig.me 显示的是服务器公网 IP,说明全局 VPN 已经生效。
# 十五、卸载 WireGuard
如果后续不再使用,可以按以下步骤卸载。
# 1. 停止并禁用服务
sudo systemctl stop wg-quick@wg0
sudo systemctl disable wg-quick@wg0
查看状态:
sudo systemctl status wg-quick@wg0
# 2. 删除配置和密钥
如果不需要保留配置:
sudo rm -rf /etc/wireguard
如果想先备份:
sudo cp -a /etc/wireguard ~/wireguard-backup
sudo rm -rf /etc/wireguard
# 3. 删除 IP 转发配置
如果之前按本文创建了 /etc/sysctl.d/99-wireguard.conf:
sudo rm -f /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
检查 IPv4 转发状态:
cat /proc/sys/net/ipv4/ip_forward
输出 0 表示已经关闭,输出 1 表示系统中还有其他配置开启了转发。
# 4. 删除防火墙规则
如果使用 UFW:
sudo ufw delete allow 51820/udp
如果之前改成了 443/udp:
sudo ufw delete allow 443/udp
查看当前规则:
sudo ufw status numbered
# 5. 卸载软件包
sudo apt remove --purge -y wireguard wireguard-tools
sudo apt autoremove -y
# 6. 检查是否卸载干净
wg
如果提示命令不存在,说明 WireGuard 工具已经卸载。
检查服务:
systemctl list-units | grep wg-quick
没有输出通常表示服务已经清理完成。
如果使用的是 wg-easy Docker,卸载方式如下:
docker stop wg-easy
docker rm wg-easy
docker rmi ghcr.io/wg-easy/wg-easy
如果还要删除 wg-easy 数据:
rm -rf ~/.wg-easy
最后,不要忘记在云服务器安全组中删除 UDP 51820 的放行规则。
# 十六、常用排查命令
查看 WireGuard 状态:
sudo wg
查看服务状态:
sudo systemctl status wg-quick@wg0
重启服务:
sudo systemctl restart wg-quick@wg0
查看监听端口:
sudo ss -lunp | grep 51820
测试客户端到服务端 VPN 地址:
ping 10.8.0.1
测试公网出口:
curl ifconfig.me
# 总结
WireGuard 的核心思路很简单:服务端和每个客户端各有一组密钥,服务端通过客户端公钥识别设备,并通过 AllowedIPs 指定该客户端使用的 VPN 地址。
对于个人使用,推荐每台设备单独生成配置文件,手动分配固定 IP。设备多了之后,可以使用 wg-easy 这类管理面板简化配置生成和二维码导入。
在校园网等受限网络中,如果客户端能主动连接公网 WireGuard 服务器,通常可以使用;但速度会受到 UDP 限制、VPS 带宽、线路质量和 MTU 等因素影响。