在 VPN 和代理协议的世界里,WireGuard 是近十年来最具革命性的项目之一。它用不到 4,000 行代码实现了一个极其简洁、安全、高性能的隧道协议,被 Linus Torvalds 亲自合并进 Linux 内核,并且被广泛认可为下一代 VPN 标准。

如果说 Reality 和 Hysteria2 是为了抗封锁,那么 WireGuard 则是为了极简与安全——它不依赖任何 CA 证书体系,不依赖复杂的 TLS 握手,只通过公钥加密就能建立安全的点对点连接。

WireGuard 网络示意图
WireGuard 全平台部署架构

本文将带你从零开始,理解 WireGuard 的核心原理,掌握其配置语法,并在 Linux / macOS / Windows / iOS / Android 上完整部署一套可用的 WireGuard 网络。


🧭 WireGuard 核心原理

为什么 WireGuard 如此简洁?

与 OpenVPN(数万行代码)或 IPsec(数十万行代码)相比,WireGuard 的设计哲学是:尽可能少的代码,尽可能少的攻击面。它的核心结构可以用一句话概括:

PLAINTEXT
WireGuard = Curve25519 密钥交换 + ChaCha20-Poly1305 加密 + BLAKE2 哈希 + SipHash24 哈希 + HKDF 密钥派生

所有这些都是经过密码学界广泛验证的算法,WireGuard 只是巧妙地把它们组合在了一起。

WireGuard 连接的三个核心要素

PLAINTEXT
┌──────────────────────────────────────────────────┐
│              WireGuard 三要素                     │
│                                                    │
│  1. 私钥(Private Key)                           │
│     每个节点(服务器/客户端)必须拥有自己的私钥     │
│     永不公开,保存在本地                          │
│                                                    │
│  2. 公钥(Public Key)                            │
│     从私钥派生,可以公开                          │
│     其他节点通过公钥识别你的身份                   │
│                                                    │
│  3. 监听端口 + 端点 IP + 允许的 IP 段              │
│     定义你的网络边界和可达范围                     │
│                                                    │
│  ⚠️  PSK(Pre-Shared Key)可选                    │
│      可选的对称密钥,提供额外的前向保密           │
└──────────────────────────────────────────────────┘

WireGuard 与传统协议对比

特性WireGuardOpenVPNIPsecShadowsocksHysteria2
代码量~4,000 行~100,000 行数十万行~10,000 行~10,000 行
加密算法ChaCha20-Poly1305AES-256-CBCAES-GCMChaCha20-IETFChaCha20-Poly1305
密钥交换Curve25519RSA/DHIKEv2ECDHEQUIC
性能⭐⭐⭐⭐⭐ 极佳⭐⭐⭐ 一般⭐⭐⭐⭐ 良好⭐⭐⭐⭐ 很好⭐⭐⭐⭐⭐ 极佳
配置复杂度⭐⭐ 简单⭐⭐⭐⭐⭐ 复杂⭐⭐⭐⭐ 较复杂⭐⭐ 简单⭐⭐⭐ 中等
内核级支持✅ Linux 5.6+ 内置❌ 用户态✅ 部分内核支持❌ 用户态❌ 用户态
跨平台✅ 完美✅ 良好⚠️ 依赖操作系统✅ 完美✅ 完美
抗封锁特征UDP + 加密,特征明显TCP/UDP 多样UDP,特征强可变UDP + QUIC
移动端支持✅ 官方客户端✅ 第三方客户端⚠️ 较复杂✅ 良好✅ 良好

WireGuard 连接流程

PLAINTEXT
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 并非完美。它在以下场景下需要特别注意:

  1. 端口固定:默认 UDP 51820,如果端口被封,需要手动更换
  2. 无 NAT 穿透:默认没有内置 NAT 穿透,客户端需要配置 endpoint 为可访问的公网 IP
  3. 纯 UDP:只使用 UDP,部分网络环境可能完全禁用 UDP
  4. 不支持 TCP:只能运行在 UDP 上(但可以用 udp2raw 等工具套层 TCP 伪装)
  5. 抗 DPI 能力有限:WireGuard 的握手包有明显特征,可以被深度包检测识别

⚡ 核心配置文件详解

