本页融合 NSN 的设计差距、改造主题与生产化扩展方向,作为路线规划的输入。架构概念见 architecture.md。
NSN 的演进必须保留以下差异化语义,否则失去产品定位:
resource_id 合并去重。userspace 模式不需要 root,使 NSN 可跑在容器、笔记本、CI runner、移动沙箱等多形态宿主上。WgConfig 故意不含 private_key 字段。下面是仍然开放的改造项,已剔除近期已修复的 P0(ACL fail-closed、conntrack TTL/cap、spawn_supervised 等)。
| ID | 现状 | 目标 |
|---|---|---|
| A.1 ACL 合并语义 | 多 NSD 合并已具备 sentinel 区分(空 ≠ 失败) | + 显式 policy_version 字段;rollback / 灰度 |
| A.2 启动期 ACL 等待 | 等待初始 ACL 加载完成后再开 WSS | + 配置项 startup.acl_required = true 默认 true |
| A.3 出站 ACL | 当前仅入站维度,出站方向未实现 | + 出站策略求值(NSC 对称项,NSN 对应远端 NSN 方向) |
| A.4 ACL 模拟与回放 | 未实现 | + /api/acl/simulate?subject=X&target=Y + 历史日志重放 |
| A.5 跨配置一致性校验 | services.toml 与 AclConfig 各自独立校验 | + 启动后做交叉校验(services 引用的 wg 隧道在 WgConfig 中存在等) |
| ID | 现状 | 目标 |
|---|---|---|
B.1 to_http_base() 改写 | 仍把 noise:// / quic:// 写为 http://(明文) | + 改 https:// + reqwest TLS 校验 + auth.allow_plaintext_for_legacy 过渡开关 |
| B.2 控制面 HTTP API 收敛 | register/auth/heartbeat 4 个 API 仍走 to_http_base,绕过 Noise / QUIC transport | + 全部封装进 ControlTransport,加密信封统一 |
| B.3 challenge-response | authenticate 签名仅含本地时间戳,无 server nonce → 重放窗口 | + NSD 增加 /api/v1/machine/auth/challenge,签名嵌入 nsd_url + server nonce |
| B.4 私钥保护 | machinekey.json 明文 hex JSON 落盘 | + AEAD(chacha20poly1305)包裹,密钥来自 NSN_KEY_ENC_KEY 或 OS keyring |
| B.5 token 脱敏 | Bearer token 多处 format!() 拼接,可能进日志 | + secrecy::SecretString 包裹,tracing field 强制脱敏 |
| B.6 WSS Open frame 范围 | 缺地址范围限制,有 SSRF 跳板风险 | + 限制目标地址在白名单段内 |
| B.7 WSS Open frame 身份 | 缺 source identity 字段 | + 新增 source TLV,NSGW 填入 NSC 身份 |
| B.8 QUIC 公钥治理 | 信任完全基于 SHA-256 fingerprint pinning,无法轮换吊销 | + Machine PKI 路径(F1.1) |
| ID | 现状 | 目标 |
|---|---|---|
| C.1 业务 instrument 普及 | OTel pipeline 已注册并启用,关键路径已埋部分指标 | + 端到端覆盖:WSS Open / ACL is_allowed / ServiceRouter::resolve / SSE dispatch / wg encrypt-decrypt 全部 histogram |
| C.2 mpsc 占用率 | 缺 nsn_channel_pending / nsn_channel_dropped_total | + 封装 MeteredSender<T>,所有 mpsc 用它包裹 |
| C.3 tracing span | 缺 root span / 无 trace_id / 无跨调用上下文传播 | + 入口 task 创建 root span,绑定 gateway_id / connection_id / frame_seq |
| C.4 SLI/SLO 文档 | 未定义 | + 4 个核心 SLI(可用性 / p50 / p99 / 错误率)文档化 |
| C.5 NAT miss 可见 | 反向查找 miss 静默丢包 | + nsn_nat_miss_total counter + sample log |
| C.6 ACL deny 计数 | deny 事件仅 VecDeque,/api/metrics 不暴露 | + nsn_acl_denials_total{reason} + nsn_acl_allows_total |
| C.7 日志滚动 | tracing file appender 按日滚动,无大小上限 / 无压缩 / 无清理 | + 改按大小+保留窗口滚动 |
C.8 /api/metrics 拼写 | 部分指标走手写字符串拼接 | + 全部改为 OTel instrument |
| ID | 现状 | 目标 |
|---|---|---|
| D.1 NSGW 健康探活 | NSGW connector 已有基础探活路径 | + 主动验证探活报告进入 metric;Failed gateway 进入指数退避重连 |
| D.2 WSS upgrade 切换 | UDP 升级时 abort 中断所有 WSS 流 | + 先 draining,完成 in-flight 后再切 |
| D.3 单 TCP HOL | 单 WSS TCP 是吞吐天花板 + 所有流共享 | + N 路 TCP(N=cpus 或可配),streams 哈希分散 |
| D.4 relay idle timeout | 中继路径慢响应缺统一 idle timeout | + idle timeout(默认 5 min) |
D.5 proxy_done 容量 | 当前 1,WSS proxy 异常退出后不重连 | + 调到 4,异常退出触发 connector 重建 |
| D.6 conntrack 进阶 | TTL/cap 已实现 | + 跨进程持久化 / 慢路径热点采样 |
| ID | 现状 | 目标 |
|---|---|---|
| F.1 connector 选路与 tunnel-ws 强耦合 | 选路策略假设单条 TCP socket | + 选路抽象与单 TCP 解耦,扩多 TCP 不需协议改造 |
| ID | 现状 | 目标 |
|---|---|---|
| G.1 ACL 热路径 | 每帧 Open 走读写锁 | + ArcSwap snapshot,无锁读 |
| G.2 WSS data 帧零拷贝 | 中继路径多次 Vec 拷贝 | + bytes::Bytes 引用计数零拷贝 |
| G.3 services hostname DNS 缓存 | 严格模式每次 WSS Open 都 DNS resolve | + TTL 30s cache |
| G.4 monitor JSON 缓存 | 状态端点高频序列化无 cache | + 写后 invalidate 的 string cache |
| G.5 选路时间复杂度 | 多网关管理器选路 O(N) | + 维持 sorted set,O(log N) |
| G.6 用户态 WG 多核加解密 | 单线程加解密 | + per-CPU pinned worker |
| G.7 read buffer | TCP relay 读缓冲固定较小 | + 调大或与 NSGW MTU 协商 |
| 项目 | 改动 | 时机 |
|---|---|---|
services_ack 写入 AppState | /api/services 增加三态字段 | 顺手做 |
心跳 local_ips 动态采集 | 网卡 IP 变化运行期感知 | 顺手做 |
| audit 事件流 | 独立审计模块,统一 SecurityEvent 类型 + syslog / file sink | 与 B 主题一起 |
每个 Phase 的准入条件统一为:
目标:闭合 B 主题。NSN 改动:
to_http_base 用法,保留作为 legacy 配置项secrecy::SecretString 包裹SecurityEvent 与 syslog sink前置依赖:NSD 端 auth/challenge API、frame v2 schema 评审。
目标:闭合 C 主题。NSN 改动:
/api/metrics 手写字符串拼接全部改为 OTel instrumentMeteredSender<T> 包裹所有 mpsc准入:/api/metrics 不再含字符串拼接;NSC 暴露 /metrics 至少 8 个 metric。
目标:闭合 D 主题。NSN 改动:
proxy_done 容量提升前置依赖:Phase 2 metric 框架(D.3 需要 benchmark)。
准入:杀掉一条 NSGW TCP 后 30 秒内重连成功率 > 99%;双 TCP 比单 TCP throughput 提升 ≥ 30%。
目标:闭合 F + G。NSN 改动:
准入:子模块各自有 unit test;性能 metric 有 before / after 对比。
目标:闭合 A.1 / A.3 / A.4 / A.5。前置依赖:NSD 端 policy_version、模拟接口。
NSN 形态扩展:
跨形态共同改造:连接级 trace 串联、per-service 时延 / 吞吐 / 错误率直方图、ACL 版本号与一键回滚、设备态势上报对接条件策略、BYO-CA(machinekey 改 X.509 证书,NSN 验证链)。
| 能力 | NSN 改造 | 落地级别 |
|---|---|---|
| D1 · P2P 直连(NAT 穿透) | 上报 NAT 类型 / 端口探测;打洞成功后绕开 NSGW 直连 | GA / 企业级 |
| D2 · 多路径(MPTCP / WG+WSS 并行) | MultiGatewayManager 扩展为并行选路;packet scheduler 支持 redundant / min-rtt | GA / 企业级 |
| D3 · BBR / CUBIC 拥塞控制可选 | WSS 模式下 per-socket setsockopt 切 CC | GA |
| D4 · FEC 前向纠错 | WsFrame 新增 Fec { group_id, k, n } 类型;丢包敏感应用受益 | 企业级 |
| D5 · Edge NSN | 无头部署(provisioning key 自动注册);edge 缓存 / 简单策略本地执行 | 企业级 |
| D6 · 移动 / IoT 优化 | 动态 keepalive;会话 ID 持久化断点续连;低功耗 push notification | GA / 企业级 |
| D7 · 跨云统一控制面 + 数据面 | NSN 跑在各云 VPC 内;GeoDNS 选最近 NSGW;Private Link 对接 | 企业级 |
| D8 · 私有 DNS / 企业 AD 集成 | NSN 侧需处理 .corp → 内部 IP 解析 | GA |
| D9 · BYO-CA(客户自带 CA) | machinekey 改为 X.509 证书;NSN 验证链 | 企业级 |
| D10 · 硬件加速 | AES-NI(已有);可选 SmartNIC / DPU offload;eBPF 路由 | 企业级 |
NSD 生产化新增的契约,NSN 端需配合:
| 新契约 | 方向 | NSN 角色 | 支撑能力 |
|---|---|---|---|
POST /api/v1/machine/posture | NSN → NSD | 上报设备状态(OS / 磁盘加密 / 2FA) | 条件策略 |
SSE policy_version | NSD → NSN | NSN 用版本号判断是否需要重载 ACL | ACL 版本化 + rollback |
SSE gateway_drain | NSD → NSN | 通知"网关 X 即将下线",提前迁移流量 | 网关热升级 |
SSE ca_bundle_update | NSD → NSN | 证书包热更新 | Machine PKI |
POST /api/v1/events | NSN → NSD | 通用事件上报(连接 / 错误 / 安全事件) | 事件总线 |
| 高风险改造 | 风险 | 回滚预案 |
|---|---|---|
| 单一 ACL Arc | 并发竞态难调试 | feature flag acl.use_arcswap = false 保留旧路径 |
| fail-closed | 启动时延变长,旧部署可能告警 | 配置 acl_required = false 临时关闭 |
| 强制 https | NSD 端未开 https → register 失败 | auth.allow_plaintext_for_legacy = true 过渡期 |
| 密钥加密 | 升级时旧明文密钥被误删 | 永远 read 兼容 + write 加密;旧明文文件备份保留 |
| 多 TCP WSS | NSGW 不识别 → 所有 WSS 失败 | frame v2 协商失败回退 v1 |
| 启动装配模块化 | 大重构容易引入回归 | 每次 PR < 200 行;失败立刻 revert |
| 事项 | 理由 |
|---|---|
| IPv6 全栈支持 | 单独 milestone(>= 15 人日);先把 v4 体系打稳 |
| 控制面 GraphQL/gRPC 升级 | 没有需求驱动 |
| WG 协议升级(改 WG2 / Boring) | gotatun 已可用,性能改造优先级低于 D / G |
| 完整 chaos engineering 框架 | 投入产出比低 |
| 把 ACL 改为 OPA / Cedar | 表达力够用,引入新依赖维护成本高 |
某些改造必须协调 NSD / NSGW 端,需要在 spec 评审与发布节奏上同步:
| 改造 | NSN 改动 | NSD / NSGW 配套 | 协调点 |
|---|---|---|---|
| 强制 https | reqwest scheme | NSD 必须开 8443/https | 部署文档同步发布 |
| 加密通道承载 HTTP API | ControlTransport 扩展 | NSD 实现 transport 适配器 | 跨团队 spec 评审 |
| challenge-response | 增加 challenge POST | NSD /api/v1/machine/auth/challenge | API 版本协商 |
| 多 TCP WSS | 多通道 frame 协议 | NSGW 识别多通道协商 | WS frame v2 spec |
| frame source identity | 新增 source 字段 | NSGW 填入 NSC 身份 | frame schema bump |
| ACL sentinel | merge 算法 | NSD 标记"empty 是真实意图"vs"空因失败" | API 行为约定 |