架构:控制面与数据面
一句话概括
理解 Meshora 的技术选型,只需要先接受一个事实:
WireGuard 本身不做节点发现、不做 NAT 穿透、不做中继、不做选路。 它只负责"两个已知 endpoint 之间的加密隧道"。
Meshora 要自研的控制面,恰好就是这些 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 传密钥
平台策略
Meshora Core (Rust)
│
┌──────────┬──────────┼──────────┬──────────┐
Windows macOS Linux 移动端 OpenWrt
wintun utun tun VpnService tun客户端只做 Windows 和安卓 —— 1.0.0 只做局域网游戏联机,玩这类游戏的人绝大多数在 Windows 上, 手机上的联机游戏次之。安卓客户端和 Windows 的共用节点代码和界面,只有虚拟网卡换成了系统的 VpnService。
更长远看,Windows 上的分应用分流(Application Routing)也是最难的一块, 先在 Windows 上打好底子,能更早暴露设计问题。
下一步:自动网络:建连流水线 逐步拆解两个节点从互不相识到建立连接的全过程。