VNT 2.0 源码拆解:学习路径与模块地图

专栏:VNT 2.0 组网源码 · 第 1 / 11 篇
VNT组网Rust源码学习

VNT 是一个用 Rust 写的开源虚拟组网工具:几台天各一方的设备,只要填同一个组网编号和服务端地址,就能像在同一个局域网里互相访问——远程桌面、联机游戏、访问 NAS 都靠它。2.0 版本整体重构(与 1.0 不兼容):单核 vnt-core + 四种载体(CLI/Web/桌面/Android)、三种服务端协议(TLS-TCP/QUIC/WSS)、QUIC 增强通道、多服务端容灾。

为什么值得读这份源码:它在一个中等体量的仓库里(vnt-core 约 3 万行)装下了网络编程的几乎全部核心命题——虚拟网卡、包加密、NAT 打洞、可靠传输、前向纠错。读懂它,WireGuard/Tailscale 类产品的设计你也能一眼看懂。

学习路径:跟着一个 IP 包走

图表(vnt-learning-path.md)

目录

#篇章核心问题
2总览:VNT 是怎么组网的虚拟局域网的原理是什么?模块怎么分工?
3一次组网的完整生命周期从 vnt2_cli -k 123456 到 ping 通对端,经历了什么?
4TUN 虚拟网卡:IP 包的进出口操作系统怎么把包交给用户态程序?TUN/TAP/无网卡三种模式差在哪?
5包加密:ChaCha20-Poly1305 与确定性证书服务端只转发密文是怎么做到的?没有密钥协商怎么防中间人?
6NAT 打洞:STUN、双端协作与三层中继两台内网设备如何直连?打不洞时靠什么兜底?
7数据平面:一个 IP 包的完整旅程压缩、FEC 前向纠错、路由选择怎么串起来?
8QUIC 增强通道:可靠传输与端口映射用户态 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-Poly1305VNT 的包加密算法:快、移动端友好、防篡改
虚拟 IP只在虚拟网内有效的地址(如 10.26.0.2),由服务端分配
Rust本项目的语言:性能与 C 相当但内存安全;专栏遇到语法会随时解释

学习方法

  1. 装一个玩起来:源码阅读前先按 README 组一次网(公共服务端 101.35.230.139:6660),ping 通对端——所有源码理解都锚定在”我跑通过”上;
  2. 跟着 IP 包走:目录顺序就是一个包从 TUN 出发到对端 TUN 的旅程,每篇放大其中一段;
  3. 对照第 3 篇的生命周期时序图:迷路时回到那张图定位自己。

版本锚点:v2 分支 376689a(vnt-core 2.0.3,2026-08-25)。VNT 迭代快,以设计思想为锚,接口细节以源码为准。

← 返回文章列表