状态:产品与系统架构基线。本文只定义 NSIO Next 的目标形态,不表示所有能力已经实现。
用户从登录到每项能力成功、失败和撤销的完整流程见产品闭环与功能实现规格;每个产品对象、组件责任、交互状态和端到端预演以产品能力目录与实现闭环为检查总账。注册的两台状态机、数据结构、API、错误码和配额事务以注册、准入与配额协议为权威。
NSIO Next 是一个以统一节点网络为基础、以命名服务和企业网关为增值层的零信任连接平台:
它不是“把 NSC 和 NSN 拼成一个二进制”,也不是“用 L3 替换 L4”。目标是一个统一客户端、两个互补的数据平面和一个统一的策略系统。
NSIO Next 不是旧 NSIO 的升级版本或兼容运行时,而是一套从零开始的产品与协议:
ns 与旧 NSD 的交叉连接;v1 开始,各协议面以后按自身版本独立演进;| 目标用户 | 第一次成功体验 | 持续价值 |
|---|---|---|
| 个人 | 两台设备登录后可直接通过名称互访 | 远程桌面、NAS、开发机、家庭服务和互联网出口 |
| 小团队 | 邀请成员后按模板安全协作 | 节点、服务、共享环境和基础审计 |
| 企业 | SSO/MDM 接入后按组获得最小权限 | 服务目录、应用连接、固定出口、合规、私有部署 |
| 运维与开发 | 用 Enrollment Key 无人值守接入服务器 | 服务发布、子网路由、自动化与 API |
ns daemon。桌面 user-owned 模式同一时刻只允许一个 OS principal,切换用户前撤销系统级网络投影;无头/MDM 节点使用独立 managed-device 模式。具体 IPC、接管、卸载与真机门遵守发行生命周期。| 现有能力 | Next 中的归属 | 处理方式 |
|---|---|---|
| NSC/NSN Ed25519 + X25519 身份 | Device / Node Membership | 保留密钥思想,拆分设备身份与网络成员身份 |
| Connector 传输与节点会话实现 | 统一 Node 的传输基础 | 仅复用满足 Next Node/Capability 契约的实现,不读取旧 MachineKind 数据 |
| NSC/NSN 的运行能力实现 | Node Capability 模块的工程参考 | 重新接入 Next 的声明、审批和运行证据,不继承 machine_type 产品角色 |
| WireGuard、WSS、P2P candidates | L3/L4 公共传输层 | 复用并统一选路、健康检查和中继回退 |
| NSC TUN | L3 基础数据面 | 提升为统一节点的默认桌面/移动数据面 |
本地 services.toml 格式思想 | Service Publisher 本地声明 | Next 定义新的本地 Service Manifest schema,并提供 App/CLI/API 管理入口 |
| User / Group / Realm 的领域经验 | Identity / Group / Network | Next 使用新表和新 ID,不读取旧数据库资产 |
| allow-only ACL | Unified Grant v1 | 保留默认拒绝和 allow-only 原则;使用 Next 原生规范化模型 |
| 服务域名、协议、端口和 VIP 经验 | L4 Service Plane | Next 由 NSD 原生集中分配 Service ID、VIP 和名称 |
| Gateway Egress / Exit / Public Ingress | NSGW Premium Edge | 作为企业增值能力保留并统一授权 |
| 审计、Posture、Plan/Entitlement | 企业治理层 | 直接复用并扩展到 L3 节点和路由 |
Next 不建立同时承担设备、网络成员、运行进程和产品角色的 Machine 聚合对象,而是从第一版拆开:
这样同一台笔记本可以既访问另一台机器的 L3 地址,又发布本机开发服务;一台服务器可以同时是节点、服务发布者和子网路由器,而不需要换二进制。
| 组件 | 定位 | 承载业务流量 | 是否必需 |
|---|---|---|---|
ns | 统一节点运行时:TUN、加密、直连/中继、服务发布、子网路由 | 是 | 是 |
| NS App | 桌面/移动交互:登录、连接、设备、服务、出口和诊断 | 否 | 人类设备需要 |
| NSD | 身份、组织、网络、密钥公钥、策略、DNS、路由、审计和配置分发 | 否 | 是,可云托管或私有部署 |
| Relay Plane | 免费托管或社区自建的最小密文中继,只在直连失败时承载端到端密文 | 是 | 条件必需:困难 NAT/UDP 封锁时需要 |
| NSGW | 专属/区域中继、公网入口、应用连接、固定出口、互联网出口、区域 PoP | 是 | 基础 L3 不要求购买;增值能力需要 |
| 管理控制台 | 组织、用户组、设备、节点、服务、策略、审计和计费 | 否 | 企业管理需要 |
ns 的模块形态ns 是一个运行时,不再按访问端/发布端分成 NSC 和 NSN。它由能力模块组成:
| 能力 | 默认状态 | 作用 |
|---|---|---|
endpoint | 开启 | 获得 Node IP,访问被授权的节点和服务 |
service_host | 按声明开启 | 发布本机或本机可达的 TCP/UDP/HTTP/HTTPS 服务 |
subnet_router | 显式开启并审批 | 发布一个或多个 CIDR,让其他节点访问传统网段 |
app_connector | 显式开启并审批 | 按域名把特定 SaaS/企业应用流量送到连接器 |
exit_provider | 显式开启并审批 | 允许该节点作为自托管互联网出口 |
relay_candidate | 默认关闭 | 允许节点承担受控中继;云产品通常由 NSGW 提供 |
能力是集合,不是互斥角色。一台节点可以同时拥有 endpoint + service_host + subnet_router。
NSGW 具有公网监听、多租户、NAT、证书、WAF、固定公网 IP 和高可用等高权限职责,安全边界与员工终端完全不同。把它合进 ns 会扩大终端攻击面,也会让“基础节点能力”和“运营级边缘基础设施”无法独立升级。
基础 Relay Plane 可以复用 NSGW 的密文中继实现或使用受限的社区 Relay 部署,但它只有 relay capability,不自动获得租户 Service 目录、Ingress、Egress、Exit、证书终结或管理权限。商业 NSGW 销售的是区域质量、容量、SLA、专属隔离和边缘增值能力,不是“能否联网”的开关。
因此只合并 NSC/NSN,不合并 NSGW。
| 对象 | 归属 | 定义 | 关键说明 |
|---|---|---|---|
| Organization | 平台 | 账单、合同、管理员和合规边界 | Next 原生租户边界;个人 UI 可称“我的空间”而隐藏内部术语 |
| Network | Organization | L3 地址、DNS、成员和策略的信任边界 | UI 使用“网络”,每个 Network 只有一个逻辑控制权威 |
| User | Organization | 人类身份 | 来自本地账号、OIDC/SSO 或受邀外部身份 |
| Group | Organization | 用户集合 | 可从 IdP/SCIM 同步,也可手动维护,再分配到一个或多个 Network |
| Network Principal Membership | Network | User/Group 对该 Network 的成员关系与管理角色 | 决定谁能看见和管理该 Network,不等于数据面访问授权 |
| Device | Organization | 一台真实 OS 安装及其长期设备身份 | 归属用户或服务主体,保存姿态,不直接持有 Network 地址 |
| Node Membership | Network + Device | Device 在某个 Network 中的一次成员关系 | 持有 Network 专属密钥、Node IP、名称、状态和标签 |
| Machine Principal | Organization | 服务账号、Workload Identity 和自动化主体的统一权威身份 | 凭据可以是静态、联邦或 attested,但不能伪装成人类用户 |
| External Principal | Organization/Share | 外部协作者或 Edge 访客的最小身份 | 只在明确 Binding 或 Edge 会话中生效,不自动获得 Network Membership |
| Node Capability | Node Membership | 节点可申请的运行能力 | 替代 client/connector 产品角色;实际启用还需 CapabilityActivation |
| CapabilityActivation | Node Membership + capability | 一次具体能力的批准、配额占用和租约权威 | 自动批准也必须经过同一事务、审计和计量 |
| Site | Network | 地理位置、机房、VPC 或办公点的组织标签 | 用于分组、路由和展示,不是身份边界 |
| Service | Network | 稳定的 L4/L7 逻辑资源 | 拥有名称、VIP、协议和 ACL,可有多个后端 |
| Service Endpoint | Service + Node | 某节点实际承载的后端 | 来自节点本地声明和健康上报 |
| Route | Network | 节点发布的 CIDR 或默认路由 | 必须经审批和 Grant 授权后才能使用 |
| ExitProfile | Network + Gateway | 可被授权和选择的出口范围 | 使用权限由 AccessGrant 决定,健康和选择另行表达 |
| PublicApplication | Organization/Network | 外部访问某个 Service 的公开 host/path | 由 EdgeAuthPolicy 管理,不是内部 AccessGrant 资源 |
| Gateway | Organization | 一个 NSGW 实例或 PoP | 通过 Gateway Assignment 获得被显式分配的 Network 与能力 |
| AccessGrant | Network | 主体对 Node、Service、Route、ExitProfile 的 allow-only 运行时授权 | 只管内部数据面访问,不管发布、Edge 登录或管理 RBAC |
| CapabilityPolicy | Organization/Network | 哪个 MachinePrincipal/节点可以申请哪些能力和最大范围 | 只定义申请资格;不能替代逐实例 CapabilityActivation |
| EdgeAuthPolicy | PublicApplication | 访客如何认证及能否访问请求 | 支持 OIDC、API Key、Service Credential、Signed URL、mTLS 和显式 Anonymous |
| AdminRoleBinding | Organization/Network | 管理主体对控制面资源的管理动作 | 与 AccessGrant 完全分离 |
| Enrollment Key | Network | 无人值守设备首次加入凭据 | 仅用于注册,不能代替节点长期私钥 |
一台电脑是一个 Device,但可以有多个 Network Membership:例如个人网络、公司网络和客户项目网络。每个 Membership 都有不同的 Node IP、Node Key、策略和生命周期。
首期产品交互突出一个主 Network,降低普通用户理解成本。同一账号可属于多个 Organization/Network,但运行时只激活一个控制 Profile;切换时重新投影地址、DNS、路由和 Exit。
权威 principal 分为三类:User、MachinePrincipal 和 ExternalPrincipal。Group、批准的 Tag 与 self 是选择器或集合,不是新的身份类型;NodeMembership 是编译后的运行时身份。Device 只作为来源设备、所有权、管理状态与 posture 条件,不能直接作为 AccessGrant subject。
节点所有者有三种:
服务主体不能伪装成人类用户。服务账号与 Workload Identity 都建模为 MachinePrincipal,凭据类型决定认证方式;服务节点用标签、MachinePrincipal 和 Enrollment Key 管理,管理员离职不会让生产服务器失去归属。
Organization 中有 1,000 个员工,不代表 1,000 人都自动进入每个 Network。关系分成两层:
Group 本身是 Organization 级身份集合,因此 developers 可以同时被分配到开发网络和共享工具网络;不同 Network 对同一个 Group 使用不同 Grants。创建 Group 本身不授予任何 Network 或资源访问权。
外部协作者优先使用资源分享,而不是把其加入整个 Organization:
现有运营后台或管理仓库中的 application 表示平台运营/管理入口时,不得直接复用为本章的受保护业务 Application。Next 中对员工开放的应用必须以权威 Service 为底座,二者在命名、ID 和存储上分离,避免 M2 组织模型落地时发生概念碰撞。
跨组织分享不是把两个目录合并,也不是让一方 NSD读取另一方完整策略。首版使用双边确认的 Share:
ShareOffer,绑定具体 Node 或 Service、允许动作、目标 Organization、到期时间和不可枚举的随机 share_id;ShareBinding,只把本地明确的 User/Group/Device 绑定到该分享,并对本地身份、设备姿态和离职状态负责;resource Grant ∩ ShareOffer ∩ ShareBinding ∩ posture ∩ validity 全部成立才签发短期访问租约,任何一方不能单方面扩大另一方的边界;首版优先支持“分享一个 Service 给外部用户/组”。跨组织 Node 分享和 Network-to-Network 路由会扩大 L3 信任面,放在独立阶段,不由 Service 分享隐式开启。
人类身份、登录入口、账号绑定、会话、MFA、撤销和部署差异以身份、登录与会话实现基线为权威;本节只保留架构关系和首次加入摘要。
答案是:人类设备默认必须登录;无人值守节点不要求交互登录。
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| Windows/macOS/Linux 桌面 | 系统浏览器 + Authorization Code + PKCE | 用户可在网页选择邮箱密码、Google、GitHub 或企业 OIDC;App 不接触密码 |
| iOS/Android | 系统认证会话 + PKCE | 符合移动端安全模型,不使用内嵌 WebView |
| 无头人类设备 | Device Code | 只作为没有本地浏览器时的回退,必须显示设备指纹与校验短语 |
| 企业 MDM 设备 | MDM Attestation + SSO | Device 归组织,用户登录后才创建数据 Membership |
| Linux 服务器/容器 | Enrollment Key | 无浏览器、可自动化、可预绑定标签 |
| CI 临时 Runner | Workload Attestation 或短期 Enrollment Key | 任务结束自动删除成员关系 |
| 路由器/嵌入式 | 一次性 Enrollment Key 或管理员批准码 | 资源受限且通常无人值守 |
Auth Key 改名为 Enrollment Key(注册密钥),明确它只用于首次加入。用户设备不要求管理员手工生成 key 再复制粘贴。
邮箱不是登录的统一前置条件。只有邮箱密码和被用户主动选择的企业 SSO 发现流程需要邮箱;Google、GitHub 直接进入各自流程。Passkey 主登录后续以 Connector 增加。登录成功仍只证明用户身份,不直接创建 Device、Membership 或数据面 Grant。
| 密钥/令牌 | 保存位置 | 生命周期 | 用途 |
|---|---|---|---|
| Staging Device Key | 设备安全存储 | 单次 Request;commit 后晋升 | 绑定可恢复注册请求,跨 Organization 不复用 |
| Device Key | 设备安全存储 | 按 Organization 长期,可撤销 | 标识该 Organization 中的 Device |
| Node Key | 设备安全存储 | 按 Network、可轮换 | 证明 Network Membership |
| WireGuard Key | 设备安全存储 | 可轮换 | 数据面加密 |
| User Session | App/系统安全存储 | 短期 | 调用 NSD 用户 API |
| Enrollment Key | NSD 仅存哈希,客户端短暂持有 | 一次/限次/到期 | 无人值守首次注册 |
任何私钥都不进入 NSD 配置下发。管理员能撤销 Device 或 Membership,但不能导出其私钥。
用户不需要先进入网页创建 Network ID,也不需要复制节点 ID。控制台适合管理,不是完成第一次连接的前置条件。
管理员先创建带约束的 Enrollment Key:所属 Network、允许标签、能力上限、是否预批准、有效期和使用次数。服务器执行:
节点不能通过 key 自行增加未被 key 允许的标签或能力。
Enrollment Key 只完成一次注册,不能作为永久远程管理凭据。若注册策略允许受管配置,节点在本地派生并保存一份带 Organization/Network、管理签名方、能力范围、revision 和撤销状态的 ManagedConfigAuthorization;后续 desired manifest 必须同时满足该本地授权与当前 Network 策略。节点所有者可本地撤销该授权,撤销后新的受管变更回落为待确认请求并产生审计,不能继续静默写入本地 Service/Route manifest。
上述注册方式共享同一个 Enrollment Request/Grant 状态机。证明材料不同不允许产生另一条更宽松的提交路径,完整规则见注册、准入与配额协议。
客户端需要知道“去哪个 NSD 登录”,但不要求用户手工输入长 URL:
ns://join/<code>、企业下载包、MDM 配置或邮箱域名发现 NSD;--control-server,适合自动化和测试;Next 首版一个 ns 运行实例只激活一个控制 Profile。一个 Organization 可以包含多个 Network,账号也可以属于多个 Organization,但用户切换主 Network/Profile 时必须先完成路由、DNS、Exit 和未完成操作检查。多独立 NSD 同时激活不属于首版协议、交互或验收范围。
登录页不按地区分叉,也不要求所有人先输入邮箱。云托管首版提供邮箱密码、Google、GitHub 和企业 OIDC;私有部署只展示客户实际配置的方式。未来 Passkey、微信、企业微信、飞书、钉钉等只作为 Identity Authority Connector 增加,不能产生新的 User、Device 或 Grant 类型。
| 地址 | 示例 | 对用户可见 | 含义 |
|---|---|---|---|
| Node IP | 100.80.12.34 | 是 | 节点在 Network 中的稳定 L3 身份地址 |
| Service VIP | 100.112.8.9 | 通常由 DNS 隐藏 | 一个逻辑 Service 的稳定地址,可指向多个节点后端 |
| 物理 Endpoint | 203.0.113.8:51820 | 否 | WireGuard 打洞或中继使用的公网/局域网端点 |
Next 对外只展示稳定 Node IP 和 Service VIP;TUN 内部栈地址、传输地址和物理 Endpoint 不进入普通产品 UI,也不得被当作节点身份。
一个节点只有一个节点名,但可以发布多个服务:
| 类型 | 示例 | 解析到 |
|---|---|---|
| 节点短名 | dev-mac | 当前 Network 的 Node IP |
| 节点 FQDN | dev-mac.dev.acme.node.ns.io | Node IP |
| 服务短名 | git | 当前 Network 的 Service VIP |
| 服务 FQDN | git.dev.acme.svc.ns.io | Service VIP |
| 自定义域名 | git.acme.com | 按策略由 split DNS 或代理命中 Service |
因此“一台机器里有五个服务”时,仍然只有一个 Node IP/节点域名,但有五个 Service 名称和五个独立授权资源。
短名称不是可以猜测的解析规则:Node 与 Service 同名时,该短名记录必须 withheld,DNS 不得随机解析到任一对象;UI 同时显示“节点/服务”类型及各自 FQDN,CLI 必须使用完整 FQDN。多个 Profile/Network 提供同一短名时使用相同的 fail-closed 规则。完整交互见产品闭环 §3.2。
100.64.0.0/10 划成互不重叠的用途池,例如 Node IP 使用 100.64.0.0/11,Service VIP 使用 100.96.0.0/11;具体边界由协议常量固定并纳入契约测试,不能由各 NSD 随意解释;/48,Node 分配稳定 /128;Service VIP 集中化是 服务名 → 稳定 Service VIP 在多设备间一致的前提。地址池规划必须按 Node 与 Service 的峰值、保留期和不可立即复用窗口分别计算。
首发规模基线为单 Network 10,000 个 active Node Membership、5,000 个 Service 和 50,000 条 active authored GrantRule;schema、分页、投影分块和地址模型不得在达到 100,000 Node、50,000 Service、500,000 GrantRule 的设计上限前要求破坏性重构。设计上限不是已验证能力或 SLA,完整对象/时延目标与当前验证状态见产品能力目录 §19.5。
单 Network 预计超过 20,000 个 active Node + Service,或 IPv4 地址块计入隔离/保留后达到 75% 时,控制面必须阻止无计划扩容并要求 IPv6-first、追加 IPv4 块或客户自定义池的显式容量方案;没有容量方案不能形成销售承诺或 API 成功结果。
NS App 默认安装按域 DNS:
*.node.ns.io 返回 Node IP;*.svc.ns.io 和显式批准的自定义 Service 域名返回 Service VIP;连接后,用户可以直接:
这类访问面向“节点”,目标程序监听在哪个端口由目标机器自己决定。它适合个人、小团队、远程桌面、SSH、文件共享和开发环境。
启用 L3 时,Windows、macOS、iOS 和 Android 默认使用系统 TUN/VPN API:把 Node IP 配到虚拟接口,并把被授权的 Node/Route 前缀安装到该接口。Linux 桌面可同样使用 TUN;服务器可选择内核 WireGuard 接口以降低开销,但必须消费同一份 netmap/grants/routes 并执行相同策略,不能形成“内核模式默认放宽”的旁路。
TUN 是 L3 的默认数据面,不是整个产品唯一数据面:Next 可以为明确支持的平台提供本地 Proxy 服务访问模式;同时启用 L3 与 L4 时,Service VIP 进入同一 TUN,但仍按 Service Grant 而不是 Node Grant 授权。
NSD 不转发业务包。NSGW 作为中继时只看连接元数据和密文包,不拥有会话明文密钥。
L3 不代表“加入网络就全部互通”。方便性来自策略模板,不来自取消授权。
| 模板 | 默认行为 |
|---|---|
| 个人网络 | 同一 User 自己的节点互通;分享给他人的节点仅按分享授权 |
| 小团队 | 组内开发设备互通,服务器按标签和端口开放 |
| 企业 | 默认拒绝;员工通常只能访问已授权服务和少量运维节点 |
| 临时协作 | 到期后自动失效,仅访问指定节点/服务 |
NSD 不应把整个 Network 的节点、地址和公钥都发给每台设备。它根据 Grant 计算可见 peer map:
Node 可以发布传统网段,例如 10.20.0.0/16,但必须经历:节点声明 → 管理员批准 → Route 资源创建 → Grant 授权 → 客户端安装路由。
地址重叠时不做随机选择:相同 Network 内按 route domain、优先级和健康状态确定;无法唯一决定则拒绝安装并给出明确冲突。
L3 解决“连接到哪台机器”,L4 Service 解决“访问哪个业务能力”。服务平面提供 L3 无法自然表达的能力:
ns 校验后向 NSD 上报 Service Endpoint;首版不自动扫描并公开本机端口。可提供“检测到可发布服务”建议,但必须由用户确认。
不冲突,因为入口和授权资源不同:
| 访问方式 | 目标 | 授权对象 | 暴露范围 |
|---|---|---|---|
ssh dev-pc | Node IP:22 | Node / port | 目标节点的 SSH 端口 |
ssh git-service | Service VIP:22 | Service | 只暴露该逻辑服务 |
https://git.acme.com | Service/custom domain | Service | 只暴露该应用 |
企业可完全禁止员工间 L3 横向访问,只开放 L4 服务目录;个人网络则可主要使用 L3,只有需要稳定名称或共享时才发布 Service。
Next 不使用一张“万能 ACL”同时管理内部流量、节点能力、公网访客和控制台管理员。四个策略平面共享规范化选择器、条件、版本、审计和稳定错误,但拥有各自资源、动作和执行器:
| 策略平面 | 回答的问题 | 权威执行器 |
|---|---|---|
| AccessGrant | 谁从什么设备访问哪个 Node、Service、Route 或 ExitProfile | AccessCompiler → ns/publisher/Connector/NSGW 双端投影 |
| CapabilityPolicy | 哪个节点可申请什么能力、最大范围和是否可自动批准 | CapabilityCompiler → CapabilityActivation 事务 |
| EdgeAuthPolicy | 外部访客如何认证、能否访问某个 PublicApplication 请求 | EdgePolicyEvaluator → NSGW Ingress |
| AdminRoleBinding | 谁能管理哪些租户对象、执行哪些控制面动作 | AdminAuthorizer 在线判定 |
Entitlement 只决定某项商业能力或额度能否准入,不授予访问权限。ServiceEndpoint、Connector、Relay、Gateway 是承载者;ShareOffer、ShareBinding、Lease 是委托和租约对象,都不得伪装成普通 AccessGrant 目标。
继续使用 allow-only 是为了让多层策略合并保持可预测。需要表达“某组不能访问”时,应缩小 allow 范围,而不是叠加顺序敏感的 deny。数组只属于 API/UI 的批量创作体验;持久化和编译层使用规范化的单主体、单资源 GrantRule,这样每次允许都能准确归因到一条规则。Device 限制写入 source condition,例如 user:clark + device:corp-mac + managed:true,不能写成 subject=device:corp-mac。
能访问节点不代表能编辑节点;能使用出口不代表能配置 NSGW。AdminRoleBinding 至少支持 Organization Owner、Billing Admin、Network Admin、Security Admin、Service Publisher、Edge Admin、Auditor 和 Member,并把动作细分为成员、设备、Network、策略、Service、Route、Gateway、PublicApplication、审计、账单等资源的 read/create/update/approve/revoke/export,而不是一个宽泛的 administer。
发布能力也不属于 AccessGrant。CapabilityPolicy 先判断节点是否有资格申请 service_host、subnet_router、app_connector、exit_provider 或 relay_candidate,再由逐实例 CapabilityActivation 完成批准、配额占用、计量、审计和短租约签发。策略允许“符合条件自动批准”,但自动分支仍执行同一事务,不能绕开 Managed Resource 计费触发点。
Grant 的选择器、规范化、命中、最小投影、撤销与测试以Grant 与策略编译实现规格为权威。
NSD 保存人类可读 Grant,编译成每节点最小配置:
编译失败、读取失败或签名失败时不得下发空集合冒充“没有授权”;应返回显式错误并保留上一份未过期的已验证配置。
控制台允许管理员一次选择多个主体和多个资源,但服务端必须把一次人类操作保存为一个 GrantSet,并规范化为可独立命中和审计的 GrantRule:
GrantRule 只有一个规范化主体选择器和一个资源选择器,数组只存在于创作 API,不进入编译语义;grant_set_id 为边界,不根据名称或相似条件猜测哪些规则属于一组;grant_set_id 和真正命中的 grant_rule_id;Organization 是商业和管理边界,Network 是地址与信任边界。一个 Organization 可以有开发、生产、实验等多个 Network。
Next 使用版本化的 snapshot + delta:
| 事件 | 内容 |
|---|---|
netmap | 本节点可见 peers、地址、公钥、路径提示和租约 |
grants | 编译后的 L3/L4/Route/Exit 授权 |
services | 被授权 Services、VIP、Endpoint 选择信息 |
routes | 子网、应用连接和默认路由 |
dns | Node DNS、Service DNS、split DNS 和上游规则 |
gateways | 可用中继、入口、Egress、Exit 候选 |
credentials | 可轮换的短期控制凭据,不含节点私钥 |
每个事件都有 Organization/Network 作用域、类型化目标(Device、Membership、Gateway 或 Client Session)、epoch、版本、有效期和签名;消费者拒绝跨作用域/目标重放、回滚版本和过期配置。首版事件命名和载荷见Runtime Protocol v1。
| 对象 | 典型状态 | 关键规则 |
|---|---|---|
| User | invited / active / suspended / removed | suspended 立即阻止新会话;removed 触发其用户设备 Membership 撤销 |
| Device | pending / approved / quarantined / revoked | quarantined 只允许修复与控制面;revoked 后密钥进入拒绝列表 |
| Node Membership | pending / active / offline / expired / revoked | offline 不等于删除;Node IP 在保留期内不立即复用 |
| Service | draft / pending / active / degraded / retired | 无健康 Endpoint 时 degraded,不把读取故障显示成 offline |
| Route | advertised / pending / approved / withdrawn / conflicting | 未批准和冲突状态不下发系统路由 |
| Gateway | online / degraded / drained / offline | drained 不接新流量,已有会话按策略结束 |
| AccessGrant | draft / active / disabled / expired | 版本化、可模拟、可审批、可回滚 |
| CapabilityActivation | active / suspended / revoked | suspended 停止执行但保留配额;revoked 释放配额并要求重新申请 |
| PublicApplication | draft / active / suspended / revoked | 停用公网入口不删除底层 Service;安全撤销需要终止在途会话 |
删除流程必须先计算影响:用户拥有的设备、节点发布的服务、Route、共享和自动化凭据都要列出,再由管理员选择转移所有权、停用或删除。生产 Service 不因某个员工离职而被误删。
Activation、Availability、Projection 和 Runtime 是独立状态轴:节点离线只令 availability=unavailable,不改变 active/suspended/revoked;管理员暂停一个正好离线的能力时,两轴同时成立。suspended 保留受管资源占位和计费,保证恢复不会因额度被他人占走而失败;只有显式 revoked 才释放。暂停可选设置审计化 auto_revoke_at,但不存在全局“暂停 N 天自动撤销”。
控制面只提供候选和策略,节点根据实时网络质量选择。切换路径不改变 Node IP、Service VIP 或上层连接身份。
中继 NSGW 只能看到短期轮换的 opaque route/session ID、包长、时间和中继流量,不获得稳定 Membership/Node/WireGuard 身份,也不持有 WireGuard 明文密钥。NSD 与端点保留稳定身份到 opaque lease 的映射用于授权和审计;Relay 不能跨租约关联。需要 L7 终结的公网入口、HTTP 代理、WAF 等是另一种显式模式,必须单独展示其信任边界。
NAT 穿透是基础 L3 的独立核心子系统,不是“调用 WireGuard 后自动获得”的能力。至少包含:
控制面只协调候选和签名,不进入业务包路径。路径探测消息必须绑定 Node Membership、目标 peer、epoch 和 nonce,防止第三方伪造 endpoint 或把节点诱导到未授权地址。
完整的个人 L3 体验不能假设双方都处于友好 NAT。基础套餐因此包含一个只转发端到端密文的 Relay Plane:
| 部署 | 能力 | 商业边界 |
|---|---|---|
| Vendor Community Relay | 公平使用、无租户明文、无 Ingress/Egress/Exit | 基础连接兜底,不单独收费 |
| Self-hosted Relay | 单一 relay capability、社区可部署 | 不要求购买 NSGW license |
| Managed NSGW Relay | 区域选择、容量、SLA、数据地域、专属隔离 | 团队/企业增值 |
| NSGW Edge | Ingress、Egress、Exit、WAF、固定 IP | 明确授权的付费边缘能力 |
同一代码可以复用 relay transport,但 capability、配置、凭据和部署清单必须分离;“能中继密文”不能成为读取 Service 目录或启用网关 NAT 的通行证。
Vendor Community Relay 的“公平使用”必须是可执行策略,而不是营销用语:
community_relay_quota_exceeded,不能伪装成节点离线;Phase 2 不能只在同局域网或单边公网环境宣布完成。自动化与真机矩阵至少覆盖:
首版性能目标从“控制面已下发双方有效候选”开始计时,使用 p95 而不是单次最好结果:
| 场景 | 首次可用目标 | 合格路径 |
|---|---|---|
| 同一 LAN | < 2s | 直连 |
| 普通家用 NAT | < 5s | 直连优先,Relay 兜底 |
| CGNAT 或双端 symmetric NAT | < 10s | 探测失败后进入 Relay |
| UDP 完全封锁 | < 15s | WSS/TLS Relay |
| Wi-Fi/蜂窝切换、NAT rebinding | < 10s 恢复已有连接 | 漫游或 Relay,不改变 Node IP |
| Relay 实例故障 | < 15s 切换 | 另一健康 Relay,授权不扩大 |
这些是 Phase 2 的初始验收门,真机数据可以收紧目标,但不能在没有版本化基准、测试网络说明和 p95 证据时放宽。超时必须报告停在哪个阶段:发现、探测、握手、Relay 选择或策略安装。
这部分应单独立项、预算和验收;它与统一 ns、Grant v1 并行推进,但没有通过上述矩阵之前,不能把“像 Tailscale 一样简单连接”作为已完成能力。
Relay attach/frame、L3 candidate/roaming、ServiceFlow、RouteFlow、ExitTunnelLease 与各 generation 过渡的唯一线协议见数据面协议。架构层只决定信任边界,不允许各组件自行发明 token claims 或关闭语义。
| 能力 | 解决的问题 | 数据是否在 NSGW 终结 | 商业价值 |
|---|---|---|---|
| Managed Relay | P2P 不通、跨区域不稳定 | 否,默认密文 | 区域 PoP、SLA、低延迟 |
| Public Ingress | 外部用户访问内部服务 | 通常是 | 证书、WAF、OIDC、限流、审计 |
| Gateway Egress | 从指定网络访问受 IP 白名单保护的应用 | 视协议而定 | 固定来源 IP、应用连接器 |
| Gateway Exit | 员工互联网流量走企业出口 | 是,网络层 NAT | 合规出口、区域访问、固定 IP |
| Private App Connector | 按域名/CIDR 接企业内网或 SaaS | 可选 | 不暴露整网,只开放应用 |
| Dedicated Edge | 客户独享边缘与公网 IP | 按能力 | 隔离、性能、合规 |
一个 NSGW 必须按 Organization、Network 和 Capability 显式分配。中继能力不能自动获得 Public Ingress 权限;Exit 网关不能自动读取 Service 目录;公网入口只获得被发布 Service 的最小后端集合。
Public Ingress 由 PublicApplication(host/path) + EdgeAuthPolicy + IngressBindingLease 显式绑定到一个 Service。外部访客形成 EdgeIdentity/ExternalPrincipal,只在 Edge 请求中有效,不获得 Network Membership;NSGW 以受限 Gateway 身份和 Binding Lease 访问后端。内部 Service AccessGrant 与公网 EdgeAuthPolicy 是两条独立路径,收紧其中一条不会暗中改变另一条,控制台必须交叉展示并提示影响。
NS App 的主导航建议只有五项:
不把 NSC/NSN 暴露给用户。服务发布是“服务”页的动作,不要求用户切换成某种节点模式。
状态必须区分“控制面连接”“L3 数据面”“服务目录”“Exit”。不能用一个绿色圆点掩盖其中某一层失败。
设备列表展示名称、所有者、OS、Node IP、在线状态、直连/中继路径和用户被授权的操作。点击设备可复制名称/IP、Ping、SSH/RDP 或查看允许端口;未授权端口不展示成可用动作。
服务列表按应用名称展示,不要求员工理解承载节点。点击 Web 服务直接打开;TCP/UDP 服务提供复制地址和命令示例。服务详情可展示健康后端数量,但普通成员看不到未授权 Endpoint 和完整 ACL 图。
账号可以属于多个 Organization/Network。普通用户界面突出一个主 Network;切换主 Network 时先校验地址、DNS、未完成连接和 Exit 状态。首版一个运行实例只激活一个控制 Profile,切换是显式动作,不在本机合并多个独立控制权威的路由与 DNS。
互联网出口是连接设置,不是单独的首页产品模块:
首次登录不要求用户先创建 Organization、Network 或选择套餐:
升级向导收集组织展示名称、Owner/账单联系人、安全模板、成员来源和套餐,并在提交前预览 Grant 变化。右侧可使用交互式产品预览,让用户填写名称和模板时立即看到导航、成员与资源如何变化,但预览不能替代真实状态。
企业员工门户只显示该用户被授权的 Services。Web 服务可直接打开,TCP/UDP 服务显示连接方式。应用门户不是简单书签:每一项必须关联权威 Service ID 和 Grant,不能只保存一个任意 URL 后宣称已受 NSIO 保护。
本节只定义能力如何分类和如何强制。具体套餐、价格、配额数字和首版强制范围见 商业模型与 Entitlement——那些数字会随市场调整,不应写进架构文档。
Effective Entitlement 分四个桶,新增键按后两列判定归属,不靠直觉:
| 桶 | 含义 | 超限是否阻断合法操作 | 是否影响账单 | 示例 |
|---|---|---|---|---|
features | 是否拥有某项功能 | 未拥有即不可用 | 是 | l3_mesh、l4_services、sso、scim、posture、flow_logs、managed_edge、private_deployment |
quotas | 可购买、可计量、影响资源准入 | 是 | 是 | human_seats、networks、managed_resources、ephemeral_minutes、edge_regions、edge_traffic_bytes |
limits | 非计费的反滥用与安全上限 | 仅在滥用时 | 否 | user_devices_per_seat、services_per_network |
service_levels | 托管服务质量与数据生命周期 | 否 | 否 | audit_retention_days、community_relay_mbps |
每个 quota 携带 enforcement ∈ {block, warn, meter}:block 拒绝新增或扩大且存量不动,warn 允许但产生告警事件,meter 只计量。执行模式是签名声明的一部分,不是代码分支——把一项能力从观察切到强制是签发新声明,不是发版。
商业原则:Personal 与企业套餐使用同一套 Node、Service、Route 和 Grant 安全模型。个人用户可以发布服务、配置节点/端口/服务 ACL、分享设备并使用自建或获授权的 Gateway 能力;主体、资源、动作、协议/端口、时间和到期等核心 Grant 维度在所有档位一致。posture 作为 Grant 条件依赖 MDM、设备证明和组织治理,因此属于相应企业能力,不把这一企业治理条件包装成 Personal 已具备。套餐差异来自资源数量、托管流量、可用区域、身份治理、审计保留、合规、专属基础设施和 SLA,而不是删除个人用户的核心安全控制或故意让基础网络不可用。
Entitlement 是商业能力声明,不替代 Grant,也不能成为数据面安全授权。执行分三种部署模型:
| 模型 | 权威 | 强制点 | 边界 |
|---|---|---|---|
| 托管云 | 平台 Billing/Entitlement Service 的签名声明 | NSD API 事务、资源配额、策略编译;托管 Relay/NSGW 再校验短期 capability lease | 服务端硬约束,客户端只展示结果 |
| 社区自建 | 内置 Community entitlement | 开放基础 L3、L4 和 self-hosted Relay;不包含托管 SLA/PoP/固定 IP | 不要求联网验 license,不故意锁协议 |
| 企业自建 | 平台签发的离线 license/entitlement bundle | 私有 NSD 在变更事务与编译时验证;私有 NSGW 验证作用域 lease | 客户控制二进制,技术上只能做签名校验与软约束,最终依赖合同和支持权益 |
签名 entitlement 至少包含 organization/deployment ID、单调递增的 entitlement revision、feature set、quota、issued_at、expires_at、grace period、key ID 和签名。具体规则:
use-exit;商业状态、安全撤销和控制面故障不得压成一个 entitlement 布尔值:
| 事件 | 已建立会话 | 新会话/续租 | 配置变更 | 控制台读取与收尾 |
|---|---|---|---|---|
| 安全撤销 | 在撤销 SLA 内主动终止目标会话 | 立即拒绝 | 仅允许修复、撤销和必要的管理员动作 | 保留最小诊断、审计和恢复入口 |
| 欠费 | 催缴 grace period 内保持;期满后收费托管能力随租约自然退出,自建基础能力不受影响 | grace period 后按当前有效免费 entitlement 准入,不签发新的付费托管租约 | 允许删除、降配和付款恢复,拒绝新增收费资源 | 始终允许查看账单、影响预览、导出、删除和恢复 |
| 合同/entitlement 到期 | 不立即拆除正在使用的安全通道;按已签发租约到期收敛 | 到期或 grace period 后不签发收费能力新租约 | 允许查看、删除和降配,阻止扩大 | 明确显示到期能力、最后有效时间和恢复方案 |
| entitlement 读取/验签失败 | 在最后已验证声明的 grace period 内保持;超过后不伪造“无套餐”状态 | grace period 内按最后有效声明,超过后对新增/扩大 fail-closed | 返回明确可重试系统错误 | 使用缓存只读展示并标记陈旧,不返回空能力集 |
基础 Node/Service Grant 的安全撤销不受商业 grace period 延迟;商业系统也不能通过“欠费”事件绕过审计,直接伪装成安全撤销。
该分层让“协议和社区基础能力开放”与“托管服务和企业运营能力收费”同时成立,不靠破坏基础网络制造付费点。
| 边界 | 信任内容 | 不信任内容 |
|---|---|---|
| Device ↔ NSD | 身份认证、签名配置 | NSD 不获得 Device/Node 私钥 |
| Node ↔ Node | WireGuard 会话和双方策略 | 不信任对端自行声明的用户/标签 |
| Node ↔ NSGW relay | 中继可转发密文 | 不信任中继读取或修改明文 |
| Node ↔ Service Endpoint | Service ID、Grant、本地 manifest | 不信任 NSD 单方面扩大本地后端 |
| Client ↔ Connector | 签名 Route credential 与匹配投影 | 不信任客户端自报来源或任意目标;建流不回查 NSD |
| Edge visitor ↔ NSGW ↔ Service | EdgeAuthPolicy、Binding Lease、受限 Gateway identity | EdgeIdentity 不获得 Network Membership 或横向访问 |
| Organization ↔ Organization | 明确分享的资源 | 不共享完整成员、节点和服务目录 |
“Exit 捕获后不自动恢复本地直出”和“读取失败不折叠为空授权”是 Next 的原生安全基线,必须通过反向注入测试证明:重新注入自动恢复或把读取故障当无候选时,测试必须失败。
amr/acr/auth_time 只有经过 Federation Binding 显式映射后才能满足 NSIO assurance;强度不足时执行本地 step-up,不机械重复企业已完成的 MFA;| 表 | 关键字段 |
|---|---|
enrollment_requests | protocol, state, proof, device_pub_hash, principal, target, capabilities, decision digest, expiry, revision |
enrollment_grants | request_id, generation, state, device/target binding, approval/entitlement revision, signature, expiry |
enrollment_approvals | request_id, decision, actor, preview digest, reason, expiry, revision |
devices | organization_id, lifecycle_owner_type/id, device_pub, display_name, posture, state, revoked_at |
networks | org_id, name, dns_slug, ipv4_pool, ipv6_prefix, policy_template |
network_principal_memberships | network_id, principal_type/id, role, state, expires_at |
node_memberships | network_id, device_id, node_key, wg_key, node_ip4/ip6, state |
machine_principals | organization_id, kind, credential_type, owner, state, revision |
node_capabilities | membership_id, capability, desired, advertised scope, health |
capability_policies | scope, subject selector, capability, ceiling, auto-approval policy, revision |
capability_activations | membership/capability, state, availability, approval, quota allocation, lease, auto_revoke_at, revision |
services | network_id, name, protocol, vip4/vip6, custom_domain, state |
service_endpoints | service_id, membership_id, backend, health, local_revision |
routes | network_id, publisher_membership_id, prefixes, kind, approval, priority |
grant_sets | network_id, name, effect, state, revision, created_by, approval |
grant_rules | grant_set_id, subject_selector, resource_selector, actions, constraints |
admin_role_bindings | scope, principal, role/actions, conditions, state, revision |
public_applications | organization/network, service_id, host/path, edge policy, state, revision |
edge_auth_policies | application_id, methods, selectors, conditions, session policy, revision |
ingress_binding_leases | application/service/gateway, policy revision, backend scope, expiry, state |
enrollment_keys | organization/network, hash, tags, capability ceiling, expiry, uses, state |
shares | provider_org/network, resource_type/id, opaque_id, consumer_org, actions, expiry, state |
share_bindings | share_id, consumer_principal_type/id, posture, state, revision |
entitlement_snapshots | org/deployment, entitlement_id/revision, canonical digest, issuer, features, quotas, issued/expiry/grace, signature |
entitlement_heads | org/deployment, current snapshot/revision/digest, state, grace, rollback high-water mark |
quota_usage | subject/deployment/resource type, used, reserved, limit, admission state, enforcement, entitlement/usage revision |
quota_allocations | quota key, resource ID, amount, source request/reservation, state |
quota_reservations | batch, resource type, requested, consumed, state, entitlement revision, expiry, idempotency key |
这些是 Next 的原生表,不从旧 machines、Realm、AuthKey、Policy 或状态目录导入数据。Enrollment、Entitlement 和 Quota 的完整字段、状态和事务以注册、准入与配额协议为权威。表结构和协议从首个 Next release 开始遵守 additive 演进与未知字段策略;这只保证 Next 版本之间的前向演进,不表示与旧 NSIO 兼容。
以下版本轴独立推进,禁止通过一个版本号推断另一个协议面的能力:
| 协议面 | 版本权威 |
|---|---|
| Entitlement bundle | schema_version |
| Enrollment 协议 | Enrollment API major/minor |
| 控制面事件 | 每个事件类型自己的 schema version |
| FFI 与客户端 | ABI version + 每个 payload schema version |
| 数据库 | 服务端内部 migration revision,不暴露为客户端能力 |
跨面依赖通过经过认证的 Capability Manifest 明确协商。能力声明只能关闭双方不共同支持的可选功能,不能降低签名、Device Key 绑定、确认页防钓鱼、授权或 fail-closed 基线。HTTP well-known 只用于预检,认证握手才是最终权威。
各仓库的内部模块、接口、状态与测试要求以组件实现规格和实施蓝图为准;本节只定义所有权。
| 仓库 | Next 职责 |
|---|---|
ns-next | 统一 ns agent、TUN、WireGuard/WSS、L3 router、L4 service host、CLI、FFI |
nsc-app-next | 过渡期仓库名;产品演进为 NS App,负责桌面/移动交互 |
nsd-next | Organization/Network/Identity/Policy/Control/Audit/API |
nsgw-next | 托管中继、Ingress、Egress、Exit、PoP 数据面 |
ns-shared-next | NSD/NSGW/agent 共享的稳定协议与签名类型;避免复制 wire schema |
admin-next | 平台运营、计费、组织和基础设施管理,不替代租户控制台 |
product-docs-next | 面向管理员与最终用户的操作文档 |
qa-next | L3/L4/网关/升级/跨平台验收矩阵 |
仓库名中的 -next 是产品线隔离标识,不代表迁移层。产品名和二进制统一为 NS App 与 ns;是否重命名仓库是独立的工程管理决策。
退出条件:新 Organization 可以从空数据库完成登录、注册、授权和配置投影;协议契约、错误分类与 fail-closed 反向测试全绿。
ns 与 L4 Servicens 二进制和一个 NS App;退出条件:同一新注册节点可以同时访问服务并发布服务,Service Grant 与 Node Grant 独立生效。
退出条件:个人两台设备在同 LAN、普通 NAT、CGNAT、双端 symmetric NAT 和 UDP 封锁场景下,都达到 §11.4.2 的 p95 首次可用目标,并通过直连或 Relay 按名称互访;企业未授权节点不可见、不可达;网络切换在目标时限内恢复且 Node IP 不变。
退出条件:企业可以关闭员工横向 L3,只通过服务目录开放应用。
退出条件:基础 L3 在没有付费/专属 NSGW 时仍能通过直连或基础 Relay 工作,购买 NSGW 后只增加区域质量、SLA 和被授权的边缘能力。
退出条件:企业身份、策略、审计、规模和 entitlement 事务在生产拓扑下达到记录的撤销、性能和隔离目标。
退出条件:产品可以被安全安装和移除、可以收款开票、可以公开解释事故、可以从空环境恢复,并能完成数据权利请求;任何商业或运营故障都不被压成网络授权事实。
ns 节点可同时访问 L3、消费 Service、发布 Service;| 决策 | 结论 | 原因 |
|---|---|---|
| NSC/NSN 是否合并 | 是,统一为 ns | 两者共享身份与传输,角色分裂阻碍 L3 和双向服务能力 |
| NSGW 是否合并 | 否 | 公网、多租户和高权限边缘需要独立安全边界 |
| L3 是否依赖 NSGW | 不依赖付费/专属 NSGW;困难网络依赖基础 Relay Plane | 基础产品必须真实可用,不能假设所有 NAT 都可直连;NSGW 销售质量与边缘能力 |
| L3 是否默认无 ACL | 仅个人模板简化,底层始终有 Grant | 企业不能默认横向互通 |
| Personal 是否使用残缺安全模型 | 否,使用与企业相同的 Grant 引擎 | 免费与付费差异应是配额、托管资源和治理,不是取消 ACL 或服务发布 |
| 个人升级企业是否新建 Organization | 否,默认原地升级 | 保持 Node IP、Service、Grant、域名和审计连续;独立 Organization 只用于明确隔离边界 |
| L3 默认数据面 | 桌面/移动端 TUN/VPN API;Linux 服务器可用内核 WG | L3 需要稳定 Node IP 和系统路由;L4 Service 可共用 TUN 或使用 Next 原生 Proxy |
| L4 是否改成 IP:port ACL | 否 | 会丢失服务身份、HA、域名、发布者同意和目录体验 |
| 人类客户端是否用 Auth Key | 否,默认浏览器身份登录/Device Code | 首版登录页使用本地账号、Google/GitHub 或企业 OIDC;需要真实用户身份、MFA、离职回收和简单体验 |
| Server 是否必须登录账号 | 否,使用受限 Enrollment Key | 无人值守和自动化需要 |
| 一个 Device 是否可加入多个 Network | 同一 Organization 内可以;首版运行时只激活一个控制 Profile | Membership 按 Network 隔离,切换前检查 OS 路由、DNS 和 Exit 冲突 |
| 企业是否自动全互通 | 否,默认拒绝 | 最小权限和元数据隐私 |
| 跨组织是否合并目录/策略 | 否,使用双边 Share 与短期租约 | 权限取交集、撤销双向生效、目录最小披露 |
| 自建 entitlement 是否是安全边界 | 否 | 客户控制二进制;硬约束只存在于供应商控制的托管服务 |
| App 是否能发布服务 | 能,但必须本地确认并受管理员策略约束 | 统一节点不再人为分消费端/发布端 |
NSIO Next 不应成为“Tailscale 的另一个实现”,而应成为:
Tailscale 式的简单节点网络 + NSIO 已经具备的服务级零信任 + 可独立部署的企业边缘。
个人用户先得到简单的节点互联;企业在同一客户端和同一策略体系上继续获得服务目录、最小权限、应用连接、固定出口、公网入口、审计和私有部署。L3 扩大产品入口,L4 与 NSGW 构成商业差异和收入层,两者必须同时成立。