服务端配置文件(/etc/wireguard/wg0.conf

INI
[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

INI
[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 ...

🔑 密钥生成与管理

生成密钥对

BASH
# 方法一: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

查看密钥内容

BASH
$ 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
# 如果两者相同,则匹配

密钥管理最佳实践

PLAINTEXT
⚠️  密钥管理的安全要点:

1. 每个节点必须有独立的私钥,不要在多个节点共用私钥
2. 私钥权限设置为 600(仅限所有者读写)
   chmod 600 /etc/wireguard/wg0.conf
3. 定期轮换密钥(建议 6-12 个月)
4. 客户端加入网络时,不要在公网传输私钥
   → 使用 QR Code(移动端)
   → 使用加密传输(scp / 加密邮件)
   → 直接粘贴(远程桌面 / SSH)
5. 启用预共享密钥(PSK)可以增加额外安全层
   PSK 是对称密钥,配合非对称密钥交换,提升抗量子攻击能力
6. 如果密钥可能泄露,立即更换!

🚀 实战一:VPS 上部署 WireGuard 服务端

步骤 1:系统环境检查

BASH
# 检查 Linux 内核版本(需 >= 5.6,或安装模块)
uname -r
# 5.15.0-76-generic  ← 5.15 已经包含

# 检查内核模块是否可用
modprobe wireguard
# 如果无错误,说明模块已加载

# 确认模块已加载
lsmod | grep wireguard
# wireguard  221184  0

步骤 2:安装 WireGuard

BASH
# 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:生成服务端密钥

BASH
# 创建配置目录并设置权限
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:编写服务端配置文件

BASH
# 创建 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 转发

BASH
# 临时启用
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:防火墙放行

BASH
# 如果使用 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

BASH
# 启动接口
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:添加第一个客户端

BASH
# 在 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:生成客户端配置文件

BASH
# 生成客户端配置(可以直接导入客户端软件)
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 客户端

BASH
# 1. 安装
apt install -y wireguard wireguard-tools

# 2. 把客户端配置文件放到 /etc/wireguard/wg0.conf
#    从 VPS 下载或手动创建

# 3. 启动
wg-quick up wg0

# 4. 设置开机自启
systemctl enable wg-quick@wg0

macOS 客户端(官方 App)

PLAINTEXT
1. 从 App Store 下载 "WireGuard"(由 WireGuard Development Team 开发)
2. 点击 "Create empty tunnel" 或 "Import tunnel(s) from file"
3. 粘贴配置文件内容或选择 .conf 文件
4. 点击 "Activate" 启用隧道
5. 状态变绿后表示连接成功

macOS 客户端(命令行)

BASH
# 通过 Homebrew 安装
brew install wireguard-tools

# 配置文件路径
# /usr/local/etc/wireguard/wg0.conf

# 启动
sudo wg-quick up wg0

Windows 客户端

PLAINTEXT
1. 从官网下载安装程序:https://www.wireguard.com/install/
2. 安装后打开 WireGuard
3. 点击 "Add Tunnel" → "Add empty tunnel"
4. 粘贴配置文件内容,命名为 "wg0"
5. 点击 "Activate" 启用
6. 状态栏图标变绿,表示连接成功

iOS 客户端

PLAINTEXT
1. 从 App Store 下载 "WireGuard"(需要美区或其他区 Apple ID)
2. 打开 App,点击右上角 + 号
3. 选择 "Create from QR code" 扫描 VPS 上生成的二维码
4. 或者选择 "Create from file" 导入 .conf 文件
5. 给隧道命名,点击开关启用
6. 首次启用会请求 VPN 权限,确认即可

Android 客户端

PLAINTEXT
1. 从 Google Play 下载 "WireGuard"(官方客户端)
2. 或者从 F-Droid 下载
3. 打开 App,点击右下角 + 号
4. 选择 "从 QR 码扫描" 或 "从文件导入"
5. 导入后启用隧道
6. Android 会请求 VPN 权限,确认即可

🔍 故障排查手册

问题 1:服务端无法启动

BASH
# 检查端口是否被占用
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:客户端连接不上

PLAINTEXT
检查清单:

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:能连接但无法上网

PLAINTEXT
最常见原因: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:速度很慢

PLAINTEXT
常见原因:

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:连接经常断开

PLAINTEXT
1. 检查 PersistentKeepalive
   客户端配置中必须有(NAT 环境下)
   PersistentKeepalive = 25

2. 检查 NAT 超时
   某些路由器的 UDP NAT 会话超时很短(30-60秒)
   可以降低 PersistentKeepalive 到 15

3. 检查 VPS 是否启用 DDoS 防护
   可能把你的 UDP 流量误判为攻击流量

4. 使用 TCP 模式(高级)
   如果 UDP 被完全封锁,可以用 udp2raw 把 UDP 伪装成 TCP
   见本文"高级应用"章节

问题 6:密钥被识别错误

PLAINTEXT
常见错误:

1. 私钥/公钥配置反了
   [Interface] 必须是 PrivateKey(私钥)
   [Peer] 必须是对方的 PublicKey(公钥)

2. 生成时的权限问题
   确保生成密钥时 umask 是 077,文件权限为 600

3. 复制时多了/少了字符
   公钥和私钥都是精确的 44 字符(不含换行)
   复制时不要包含多余的空格或换行

🌐 高级应用场景

场景 1:多客户端组网(星型拓扑)

PLAINTEXT
         ┌────────────┐
         │   客户端 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:

INI
[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:

BASH
# 客户端 1 上执行
ping 10.0.0.3   # ping 客户端 2
# 应该可以通(流量通过服务端转发)

场景 2:旁路由模式(透明代理)

把一台支持 WireGuard 的设备配置为旁路由,让局域网内所有设备自动通过它上网:

PLAINTEXT
局域网 (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)

旁路由配置:

INI
[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

局域网设备使用:

PLAINTEXT
方法一:手动配置网关
  把需要走代理的设备的默认网关改为 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 打通:

PLAINTEXT
办公室 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 的配置:

INI
[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 的配置:

INI
[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

验证:

BASH
# 在办公室 A 的某台设备上
ping 192.168.2.100   # 访问办公室 B 的设备
# 应该可以通

场景 4:UDP over TCP 伪装(抗封锁高级技巧)

如果你的网络环境完全封锁 UDP,WireGuard 无法直接工作。可以用 udp2raw 等工具把 UDP 流量包装成 TCP:

PLAINTEXT
客户端 WireGuard (UDP) → udp2raw 客户端 → TCP 伪装 → udp2raw 服务端 → WireGuard 服务端

1. 服务端配置 udp2raw:

BASH
# 安装 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 faketcp

2. 客户端配置 udp2raw:

BASH
./udp2raw_amd64 -c -l127.0.0.1:51820 -r VPS公网IP:8080 -k "你的密码" --raw-mode faketcp

3. 客户端 WireGuard 配置:

INI
[Peer]
PublicKey = VPS公钥
Endpoint = 127.0.0.1:51820  # 指向本地 udp2raw
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

场景 5:wg-dashboard 可视化管理

BASH
# 安装 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 负责规则分流:

JSON
{
  "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 作为代理协议:

YAML
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:


⚡ 性能优化与安全加固

性能优化

BASH
# 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 流量有显著提升
# (已包含在上面的配置中)

安全加固

BASH
# 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

🎯 客户端配置对比速查表

平台官方客户端配置方法最佳实践
Linuxwg-quick / NetworkManager配置文件 /etc/wireguard/wg0.confsystemctl enable wg-quick@wg0
macOSWireGuard App(App Store)导入 .conf 文件或粘贴内容使用菜单栏快速切换
WindowsWireGuard 客户端(官网)粘贴配置内容配合 PowerShell 脚本管理
iOSWireGuard App(App Store)扫描 QR Code 或导入文件使用 On-Demand 功能自动触发
AndroidWireGuard App(Play Store / F-Droid)扫描 QR Code 或导入文件配合 Tasker 自动化
路由器各固件插件Web 界面配置旁路由模式最灵活

结语

WireGuard 的核心理念是用最小的代码实现最大的安全。它简洁、快速、易于维护,但也意味着需要你手动处理很多传统 VPN 协议内置的功能(如证书系统、NAT 穿透、自动密钥分发)。

总结要点:

如果你需要的是一个简洁、安全、高性能的 VPN 工具——WireGuard 无疑是最佳选择。把它和 Reality、Hysteria2 等协议放在一起,你就拥有了应对不同网络环境的完整工具箱。

愿你的网络连接如同 WireGuard 的设计哲学一样——简洁而强大。🚀

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/wireguard-deep-dive/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。