NSIO Docs
NSIO Docs
首页
总体架构

NSN · 站点节点

NSN · 站点节点
NSN · 架构与功能设计
NSN · 演进路线与开发计划

NSC · 用户客户端

NSC · 用户客户端
NSC · 架构与功能设计
NSC · 演进路线与开发计划

NSD · 控制中心

NSD · 控制中心
NSD · 架构与功能设计
NSD · 演进路线与开发计划

NSGW · 数据网关

NSGW · 数据网关
NSGW · 架构与功能设计
NSGW · WireGuard Peer Relay 协议层
NSGW · 演进路线与开发计划

Last Updated: 2026/5/8 08:44:39

Previous PageNSGW · WireGuard Peer Relay 协议层

#NSGW · 演进路线与开发计划

本页融合 NSGW 的设计差距、演进目标与六大能力轴,作为路线规划输入。架构概念见 architecture.md。

#1. 不可放弃的差异点

NSGW 的演进必须保留以下设计原则:

  1. 协议无关的中继 —— WireGuard / WSS / HTTPS 三条数据通路在 NSGW 内由各自子系统承载,共享身份与配置同步,但不共享数据通路。
  2. 网关无状态化 —— NSGW 不维护用户业务态;水平扩展、滚动升级、跨区 failover 不必处理"会话迁移"这一最难子问题。
  3. 配置全部来自 SSE —— NSGW 的 peer 表、HTTPS 路由表、ACL 投影,都通过 SSE 单向接收,本地不维护"权威配置文件"。
  4. 两级信任的 ACL —— NSGW 偏宽 + NSN 偏严 = 安全;ACL 投影过期 / 断链 / 空策略选 fail-open 偏宽。
  5. 客户端选路 + 网关独立 —— "哪个用户走哪个网关"的决策在客户端侧,NSGW 之间互不感知。

#2. 开放差距 · 必修(P0/P1)

ID一句话修复方向
GW-P0-01MVP 数据面与生产数据面尚未融合:MVP 有 SSE 契约但无生产能力;早期生产参考有数据面能力但未消费 NSIO SSE路线 A:把 HTTP pull 配置模型换成 NSD /api/v1/config/stream SSE;保留 SNI proxy + WG kernel + PROXY v1;新增反代动态路由集成(消费 routing_config SSE)
GW-P1-01/admin/shutdown 无访问保护,任何能访问 9091 端口的都能停服绑定 127.0.0.1;或加 Bearer token;或编译时条件编译,生产镜像不包含
GW-P1-02反代后台启动,SIGTERM 时不接信号,连接被硬切supervisord / s6-overlay;或主进程退出前 kill -TERM 反代等其结束
GW-P1-03WSS Open target_ip 未校验,可绕过 NSN 的目标过滤,把 NSGW 当跳板扫描内网NSGW 侧对 target_ip 做 bogon / 内网过滤(除非 ACL projection 显式允许)
GW-P1-04WSS Open 帧无 source identity TLV(已决议加,NSGW 侧待实现)/client 握手后记录 {gateway_id=self, machine_id from JWT};handleClientFrame() 转发 Open 帧时追加 TLV;缺 TLV fail-closed
GW-P1-05NSGW 侧 MultiGatewayManager::health_interval 在 NSN 侧未驱动定时任务(NSN 侧改造,但 NSGW 需暴露稳定的 /healthz + 探活包容量预案)NSGW 暴露 /healthz + 控制探活包频率;避免 N×M 放大

#3. 六大能力轴 × MVP / GA / 企业级

NSGW 生产化能力组织成 6 条正交轴:

