在 VPN 和代理协议的世界里,WireGuard 是近十年来最具革命性的项目之一。它用不到 4,000 行代码实现了一个极其简洁、安全、高性能的隧道协议,被 Linus Torvalds 亲自合并进 Linux 内核,并且被广泛认可为下一代 VPN 标准。
如果说 Reality 和 Hysteria2 是为了抗封锁,那么 WireGuard 则是为了极简与安全——它不依赖任何 CA 证书体系,不依赖复杂的 TLS 握手,只通过公钥加密就能建立安全的点对点连接。

本文将带你从零开始,理解 WireGuard 的核心原理,掌握其配置语法,并在 Linux / macOS / Windows / iOS / Android 上完整部署一套可用的 WireGuard 网络。
🧭 WireGuard 核心原理
为什么 WireGuard 如此简洁?
与 OpenVPN(数万行代码)或 IPsec(数十万行代码)相比,WireGuard 的设计哲学是:尽可能少的代码,尽可能少的攻击面。它的核心结构可以用一句话概括:
WireGuard = Curve25519 密钥交换 + ChaCha20-Poly1305 加密 + BLAKE2 哈希 + SipHash24 哈希 + HKDF 密钥派生所有这些都是经过密码学界广泛验证的算法,WireGuard 只是巧妙地把它们组合在了一起。
WireGuard 连接的三个核心要素
┌──────────────────────────────────────────────────┐
│ WireGuard 三要素 │
│ │
│ 1. 私钥(Private Key) │
│ 每个节点(服务器/客户端)必须拥有自己的私钥 │
│ 永不公开,保存在本地 │
│ │
│ 2. 公钥(Public Key) │
│ 从私钥派生,可以公开 │
│ 其他节点通过公钥识别你的身份 │
│ │
│ 3. 监听端口 + 端点 IP + 允许的 IP 段 │
│ 定义你的网络边界和可达范围 │
│ │
│ ⚠️ PSK(Pre-Shared Key)可选 │
│ 可选的对称密钥,提供额外的前向保密 │
└──────────────────────────────────────────────────┘WireGuard 与传统协议对比
| 特性 | WireGuard | OpenVPN | IPsec | Shadowsocks | Hysteria2 |
|---|---|---|---|---|---|
| 代码量 | ~4,000 行 | ~100,000 行 | 数十万行 | ~10,000 行 | ~10,000 行 |
| 加密算法 | ChaCha20-Poly1305 | AES-256-CBC | AES-GCM | ChaCha20-IETF | ChaCha20-Poly1305 |
| 密钥交换 | Curve25519 | RSA/DH | IKEv2 | ECDHE | QUIC |
| 性能 | ⭐⭐⭐⭐⭐ 极佳 | ⭐⭐⭐ 一般 | ⭐⭐⭐⭐ 良好 | ⭐⭐⭐⭐ 很好 | ⭐⭐⭐⭐⭐ 极佳 |
| 配置复杂度 | ⭐⭐ 简单 | ⭐⭐⭐⭐⭐ 复杂 | ⭐⭐⭐⭐ 较复杂 | ⭐⭐ 简单 | ⭐⭐⭐ 中等 |
| 内核级支持 | ✅ Linux 5.6+ 内置 | ❌ 用户态 | ✅ 部分内核支持 | ❌ 用户态 | ❌ 用户态 |
| 跨平台 | ✅ 完美 | ✅ 良好 | ⚠️ 依赖操作系统 | ✅ 完美 | ✅ 完美 |
| 抗封锁特征 | UDP + 加密,特征明显 | TCP/UDP 多样 | UDP,特征强 | 可变 | UDP + QUIC |
| 移动端支持 | ✅ 官方客户端 | ✅ 第三方客户端 | ⚠️ 较复杂 | ✅ 良好 | ✅ 良好 |
WireGuard 连接流程
1. 节点 A 生成密钥对 (privA, pubA)
节点 B 生成密钥对 (privB, pubB)
↓
2. A 把 pubA 告诉 B,B 把 pubB 告诉 A
↓
3. A 配置文件中写入:AllowedIPs = B 的 IP 段
B 配置文件中写入:AllowedIPs = A 的 IP 段
↓
4. A 监听 51820(默认端口),B 也监听 51820
↓
5. A → B:发送加密握手包(包含 pubA + 随机挑战)
B → A:验证 pubA,计算共享密钥(Curve25519)
A ← B:用共享密钥验证 B 的响应
↓
6. 握手完成!开始用 ChaCha20-Poly1305 加密传输数据
↓
7. 每 2 分钟轮换一次会话密钥(前向保密)
↓
8. 空闲 180 秒后,连接静默(DPI 难以识别)WireGuard 的弱点
WireGuard 并非完美。它在以下场景下需要特别注意:
- 端口固定:默认 UDP 51820,如果端口被封,需要手动更换
- 无 NAT 穿透:默认没有内置 NAT 穿透,客户端需要配置 endpoint 为可访问的公网 IP
- 纯 UDP:只使用 UDP,部分网络环境可能完全禁用 UDP
- 不支持 TCP:只能运行在 UDP 上(但可以用 udp2raw 等工具套层 TCP 伪装)
- 抗 DPI 能力有限:WireGuard 的握手包有明显特征,可以被深度包检测识别
⚡ 核心配置文件详解
服务端配置文件(/etc/wireguard/wg0.conf)
[Interface]
# 服务端的私钥(由 wg genkey 生成)
PrivateKey = oJVqJq2j5z...(32 字节 Base64 编码)
# 服务端在 VPN 网络内的 IP 地址(CIDR 格式)
Address = 10.0.0.1/24, fd00::1/64
# 监听端口(UDP,默认 51820)
ListenPort = 51820
# NAT 转发后处理(把 VPN 流量映射到公网出口)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# ============== 客户端 1 ==============
[Peer]
# 客户端 1 的公钥
PublicKey = P3z7k2D...
# 可选:预共享密钥(额外安全层)
PresharedKey = ABCDEFG...
# 允许来自该客户端的源 IP(CIDR)
AllowedIPs = 10.0.0.2/32, fd00::2/128
# ============== 客户端 2 ==============
[Peer]
PublicKey = M8n3lKp...
PresharedKey = HIJKLMN...
AllowedIPs = 10.0.0.3/32, fd00::3/128客户端配置文件(wg-client.conf)
[Interface]
# 客户端私钥
PrivateKey = eJ7n2Qp...
# 客户端在 VPN 网络内的 IP
Address = 10.0.0.2/32, fd00::2/128
# DNS 服务器(可选,建议设置)
DNS = 1.1.1.1, 8.8.8.8
# ============== 服务端 ==============
[Peer]
# 服务端公钥
PublicKey = c2Bz8Kq...
# 服务端公网 IP 和端口(Endpoint)
Endpoint = 203.0.113.45:51820
# 允许通过该 Peer 的流量(0.0.0.0/0 表示所有 IPv4,::/0 表示所有 IPv6)
AllowedIPs = 0.0.0.0/0, ::/0
# 保持连接(NAT 穿透,每隔 25 秒发送一次心跳包)
PersistentKeepalive = 25配置参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
| PrivateKey | 私钥,每个节点独有,必须保密 | wgLKJ... |
| PublicKey | 公钥,由私钥派生,公开给其他节点 | ABC123... |
| PresharedKey | 预共享密钥(可选),增加对称加密层 | XYZ987... |
| Address | 本节点在 VPN 网络中的 IP 地址(CIDR) | 10.0.0.1/24 |
| ListenPort | 监听端口(仅服务端需要) | 51820 |
| Endpoint | 对端节点的公网 IP 和端口(客户端需要) | 203.0.113.45:51820 |
| AllowedIPs | 允许通过该 Peer 转发的 IP 范围 | 0.0.0.0/0 |
| PersistentKeepalive | 心跳间隔(秒),NAT 穿透必需 | 25 |
| DNS | 客户端 DNS 服务器(可选) | 1.1.1.1, 8.8.8.8 |
| MTU | 最大传输单元(可选,默认自动) | 1420 |
| Table | 路由表编号(可选,高级配置) | auto |
| PostUp | 接口启动后执行的命令 | iptables ... |
| PostDown | 接口停止后执行的命令 | iptables ... |
🔑 密钥生成与管理
生成密钥对
# 方法一:wg 工具生成
wg genkey | tee server_private.key | wg pubkey > server_public.key
# 方法二:wg-quick 一键生成
umask 077 # 确保文件权限严格
wg genkey > server_private.key
wg pubkey < server_private.key > server_public.key
# 方法三:生成预共享密钥(可选,用于 PSK 模式)
wg genpsk > preshared.key查看密钥内容
$ cat server_private.key
oJVqJq2j5zN1R5x...(44 个字符的 Base64)
$ cat server_public.key
P3z7k2D8nM5pKqL...(同样 44 个字符)
# 验证私钥和公钥是否匹配
echo "私钥生成的公钥应为:"
cat server_private.key | wg pubkey
echo "文件中的公钥:"
cat server_public.key
# 如果两者相同,则匹配密钥管理最佳实践
⚠️ 密钥管理的安全要点:
1. 每个节点必须有独立的私钥,不要在多个节点共用私钥
2. 私钥权限设置为 600(仅限所有者读写)
chmod 600 /etc/wireguard/wg0.conf
3. 定期轮换密钥(建议 6-12 个月)
4. 客户端加入网络时,不要在公网传输私钥
→ 使用 QR Code(移动端)
→ 使用加密传输(scp / 加密邮件)
→ 直接粘贴(远程桌面 / SSH)
5. 启用预共享密钥(PSK)可以增加额外安全层
PSK 是对称密钥,配合非对称密钥交换,提升抗量子攻击能力
6. 如果密钥可能泄露,立即更换!🚀 实战一:VPS 上部署 WireGuard 服务端
步骤 1:系统环境检查
# 检查 Linux 内核版本(需 >= 5.6,或安装模块)
uname -r
# 5.15.0-76-generic ← 5.15 已经包含
# 检查内核模块是否可用
modprobe wireguard
# 如果无错误,说明模块已加载
# 确认模块已加载
lsmod | grep wireguard
# wireguard 221184 0步骤 2:安装 WireGuard
# Debian / Ubuntu
apt update
apt install -y wireguard wireguard-tools
# CentOS / RHEL / Fedora
yum install epel-release elrepo-release
yum install kmod-wireguard wireguard-tools
# Arch Linux
pacman -S wireguard-tools
# 验证安装
wg --version
# wireguard-tools v1.0.20210914步骤 3:生成服务端密钥
# 创建配置目录并设置权限
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
cd /etc/wireguard
# 生成服务端密钥
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
# 查看密钥
echo "=== 服务端私钥 ==="
cat server_private.key
echo ""
echo "=== 服务端公钥 ==="
cat server_public.key步骤 4:编写服务端配置文件
# 创建 wg0.conf
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
PrivateKey = 你的服务端私钥
Address = 10.0.0.1/24, fd00::1/64
ListenPort = 51820
# NAT 转发(适用于大多数 VPS,把出站网卡改为你的实际网卡名)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF
# 设置文件权限
chmod 600 /etc/wireguard/wg0.conf步骤 5:启用 IP 转发
# 临时启用
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1
# 永久启用(写入 sysctl 配置)
cat >> /etc/sysctl.conf << 'EOF'
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
# 确认生效
sysctl net.ipv4.ip_forward
# net.ipv4.ip_forward = 1步骤 6:防火墙放行
# 如果使用 UFW
ufw allow 51820/udp
ufw reload
# 如果使用 iptables
iptables -A INPUT -p udp --dport 51820 -j ACCEPT
iptables-save
# 检查 VPS 供应商的防火墙面板,确保 UDP 51820 已放行
# 很多云服务商(阿里云/腾讯云/AWS)需要在控制台单独配置步骤 7:启动 WireGuard
# 启动接口
wg-quick up wg0
# 查看状态
wg show wg0
# 预期输出:
# interface: wg0
# public key: (服务端公钥)
# listening port: 51820
# peer: (客户端公钥,尚未配置,此时为空)
# 设置为开机自启
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
# 测试接口
ip addr show wg0
# 应该能看到 10.0.0.1/24 和 fd00::1/64步骤 8:添加第一个客户端
# 在 VPS 上生成客户端密钥(也可以在客户端生成,只把公钥发给服务器)
cd /etc/wireguard
umask 077
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
wg genpsk > client1_psk.key
# 把 Peer 配置追加到服务端配置文件
cat >> /etc/wireguard/wg0.conf << EOF
[Peer]
# Client 1 - 我的笔记本
PublicKey = $(cat client1_public.key)
PresharedKey = $(cat client1_psk.key)
AllowedIPs = 10.0.0.2/32, fd00::2/128
EOF
# 重新加载 WireGuard 配置(不中断现有连接)
wg syncconf wg0 <(wg-quick strip wg0)步骤 9:生成客户端配置文件
# 生成客户端配置(可以直接导入客户端软件)
cat > /etc/wireguard/wg0-client1.conf << EOF
[Interface]
PrivateKey = $(cat client1_private.key)
Address = 10.0.0.2/32, fd00::2/128
DNS = 1.1.1.1, 8.8.8.8
[Peer]
PublicKey = $(cat server_public.key)
PresharedKey = $(cat client1_psk.key)
Endpoint = $(curl -s ifconfig.me):51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF
# 生成 QR Code(方便移动端扫码)
apt install -y qrencode
qrencode -t ansiutf8 < /etc/wireguard/wg0-client1.conf
# 屏幕上会出现一个二维码,手机 WireGuard App 可直接扫描
# 或者生成 PNG 文件
qrencode -o /etc/wireguard/client1_qr.png < /etc/wireguard/wg0-client1.conf💻 实战二:客户端配置
Linux 客户端
# 1. 安装
apt install -y wireguard wireguard-tools
# 2. 把客户端配置文件放到 /etc/wireguard/wg0.conf
# 从 VPS 下载或手动创建
# 3. 启动
wg-quick up wg0
# 4. 设置开机自启
systemctl enable wg-quick@wg0macOS 客户端(官方 App)
1. 从 App Store 下载 "WireGuard"(由 WireGuard Development Team 开发)
2. 点击 "Create empty tunnel" 或 "Import tunnel(s) from file"
3. 粘贴配置文件内容或选择 .conf 文件
4. 点击 "Activate" 启用隧道
5. 状态变绿后表示连接成功macOS 客户端(命令行)
# 通过 Homebrew 安装
brew install wireguard-tools
# 配置文件路径
# /usr/local/etc/wireguard/wg0.conf
# 启动
sudo wg-quick up wg0Windows 客户端
1. 从官网下载安装程序:https://www.wireguard.com/install/
2. 安装后打开 WireGuard
3. 点击 "Add Tunnel" → "Add empty tunnel"
4. 粘贴配置文件内容,命名为 "wg0"
5. 点击 "Activate" 启用
6. 状态栏图标变绿,表示连接成功iOS 客户端
1. 从 App Store 下载 "WireGuard"(需要美区或其他区 Apple ID)
2. 打开 App,点击右上角 + 号
3. 选择 "Create from QR code" 扫描 VPS 上生成的二维码
4. 或者选择 "Create from file" 导入 .conf 文件
5. 给隧道命名,点击开关启用
6. 首次启用会请求 VPN 权限,确认即可Android 客户端
1. 从 Google Play 下载 "WireGuard"(官方客户端)
2. 或者从 F-Droid 下载
3. 打开 App,点击右下角 + 号
4. 选择 "从 QR 码扫描" 或 "从文件导入"
5. 导入后启用隧道
6. Android 会请求 VPN 权限,确认即可🔍 故障排查手册
问题 1:服务端无法启动
# 检查端口是否被占用
ss -ulnp | grep 51820
# 检查内核模块
modprobe wireguard
# 如果失败,可能需要安装内核头文件
# apt install linux-headers-$(uname -r)
# 检查配置文件语法
wg-quick strip wg0 # 会提示语法错误
# 检查密钥格式
# 私钥和公钥必须是 32 字节(44 字符 Base64)
# 可以用以下命令验证
echo "你的私钥" | base64 -d | wc -c
# 应该输出 32问题 2:客户端连接不上
检查清单:
1. 服务端是否在运行
systemctl status wg-quick@wg0
2. 端口是否可访问(在客户端上测试)
nc -zv 你的VPS公网IP 51820
注意:nc 测试 UDP 不太可靠,推荐用 tcpdump
3. 在 VPS 上抓包看是否收到请求
tcpdump -i eth0 udp port 51820 -n
← 如果客户端启动后没看到任何流量,说明网络不通
4. 检查 VPS 供应商的防火墙
阿里云/腾讯云/AWS 等都需要在云控制台开放 UDP 端口
5. 检查密钥是否正确
对比服务端配置中的 PublicKey 和客户端生成的公钥是否一致
6. 检查 AllowedIPs
服务端 AllowedIPs 必须包含客户端 Address 中的 IP问题 3:能连接但无法上网
最常见原因:NAT 转发没有正确配置
1. 检查 IP 转发是否开启
sysctl net.ipv4.ip_forward
必须 = 1
2. 检查 iptables 规则
iptables -t nat -L POSTROUTING -n
应该有一条 MASQUERADE 规则在你的出站网卡上
3. 检查出站网卡名
ip addr show # 找到你的公网网卡,通常是 eth0 或 ens3 或 venet0
# 把 PostUp 中的 eth0 改为你实际的网卡名
4. 测试 VPN 内网是否连通
在 VPS 上 ping 10.0.0.2
在客户端 ping 10.0.0.1
如果能 ping 通但上不了网,就是 NAT 或 DNS 问题
5. 检查 DNS
客户端配置中的 DNS 是否可访问
可以尝试改为 8.8.8.8 或 223.5.5.5问题 4:速度很慢
常见原因:
1. MTU 设置不合理
默认可能太大,导致分片
尝试在客户端 [Interface] 添加
MTU = 1380
2. VPS 本身带宽有限
先测试 VPS 直连速度
curl -s https://speed.hetzner.de/100MB.bin | wc -c
3. 客户端与服务端的延迟过高
ping 你的VPS公网IP
如果 RTT > 200ms,考虑更换地理位置
4. 加密/解密性能瓶颈
WireGuard 对 CPU 有一定要求,低端 VPS(1核 512MB)可能受限问题 5:连接经常断开
1. 检查 PersistentKeepalive
客户端配置中必须有(NAT 环境下)
PersistentKeepalive = 25
2. 检查 NAT 超时
某些路由器的 UDP NAT 会话超时很短(30-60秒)
可以降低 PersistentKeepalive 到 15
3. 检查 VPS 是否启用 DDoS 防护
可能把你的 UDP 流量误判为攻击流量
4. 使用 TCP 模式(高级)
如果 UDP 被完全封锁,可以用 udp2raw 把 UDP 伪装成 TCP
见本文"高级应用"章节问题 6:密钥被识别错误
常见错误:
1. 私钥/公钥配置反了
[Interface] 必须是 PrivateKey(私钥)
[Peer] 必须是对方的 PublicKey(公钥)
2. 生成时的权限问题
确保生成密钥时 umask 是 077,文件权限为 600
3. 复制时多了/少了字符
公钥和私钥都是精确的 44 字符(不含换行)
复制时不要包含多余的空格或换行🌐 高级应用场景
场景 1:多客户端组网(星型拓扑)
┌────────────┐
│ 客户端 1 │
│ 10.0.0.2 │
└─────┬──────┘
│
┌─────▼──────┐
│ VPS 服务端 │
│ 10.0.0.1 │
└────┬──────┬┘
│ │
┌────────┘ └───────┐
│ │
┌────▼──────┐ ┌────▼──────┐
│ 客户端 2 │ │ 客户端 3 │
│ 10.0.0.3 │ │ 10.0.0.4 │
└───────────┘ └───────────┘
客户端之间通过服务端中转通信
(把客户端的 AllowedIPs 设置为 10.0.0.0/24,即可互相访问)服务端配置多个 Peer:
[Interface]
PrivateKey = 服务端私钥
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
# Client 1
PublicKey = 客户端1公钥
AllowedIPs = 10.0.0.2/32
[Peer]
# Client 2
PublicKey = 客户端2公钥
AllowedIPs = 10.0.0.3/32
[Peer]
# Client 3
PublicKey = 客户端3公钥
AllowedIPs = 10.0.0.4/32客户端之间互相 ping:
# 客户端 1 上执行
ping 10.0.0.3 # ping 客户端 2
# 应该可以通(流量通过服务端转发)场景 2:旁路由模式(透明代理)
把一台支持 WireGuard 的设备配置为旁路由,让局域网内所有设备自动通过它上网:
局域网 (192.168.1.0/24)
│
├── 主路由器 (192.168.1.1)
│
└── 旁路由 (192.168.1.2) ← 运行 WireGuard,做透明代理
│
└── WireGuard 隧道 (wg0, 10.0.0.2)
│
▼
VPS 服务端 (10.0.0.1)旁路由配置:
[Interface]
PrivateKey = 旁路由私钥
Address = 10.0.0.2/32
# 不设置 DNS(由内网 DNS 负责)
# 开启转发
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = iptables -A FORWARD -i eth0 -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o %i -j MASQUERADE
[Peer]
PublicKey = VPS公钥
Endpoint = VPS公网IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25局域网设备使用:
方法一:手动配置网关
把需要走代理的设备的默认网关改为 192.168.1.2
DNS 设置为 223.5.5.5 或其他公共 DNS
方法二:DHCP 指定网关
在主路由器的 DHCP 设置中,把网关指向 192.168.1.2
所有设备自动通过旁路由上网
方法三:路由策略分流
只把特定 IP 段的流量发给 192.168.1.2
其他流量走默认网关场景 3:站点到站点(Site-to-Site)VPN
把两个办公室的内网通过 WireGuard 打通:
办公室 A (192.168.1.0/24) 办公室 B (192.168.2.0/24)
│ │
▼ ▼
WireGuard 网关 A WireGuard 网关 B
(192.168.1.254) (192.168.2.254)
VPN 内网: 10.0.0.1 VPN 内网: 10.0.0.2
│ │
└──────────── Internet ────────────┘网关 A 的配置:
[Interface]
PrivateKey = A私钥
Address = 10.0.0.1/32
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = B公钥
Endpoint = B的公网IP:51820
AllowedIPs = 10.0.0.2/32, 192.168.2.0/24 # 关键:允许对端的整个内网
PersistentKeepalive = 25网关 B 的配置:
[Interface]
PrivateKey = B私钥
Address = 10.0.0.2/32
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT
...
[Peer]
PublicKey = A公钥
Endpoint = A的公网IP:51820
AllowedIPs = 10.0.0.1/32, 192.168.1.0/24
PersistentKeepalive = 25验证:
# 在办公室 A 的某台设备上
ping 192.168.2.100 # 访问办公室 B 的设备
# 应该可以通场景 4:UDP over TCP 伪装(抗封锁高级技巧)
如果你的网络环境完全封锁 UDP,WireGuard 无法直接工作。可以用 udp2raw 等工具把 UDP 流量包装成 TCP:
客户端 WireGuard (UDP) → udp2raw 客户端 → TCP 伪装 → udp2raw 服务端 → WireGuard 服务端1. 服务端配置 udp2raw:
# 安装 udp2raw
wget https://github.com/wangyu-/udp2raw-tunnel/releases/download/20230206.0/udp2raw_binaries.tar.gz
tar -xzvf udp2raw_binaries.tar.gz
cd udp2raw_binaries
# 启动 udp2raw 服务端(把收到的 TCP 8080 转发到本地 UDP 51820)
./udp2raw_amd64 -s -l0.0.0.0:8080 -r 127.0.0.1:51820 -k "你的密码" --raw-mode faketcp2. 客户端配置 udp2raw:
./udp2raw_amd64 -c -l127.0.0.1:51820 -r VPS公网IP:8080 -k "你的密码" --raw-mode faketcp3. 客户端 WireGuard 配置:
[Peer]
PublicKey = VPS公钥
Endpoint = 127.0.0.1:51820 # 指向本地 udp2raw
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25场景 5:wg-dashboard 可视化管理
# 安装 wg-easy(最流行的 WireGuard 管理面板)
docker run -d \
--name=wg-easy \
-e WG_HOST=你的VPS公网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 \
weejewel/wg-easy
# 访问管理面板
# https://你的VPS公网IP:51821
# 可以:添加/删除客户端、查看状态、下载配置、生成 QR Code📱 WireGuard 与其他代理工具结合
方案一:WireGuard + sing-box(网关模式)
把 WireGuard 作为 sing-box 的一个出站通道,让 sing-box 负责规则分流:
{
"outbounds": [
{
"type": "wireguard",
"tag": "wg-out",
"server": "VPS公网IP",
"server_port": 51820,
"local_address": [
"10.0.0.2/32",
"fd00::2/128"
],
"private_key": "客户端私钥",
"peer_public_key": "服务端公钥",
"pre_shared_key": "预共享密钥(可选)",
"mtu": 1420
}
]
}方案二:WireGuard + Clash Meta
Clash Meta 也支持 WireGuard 作为代理协议:
proxies:
- name: "WireGuard-VPS"
type: wireguard
server: VPS公网IP
port: 51820
ip: 10.0.0.2
private-key: 客户端私钥
public-key: 服务端公钥
pre-shared-key: 预共享密钥(可选)
udp: true
mtu: 1420方案三:在路由器上运行 WireGuard
主流开源固件都支持 WireGuard:
- OpenWrt:
opkg install wireguard-tools luci-app-wireguard - iStoreOS:在应用市场安装 WireGuard 插件
- RouterOS (MikroTik):原生支持,
/interface/wireguard - pfSense / OPNsense:插件市场安装 WireGuard
⚡ 性能优化与安全加固
性能优化
# 1. 调整 MTU(根据网络环境)
# 大多数情况下 1420 是比较安全的值
# 在客户端 [Interface] 中添加
MTU = 1380
# 2. 使用 AES-NI(如果 CPU 支持)
# WireGuard 默认使用 ChaCha20,但 CPU 支持 AES-NI 时可以切换
# 通过内核模块参数调整(高级用法)
# 3. 内核参数调优
cat >> /etc/sysctl.conf << 'EOF'
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl -p
# 4. 启用 TCP BBR
# 对通过 WireGuard 隧道的 TCP 流量有显著提升
# (已包含在上面的配置中)安全加固
# 1. 设置严格的文件权限
chmod 700 /etc/wireguard
chmod 600 /etc/wireguard/*.conf
chmod 600 /etc/wireguard/*.key
# 2. 限制配置文件的读取
chown root:root /etc/wireguard/*.conf
chown root:root /etc/wireguard/*.key
# 3. 启用预共享密钥(PSK)
# 每个 Peer 都可以配置独立的 PSK
wg genpsk
# 4. 限制 AllowedIPs
# 只给客户端它真正需要的 IP 范围,不要使用 0.0.0.0/0
# 在服务端使用 /32 的精确 IP 限制
# 5. 定期更换端口
# 使用非默认端口可以避开简单的端口扫描
ListenPort = 51820 # 默认
# 可以尝试 1-65535 之间的任意端口
# 6. 使用防火墙限制 WireGuard 端口
# 只允许来自特定 IP 段的连接(可选)
iptables -A INPUT -p udp -s 114.0.0.0/8 --dport 51820 -j ACCEPT
iptables -A INPUT -p udp --dport 51820 -j DROP🎯 客户端配置对比速查表
| 平台 | 官方客户端 | 配置方法 | 最佳实践 |
|---|---|---|---|
| Linux | wg-quick / NetworkManager | 配置文件 /etc/wireguard/wg0.conf | systemctl enable wg-quick@wg0 |
| macOS | WireGuard App(App Store) | 导入 .conf 文件或粘贴内容 | 使用菜单栏快速切换 |
| Windows | WireGuard 客户端(官网) | 粘贴配置内容 | 配合 PowerShell 脚本管理 |
| iOS | WireGuard App(App Store) | 扫描 QR Code 或导入文件 | 使用 On-Demand 功能自动触发 |
| Android | WireGuard App(Play Store / F-Droid) | 扫描 QR Code 或导入文件 | 配合 Tasker 自动化 |
| 路由器 | 各固件插件 | Web 界面配置 | 旁路由模式最灵活 |
结语
WireGuard 的核心理念是用最小的代码实现最大的安全。它简洁、快速、易于维护,但也意味着需要你手动处理很多传统 VPN 协议内置的功能(如证书系统、NAT 穿透、自动密钥分发)。
总结要点:
- ✅ 极简配置:几行文本即可建立完整的 VPN 隧道
- ✅ 内核级支持:Linux 5.6+ 原生支持,性能极高
- ✅ 跨平台:从路由器到手机,所有主流平台都有客户端
- ✅ 安全可靠:基于现代密码学算法,代码量小,审计容易
- ✅ 多场景应用:可以作为普通 VPN、旁路由、站点互连等
- ⚠️ 注意事项:只使用 UDP、抗 DPI 能力有限、需要手动配置密钥
如果你需要的是一个简洁、安全、高性能的 VPN 工具——WireGuard 无疑是最佳选择。把它和 Reality、Hysteria2 等协议放在一起,你就拥有了应对不同网络环境的完整工具箱。
愿你的网络连接如同 WireGuard 的设计哲学一样——简洁而强大。🚀
