# 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 就是公网出口网卡名。不同服务器可能叫 ens3enp1s0eth0 等,后续配置里要替换成你的真实网卡名。

# 三、开启内核转发

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 等因素影响。