轴主问题MVPGA企业级
① 连接能力"如何让数据进入 NSGW"WG + WSS + UDP hole punch 对齐 + WG 不解密中继(Peer Relay)+ QUIC + STUN + PROXY v2 + mTLS + SO_REUSEPORT 多进程+ Noise + 内置 TURN + Gateway-to-Gateway Mesh
② 路由与寻址"如何选择目的 NSN / 出口"WG peer 同步 + HTTP 动态路由 + SNI / 基础 L4 端口映射 + GatewayEgress(指定目标 L4 转发)+ Anycast + GeoDNS + 跨网关热迁移 + path/header routing + A/B + 路由优先级与回落 + GatewayExit(exit node 模式,SNAT + conntrack)+ 流量工程 + Virtual Port + 多 PoP exit 选路
③ 安全能力"如何挡住恶意流量"基础限速 + UDP flood 防护+ IP 信誉 / CrowdSec + WAF 基础 + Resource 级认证 + Slow loris+ WAF CRS + 零信任策略点 + DDoS L7 challenge + L3-L7 多层
④ 容灾运维"失败时怎么收敛"健康端点 + 重连策略+ 热升级(drain + swap)+ 蓝绿 + 配置回滚+ 跨区 failover 自动化 + 会话状态快照 + 连接 handoff
⑤ 观测与审计"现在什么在跑"Prometheus /metrics + pprof token 保护+ OTel traces + 结构化访问日志 + WG 连接级日志 + 实时拓扑上报+ 采样率控制 + 审计落盘 + SIEM
⑥ 资源与计费"怎么管带宽 / 配额 / 出账"WSS 背压 + 连接数上限+ 每 org 配额 + 计费埋点(/billing/ingest)+ QoS 分类(prod/dev/bulk)+ tc / eBPF 整形 + 过载降级

#4. 阶段排期

#4.1 Phase 1 · MVP(对齐 SSE 契约 + 生产 WG)

目标:消费 NSIO SSE,具备生产 WG + 反代能力。

  • 把配置接入由 HTTP pull 改为消费 NSD /api/v1/config/stream SSE
  • wg_config SSE 事件 → 内核 WG peer 表 diff apply
  • routing_config SSE 事件 → 反代或 SNI proxy 动态路由
  • acl_projection SSE 事件 → 装载本地 AclEngine(projection)
  • /client ingress 校验 NSC JWT → 拿 machine_id
  • WSS Open frame 的 target_ip bogon / 内网过滤
  • /healthz + /server-pubkey + /admin/shutdown 加 token 保护
  • 反代支持 graceful shutdown
  • Prometheus /metrics 端点(WG handshakes / WSS streams / 反代 RPS)
  • PROXY Protocol v1 / MTU/MSS clamp
  • UDP hole-punch
  • WG 不解密中继(Peer Relay 模式) —— 参照 Tailscale Peer Relay:NSGW 不解密、不持有相关密钥,按 4-tuple / receiver_index 桥接 NSC ↔ NSN 端到端 WG 会话;兼容存量 WG 客户端;模式由 NSN/NSC 在 /machine/register 声明 supported_link_modes,NSD 策略层选定并下发 SSE gateway_wg_relay(无运行期申请 API)

MVP 验收:4 套 Docker E2E(WG / WSS / Noise / QUIC)切换到生产 NSGW 仍通过;acl_projection 早拒 ~99% 越权;target_ip 内网扫描尝试被预拒。

#4.2 Phase 2 · GA(中型企业销售门槛)

目标:多区 + 完整安全 + 完整观测 + 计费基础。

  • 连接:QUIC 数据面、内置 STUN、PROXY v2、mTLS 终结、SO_REUSEPORT 多进程
  • 路由:Anycast IP、GeoDNS、跨网关热迁移、路由优先级与回落、path / header routing
  • 安全:基础限速、UDP flood 防护、IP 信誉(CrowdSec)、WAF 基础、Resource 级认证、Slow loris 防护
  • 容灾:热升级 drain+swap、蓝绿部署、配置回滚
  • 观测:OTel traces、结构化访问日志、WG 连接级日志、实时拓扑上报
  • 资源:每 org 配额、计费埋点(POST /api/v1/billing/ingest)、WSS 背压、连接数上限

