状态:产品、交互与跨组件实现基线。本文回答“用户如何一步步完成任务,以及系统每一层如何闭环”。系统对象与安全边界以统一 L3 + L4 架构为准;全部能力、组件责任、状态与角色预演见产品能力目录与实现闭环;控制对象状态/API 见控制资源生命周期,运行投影见Runtime Protocol,建流与传输见数据面协议,注册状态、API 与事务以注册、准入与配额协议为权威。
一个功能只有覆盖七个必需阶段,才算可以进入实现:
需要人工或策略批准的功能再增加审批阶段;会占用配额、计费或计量的功能再增加计量阶段。没有这些条件的功能不强行写“无审批/无计量”占位,但不得漏掉适用阶段。
后文所有功能都按这个标准描述。只画 UI、只定义 API、只跑通 happy path 都不算完成。
| 使用者 | 首次入口 | 主要目标 | 认证方式 |
|---|---|---|---|
| 个人用户 | NS App | 两台自己的设备互联 | 邮箱密码、Google 或 GitHub |
| 组织创建者 | NS App 或 Web | 创建团队、邀请成员、管理网络 | 人类登录 + MFA |
| 企业员工 | 企业邀请、SSO 或 MDM | 访问被授权节点和应用 | 企业 OIDC,目录生命周期可接 SCIM |
| 无人值守节点 | CLI、镜像或自动化 | 服务器、路由器、连接器、CI 加入 | Enrollment Key,只用于注册 |
人类设备不先要求用户理解 Organization、Network ID 或 Auth Key。统一流程是:
Personal Network 和个人安全模板;登录入口、账号绑定、会话和身份撤销的权威规则见身份、登录与会话实现基线。App 不显示密码字段,也不根据邮箱自行合并账号;邮箱只在邮箱密码或用户主动选择的企业 SSO 发现流程中使用。
不在首次连接之前强迫个人用户选套餐、配置 ACL 或进入管理控制台。先让两台设备连通,再展示升级价值。
这里的 Organization 是后台稳定租户边界,不是要求个人用户手工“创建公司”。个人 UI 只称“我的空间”。个人空间升级团队时仍使用同一个 Organization,不重建任何资源;只有用户明确要求另一个独立账单/安全边界时,才创建新的 Organization ID。
个人空间使用和企业相同的 Grant 引擎。个人用户可以创建节点端口规则、服务 ACL、发布 Service、使用 Route/Exit 等基础能力;默认界面用“谁可以访问”而不是“ACL/GrantRule”降低门槛。套餐限制应落在设备数量、托管流量、审计保留、SSO/SCIM、专属 NSGW 和 SLA,不通过取消个人用户的安全控制来制造升级理由。
NS App 面向使用和本机发布:
管理控制台面向组织治理:
账号可以属于多个 Organization/Network,但首版运行时只激活一个控制 Profile;切换入口放在账号与 Network 选择器中。
用户操作
clark-mac;ping clark-pc。系统实现
user:self → nodes:owned 的个人模板;Device/Node Membership 只在 Enrollment Grant commit 事务中创建;ns 的 L3 TUN,安装 Node 路由与 split DNS;成功状态
失败与收尾
个人与企业不是两套数据模型,也不要求用户把设备搬到另一个空间。Personal 配额内邀请成员是正常协作流程,不会自动启用付费试用或改变 entitlement。只有用户主动点击“升级团队”、明确确认试用,或尝试启用当前 entitlement 不包含的 SSO/SCIM 等企业能力时,才进入升级向导。
批量导入用户、绑定企业域名等动作应先按当前 entitlement 预检:当前能力和配额足够时直接完成;不足时展示缺少的能力、预计影响和试用期限,由用户明确确认后再启用试用。推荐升级可以提示,但不能因为邀请第一个成员或填写企业域名而静默改变商业状态。
向导只收集新增的组织信息:
升级保持同一个 Organization ID、默认 Network ID、Device、Node Membership、Node IP、Service ID、域名和审计历史。安全模板切换使用版本化 Grant 变更并先预览影响,不能因为“升级企业版”自动扩大或突然切断已有访问。
用户仍可从空间选择器“新建独立 Organization”,但它只用于确实需要账单、法律实体或安全边界隔离的场景,不是个人转企业的必经路径。
邀请方式
企业 SSO
管理员在目标 Network 创建 Enrollment Key,必须限定:到期、使用次数、标签、允许能力和是否需要审批。
节点生成自己的长期 key,用 Enrollment Key 只完成一次注册。服务器不能通过命令行增加 key 未允许的 tag、route、service_host 或 exit_provider 能力。注册后 key 可立即删除,节点不受影响;节点撤销后不能靠旧 key 恢复身份。
| 对象 | 目标地址 | 默认名称 | 适用场景 |
|---|---|---|---|
| Node | Node IP | <node>.<network>.<org>.node.ns.io | Ping、SSH、RDP、文件共享、任意被授权端口 |
| Service | Service VIP | <service>.<network>.<org>.svc.ns.io | 稳定业务身份、服务级 ACL、HA、多后端 |
例子:
.node.ns.io 和 .svc.ns.io 是目标逻辑命名空间,由 NS App 的 split DNS 解析,不要求公开互联网 DNS 暴露内部地址。私有部署可以使用客户自己的受控后缀;协议携带的是稳定对象 ID 和完整域名,不把 ns.io 硬编码成唯一可能后缀。
clark-pc、git;自定义域名有两种完全不同的模式:
git.acme.com。已连接且获授权的设备通过 split DNS 得到 Service VIP;未连接设备继续使用公共 DNS 或解析失败;TUN 模式不要求 HTTP Proxy 才能支持内部自定义域名。split DNS 返回 Service VIP,原始 TCP/TLS 流量经 TUN 到 Service Endpoint,SNI 和 Host 保持不变。Next 在明确支持的平台也可以提供本地 L4 Proxy 模式,由 PAC 把匹配域名送到本机代理。
当访问域名与远端 backend 域名相同,连接器解析 backend 时必须使用未被 NS split DNS 覆盖的 origin resolver 或固定 origin 记录,避免把请求再次解析回 Service VIP 形成环路。
设备页只展示用户有权知道的节点:名称、所有者、OS、在线状态、Node IP、Node DNS 和允许的常用动作。未授权节点不显示为灰色诱饵。
常用动作不是根据端口扫描猜出来的,而是由 Node Grant、目标节点声明的能力和实时状态共同决定。用户仍可在终端直接访问被授权端口。
ping clark-pc、ssh clark-pc;NSD 下发 netmap + grants + dns snapshot/delta(各自 schema_version=1),但不承载包。源端允许不是最终许可,目标端仍执行入站规则,防止过期配置或修改过的客户端绕过。
管理员不需要手写 JSON。创建规则使用一句可读表单:
个人模板等价于“允许 user:self 访问 nodes:owned 的任意端口”,但底层仍是 Grant。个人用户可以在“访问权限”高级设置中把它收紧到节点、协议和端口,也能为分享对象创建最小授权。企业默认不创建横向 Node Grant,员工只看到服务目录。
| 状态 | 用户文案 | 可执行动作 |
|---|---|---|
| authorized + online | 在线,可连接 | 打开/复制名称/诊断 |
| authorized + offline | 节点离线 | 查看上次在线、通知所有者 |
| no Grant | 不出现在普通列表 | 管理员策略模拟可看到拒绝原因 |
| control read failed | 暂时无法刷新设备 | 重试;保留最后未过期数据 |
| route conflict | 无法安装到该节点的路由 | 查看冲突 Network/CIDR |
| handshake failed | 无法建立安全通道 | 网络诊断、Relay 状态、重试 |
断开 NS 只移除本机临时路由、DNS 和会话,不删除 Device、Membership 或 Node IP。管理员撤销 Membership 后,DNS、peer map 和入站许可在撤销 SLA 内同时消失,并写审计事件。
服务发布采用两层权威的交集:
ns 决定“这台机器允许暴露哪个本地/远程后端”;服务由 ns 上报。NS App、CLI 和原生 services.toml 都编辑同一份 Next Service Manifest,再由 ns 签名上报。NSD 不能单方面把员工笔记本任意端口变成服务。
用户进入“发布服务”后按三步完成,不展示协议内部字段:
第一步:选择来源
127.0.0.1:8080;192.168.1.20:22;https://xsaz.s8nw56.com;services.toml 选择已声明的后端。App 可以在用户点击“发现本机服务”后扫描监听端口,但首版不后台自动扫描,更不自动发布。
第二步:定义服务
git;第三步:确认边界
明确展示“哪些 Network、哪个本机后端、NSD 管理员是否需要审批”。点击发布后先写本地 manifest,再上报;本地写入失败时不在 NSD 留下 active Service。
ns 验证后端格式、协议、端口、禁止范围和本地 publish capability;ns 用 Node key 上报 service.declare 命令,包含本地 manifest revision 和健康材料;services + dns + grants snapshot/delta;可以下发发布请求或受管期望配置,但不能无条件强制发布:
| 节点类型 | NSD 下发行为 | 节点处理 |
|---|---|---|
| 用户设备 | publication.request | App 弹出请求,用户接受后写本地 manifest;拒绝/过期可审计 |
| 普通服务器 | 请求待本地 CLI/Admin 接受 | ns service request list/accept/reject |
| 受管服务器 | 下发 scoped desired manifest | 仅在注册时派生、节点本地仍有效的 ManagedConfigAuthorization 范围内自动接受 |
| 超出预授权范围 | 拒绝 | 不创建 endpoint,返回 local_policy_denied |
Enrollment Key 只在注册时证明一次性加入权限。受管服务器会把其允许范围派生为节点本地的 ManagedConfigAuthorization,记录 Organization/Network、管理签名方、允许资源类型与范围、revision 和撤销状态;desired manifest 每次到达都必须重新校验这份本地授权,不能继续拿已消费或已过期的 Enrollment Key 当永久授权。
节点所有者可以执行“停止受管配置”:
ManagedConfigAuthorization 并写入不可回退的 revision;publication.request,必须由 App/CLI 明确接受;管理员可以随时在 NSD 禁用 Service 或撤销 Grant,因为这是远端可达性;但删除节点本地 manifest 需要节点所有者或当前有效的受管配置权限。远端授权永远不能超过本地同意。
节点可以作为连接器发布它能够访问的远程后端,例如 https://xsaz.s8nw56.com:
ns;这不要求额外 NSGW。需要高可用、固定企业出口、托管 IP 或审计 SLA 时,才使用 Gateway Egress/App Connector 增值能力。
服务页是被授权的应用目录,不是全 Organization 服务清单:
Web 服务点击“打开”;TCP/UDP 服务显示适合的命令或一键动作。Gateway Egress 服务用明显的“网关出网”标签,但仍保持相同 item 布局和筛选逻辑。筛选使用单选菜单:协议、服务类型、状态;选择后筛选值直接显示在控件上。
Service Grant 与 Node Grant 独立。用户可以访问 git Service,但没有权利访问承载节点的其他端口;管理员也可以完全关闭横向 L3,只保留服务目录。
纯 L4 或无 TUN 模式下:
PAC 只是告诉系统“哪些域名走本地代理”,不包含访问权限。真正授权仍由 services/grants 投影和目标端校验执行。Next 的 L3 默认 TUN;Proxy 是 Next 自己的可选服务数据面,不是旧产品兼容层。
| 事实 | 用户状态 |
|---|---|
| 有 Grant 且至少一个健康 Endpoint | 在线 |
| 有 Grant,Endpoint 全离线/健康失败 | 暂无可用后端 |
| Service 被管理员 disabled | 已停用 |
| Grant 被撤销 | 从普通用户目录移除;管理员可见“未授权” |
| NSD/存储读取失败 | 暂时无法刷新服务,不显示空目录 |
| DNS/路由尚未安装 | 正在准备访问路径 |
| 协议版本无法解析 | 客户端需要更新 |
组织管理员有四个入口:单个邀请、批量粘贴、CSV 导入、SCIM 同步。批量导入每行包含邮箱、显示名和用户组;组不存在时在预览中列出并要求一次明确确认后创建。
重复邮箱首行生效并标记;同 Organization 已存在用户不重复创建;跨 Organization 不泄漏归属,只返回不可用。预览后数据变化导致 digest 不同,提交返回“预览已变化”,要求重新确认。
Group 是 Organization 级身份集合,但不会自动进入所有 Network:
UI 必须分开“加入网络”和“可以访问什么”,避免管理员误以为把员工加进 Network 就已全互通。
规则向导使用自然语言四步:
保存前展示影响模拟:新增可达关系、失去的访问、受影响设备数和冲突。发布后显示 config revision、投影进度和失败节点。读取/编译失败不能发布一个空 Grant 集合。
发布能力、PublicApplication 访客认证和管理角色不在这个向导里。它们分别进入 Capability、Public Applications 和 Roles 页面,避免管理员误以为“允许访问一个服务”同时允许节点发布它或把它暴露到公网。
个人空间默认使用“我的设备互通”模板,让首次体验简单;用户仍能打开“访问权限”进行完整控制:
445 给家庭成员;邀请第一个成员并不会自动扩大个人模板,也不会自动进入付费试用。用户之后明确进入升级向导时,向导必须把 user:self 规则与新成员规则分开确认。
Device 表示真实安装;Node Membership 表示它在某个 Network 的身份。用户在设备页执行的动作要明确作用范围:
| 动作 | 作用 |
|---|---|
| 断开 | 只停止当前本机运行时,不删除 Device/Membership |
| 从 Network 移除 | 撤销一个 Node Membership,其他 Network 不受影响 |
| 隔离设备 | 所有 Membership 进入 quarantined,只保留控制/修复路径 |
| 撤销设备 | 吊销 Device key 和全部 Membership |
| 删除本机数据 | 本地退出并删除 key,需要系统确认,不替管理员删除服务端审计 |
个人设备默认由本人自动批准;企业可要求管理员批准或 MDM 证明。姿态包含 OS、版本、磁盘加密、锁屏、EDR 等结论,敏感原始数据尽量留在设备或姿态提供方。
姿态不满足时显示“设备需要修复”及具体动作,不简单显示“无权限”。隔离状态仍允许访问更新、认证和企业修复端点,修复成功后重新评估。
个人空间自动有一个 Personal Network。团队通常沿用该 Network 原地升级;只有开发/生产、客户隔离或地址域确实不同才创建第二个 Network。
创建 Network 向导:名称 → 地址池/自动分配 → DNS slug → 安全模板 → 管理员 → 完成。地址与当前设备已有系统路由重叠时在连接阶段 fail-closed 并指出冲突 CIDR。
节点不能仅靠 Enrollment Key 或 CapabilityPolicy 自行发布任意公司网段;key/policy 只设申请上限,实际能力仍要经过同一个 Activation 事务。自动批准也占相同 Managed Resource 配额并产生相同审计。路由重叠、发布节点离线、读取失败分别显示。撤销时先停止新流量并移除客户端路由,再关闭发布端转发。
授权是双端的:客户端只得到自己可用 Route 和签名 RouteAccessCredential,Connector/Router 只得到“哪些来源可到哪些精确目的地、协议和端口”的白名单。Connector 本地验签和校验实际目标,不能向 NSD 逐流查询,也不能因自己位于内网就转发到 Route 之外。
策略变化按 generation 切换。新增权限可在有界窗口平滑重叠;收紧权限默认 security_first,先 staging/ACK Connector 再按 activation epoch 切客户端,未准备的 Connector 移出候选,宁可短暂 fail-closed。选择 bounded_drain 时,UI 必须显示旧权限最晚失效时间;新旧 generation 各自使用自己的目的地集合,永远不做 union。
App Connector 面向域名集合,不等于开放整段网络:
ManagedConfigAuthorization 范围内;use-route Grant;动态域名解析出的 IP 必须带短租约,并防止解析到 loopback、link-local、metadata service 或未允许私网范围。域名读取失败不退化成捕获整个默认路由。
Domain Route 只能保证当前解析 IP 的 best-effort L3 捕获,共享 CDN/多租户 IP 可能扩大范围,页面必须展示当前解析集和冲突。需要严格 Host/SNI/path 的应用应创建 DomainService/Gateway Egress,而不是把 Domain Route 标成严格应用级访问。
用户不需要选择 Relay。ns 自动按局域网直连 → UDP 打洞 → 基础 Relay → WSS/TLS Relay 的顺序建立路径。首页只显示“直连”或“经中继”,诊断页才展示区域、延迟、候选和失败原因。
基础 Relay 只收到短期 RelayRouteLease、轮换 opaque route/session ID 和两端密文,不收到稳定 Node/Membership/WG 身份、Service 目录或企业边缘配置。Relay 不可用时自动换区域;全部 Relay 不可用且无法直连时显示“安全通道无法建立”,不能回退到公网直连目标业务端口。直连、Relay 和 WSS 切换不改变 Node IP 或系统 TUN MTU。
Gateway Exit 是用户设备把公网 IPv4 或指定 CIDR 交给企业出口,不是普通 Service。
管理员准备
用户交互
失败分流
no_authorized_candidates:确定未授权。关闭用户偏好并恢复原数据面,明确提示联系管理员;candidates_not_ready:候选尚未到达,保持连接和出口意图,允许取消/重试;read_failed:未知故障,不伪装成未授权;external_unmanaged,状态必须说明 IPv6 去向。Gateway Egress 是一个特定 TCP/UDP 服务通过网关访问,不接管用户默认路由:
backend=gateway_egress 的 Service;ServiceFlowCredential 送到网关;用户不需要开启 Gateway Exit。Egress 服务不可用只影响该 Service,不应让整个 TUN 或其他 L4 Service 断开。
Public Ingress 把一个已存在、已获本地同意的 Service 暴露给外部:
PublicApplication,选择域名/path、EdgeAuthPolicy、证书、WAF/限流和 NSGW;IngressBackendCredential 和最小 publisher projection 经 ServiceFlow 访问 Endpoint;入口状态分为 DNS 待验证、证书签发中、认证策略就绪、Binding 已投影、在线、后端不可用、配置读取失败和已停用,不能只显示一个绿色开关。Service 详情同时显示“内部访问”和“公网入口”两条独立策略,并明确提示:收紧内部 AccessGrant 不会自动收紧 PublicApplication。
安全撤销必须处理在途长连接。管理员可以按应用、策略版本、Binding、EdgeIdentity、API/Service Credential 或 IdP session 踢除;NSGW 在 SLA 内主动关闭 HTTP、WebSocket、gRPC、SSE/raw stream,并返回协议可解释的 401/403/1008/UNAUTHENTICATED 等结果。策略读取失败是 503,后端不可用是 502,不能冒充未授权。
需要让第三方 SaaS 只接受固定 IP 时,管理员选择 Gateway Egress 或 App Connector + NSGW 固定出口。第三方白名单填写的是 NSGW/连接器的公网出口 IP,不是员工电脑公网 IP,也不是 Node IP、Service VIP 或 WireGuard endpoint。
首版优先分享 Service:
分享失败时区分邀请过期、对方拒绝、federation key 错误、资源已退休和策略读取失败。跨组织 Node 分享和 Network 路由不随 Service 分享自动开启。
Organization、Network、Device、Node IP、Service、Grant 和审计 ID 全程不变。升级不是导出/导入,也不要求用户切换到一个新空间。
个人用户使用完整的核心安全模型:L3 Node、L4 Service、访问权限、设备分享、基础 Route、社区 Relay,以及被授权时的 Exit/Egress。商业区分主要是数量、托管资源和治理:
不通过“个人版没有 ACL”“个人版不能发布服务”来迫使升级。
首页不展示 ACL 语法、Profile ID、WireGuard key、内部 TUN stack IP 或所有候选 endpoint。
进度来自运行时实际阶段,不使用定时器伪进度。标准连接成功但 Exit 尚未就绪时,应显示“已连接,私网服务可用;正在准备互联网出口”,不能隐藏真实可用状态。
每个错误包含稳定 code、简短标题、事实说明、是否可重试、建议动作和诊断入口。UI 不解析英文字符串判断逻辑。
| code 类型 | 示例动作 |
|---|---|
| auth/session | 重新登录 |
| system_permission | 打开系统设置 |
| no_authorized_resource | 联系管理员/打开访问权限 |
| control_read_failed | 重试、查看服务状态 |
| route_conflict | 展示冲突软件/Network/CIDR |
| runtime_incompatible | 更新 App/runtime |
| local_manifest_denied | 编辑本地发布范围 |
| entitlement | 查看套餐或管理员处理 |
App 崩溃或 helper 失败后,ns doctor、日志导出和恢复标准连接必须在未连接状态也能使用。
Organization Overview 只展示管理员下一步需要处理的事实:待接受邀请、待批准设备、待批准 Service/Route、策略投影失败、Gateway 异常、试用/配额和高风险审计。每个数字可点击进入过滤后的真实列表。
| 页面 | 空状态 | 主动作 |
|---|---|---|
| Members | 还没有其他成员 | 邀请成员 / 批量导入 / 配置 SSO |
| Devices | 还没有设备 | 下载 NS App / 复制服务器安装命令 |
| Services | 还没有服务 | 查看发布步骤 / 向受管节点发发布请求 |
| Access | 仅有初始模板 | 创建访问权限 / 从模板开始 |
| Capabilities | 没有能力申请 | 查看节点能力 / 创建策略 |
| Public Applications | 没有公网应用 | 从现有 Service 创建公网入口 |
| Routes | 没有待批准路由 | 查看 Subnet Router 配置 |
| Gateways | 没有网关 | 使用基础 Relay / 部署或购买 NSGW |
读取失败不能渲染成上述空状态,必须显示错误、request ID 和重试。
删除 User、Device、Network、Service、Route、Gateway、AccessGrant、CapabilityActivation 或 PublicApplication 前,服务端生成影响预览并返回 digest。确认必须绑定这个 digest;提交时重新规划,不一致返回“影响已变化”。高风险变更支持二人审批、计划生效和 canary。
Capability 页面分别展示 Activation、Availability、Projection 和 Runtime。暂停说明“仍占用 1 个受管资源额度”,可选显式 auto_revoke_at;离线不改写暂停/授权;只有撤销释放额度。页面不得把这些轴合成一个 Active。
每个产品动作至少记录:Organization/Network、actor、action、resource ID、result、request ID、before/after revision、来源和时间。安全事件不得记录私钥、Enrollment Key 明文、完整业务 payload 或不必要的批量邮箱清单。
关键事件包括:登录、邀请、Device 注册/审批/撤销、Service 声明/批准/拒绝、Grant 发布/回滚、Route 批准、Exit 选择、Ingress 变更、Share 接受/撤销、entitlement 变化和管理员导出。
App 诊断包包含脱敏版本、控制连接状态、TUN/DNS/route ownership、peer path、Service/Exit readiness 和最近错误码。不包含私钥、token、完整用户目录或业务内容。管理员控制台可以用 request ID 关联服务端审计,但不能直接读取终端隐私数据。
下表是实现时的跨仓库契约。名称是目标语义,具体 URL 可在 API 设计阶段确定。
事件信封、幂等、revision、错误和能力协商统一遵守跨组件共享契约。具体组件实现见ns、Client、NSD和NSGW。
| 功能 | 权威对象 | 上行/命令 | NSD 处理 | 下行事件 | 数据面执行 |
|---|---|---|---|---|---|
| 登录/空间发现 | Account, Organization | OIDC callback, Directory query | 会话、邀请、空间列表 | session/profile | App |
| Device 注册 | Device | device.register | 绑定 owner、姿态、审批 | device.status | App/ns |
| 加入 Network | Node Membership | membership.enroll | 分配 Node IP/key scope | netmap snapshot/delta | ns TUN/WG |
| Node ACL | AccessGrantSet/Rule | grant publish | 编译 peer/port policy | grants + netmap | 源/目标 ns |
| Service 发布 | Local Manifest + CapabilityActivation + Service | capability request / service.declare | 资格、批准、配额、VIP/名称 | activation + services + dns | 发布/消费 ns |
| 发布请求 | PublicationRequest | admin request / node accept | 校验本地接受或 managed scope | publication.request/status | 节点 ns/App |
| Service ACL | AccessGrantSet/Rule | grant publish | 编译目录与路由 | services + grants | 双端 ns |
| Subnet Route | CapabilityActivation + Route | capability request / route.advertise | 配额、审批、双端授权、generation | client/connector routes | 客户端/路由节点 |
| App Connector | ApplicationRoute | domains + connector | DNS 安全、授权 | routes + dns | ns connector |
| Relay | Relay lease | path candidates | 区域/租约选择 | gateways/netmap | ns ↔ Relay |
| Gateway Exit | Exit Profile/Grant/Selection | profile report / selection | 候选授权、投影 | gateway candidates/readiness | ns + NSGW |
| Gateway Egress | Service + gateway backend | gateway declaration | Service 投影与 ACL | services snapshot/delta | ns + NSGW |
| Public Ingress | PublicApplication + EdgeAuthPolicy + IngressBindingLease | admin create/revoke | DNS/cert/WAF/auth/backend | edge ingress config | NSGW + ns |
| 跨组织分享 | ShareOffer/Binding | offer/accept/revoke | 双边交集、租约 | shared resource lease | 两边 NSD/ns |
| Entitlement | Signed snapshot | billing/license update | API/配额/编译检查 | feature/quota status | NSD/NSGW;非客户端自报 |
所有下行事件包含稳定 deployment、Organization/Network 作用域、类型化目标(Device、Membership、Gateway 或 Client Session)、schema version、config revision、epoch、有效期和签名。Client 本地 Profile ID 不进入线协议。消费者必须:
ns每个阶段都交付可使用的纵向闭环,不以“数据库表建好了”作为退出条件。
跨仓库依赖、合并顺序、环境和 Definition of Done 见实施蓝图。
验收:空数据库可完成首个 Organization、首个 Network 和首台 Device 注册;Next 不读取旧 NSIO 状态或连接旧协议端点。
ns,先完成 L4 闭环ns 运行时,不建立消费端/发布端二进制角色;ns 和 App 既能访问 Service,也能发布 Service;services.toml、App 和 CLI 统一进入 Local Manifest;验收:一台用户电脑通过 App 发布本地 Web,另一台电脑被授权后打开;禁用 Grant、停发布、后端离线和读取失败状态全部准确。
验收:个人不进控制台完成首台设备;Google/GitHub 不要求先填邮箱;App 不接触密码;邀请成员不重建已有 Node/Service;普通 logout 不断数据面;SCIM 离职在 SLA 内收敛且公司 Device 保留。
验收:两台设备在 LAN、普通 NAT、CGNAT、双 symmetric NAT 和 UDP 封锁下按名称互访;无 Grant 不可见不可达。
验收:企业关闭横向 L3,仅按组开放 Git Service 和一个 SaaS 域名;离职/撤销在 SLA 内生效。
验收:不购买 NSGW 的个人仍可完成 L3/L4;购买后只出现被授权能力,关闭增值能力不破坏普通节点和服务访问。
ns runtime、签名 artifact、灰度更新、企业托管和完整卸载;详细规格见发行生命周期、采购计费、服务运营、备份恢复和信任合规。这些工作与 M1-M5 并行启动,不能等网络功能完成后再补。
验收:五平台从安装到卸载不会破坏网络;首个付费订单可追到 entitlement;一次区域事故和一次空环境恢复完成;导出/删除/Hold 不互相误判。
| # | 用户旅程 | 成功标准 |
|---|---|---|
| 1 | 新个人用户登录并连接首台设备 | 可直接选择邮箱密码、Google 或 GitHub;三分钟内获得 Node IP/DNS,不进入控制台 |
| 2 | 第二台设备登录 | 可按短名 Ping/SSH;直连失败自动 Relay |
| 3 | 个人收紧 ACL | 只允许指定节点端口,其他端口双端拒绝 |
| 4 | 个人邀请成员并升级团队 | Organization/Network/Node IP/Service ID 不变化 |
| 5 | 企业邀请/SSO 员工 | 登录成功但设备未批准时不可访问,状态准确 |
| 6 | 服务器 Enrollment | key 过期/超次数/越权 capability 被拒绝 |
| 7 | App 发布本地 Service | 本地确认、NSD 审批、授权消费、停用完整闭环 |
| 8 | NSD 请求用户设备发布 | 用户拒绝后没有 Endpoint,且有审计 |
| 9 | 受管服务器自动发布 | 只在派生的本地 ManagedConfigAuthorization 范围内接受,越界 fail-closed;本地撤销后回落待确认且旧 revision 不能恢复 |
| 10 | 访问远程白名单 SaaS | 目标看到连接器/NSGW 固定公网 IP |
| 11 | Subnet Router | Capability 未批准不启用;批准+Grant 后双端可达;Connector 不能转发到 Route 外目标;撤销后移除 |
| 12 | 自定义域名 TUN 访问 | split DNS 命中 Service VIP,TLS Host/SNI 保持 |
| 13 | Gateway Exit 首次选择 | 标准连接可用、候选选择、重连、IP 改变、关闭恢复 |
| 14 | Exit 投影失败 | 按 capture 事实阻断/提示,不自动静默本地直出 |
| 15 | Gateway Egress | 仅目标 Service 经网关,其他服务和公网不受影响 |
| 16 | Public Ingress | 只能绑定已有 Service;六种 Edge Auth 可执行;按身份撤销长连接;停入口不删除内部服务 |
| 17 | 跨组织 Service Share | 双边确认、最小目录、任一方撤销生效 |
| 18 | NSD/存储读取失败 | 显示故障并保留有效缓存,不出现假空列表 |
| 19 | Tailscale/企业 VPN 共存 | 冲突具体可见,不抢外部 route,关闭 NS 可恢复 |
| 20 | 设备/用户离职 | ownership 先转移,Membership/Grant 在 SLA 内撤销 |
| 21 | 身份生命周期 | logout、解绑、SCIM 离职、Device 撤销结果各自准确;会话过期默认不断隧道 |
| 22 | App 与独立 ns 共存 | App/CLI 连接同一 daemon,升级不启动第二个 TUN/runtime |
| 23 | 客户端升级与卸载 | 灰度可暂停;中断可恢复;卸载后 helper/route/DNS/driver 无残留且公网正常 |
| 24 | 移动端商店发布 | entitlement/declaration、App 内披露、真机 VPN 和商店审核材料一致 |
| 25 | 个人升级付费 | 订单只扣一次,发票可查,entitlement 激活失败可对账且不重复扣款 |
| 26 | 企业报价与降档 | Quote/SLA 受控;降档显示影响,不删除存量资源或伪装安全撤销 |
| 27 | 托管区域故障 | 客户端、状态页、支持和 SLA bucket 对同一服务/区域给出一致事实 |
| 28 | Hosted/Self-hosted 恢复 | 从空环境恢复,旧授权/删除对象不复活,RPO/RTO 有真实记录 |
| 29 | 导出、注销与 Legal Hold | 导出完整性可验证;Hold 只保留覆盖数据;删除失败不误报成功 |
| 30 | 多 OS 用户与开机恢复 | B 无法看到或控制 A 的 runtime;切换到 B 前撤销 A 的系统网络投影;冷启动时 user-owned 等待 owner、managed-device 无人值守恢复;管理员 reset 不冒充远端 revoke |
| 31 | Route 策略 generation | additive 无过宽窗口;restrictive 按 security-first/bounded-drain 精确收敛;新旧目的地不 union |
| 32 | Capability 生命周期 | suspended 仍占额度、unavailable 不改授权、revoked 才释放且恢复需重新申请 |
| 33 | PolicyKernel 升级 | 同地域 shadow diff、确认/canary、新 effective revision 与完整 provenance 可追踪 |
先登录。系统自动给首次用户一个真实但 UI 称为“个人空间”的 Organization 和默认 Network。个人升级团队/企业在同一 Organization 内改变商业能力,不新建或重建资源;只有明确需要独立边界时才另建 Organization。
不必须。邮箱密码登录才填写邮箱和密码;Google、GitHub 直接进入各自流程;只有用户主动选择“企业 SSO”后,才输入企业邮箱或组织域名用于发现企业 IdP。App 始终打开系统浏览器,不接触密码。Passkey 主登录属于后续 Connector。
能。个人默认用简单模板,但底层和企业使用同一 Grant 引擎,可以控制节点、端口、服务、分享、Route 和 Exit。套餐限制治理与托管资源,不移除基础安全能力。
是。桌面和移动端默认 TUN/VPN API,Linux 服务器可选内核 WireGuard。Next 可选提供本地 Proxy 服务访问模式,但它不承担 L3 节点组网。
ns.io 域名吗?连接后使用 Node IP、短名或 <node>.<network>.<org>.node.ns.io。域名由按授权下发的 split DNS 解析,不公开泄漏节点目录。
机器只有一个 Node IP/Node 名;每个 Service 有独立 Service ID、Service VIP 和 <service>.<network>.<org>.svc.ns.io,因此可以做服务级 ACL 和多后端。
ns 上报吗?是。统一 ns 从本地 manifest 上报签名声明。NS App、CLI、services.toml 只是不同编辑入口,最终共用一份本地权威。
能下发发布请求或受管 desired manifest,但用户设备必须本地接受;受管服务器也只能在注册时派生且尚未被节点撤销的 ManagedConfigAuthorization 范围内自动接受。NSD 可以禁用远端可达性,不能凭空扩大本地发布范围。
不必须。默认 TUN 通过 split DNS 把内部自定义域名解析到 Service VIP;Proxy/PAC 是平台支持时的可选服务数据面。公网访问使用 Public Ingress。
不会共用授权语义。Node Grant 控制节点/端口,Service Grant 控制独立 Service;两者可以共用 TUN 和加密传输。企业可以关闭横向 L3 但继续开放 L4 Service。
能。基础 L3 使用直连和免费/社区 Relay,基础 L4 由节点发布。NSGW 增加区域/SLA、固定 IP、Ingress、Egress 和 Exit,不是基本连接开关。