WireGuard

WireGuard 是一种现代 VPN / 隧道协议与实现路线,强调更小的协议面、更快的握手和更简单的密钥配置。

#type / concept #status / growing #tech / network #resource / wireguard #protocol / wireguard

[!info] related notes

WireGuard

一句话定义

WireGuard 是一种现代 VPN 协议和实现,以极简的代码量(约 4000 行内核代码)和精选的加密原语,在内核层实现高性能、低延迟的点对点加密隧道。

核心机制 / 工作原理

设计哲学

  • 简单:协议代码量仅约 4000 行(对比 OpenVPN 约 10 万行),攻击面小,易于审计
  • 高效:作为内核模块运行,避免用户态/内核态切换开销
  • 安全:不协商加密算法(避免降级攻击),固定使用最安全的密码学套件

加密套件

WireGuard 固定使用以下原语,不支持协商:

用途算法
密钥交换Curve25519(ECDH)
对称加密ChaCha20-Poly1305
哈希BLAKE2s
密钥派生HKDF
MACPoly1305

选择理由:这些算法在现代硬件上性能优异,且常数时间实现容易,抗侧信道攻击。

工作流程

  1. 密钥生成:每个节点生成 Curve25519 公私钥对
  2. 配置交换:双方交换公钥和端点信息
  3. 握手:客户端发起 Noise Protocol Framework 握手(1-RTT,比 TLS 更快)
  4. 数据传输:握手完成后,数据通过 UDP 封装传输,每个数据包独立加密
  5. 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 对比

维度WireGuardOpenVPNIPSec
代码量~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 发来的流量。
创建于 2026/5/13 更新于 2026/5/27