本文基于 pirate/wireguard-docs 整理重写,系统介绍 WireGuard 的核心概念、工作原理、安全模型与性能特性,可作为日常配置与排错的技术参考。
一、概述
WireGuard 由 Jason Donenfeld 等人用 C 语言开发,2020 年 1 月并入 Linux 5.6 内核。相比 IPSec/IKEv2、OpenVPN、L2TP 等传统 VPN 协议,WireGuard 的核心差异在于:
| 特性 | WireGuard | OpenVPN | IPSec |
|---|---|---|---|
| 代码量 | ~4,000 行 | ~70,000 行 | ~400,000 行 |
| 内核态运行 | 是 | 否(用户态) | 是 |
| 配置复杂度 | 极低(几行 INI) | 中等 | 高 |
| 加密套件 | 固定(无协商) | 可协商 | 可协商 |
| 漫游支持 | 原生 | 需额外配置 | 有限 |
| 移动端省电 | 好(无连接时不发包) | 一般 | 差 |
WireGuard 的核心设计哲学:使用经过验证的现代加密算法,拒绝加密套件协商,拒绝复杂状态机。
二、核心概念
2.1 Peer / Node / Device
每个 Peer 拥有一对公私钥(wg genkey / wg pubkey)、一个 VPN 子网地址和可选的路由转发配置。
2.2 Bounce Server(中继服务器)
拥有公网 IP 的 Peer,负责转发 NAT 后其他 Peer 的流量。任何 Peer 开启 IP 转发(net.ipv4.ip_forward = 1)并配置 iptables 规则即可充当中继。
2.3 CIDR 基础
| CIDR | 网段范围 | 掩码 |
|---|---|---|
10.0.0.1/32 |
单个 IP | 255.255.255.255 |
10.0.0.0/24 |
10.0.0.0 ~ 10.0.0.255 | 255.255.255.0 |
10.0.0.0/16 |
10.0.0.0 ~ 10.0.255.255 | 255.255.0.0 |
0.0.0.0/0 |
全部 IPv4 地址 | 0.0.0.0 |
2.4 密钥管理
wg genkey > /etc/wireguard/private.key
chmod 600 /etc/wireguard/private.key
wg pubkey < /etc/wireguard/private.key > /etc/wireguard/public.key
在大规模部署中,可使用 Ansible 或 Kubernetes Secrets 管理密钥。动态读取私钥:
[Interface]
PostUp = wg set %i private-key <(cat /some/path/%i/privkey)
2.5 DNS
[Interface]
DNS = 10.0.0.1
三、四种网络拓扑
3.1 端到端直连
所有 Peer 在同一局域网或均拥有公网 IP。
3.2 一端 NAT,一端公网
NAT 后 Peer 的关键配置:
[Peer]
PublicKey = <服务器公钥>
Endpoint = 203.0.113.1:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25
3.3 双 NAT,中继转发
双方都在 NAT 后,引入 Bounce Server,双方将其作为 Peer 并维持 keepalive。
3.4 UDP NAT 打洞
借助 STUN 信令服务器协调源端口,但 CGNAT 通常会阻止。
四、加密与安全模型
基于 Noise 协议框架,固定使用:
| 功能 | 算法 |
|---|---|
| 对称加密 | ChaCha20 |
| 消息认证 | Poly1305 |
| 密钥交换 | Curve25519 |
| 哈希函数 | BLAKE2s |
| 密钥派生 | HKDF |
安全特性:前向加密、抗降级攻击、抗重放攻击、每两分钟自动密钥轮换、不响应未认证数据包。
五、性能特性
- 内核态运行:数据包转发在内核中完成
- UDP 封装:无连接时不发包,移动端省电
- 多核利用:多队列机制
基准测试参考 WireGuard 性能页面 和 RestorePrivacy 对比评测。
六、配置速查
6.1 服务端
# /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <服务端私钥>
PostUp = sysctl -w net.ipv4.ip_forward=1
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
[Peer]
PublicKey = <客户端公钥>
AllowedIPs = 10.0.0.2/32
6.2 客户端
[Interface]
Address = 10.0.0.2/24
PrivateKey = <客户端私钥>
DNS = 10.0.0.1
[Peer]
PublicKey = <服务端公钥>
Endpoint = 203.0.113.1:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25
6.3 常用命令
wg-quick up wg0 # 启动
wg-quick down wg0 # 停止
wg show # 查看状态