Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

常见问题

一句话说,Subnetra 是什么?

一款纯 Zig、零依赖的三层 UDP 隧道,产出小于 512 KB 的单个静态二进制,以星型叠加网连接站点 与设备,并对每条链路全加密。

它是 VPN 吗?和 WireGuard 有何不同?

它是三层加密叠加网,所以解决与 WireGuard 类似的问题。差异是刻意的权衡:

  • 无握手。 Subnetra 无状态、无握手;每包 epoch 加静态配置取代了会话协商。没有 Noise 握手、没有 rekey 定时器、没有漫游握手。
  • 单个静态二进制、无内核模块、无第三方库——它完全在用户态、在 TUN 设备上运行,并交叉编译 到低至 armv5 的 musl 目标。
  • 天生星型(Hub-and-Spoke),带二进制内 CIDR 策略引擎做站点间路由与 Hub 中继,热更新无需 重启。

它不试图做 WireGuard 的即插即用替代品;它面向固定的、运维管理的部署,其中极小可审计的二进制 与静态拓扑是首要诉求。

和 n2n 有何不同?

两者都构建加密叠加网,但设计几乎相反:

  • 星型,非 P2P。 n2n 的招牌是 supernode 协助的 NAT 打洞,让 edge 之间直连。Subnetra 是严格 星型,并 刻意不做 P2P / 打洞——每个 Spoke 到 Spoke 的包都经 Hub 中继,换取单一可预测路径 (一项非目标)。
  • 三层,非二层。 n2n 是以太(TAP)叠加网,带广播、ARP 与任意协议。Subnetra 只按 CIDR 路由 IPv4——没有广播域。
  • 无握手、单一固定加密。 n2n 有注册协议、按 community 可选 cipher。Subnetra 无注册往返,只有 一种强制 AEAD(ChaCha20-Poly1305),且每链路一把唯一密钥。
  • 静态,非发现。 n2n 经 supernode 动态发现对端。Subnetra 用静态数字 endpoint,守护进程内无 发现、无 DNS。

要即插即用的 P2P 与 L2 局域网语义,选 n2n;要极小、可审计、拓扑确定的单路径隧道,选 Subnetra。

为什么无握手?那不安全吗?

不。每个包都用每链路密钥经 ChaCha20-Poly1305 加密并认证。重放被 64-bit 单调 nonce 与滑动窗口 过滤器阻止,且每次重启的 会话 epoch 被混入密钥派生,使旧的捕获无法跨重启重放。「无握手」 意味着没有 协商 往返——不是说包未经认证。见 安全模型

它会隐藏自己是隧道吗?算「隐身」吗?

部分如此。混淆是 无状态、尽力而为 的:一个格式错误或未认证的数据报被静默丢弃、无任何 错误回复,因此监听者不会向盲扫描者暴露自己。Subnetra 声称击败成熟的 DPI 对手,并对此 诚实——见 设计原则 → 无状态混淆

全 mesh 的 obfuscate 开关默认开启:它掩盖 20 字节报头、使数据报对被动观察者看起来像随机字节, 并把保活节奏去周期化(它隐藏指纹,而非包长或时序)。设 obfuscate: false 可改发可读的明文报头 (例如抓包调试),此时被动观察者即可对协议做指纹识别。见 线协议 → 报头混淆

支持哪些平台?

  • Linux 是生产目标:x86_64aarch64armv7(硬浮点)、armv5(软浮点),全部静态 musl。Hub 通常跑在 Linux 上。
  • macOS 经原生 utun 设备作为受支持的 Spoke / 开发 平台(最小动态,仅链接 libSystem)。 它不是生产 Hub 目标。

它有多大 / 多快?

Linux 发布二进制是单个静态 musl 可执行文件,小于 512 KB。数据面单线程、无锁,且热路径 严格零分配,所以内存使用有界且可预测。要在自己硬件上得吞吐基线,运行 test/integration/bench.sh

我该用什么 MTU?

固定线开销是 64 字节(20 字节报头 + 16 字节 tag + 28 字节外层 IPv4/UDP)。因此安全隧道 MTU 为 path_mtu − 64——例如 1500 字节承载上为 1452。据此设置 local_tun_mtu,并用 subnetrad --print-network-plan --path-mtu <n> 计算并预览主机规划。见 主机网络规划

Subnetra 会替我配置主机网络吗?

不会——按设计它 只打印 规划;绝不改动主机路由或防火墙状态。subnetrad --print-network-plan 输出确切的 ip/route 命令,让你(或你的配置管理工具)有意识、可审计地应用。守护进程确实会 创建并管理它自己的 TUN 设备。

PSK 如何工作?两条链路能共用一把密钥吗?

每条 链路(每个对端对、每个方向)使用自己的 64 位十六进制预共享密钥。密钥必须 每链路 唯一——绝不要跨对端复用 PSK。用 zig build tool:keygen 生成。方向密钥从 PSK 派生,因此 A→B 与 B→A 两个方向使用不同密钥。

如何路由 Spoke 背后的真实 LAN(站点间)?

remote_routes/local_routes 中设置 LAN 前缀,并添加把目的前缀转发到正确网格 id 的策略 规则。Hub 在 Spoke 之间中继。见 配置 → 角色policy add 示例。

如何在 RouterOS / MikroTik 上运行?

通过 RouterOS 容器 特性(设备上的静态二进制容器)。见 运维 → RouterOS

Hub 是动态 IP——怎么办?

endpoint 刻意是数字的(守护进程内无 DNS)。在运维侧解决:在 Spoke 上跑一个小型 DDNS 监视器, 重写 Hub endpoint 并重载。Spoke 的 NAT 保活让路径保持打开。见 安全模型 → NAT 保活

有内置的故障切换 / 多路径吗?

没有。数据面刻意单路径;故障切换是 外部 决策(VRRP / 健康检查 DNS / 编排)。这让守护进程 保持小而可预测。见 部署 → 高可用路线图

v2(kcp_arq / fec_xor)何时到来?

那些是 预留接口点,仅为设计,在维护者批准设计 RFC 之前返回 error.NotImplemented。v1 只 交付 raw_direct。见 路线图

为什么用 Zig,为什么零依赖?

为了得到一个极小、静态链接、可审计的二进制,具备可预测内存且无供应链——整个数据面就是标准库 加裸系统调用。设计原则(「八条铁律」)完整解释了缘由。

权威规格在哪里?

规范的线上契约是 docs/PROTOCOL.md; 产品需求是 docs/subnetra-develop.md。 本站点对它们做摘要与运维化;若它们与本站点冲突,以它们为准