2476 字
12 分钟

WireGuard VPN 自建完全指南 2026:服务端部署 + 全平台客户端 + 分流路由配置

WireGuard 是近年来最受欢迎的 VPN 协议,以极简配置、超高性能、现代密码学著称。相比 OpenVPN,WireGuard 代码量仅 4000 行,配置文件几十行即可搞定,吞吐量却是 OpenVPN 的 3-5 倍。

本文从零开始,完整讲解 WireGuard 服务端部署、全平台客户端配置、分流路由,以及 Docker 一键部署方案。


一、WireGuard vs OpenVPN 快速对比#

对比项WireGuardOpenVPN
配置复杂度⭐(几十行)⭐⭐⭐⭐(几百行)
性能⭐⭐⭐⭐⭐(内核模块)⭐⭐⭐(用户态)
重连速度瞬间(< 1s)较慢(10-30s)
安全性现代密码学,代码少审计好成熟但代码量大
TCP 支持❌(仅 UDP)✅(UDP + TCP)
穿越防火墙较差(UDP 可能被封)可走 443/TCP 绕过封锁
移动端电池✅ 省电(按需连接)较费电

选择建议

自用 VPN / 异地组网 / 远程办公 → WireGuard(首选)
需要穿越严格防火墙 / TCP 回落 → OpenVPN 或 V2Ray/VLESS
企业级复杂 ACL / 日志审计 → OpenVPN 生态更成熟

二、服务端安装与配置#

2.1 安装 WireGuard#

Terminal window
# Debian / Ubuntu(Linux 5.6+ 内核已内置 WireGuard 模块)
apt update && apt install -y wireguard
# 验证安装
wg --version
# wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/

2.2 生成密钥对#

Terminal window
# 进入 WireGuard 配置目录
cd /etc/wireguard
# 生成服务端密钥对
wg genkey | tee server_private.key | wg pubkey > server_public.key
# 生成客户端密钥对(每个客户端一对)
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
wg genkey | tee client2_private.key | wg pubkey > client2_public.key
# 查看密钥(记下备用)
echo "服务端私钥:$(cat server_private.key)"
echo "服务端公钥:$(cat server_public.key)"
echo "客户端1私钥:$(cat client1_private.key)"
echo "客户端1公钥:$(cat client1_public.key)"
# 保护私钥文件
chmod 600 *_private.key
chmod 600 /etc/wireguard/ # 整个目录只有 root 可读

2.3 服务端配置文件#

Terminal window
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
# 服务端私钥
PrivateKey = $(cat /etc/wireguard/server_private.key)
# VPN 内网 IP(服务端使用 10.0.0.1)
Address = 10.0.0.1/24
# 监听端口(UDP)
ListenPort = 51820
# 启动时开启 IP 转发和 NAT(让客户端流量能出网)
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
# ── 客户端1(手机/电脑)────────────────────────────────────────
[Peer]
# 客户端1的公钥
PublicKey = $(cat /etc/wireguard/client1_public.key)
# 允许该客户端使用的 VPN 内网 IP
AllowedIPs = 10.0.0.2/32
# ── 客户端2(另一台设备)──────────────────────────────────────
[Peer]
PublicKey = $(cat /etc/wireguard/client2_public.key)
AllowedIPs = 10.0.0.3/32
EOF

⚠️ PostUp/PostDown 中的 eth0 需要替换为你的实际网卡名称(用 ip route | grep default 查看)。

Terminal window
# 启动 WireGuard
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
# 查看状态
wg show
# 输出应显示接口信息和 peer 列表
# 防火墙放行 WireGuard 端口(UDP)
ufw allow 51820/udp

2.4 开启系统 IP 转发#

Terminal window
# 持久化开启(重启生效)
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -p
# 验证
sysctl net.ipv4.ip_forward
# 输出:net.ipv4.ip_forward = 1

三、客户端配置(全平台)#

3.1 通用客户端配置文件格式#

[Interface]
# 客户端私钥
PrivateKey = <client1_private.key 的内容>
# 客户端在 VPN 中的 IP
Address = 10.0.0.2/24
# DNS(走 VPN 时使用的 DNS 服务器)
DNS = 1.1.1.1, 8.8.8.8
[Peer]
# 服务端公钥
PublicKey = <server_public.key 的内容>
# 服务端地址和端口
Endpoint = your-server-ip:51820
# 全局代理(所有流量走 VPN)
AllowedIPs = 0.0.0.0/0, ::/0
# 保活心跳(NAT 穿越,25 秒发送一次心跳包)
PersistentKeepalive = 25

3.2 Linux 客户端#

