Skip to content

架构:控制面与数据面 ​

当前状态

M1 已经按这里的设计造出了主干,在 Linux 上能跑通。两层之间的边界具体怎么划见接口契约, 要防什么见威胁模型。

一句话概括 ​

理解 Meshora 的技术选型,只需要先接受一个事实:

WireGuard 本身不做节点发现、不做 NAT 穿透、不做中继、不做选路。 它只负责"两个已知 endpoint 之间的加密隧道"。

Meshora 要自研的控制面,恰好就是这些 WireGuard 不管的部分。

这决定了整个系统分成界限清晰的两层。

控制面负责发现、认证与穿透协调;数据面由 WireGuard 承载,优先直连,失败时经中继转发已加密报文。 控制面(自研)身份 · 发现 · 穿透协调 · 选路 · ACL控制信令控制信令Node A数据面 · boringtunwintun 虚拟网卡Node B数据面 · boringtunwintun 虚拟网卡P2P 直连(打洞成功)Relay转发密文打洞失败时回退
中继只转发已经加密的 WireGuard 报文,看不到明文 —— 它不是信任节点。

数据面:不重新发明加密 ​

数据面直接采用 WireGuard 协议,用 boringtun(Cloudflare 的 Rust 用户态实现)承载。

项目选择为什么
握手Noise_IKpsk2经过审计的成熟构造,1-RTT 建连,前向安全
加密ChaCha20-Poly1305无硬件加速时也快,适配移动端与路由器
实现boringtun(用户态)不需要内核模块,跨平台一致,权限要求低
虚拟网卡Windows 用 wintun稳定、签名完备、性能好;其他平台对应 utun / tun

自己不写密码学,这是一条硬规矩。数据面的安全性直接继承 WireGuard 的既有分析结论, 我们只负责把密钥和 endpoint 正确地喂给它。这条边界具体怎么划,见接口契约。

用户态实现还有个务实的好处:崩溃了就是一个进程退出,不会拖垮内核。

控制面:全部自研 ​

这是项目真正的工作量所在。控制面要回答 WireGuard 不回答的所有问题:

职责要做的事
身份公钥即身份。节点注册、密钥分发、吊销。
发现谁在这张网里,各自声明了什么能力,当前端点是什么。
端点探测类似 STUN 的机制,让节点知道自己在公网上长什么样。
穿透协调双方同时向对方的预测端点发包(UDP 打洞),需要一个第三方来对时。
中继打洞失败时转发报文。转发的是密文。
链路探测持续测量延迟、丢包、抖动、带宽。
选路根据探测结果决定走直连还是中继,以及走哪个中继。
ACL谁可以访问谁的什么能力。

为什么中继不需要被信任 ​

中继转发的是已经用 WireGuard 加密过的报文。它能看到的只有"某个密文从 A 来,要去 B"。

这意味着:

  • 中继读不到任何通信内容
  • 中继改不了内容 —— Poly1305 认证标签会让篡改在对端被丢弃
  • 你可以用别人的中继,也可以自己架

中继确实能看到元数据:谁在和谁通信、什么时候、流量多大。 这是所有中继方案的共同性质,文档里不回避这一点。在意的话就自建中继。 中继之外还要防什么,见威胁模型。

为什么用 Rust ​

核心引擎用 Rust 写成一个统一的 Core,桌面端、移动端、服务器、NAS、OpenWrt 共用同一份代码:

  • 内存安全:这是个直接处理不可信网络输入的程序,这类程序的历史漏洞绝大多数是内存问题
  • 无 GC:转发路径上不能有不可预测的停顿
  • 交叉编译成熟:一份 Core 出到各平台,不必为每个平台重写一遍协议栈
  • boringtun 就是 Rust:数据面和控制面同语言,不用跨 FFI 传密钥

平台策略 ​

text
                  Meshora Core (Rust)
                          │
    ┌──────────┬──────────┼──────────┬──────────┐
  Windows    macOS      Linux      移动端     OpenWrt
  wintun     utun        tun      VpnService     tun

客户端只做 Windows 和安卓 —— 1.0.0 只做局域网游戏联机,玩这类游戏的人绝大多数在 Windows 上, 手机上的联机游戏次之。安卓客户端和 Windows 的共用节点代码和界面,只有虚拟网卡换成了系统的 VpnService。

更长远看,Windows 上的分应用分流(Application Routing)也是最难的一块, 先在 Windows 上打好底子,能更早暴露设计问题。

下一步:自动网络:建连流水线 逐步拆解两个节点从互不相识到建立连接的全过程。

以 MIT 协议发布 · 首页背景由 Paper Shaders 驱动(Apache-2.0)