2476 字
12 分钟
WireGuard VPN 自建完全指南 2026:服务端部署 + 全平台客户端 + 分流路由配置
WireGuard 是近年来最受欢迎的 VPN 协议,以极简配置、超高性能、现代密码学著称。相比 OpenVPN,WireGuard 代码量仅 4000 行,配置文件几十行即可搞定,吞吐量却是 OpenVPN 的 3-5 倍。
本文从零开始,完整讲解 WireGuard 服务端部署、全平台客户端配置、分流路由,以及 Docker 一键部署方案。
一、WireGuard vs OpenVPN 快速对比
| 对比项 | WireGuard | OpenVPN |
|---|---|---|
| 配置复杂度 | ⭐(几十行) | ⭐⭐⭐⭐(几百行) |
| 性能 | ⭐⭐⭐⭐⭐(内核模块) | ⭐⭐⭐(用户态) |
| 重连速度 | 瞬间(< 1s) | 较慢(10-30s) |
| 安全性 | 现代密码学,代码少审计好 | 成熟但代码量大 |
| TCP 支持 | ❌(仅 UDP) | ✅(UDP + TCP) |
| 穿越防火墙 | 较差(UDP 可能被封) | 可走 443/TCP 绕过封锁 |
| 移动端电池 | ✅ 省电(按需连接) | 较费电 |
选择建议:
自用 VPN / 异地组网 / 远程办公 → WireGuard(首选)需要穿越严格防火墙 / TCP 回落 → OpenVPN 或 V2Ray/VLESS企业级复杂 ACL / 日志审计 → OpenVPN 生态更成熟二、服务端安装与配置
2.1 安装 WireGuard
# 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 生成密钥对
# 进入 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.keywg 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.keychmod 600 /etc/wireguard/ # 整个目录只有 root 可读2.3 服务端配置文件
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 MASQUERADEPostDown = 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 内网 IPAllowedIPs = 10.0.0.2/32
# ── 客户端2(另一台设备)──────────────────────────────────────[Peer]PublicKey = $(cat /etc/wireguard/client2_public.key)AllowedIPs = 10.0.0.3/32EOF⚠️
PostUp/PostDown中的eth0需要替换为你的实际网卡名称(用ip route | grep default查看)。
# 启动 WireGuardsystemctl enable wg-quick@wg0systemctl start wg-quick@wg0
# 查看状态wg show# 输出应显示接口信息和 peer 列表
# 防火墙放行 WireGuard 端口(UDP)ufw allow 51820/udp2.4 开启系统 IP 转发
# 持久化开启(重启生效)echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confecho "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.confsysctl -p
# 验证sysctl net.ipv4.ip_forward# 输出:net.ipv4.ip_forward = 1三、客户端配置(全平台)
3.1 通用客户端配置文件格式
[Interface]# 客户端私钥PrivateKey = <client1_private.key 的内容>
# 客户端在 VPN 中的 IPAddress = 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 = 253.2 Linux 客户端
# 安装 WireGuardapt install -y wireguard
# 创建配置文件vim /etc/wireguard/wg0.conf# 填入上面的客户端配置内容
# 连接wg-quick up wg0
# 验证wg showcurl https://ipinfo.io/ip # 应显示服务器 IP
# 断开wg-quick down wg0
# 开机自启systemctl enable wg-quick@wg03.3 Windows 客户端
- 下载安装 WireGuard for Windows
- 打开 WireGuard → 添加隧道 → 从文件导入 / 手动创建
- 粘贴客户端配置文件内容,保存
- 点击 启用 即可连接
3.4 macOS 客户端
# 方法一:App Store 安装官方 WireGuard app(推荐)# 搜索 "WireGuard" → 安装 → 导入配置文件
# 方法二:Homebrew 命令行brew install wireguard-tools# 配置文件放在 /usr/local/etc/wireguard/wg0.confsudo wg-quick up wg03.5 iOS / Android 客户端
- App Store / Google Play 搜索安装 WireGuard 官方 App
- 点击
+→ 从文件或归档创建 / 手动创建 / 扫描 QR 码
生成 QR 码(从服务端快速分发配置):
# 在服务端生成客户端配置的 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 CloudFront4.3 方法二:排除中国 IP(全球分流)
wg-genconf 工具(自动生成排除中国 IP 后的 AllowedIPs):
# 在本地安装 wg-genconfpip 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 路由脚本):
# /etc/wireguard/wg0.conf 的 PostUp 添加路由规则
[Interface]...PostUp = /etc/wireguard/add-routes.shPostDown = /etc/wireguard/del-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 done4.4 方法三:仅特定应用走 VPN(应用级分流)
Linux 可以使用 cgroups 或 ip 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/24VPS 服务端配置(hub 节点,同上,已有公网 IP):
# /etc/wireguard/wg0.conf(VPS)
[Interface]PrivateKey = <VPS私钥>Address = 10.0.0.1/24ListenPort = 51820PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer] # 家庭 NASPublicKey = <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 MASQUERADEPostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
[Peer] # VPSPublicKey = <VPS公钥>Endpoint = VPS公网IP:51820AllowedIPs = 10.0.0.0/24, 172.16.0.0/24 # 可访问整个 VPN 网段 + 公司内网PersistentKeepalive = 25六、wg-easy:Docker 一键部署(推荐新手)
wg-easy 是 WireGuard 的 Web 管理面板,提供图形界面管理 peer、生成配置、查看连接状态。
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# 生成管理密码 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:51821wg-easy Web 界面功能:
- ✅ 一键新增/删除 Peer
- ✅ 下载
.conf配置文件 / 扫描 QR 码 - ✅ 实时查看各 Peer 的连接状态和流量统计
- ✅ 配置持久化(数据存在
./wg-data目录)
七、常见问题与排查
# ── 查看 WireGuard 状态 ───────────────────────────────────────wg show # 显示接口、peer 和握手时间wg showconf wg0 # 显示当前运行的配置
# ── 测试连通性 ────────────────────────────────────────────────ping 10.0.0.1 # Ping VPN 服务端内网 IPcurl --interface wg0 https://ipinfo.io # 通过 WireGuard 接口发请求
# ── 日志查看 ──────────────────────────────────────────────────journalctl -u wg-quick@wg0 -fdmesg | 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 不走 VPN | DNS 泄漏 | 检查 DNS 字段是否正确填写;或使用 dnscrypt-proxy |
相关文章:
- Linux 服务器初始化安全配置:买完 VPS 必做的 12 件事
- SSH 隧道完全指南:本地/远程/动态端口转发
- 飞牛NAS(fnOS)全平台远程访问:Tailscale + DDNS + frp 三方案
- V2Ray / VMess 完全配置指南 2026:VLESS + Reality
- Docker 完全指南 2026:Compose 多服务编排
WireGuard 已内置于 Linux 5.6+ 内核,无需单独安装内核模块。使用
uname -r确认内核版本,若低于 5.6,需通过dkms安装 WireGuard 内核模块。
WireGuard VPN 自建完全指南 2026:服务端部署 + 全平台客户端 + 分流路由配置
https://971918.xyz/posts/docs/wireguard-vpn-setup-guide/