土法炼钢兴趣小组的算法知识备份

WireGuard 深度系列:从设计哲学到内核实现

文章导航

分类入口
networksecurity
标签入口
#wireguard#vpn#noise-protocol#cryptokey-routing#curve25519#chacha20-poly1305#kernel#ndss

目录

IPSec/IKEv2 把密钥协商、变换层与策略库拆成多层;OpenVPN 把整套 TLS 状态机放进用户态。WireGuard 的回答是另一条路:故意打破「正确分层」,用一张 cryptokey routing 表、一套固定密码学原语、一个约数千行的内核虚拟网卡,把「认证加密隧道」做成看起来无状态的 wg0

本系列按哲学 → 协议 → 代码 → 使用 → 深度争论组织。已有单篇 WireGuard 内部实现VPN 工程对比 会被交叉引用,而不是重复粘贴。

系列状态:正文 5 篇 + 索引(2026-07-19)。 源码锚定 Linux 6.6 LTS drivers/net/wireguard/;工具实测 wireguard-tools v1.0.20260223、内核 6.6.87.2-microsoft-standard-WSL2

适合谁看

这个领域最值得关注的 5 个问题

1. WireGuard「简单」到底拒绝了什么?代价是什么?

回答在:01(哲学)、05(深度)

NDSS 2017 论文明确承认:IPSec 的分层在学术上更「正确」,WireGuard 从 layering violation 出发,再用工程与密码学手段补洞。简单不是少写功能,而是系统性拒绝证书体系、cipher suite negotiation、SPD/SAD 分离。

2. Noise IKpsk2 如何在 1.5 RTT 内同时完成认证、前向保密与身份隐藏?

回答在:02(协议)、已有 内部实现文

四次 Curve25519 DH(es/ss/ee/se)各贡献不同属性;响应方必须等发起方第一条 transport 才能安全发数据——这是协议安全边界,不是实现疏忽。

3. 内核里路由、加密、保序如何拆到多核又不乱序?

回答在:03(代码)、已有内部实现文

发送路径用 AllowedIPs trie 选 peer;加解密进 parallel worker;per-peer 串行保证 UDP 外层可乱序、内层会话有序。

4. 生产里 AllowedIPs、路由表、NAT、漫游哪个最容易配错?

回答在:04(运维)

cryptokey routing 与宿主机 FIB 是两套表。能握手但 ping 不通、能解密但回不了包,几乎都落在这两张表与 endpoint 学习不同步。

5. 「无算法协商」在后量子与形式化证明面前站不站得住?

回答在:05(深度)

Dowling & Paterson(ACNS 2018)指出:第一条 transport 作为 key confirmation,使标准 session-key indistinguishability 证明难以模块化;PSK 是量子威胁的权宜之计,不是 PQ 终局。

篇目依赖关系与推荐阅读路径

flowchart TD
  A["01 Design Philosophy"] --> B["02 Protocol: Noise IKpsk2"]
  B --> C["03 Kernel Code Path"]
  A --> D["04 Ops Practice"]
  B --> D
  C --> E["05 Deep Tradeoffs"]
  B --> E
  D --> E
  X["network/89 Internals"] -.-> C
  Y["network/75 VPN Compare"] -.-> A

只想理解「为什么是 WireGuard」→ 3 篇

01 → 02 → 05(可选补读 VPN 对比

要落地部署与排障 → 3 篇

01 → 04 → VPN 对比 选型节

要读内核源码 → 3 篇

02 → 03 → 内部实现

完整路线 → 全部 5 篇 + 两篇网络工程交叉文

01 → 02 → 03 → 04 → 05,并对照 75 / 89

目录

第一部分:立场与协议

  1. 系列索引(本文)
  2. 设计哲学:故意的分层破坏与密码学观点
    • 看点:NDSS 2017 对 IPSec「正确分层」的批评、cryptokey routing 作为安全隧道基本原理、OpenSSH 式带外密钥分发、「沉默是美德」、无算法协商的显式立场。
  3. 协议原理:Noise IKpsk2、四次 DH 与 Cookie
    • 看点:官方 protocol 页与论文对齐的握手消息布局、1.5 RTT key confirmation、MAC1/MAC2 cookie 相对 DTLS/IKEv2 的改进、定时器与 rekey 常量。

第二部分:实现与使用

  1. 内核代码路径:从 wg_xmit 到加解密 worker
    • 看点:Linux 6.6 源码行号、AllowedIPs trie、messages.h 常量、netlink 配置面、与第 89 篇的分工。
  2. 使用与运维:netns 实测、AllowedIPs 与故障模式
    • 看点:本机 netns 双端 ping 实测、wg/wg-quick 工作流、漫游与 keepalive、MTU、不适用场景。

第三部分:争论与边界

  1. 深度探讨:形式化证明、密码敏捷性与后量子
    • 看点:Dowling–Paterson 证明障碍与 Donenfeld 回应、netdev 上的 agility 争论、PSK 的威胁模型、与 ZTNA/零信任数据面的关系、开放问题。

每篇一句话价值

价值点
01 讲清 WireGuard 不是「简化版 IPSec」,而是另一套安全隧道公理。
02 把 IKpsk2 四次 DH 与 1.5 RTT 钉到可核对的消息字段。
03 用 Linux 6.6 路径把协议映射到具体函数与队列。
04 用真实 netns 实验把配置错误变成可复现现象。
05 把「简单」放进证明、敏捷性与量子威胁的争议里检验。

与已有文章的关系

参考主来源(系列共用)

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-20 · network

【网络工程】WireGuard 内部实现:Cryptokey Routing、Noise IK 握手与内核数据路径

WireGuard 用不到 4000 行内核代码替代了 IPSec/IKE 数十万行的协议栈——这不是少写功能,而是用固定密码学原语、固定握手模式和 cryptokey routing 这三个设计决定,换掉了证书体系、协商机和 SPD/SAD 分离。本文钻进源码和协议握手过程,逐层拆解 cryptokey routing 的双向执行、Noise IKpsk2 的 1.5 RTT 握手(含四次 ECDH 的安全属性贡献)、内核多核队列架构、timer 状态机、cookie DoS 防御和三密钥对轮换。


By .