GA 验收:3 区 NSGW 联动 + GeoDNS 自动就近;1000 节点 p99 RTT < 50ms;DDoS 模拟 100k QPS 下不丢业务流量;Stripe 接入跑通。

#4.3 Phase 3 · 企业级

目标:大型企业 / 金融 / 政府;NSIO 差异化能力产品化。

  • 连接:Noise 数据面、内置 TURN、Gateway-to-Gateway Mesh
  • 路由:流量工程(按带宽 / 成本 / 延迟)、Virtual Port、A/B 测试路由
  • 安全:WAF CRS、零信任策略点、DDoS L7 challenge、L3-L7 多层防护
  • 容灾:跨区 failover 自动化、会话状态快照、连接 handoff、热升级 SLA 化
  • 观测:采样率控制、审计落盘 + SIEM 深度对接
  • 资源:QoS 分类、tc / eBPF 整形、过载降级(付费 tier 优先)

企业级验收:10 万节点 p99 RTT < 100ms;4 区跨大洲,单区失效 30s 内 failover;合规审计满足 SOC2 + GDPR。

#5. 路线决策:traefik 是早期选择,而非长期决策

随着 NSGW 职责扩展到 L4 端口映射与多 PoP 协同策略,traefik 的"南北向 HTTP 网关"定位与 NSGW 的"跨协议数据面中继"定位逐渐错位。两条演进路线被同时保留:

  • 路线 A(当前倾向):NSGW 自研轻量 Proxy + 外部入口层(Cloudflare / ALB / 前置 envoy),NSGW 收敛为纯数据面与早期策略点。
  • 路线 B(保留口径):NSGW 内集成 envoy + xDS,NSD 提供 SSE → xDS 适配,获得完整 L4/L7 与 mTLS / SPIFFE 生态。

抽象口径:把 SSE 事件结构(gateway_http_config / gateway_l4_map)抽象到下游消费者无关,使路线切换对客户端契约无感。

#6. NSD 契约新增(阻塞 NSGW 能力落地)

NSGW 许多能力需要 NSD 配套新增契约:

NSGW 能力依赖 NSD 契约状态
L4 端口映射 / 虚拟服务 / Exit Node(GatewayEgress + GatewayExit backend)SSE gateway_l4_map({listen_port?, proto, backend: NsnBacked{target_nsn, target_port} | GatewayEgress{target_host, target_port, transport} | GatewayExit{scope: default-route|cidr|acl-driven}, acl_ref, allow_cidr, deny_cidr, geo_rules, conn_limits, audit_sink})。GatewayEgress / GatewayExit 形态下没有 NSN,NSGW 直接 connect()(egress)或 SNAT 后转发(exit);两类条目走 NSGW 内的完整 ACL 引擎(fail-CLOSED),与 NsnBacked 只跑预拒不混淆;GatewayExit 还需要 NSC 切到 TUN 数据面;架构见总体架构 §6.5与 nsgw/architecture §2.8.1❌ 待设计
NSGW 作为服务声明者(对称 NSN services.toml)POST /api/v1/gateway/services_report(或扩展现有 gateway_report body 增 egress_services / exit_services 字段),源自 NSGW 本地 gateway_services.toml;NSD 把网关上报清单与 NSN 上报清单合并到统一服务目录,经策略裁剪后下发;gateway_services.toml 是该网关 ACL 终决的兜底底线(与 NSN services.toml floor 同语义);架构见 nsgw/architecture §2.8.2❌ 待设计
WG 不解密中继(Peer Relay)register body 增字段 supported_link_modes(NSN/NSC 注册时声明);SSE gateway_wg_relay({relay_pairs: [{nsc_pubkey, nsn_pubkey, addressing: "receiver_index"|"port", listen_port?}]})由 NSD 策略层选定后下发,不引入运行期申请 API❌ 待设计
默认模式按 NSGW 运营方分层gateway/report body 增字段 operator: "self-hosted" | "managed" | "partner";NSD 据此为每条 (NSC, NSN) 边设默认优先级——self-hosted 默认 terminate、managed / partner 默认 relay;客户在 NSD 上 preferred_mode = "terminate" 才在 managed NSGW 上启用见明文形态(审计可见的 opt-in)。架构见总体架构 §6.4.1❌ 待设计
L7 中间件链(含无 NSC 公网入口的边界身份认证)SSE gateway_http_config(OIDC / mTLS / API key / 签名 URL / Basic Auth / 限速 / WAF / 请求改写);独立流量承载形态的主体识别落点,见 架构 §2.4.1❌ 待设计
mTLS 终结NSD 下发 CA bundle(SSE ca_bundle_update)❌ 待设计
零信任策略点POST /api/v1/authz(NSGW → NSD 查询)❌ 待设计
每 org 配额NSD 下发配额配置(SSE quota_update)❌ 待设计
计费埋点POST /api/v1/billing/ingest(NSGW → NSD)❌ 待设计
跨网关热迁移NSD 协调 session 转移 + SSE gateway_drain 预告❌ 待设计
拓扑上报POST /api/v1/gateway/topology(NSGW → NSD,活跃 peer / session)❌ 待设计
策略版本号SSE policy_version(NSD → NSGW + NSN)❌ 待设计