Terminal window
# 安装 WireGuard
apt install -y wireguard
# 创建配置文件
vim /etc/wireguard/wg0.conf
# 填入上面的客户端配置内容
# 连接
wg-quick up wg0
# 验证
wg show
curl https://ipinfo.io/ip # 应显示服务器 IP
# 断开
wg-quick down wg0
# 开机自启
systemctl enable wg-quick@wg0

3.3 Windows 客户端#

  1. 下载安装 WireGuard for Windows
  2. 打开 WireGuard → 添加隧道从文件导入 / 手动创建
  3. 粘贴客户端配置文件内容,保存
  4. 点击 启用 即可连接

3.4 macOS 客户端#

Terminal window
# 方法一:App Store 安装官方 WireGuard app(推荐)
# 搜索 "WireGuard" → 安装 → 导入配置文件
# 方法二:Homebrew 命令行
brew install wireguard-tools
# 配置文件放在 /usr/local/etc/wireguard/wg0.conf
sudo wg-quick up wg0

3.5 iOS / Android 客户端#

  1. App Store / Google Play 搜索安装 WireGuard 官方 App
  2. 点击 +从文件或归档创建 / 手动创建 / 扫描 QR 码

生成 QR 码(从服务端快速分发配置)

Terminal window
# 在服务端生成客户端配置的 QR 码
apt install -y qrencode
# 将客户端配置文件转为 QR 码(终端中显示)
qrencode -t ansiutf8 < /tmp/client1.conf
# 客户端用 WireGuard App 扫描即可导入

四、分流路由(Split Tunnel)配置#

默认 AllowedIPs = 0.0.0.0/0 是全局代理,所有流量走 VPN。分流配置让国内流量直连,只有需要的流量走 VPN。

4.1 原理:AllowedIPs 即路由规则#

全局代理:AllowedIPs = 0.0.0.0/0, ::/0
→ 所有目的地的流量都走 WireGuard 隧道
分流代理:AllowedIPs = 1.0.0.0/8, 2.0.0.0/7, ...(精细的 CIDR 列表)
→ 只有在列表中的 IP 段走 WireGuard,其余直连

4.2 方法一:只走特定 IP/服务(最简单)#

[Peer]
# 只让访问特定 IP 走 VPN(其他直连)
AllowedIPs = 8.8.8.8/32, # Google DNS
142.250.0.0/15, # Google 服务部分 IP
151.101.0.0/17, # Fastly CDN
13.32.0.0/15 # Amazon CloudFront

4.3 方法二:排除中国 IP(全球分流)#

wg-genconf 工具(自动生成排除中国 IP 后的 AllowedIPs):

Terminal window
# 在本地安装 wg-genconf
pip install wg-genconf
# 或直接下载脚本
# 生成"排除中国大陆 IP"的 AllowedIPs 列表
wg-genconf generate --exclude-cn > allowed_ips.txt
# AllowedIPs 会是 0.0.0.0/0 减去所有中国 IP 后的 CIDR 集合
# 类似:
# AllowedIPs = 0.0.0.0/1, 128.0.0.0/3, ...(几十条 CIDR)

手动方式(Linux 服务端 PostUp 路由脚本)

Terminal window
# /etc/wireguard/wg0.conf 的 PostUp 添加路由规则
[Interface]
...
PostUp = /etc/wireguard/add-routes.sh
PostDown = /etc/wireguard/del-routes.sh
/etc/wireguard/add-routes.sh
#!/bin/bash
# 添加直连路由:中国 IP 段不走 VPN
# 从 apnic 获取最新中国 IP 段
curl -s 'https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | \
grep 'apnic|CN|ipv4' | \
awk -F'|' '{print $4"/"32-int(log($5)/log(2))}' | \
while read cidr; do
ip route add $cidr via $(ip route | grep default | awk '{print $3}') 2>/dev/null
done

4.4 方法三:仅特定应用走 VPN(应用级分流)#

Linux 可以使用 cgroupsip rule 实现应用级分流,但配置较复杂。更简单的方案是在 WireGuard 之外再搭配 Clash 等代理工具,由 Clash 的规则系统做精细分流。


五、多端互联组网(Site-to-Site)#

5.1 场景:家庭 NAS + 公司服务器 + VPS 三点组网#

家庭 NAS(无公网 IP) ←→ VPS(有公网 IP) ←→ 公司服务器(无公网 IP)
10.0.0.2/24 10.0.0.1/24 10.0.0.3/24

VPS 服务端配置(hub 节点,同上,已有公网 IP):

