WireGuard 技术参考手册

本文基于 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           # 查看状态

参考资源