总览:VNT 是怎么组网的
专栏:VNT 2.0 组网源码 · 第 2 / 11 篇:::info 学习目标 完成本篇后你能够:解释虚拟组网与 VPN 的异同;画出 VNT 2.0 的模块分工图;说清三种设备模式(tun/tap/no)各自的用途。 前置:会基本的网络概念(IP、NAT)。预计时长:40 分钟。 :::
:::note 本章术语速查(新手建议先读)
- mesh 组网:设备两两互联(能直连就直连)而非都经过中心出口。
- 虚拟 IP:只在虚拟网内有效的地址(如 10.26.0.2),由服务端分配。
- 网关(GATEWAY):虚拟网里负责“帮别的设备转发到网外”的角色。
- Tauri:用 Rust 做桌面应用的框架(类似 Electron 但更轻)。
- JNI:Java 调用本地代码的桥梁,Android 上 Rust 代码靠它被调用。 :::
虚拟组网的原理:一个”骗过内核”的故事
你的电脑要访问 100 公里外另一台电脑的”内网 IP”(如 10.26.0.2),操作系统是拒绝的——这个网段不在任何物理网卡上。虚拟组网的做法分四步:
- 造一块假网卡(TUN):内核以为这是一块真网卡,把发往 10.26.0.2 的包交给它;
- 用户态接管:程序从 TUN 读出完整的 IP 包;
- 封装穿越公网:把 IP 包加密后通过 UDP/TCP 发到公网上的某个地方;
- 对端还原:对端程序收到后写进它自己的 TUN——对端内核以为包真的来自 10.26.0.2。
VNT 的全部核心代码,就是这四步的工程化:TUN 管理(第 4 篇)、包加密(第 5 篇)、NAT 打洞与中继(第 6 篇)、数据平面流水线(第 7 篇)。
角色分工:客户端、服务端、对端
- 服务端(vnts,独立项目):登记设备、分配虚拟 IP(如 10.26.0.2)、转发在线列表、中继密文——设置了组网密码时服务端无法解密任何内容;
- 客户端:本专栏主角。注册、创建 TUN、与对端打洞直连,打不洞时走中继;
- 对端:同一组网编号里的其他客户端,A 与 B 互为对端。
模块地图
三种设备模式
| 模式 | 行为 | 需要管理员权限 | 典型场景 |
|---|---|---|---|
tun(默认) | 创建虚拟网卡,完整参与组网 | 是 | 远程桌面、SSH、联机 |
tap | 二层以太网桥(带 MAC、支持 ARP/VLAN) | 是 | 需要广播/发现协议的老游戏 |
no | 不建网卡,只当”出口/入口”(端口映射、子网转发) | 否 | 家里当跳板访问公司内网 |
一眼记住的三个设计决定
- 密钥即密码:没有传统密钥协商——包加密密钥 = SHA256(组网密码),QUIC 证书由密码确定性生成。简单、离线可用、服务端零知识(第 5 篇详析取舍);
- 一切为了直连:打洞是持续后台任务(5 秒一轮、指数退避),中继只是兜底;P2P 邻居还能帮忙转发(三层中继);
- 核心与载体分离:
vnt-core一个 crate 服务四种载体——CLI 用 IPC 查询、Web 用 axum、桌面进程内直调、Android 走 JNI(第 10 篇)。
常见误解
- “VNT 就是 VPN”——目标相似,但 VNT 是 mesh 组网(设备互为对端、可直连),不是”客户端-出口”的代理模型;
- “服务端能看到我的流量”——设置组网密码后服务端只见过密文与元数据(源 MAC/IP);不设密码则明文(README 明确建议设密码);
- “必须公网服务器”——可用公共服务端体验,正式使用建议自建(也是源码阅读的进阶练习)。
本篇产出
- 按 README 组一次网(两台设备或一台设备 + 手机热点),ping 通对端虚拟 IP;
- 对照本篇模块地图,在源码里找到每个目录;
- 思考题:为什么虚拟 IP 段由服务端分配而不是客户端自选?(提示:冲突与路由)