VNT 2.0 源码拆解:学习路径与模块地图
专栏:VNT 2.0 组网源码 · 第 1 / 11 篇VNT 是一个用 Rust 写的开源虚拟组网工具:几台天各一方的设备,只要填同一个组网编号和服务端地址,就能像在同一个局域网里互相访问——远程桌面、联机游戏、访问 NAS 都靠它。2.0 版本整体重构(与 1.0 不兼容):单核 vnt-core + 四种载体(CLI/Web/桌面/Android)、三种服务端协议(TLS-TCP/QUIC/WSS)、QUIC 增强通道、多服务端容灾。
为什么值得读这份源码:它在一个中等体量的仓库里(vnt-core 约 3 万行)装下了网络编程的几乎全部核心命题——虚拟网卡、包加密、NAT 打洞、可靠传输、前向纠错。读懂它,WireGuard/Tailscale 类产品的设计你也能一眼看懂。
学习路径:跟着一个 IP 包走
目录
| # | 篇章 | 核心问题 |
|---|---|---|
| 2 | 总览:VNT 是怎么组网的 | 虚拟局域网的原理是什么?模块怎么分工? |
| 3 | 一次组网的完整生命周期 | 从 vnt2_cli -k 123456 到 ping 通对端,经历了什么? |
| 4 | TUN 虚拟网卡:IP 包的进出口 | 操作系统怎么把包交给用户态程序?TUN/TAP/无网卡三种模式差在哪? |
| 5 | 包加密:ChaCha20-Poly1305 与确定性证书 | 服务端只转发密文是怎么做到的?没有密钥协商怎么防中间人? |
| 6 | NAT 打洞:STUN、双端协作与三层中继 | 两台内网设备如何直连?打不洞时靠什么兜底? |
| 7 | 数据平面:一个 IP 包的完整旅程 | 压缩、FEC 前向纠错、路由选择怎么串起来? |
| 8 | QUIC 增强通道:可靠传输与端口映射 | 用户态 IP 栈怎么把 TCP 流搬进 QUIC? |
| 9 | 服务端协议与多服务端容灾 | 注册协议长什么样?多台服务端怎么协调分配 IP? |
| 10 | 多端形态:CLI/IPC/Web/桌面/Android | 一个核心怎么长出五种载体?IPC 与进程内直调各有什么取舍? |
| 11 | 实战:构建、调参与组网排障 | 参数怎么选?组网不通怎么排查? |
源码地图
vnt/
├─ src/ # 三个二进制入口:main_cli / main_web / main_ctrl + 参数配置
├─ vnt-core/ # ★ 网络核心(本专栏主角,约 3 万行)
│ ├─ core/ # NetworkManager:create_network → register → start_device
│ ├─ tun/ # TUN/TAP 虚拟网卡(tun-rs 异步)
│ ├─ crypto/ # ChaCha20-Poly1305 包加密
│ ├─ tls/ # 确定性 Ed25519 证书 + 指纹验证
│ ├─ tunnel_core/ # 数据平面:outbound/p2p(打洞·路由)/server(注册·中继)
│ ├─ enhanced_tunnel/ # QUIC 增强通道(rtx)+ 端口映射 + 用户态 IP 栈
│ ├─ fec/ # Reed-Solomon 前向纠错
│ ├─ compression/ # LZ4 压缩
│ ├─ nat/ # 子网路由 + 内置 NAT
│ ├─ protocol/ # 16 字节包头 + protobuf 协议
│ └─ context/ # 全局状态 AppState
├─ vnt-ipc/ # cli↔ctrl 的本地 IPC(TCP+protobuf)
├─ vnt-web/ # axum 管理面 + Vue3 前端
├─ vnt-desktop/ # Tauri 桌面端(复用 vnt-web)
└─ vnt-jni/ # Java/Android JNI 绑定
新手术语表(全专栏通用)
| 术语 | 大白话解释 |
|---|---|
| TUN / TAP | 内核提供的虚拟网卡:TUN 收发 IP 包(三层),TAP 收发以太网帧(二层) |
| NAT | 家用路由器把内网连接“翻译”成公网连接的机制——也是两台内网设备无法直连的原因 |
| 打洞 | 让两台 NAT 后的设备同时向对方发包,在各自 NAT 上凿出“直连的洞” |
| STUN | 公网服务,告诉你“你被 NAT 映射成了哪个公网地址” |
| 中继 | 直连失败时由第三方服务器转发流量 |
| QUIC | 跑在 UDP 上的新一代传输协议:自带加密、可靠、抗丢包 |
| FEC | 前向纠错:附带“数学纠错包”,丢包不用重传直接还原 |
| ChaCha20-Poly1305 | VNT 的包加密算法:快、移动端友好、防篡改 |
| 虚拟 IP | 只在虚拟网内有效的地址(如 10.26.0.2),由服务端分配 |
| Rust | 本项目的语言:性能与 C 相当但内存安全;专栏遇到语法会随时解释 |
学习方法
- 装一个玩起来:源码阅读前先按 README 组一次网(公共服务端
101.35.230.139:6660),ping 通对端——所有源码理解都锚定在”我跑通过”上; - 跟着 IP 包走:目录顺序就是一个包从 TUN 出发到对端 TUN 的旅程,每篇放大其中一段;
- 对照第 3 篇的生命周期时序图:迷路时回到那张图定位自己。
版本锚点:v2 分支 376689a(vnt-core 2.0.3,2026-08-25)。VNT 迭代快,以设计思想为锚,接口细节以源码为准。