WireGuard
WireGuard 是一种现代 VPN / 隧道协议与实现路线,强调更小的协议面、更快的握手和更简单的密钥配置。
#type / concept
#status / growing
#tech / network
#resource / wireguard
#protocol / wireguard
[!info] related notes
- 所属 MOC: 计算机网络 MOC, 家庭服务器
- 并列概念: 正向代理与反向代理
- 易混淆概念: Cloudflare WARP
- 关系笔记: Cloudflare WARP 与 Warp Terminal 的区别
WireGuard
一句话定义
WireGuard 是一种现代 VPN 协议和实现,以极简的代码量(约 4000 行内核代码)和精选的加密原语,在内核层实现高性能、低延迟的点对点加密隧道。
核心机制 / 工作原理
设计哲学
- 简单:协议代码量仅约 4000 行(对比 OpenVPN 约 10 万行),攻击面小,易于审计
- 高效:作为内核模块运行,避免用户态/内核态切换开销
- 安全:不协商加密算法(避免降级攻击),固定使用最安全的密码学套件
加密套件
WireGuard 固定使用以下原语,不支持协商:
| 用途 | 算法 |
|---|---|
| 密钥交换 | Curve25519(ECDH) |
| 对称加密 | ChaCha20-Poly1305 |
| 哈希 | BLAKE2s |
| 密钥派生 | HKDF |
| MAC | Poly1305 |
选择理由:这些算法在现代硬件上性能优异,且常数时间实现容易,抗侧信道攻击。
工作流程
- 密钥生成:每个节点生成 Curve25519 公私钥对
- 配置交换:双方交换公钥和端点信息
- 握手:客户端发起 Noise Protocol Framework 握手(1-RTT,比 TLS 更快)
- 数据传输:握手完成后,数据通过 UDP 封装传输,每个数据包独立加密
- Roaming:通过 Cookie 机制实现 IP 切换时的无缝重连
配置模型
# 服务器端
[Interface]
PrivateKey = <server_private_key>
Address = 10.0.0.1/24
ListenPort = 51820
[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.0.0.2/32
# 客户端
[Interface]
PrivateKey = <client_private_key>
Address = 10.0.0.2/24
[Peer]
PublicKey = <server_public_key>
Endpoint = server.example.com:51820
AllowedIPs = 0.0.0.0/0 # 全部流量走隧道
AllowedIPs 是最核心的概念:
- 声明这个 peer 负责转发哪些目标 IP 的流量
- 也用作路由表条目
0.0.0.0/0= 所有流量走隧道(全局代理)10.0.0.0/24= 仅隧道内网流量
内核模块 vs 用户态
| 模式 | 实现 | 性能 |
|---|---|---|
| 内核模块 | Linux 内核原生支持(5.6+) | 最优,接近原生网络性能 |
| 用户态(wireguard-go) | Go 实现,用于 macOS/Windows/iOS/Android | 略低,但跨平台 |
与 OpenVPN / IPSec 对比
| 维度 | WireGuard | OpenVPN | IPSec |
|---|---|---|---|
| 代码量 | ~4000 行 | ~100,000 行 | ~400,000 行 |
| 协议层 | 内核层 | 用户态(TLS) | 内核层 |
| 加密协商 | 固定(无降级风险) | 可协商(可能降级) | 可协商 |
| 握手延迟 | 1-RTT | 多 RTT | 多 RTT |
| Roaming | 原生支持 | 需额外配置 | 不原生支持 |
| 配置复杂度 | 极简 | 中等 | 复杂 |
| 移动端体验 | 优秀 | 一般 | 一般 |
| 浏览器支持 | 无(需客户端) | 无(需客户端) | 部分(IPSec/L2TP) |
最小例子
一个最小场景:笔记本通过 WireGuard 访问家庭网络。
家庭服务器(公网 IP) 笔记本(外出)
eth0: 203.0.113.1 eth0: 动态 IP
wg0: 10.0.0.1/24 wg0: 10.0.0.2/24
配置完成后:
- 笔记本 ping
10.0.0.1通过 WireGuard 隧道到达服务器 - 配置
AllowedIPs = 192.168.1.0/24后可访问家庭内网 - 配置
AllowedIPs = 0.0.0.0/0后所有流量经服务器出站
实际部署场景
- 远程办公:员工通过 WireGuard 接入公司内网
- 家庭组网:多台家庭服务器/设备通过 WireGuard 互联(替代 ZeroTier)
- 旁路由/网关:路由器运行 WireGuard,全家设备透明翻墙
- 服务器间通信:K8s 节点间、数据库主从同步的加密通道
- IoT 安全接入:远程管理物联网设备
边界与常见误解
- 误解:WireGuard 是代理。 它是三层隧道协议,不是 HTTP/SOCKS 代理。它处理的是 IP 包,不是应用层流量。
- 误解:WireGuard 能替代 ZeroTier。 功能类似但设计目标不同。ZeroTier 自带 NAT 穿透和虚拟网络管理,WireGuard 需要手动配置或借助其他工具。
- 误解:WireGuard 配置了就有 DNS 泄漏防护。 需要额外配置 DNS 和防火墙规则来防止泄漏。
- 边界:WireGuard 不提供身份认证。 它只做加密隧道,不验证”谁在连接”。需要结合其他机制(如预共享密钥或应用层认证)。
- 边界:
AllowedIPs不是防火墙。 它控制的是本机发往 peer 的路由,不阻止 peer 发来的流量。