# /etc/wireguard/wg0.conf(VPS)
[Interface]
PrivateKey = <VPS私钥>
Address = 10.0.0.1/24
ListenPort = 51820
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
[Peer] # 家庭 NAS
PublicKey = <NAS公钥>
AllowedIPs = 10.0.0.2/32, 192.168.1.0/24 # 允许访问 NAS 所在的整个家庭局域网
[Peer] # 公司服务器
PublicKey = <公司服务器公钥>
AllowedIPs = 10.0.0.3/32, 172.16.0.0/24 # 允许访问公司内网

家庭 NAS 客户端配置(通过 VPS 中转):

# /etc/wireguard/wg0.conf(NAS)
[Interface]
PrivateKey = <NAS私钥>
Address = 10.0.0.2/24
# 将家庭局域网流量转发到 VPN(让其他 Peer 能访问家庭设备)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
[Peer] # VPS
PublicKey = <VPS公钥>
Endpoint = VPS公网IP:51820
AllowedIPs = 10.0.0.0/24, 172.16.0.0/24 # 可访问整个 VPN 网段 + 公司内网
PersistentKeepalive = 25

六、wg-easy:Docker 一键部署(推荐新手)#

wg-easy 是 WireGuard 的 Web 管理面板,提供图形界面管理 peer、生成配置、查看连接状态。

compose.yml
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy
container_name: wg-easy
restart: unless-stopped
environment:
- LANG=chs # 中文界面
- WG_HOST=your-server-ip # 服务器公网 IP 或域名
- PASSWORD_HASH=$$2y$$... # 管理界面密码(bcrypt hash)
- WG_PORT=51820 # WireGuard 监听端口
- WG_DEFAULT_ADDRESS=10.8.0.x # 客户端 IP 模板(x 自动递增)
- WG_DEFAULT_DNS=1.1.1.1, 8.8.8.8
- WG_ALLOWED_IPS=0.0.0.0/0, ::/0 # 默认全局代理
- WG_PERSISTENT_KEEPALIVE=25
volumes:
- ./wg-data:/etc/wireguard # 配置数据持久化
ports:
- "51820:51820/udp" # WireGuard
- "51821:51821/tcp" # Web 管理界面
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
Terminal window
# 生成管理密码 hash(将 yourpassword 替换为实际密码)
docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw yourpassword
# 输出类似:PASSWORD_HASH='$$2y$$10$$...'(注意转义 $ 为 $$)
# 启动
docker compose up -d
# 访问管理界面
# http://your-server-ip:51821

wg-easy Web 界面功能

  • ✅ 一键新增/删除 Peer
  • ✅ 下载 .conf 配置文件 / 扫描 QR 码
  • ✅ 实时查看各 Peer 的连接状态和流量统计
  • ✅ 配置持久化(数据存在 ./wg-data 目录)

七、常见问题与排查#

Terminal window
# ── 查看 WireGuard 状态 ───────────────────────────────────────
wg show # 显示接口、peer 和握手时间
wg showconf wg0 # 显示当前运行的配置
# ── 测试连通性 ────────────────────────────────────────────────
ping 10.0.0.1 # Ping VPN 服务端内网 IP
curl --interface wg0 https://ipinfo.io # 通过 WireGuard 接口发请求
# ── 日志查看 ──────────────────────────────────────────────────
journalctl -u wg-quick@wg0 -f
dmesg | grep wireguard
问题可能原因解决方案
握手失败(latest handshake: 无)密钥配对错误 / 端口未开放检查公私钥是否配对,确认 UDP 51820 端口开放
连接成功但无法上网IP 转发未开启 / iptables NAT 规则未生效sysctl net.ipv4.ip_forward 应为 1;检查 PostUp 的 iptables 规则
客户端 IP 不变(仍是原来 IP)AllowedIPs 配置错误全局代理必须是 0.0.0.0/0,不能遗漏 ::/0(IPv6)
握手成功但延迟极高路由表冲突ip route 检查 WireGuard 路由优先级
连接一段时间后断开NAT 超时添加 PersistentKeepalive = 25
macOS 连接后 DNS 不走 VPNDNS 泄漏检查 DNS 字段是否正确填写;或使用 dnscrypt-proxy

相关文章

WireGuard 已内置于 Linux 5.6+ 内核,无需单独安装内核模块。使用 uname -r 确认内核版本,若低于 5.6,需通过 dkms 安装 WireGuard 内核模块。

WireGuard VPN 自建完全指南 2026:服务端部署 + 全平台客户端 + 分流路由配置
https://971918.xyz/posts/docs/wireguard-vpn-setup-guide/
作者
九所长
发布于
2026-07-25
许可协议
CC BY-NC-SA 4.0