本页融合 NSGW 的设计差距、演进目标与六大能力轴,作为路线规划输入。架构概念见 architecture.md。
NSGW 的演进必须保留以下设计原则:
| ID | 一句话 | 修复方向 |
|---|---|---|
| GW-P0-01 | MVP 数据面与生产数据面尚未融合: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-03 | WSS Open target_ip 未校验,可绕过 NSN 的目标过滤,把 NSGW 当跳板扫描内网 | NSGW 侧对 target_ip 做 bogon / 内网过滤(除非 ACL projection 显式允许) |
| GW-P1-04 | WSS Open 帧无 source identity TLV(已决议加,NSGW 侧待实现) | /client 握手后记录 {gateway_id=self, machine_id from JWT};handleClientFrame() 转发 Open 帧时追加 TLV;缺 TLV fail-closed |
| GW-P1-05 | NSGW 侧 MultiGatewayManager::health_interval 在 NSN 侧未驱动定时任务(NSN 侧改造,但 NSGW 需暴露稳定的 /healthz + 探活包容量预案) | NSGW 暴露 /healthz + 控制探活包频率;避免 N×M 放大 |
NSGW 生产化能力组织成 6 条正交轴:
| 轴 | 主问题 | MVP | GA | 企业级 |
|---|---|---|---|---|
| ① 连接能力 | "如何让数据进入 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 整形 + 过载降级 |
目标:消费 NSIO SSE,具备生产 WG + 反代能力。
/api/v1/config/stream SSEwg_config SSE 事件 → 内核 WG peer 表 diff applyrouting_config SSE 事件 → 反代或 SNI proxy 动态路由acl_projection SSE 事件 → 装载本地 AclEngine(projection)/client ingress 校验 NSC JWT → 拿 machine_idtarget_ip bogon / 内网过滤/healthz + /server-pubkey + /admin/shutdown 加 token 保护/metrics 端点(WG handshakes / WSS streams / 反代 RPS)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 内网扫描尝试被预拒。
目标:多区 + 完整安全 + 完整观测 + 计费基础。
POST /api/v1/billing/ingest)、WSS 背压、连接数上限GA 验收:3 区 NSGW 联动 + GeoDNS 自动就近;1000 节点 p99 RTT < 50ms;DDoS 模拟 100k QPS 下不丢业务流量;Stripe 接入跑通。
目标:大型企业 / 金融 / 政府;NSIO 差异化能力产品化。
企业级验收:10 万节点 p99 RTT < 100ms;4 区跨大洲,单区失效 30s 内 failover;合规审计满足 SOC2 + GDPR。
随着 NSGW 职责扩展到 L4 端口映射与多 PoP 协同策略,traefik 的"南北向 HTTP 网关"定位与 NSGW 的"跨协议数据面中继"定位逐渐错位。两条演进路线被同时保留:
抽象口径:把 SSE 事件结构(gateway_http_config / gateway_l4_map)抽象到下游消费者无关,使路线切换对客户端契约无感。
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) | ❌ 待设计 |
某些 NSN/NSC 改造必须协调 NSGW 端:
| 来源 | 协议变更 | NSGW 配套 |
|---|---|---|
| NSN/NSC 多 TCP WSS(吞吐 + HOL) | frame v2 多通道协商 | 识别多 TCP session 并存,缝合逻辑兼容 |
| NSC WSS path Bearer token 注入 | NSC /client 握手携带 token | NSGW /client 握手校验 token 传递 |
| 会话 ID 重用预测 | 会话 ID 改随机 | NSGW 侧生成 session ID 对齐 |
relay_tcp READ_BUF 与 NSGW MTU/MSS | 与 NSGW MTU/MSS 对齐 | 保留 ensureMSSClamping;暴露 MTU 配置一致性约定 |
| 流量重定向 NAT 五元组 | NSGW 切换时 ConntrackTable 同步 | 迁移协议(企业级) |
| 风险 | 应对 |
|---|---|
| 把 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 检测 + 拒绝接管 |
NsnBacked 路径) —— 与 NSN 终决冲突;NsnBacked 路径上的请求 NSGW 仍然只跑预拒(偏宽,fail-open),NSN 终决。
GatewayEgress / GatewayExit 形态(§6 / 架构 §2.8.1)不存在 NSN 兜底,这两条路径上 NSGW 必须做完整 ACL 终决(fail-CLOSED),gateway_services.toml 本地清单是兜底底线;路径在 NSGW 内部由 backend 类型显式区分,信任模型不互相回潮。