#7. 跨团队协调点

某些 NSN/NSC 改造必须协调 NSGW 端:

来源协议变更NSGW 配套
NSN/NSC 多 TCP WSS(吞吐 + HOL)frame v2 多通道协商识别多 TCP session 并存,缝合逻辑兼容
NSC WSS path Bearer token 注入NSC /client 握手携带 tokenNSGW /client 握手校验 token 传递
会话 ID 重用预测会话 ID 改随机NSGW 侧生成 session ID 对齐
relay_tcp READ_BUF 与 NSGW MTU/MSS与 NSGW MTU/MSS 对齐保留 ensureMSSClamping;暴露 MTU 配置一致性约定
流量重定向 NAT 五元组NSGW 切换时 ConntrackTable 同步迁移协议(企业级)

#8. 风险与回滚预案

风险应对
把 HTTP pull 配置改 SSE 时影响线上部署双写一段时间(同时支持 pull + SSE),逐步切换
traefik 替换为自研 SNI proxy 时证书 / Host 路由出错保留 traefik 作为 fallback,grace 切流
WSS frame v2 协商失败自动回退 v1;协议版本协商日志可见
ACL projection SSE 断连fail-open(避免"NSGW 挂 → 全站拒")+ alert
gateway_l4_map 误下发导致端口冲突启动期 port collision 检测 + 拒绝接管

#9. 不在路线图内

  • 把 NSGW 重写为 Rust —— Go 生态足够覆盖网关数据面需求,无需求驱动。
  • NSGW 主动心跳到 NSD —— 被动模型简化故障域,主动模型不带来新能力。
  • NSGW 维护应用层会话 —— 与"网关无状态化"原则冲突,会破坏水平扩展模型。
  • NSGW 自身做权威 ACL 决策(NsnBacked 路径) —— 与 NSN 终决冲突;NsnBacked 路径上的请求 NSGW 仍然只跑预拒(偏宽,fail-open),NSN 终决。
    • 例外:GatewayEgress / GatewayExit 形态(§6 / 架构 §2.8.1)不存在 NSN 兜底,这两条路径上 NSGW 必须做完整 ACL 终决(fail-CLOSED),gateway_services.toml 本地清单是兜底底线;路径在 NSGW 内部由 backend 类型显式区分,信任模型不互相回潮。
  • NSGW 自带"管理面 UI" —— 服务声明权对称化是为了"网关声明能力 + NSD 合成",不是让 NSGW 也有管理员入口;管理面仍只在 NSD。