本文是 NSIO Next 的功能分解索引和实现预演基线。它回答“产品最终有哪些能力、每项能力由谁负责、用户怎样操作、失败与撤销怎样闭环”,并把一个营销名称拆成可独立失败、可独立撤销和可独立验收的子能力。
本文不替代专项协议:对象与信任边界以架构为权威,交互旅程以产品闭环为权威,控制对象状态/API 以控制资源生命周期为权威,建流/凭据/传输以数据面协议为权威,逐功能证据状态以功能闭环总账为权威。本文发现冲突时必须先修上层权威,不能用矩阵掩盖矛盾。
每个功能在进入实现任务前必须回答以下问题:
| 维度 | 必须有的答案 |
|---|---|
| 使用者 | 谁看到入口;谁没有入口 |
| 前置事实 | 发起时必须已经拿到什么,不能依赖尚未建立的连接或缓存 |
| 权威对象 | 最终事实保存在哪里,revision 和幂等边界是什么 |
| Policy | 使用四个既定策略平面中的哪一个;没有策略时默认什么 |
| Projection | 哪些最小事实发给哪个执行者 |
| Runtime | 最终由 ns、Connector 或 NSGW 在哪里执行 |
| 状态 | 用户能否区分授权、批准、可用、投影、运行和读取新鲜度 |
| 失败 | 保留旧事实、回滚、阻断还是重试;不能把什么状态误报成什么 |
| 撤销 | 谁能撤销,新流和在途流多久失效,离线节点怎样收敛 |
| 审计 | 谁、以什么证明、对什么对象、产生什么结果 |
| 商业 | Entitlement 只控制准入/额度,不能替代哪条安全授权 |
| 验收 | 正向、反向注入、跨平台和真实网络证据是什么 |
任何一项只能“创建”但不能变更、暂停、撤销、删除和恢复,或只在成功态有 UI,都不算闭环。
| 产品 | 官方能力事实 | NSIO 吸收的原则 |
|---|---|---|
| Tailscale | Route injection 与 Grants 是不同层;两者同时成立才可转发 | Route 批准/安装不等于 Route AccessGrant,UI 分别展示 |
| Tailscale | Netmap trimming 只下发通信所需 peer;Tailscale Services 把稳定 VIP/name 与多后端 host 分开,host 仍需批准 | ns 只获最小 peer material;Service 与 Endpoint 分离,Endpoint 逐实例批准与健康 |
| Tailscale | Auth Key 可 ephemeral/reusable/pre-approved/tagged;Tailnet Lock 让客户签名节点 key | 人类设备不用 Enrollment Key;服务器 Key 有能力上限;高安全 Network 预留客户签名 Node Key |
| ZeroTier | 控制器签名规则、tag 和 capability,并在通信两端本地执行 | NSD 不进入建流路径;源端快速拒绝,目标端/Connector 最终校验签名材料 |
| NetBird | 用户组与基础设施 peer 组需要概念分离;默认全互通利于演示但破坏零信任;Control Center 展示 effective access | User Group 与 Machine Tag 分开;个人仅默认 self,企业默认拒绝横向;Effective Access 复用生产编译结果 |
| Twingate | Resource、Group、Security Policy、Device Profile 和 Service Account 分层;资源可设置前台/后台可见性 | Service 展示模式不是授权;人类 assurance、设备 posture、MachinePrincipal 凭据分别建模 |
| Cloudflare Access | Human Allow、Service Auth 与 Bypass 不同;Bypass 会跳过 Access 控制与日志 | NSIO 不提供“无日志 Bypass”;公开路径使用显式 Anonymous,仍保留 TLS/WAF/限流/审计 |
| Cloudflare One | Route 可绑定不同 virtual network 处理重叠地址;Access 可按 path 建独立应用 | Network 是路由隔离域;公网 path 是明确 PublicApplication 边界,不靠规则顺序猜继承 |
官方参考:
| 层 | 权威对象 | 回答的问题 |
|---|---|---|
| 身份 | Account、ExternalIdentity、User、MachinePrincipal、ExternalPrincipal | 是谁 |
| 管理边界 | Organization、Network、OrganizationMembership、NetworkMembership | 属于哪里、在哪个信任域 |
| 终端 | InstallationContext、Device、NodeMembership、NodeKey、EndpointCandidate | 哪台安装、哪份设备身份、哪个网络节点 |
| 资源 | Node、Service、ServiceEndpoint、Route、ExitProfile、PublicApplication | 访问什么 |
| 策略 | AccessGrant、CapabilityPolicy、EdgeAuthPolicy、AdminRoleBinding | 谁能访问、申请、外部访问或管理 |
| 工作流 | EnrollmentRequest、CapabilityActivation、PublicationRequest、AccessRequest、Approval | 是否已证明、批准或等待处理 |
| 运行 | Projection、Lease、FlowCredential、RouteGeneration、IngressBindingLease | 执行者当前可相信什么 |
| 商业 | EffectiveEntitlement、QuotaUsage、Reservation | 能否准入和占多少额度 |
Device、Node、Service、Membership、Principal 不能因 UI 简化而合并。显示名、hostname、邮箱和客户端自报 tag 不是授权主键。
产品不得用一个 active 覆盖以下事实:
| 轴 | 典型值 | 说明 |
|---|---|---|
| user_intent | off / on / required | 用户或受管策略想不想启用 |
| identity | unknown / authenticated / reauth_required | 人类/机器证明是否有效 |
| entitlement | entitled / limit_reached / not_entitled / read_failed | 商业准入事实 |
| authorization | allowed / denied / evaluation_error | Policy 事实 |
| approval | not_requested / pending / approved / rejected | 工作流事实 |
| activation | inactive / active / suspended / revoked | 能力是否被激活 |
| availability | ready / degraded / unavailable | 承载者健康事实 |
| projection | absent / pending / applied / outdated_applied / failed | 配置交付事实;outdated_applied 表示仍在执行已被更新 revision 取代的旧投影 |
| runtime | stopped / starting / ready / blocked / failed | 本地执行事实 |
| freshness | fresh / stale_valid / expired / read_failed | 当前展示是否来自权威新数据 |
读取失败不是 denied,离线不是 revoked,配额不足不是 unauthorized,daemon 存活不是 connected。Client 必须保留这些区别。
三种“看见”必须分开:
requestable 的最小资源占位;requestable 占位不含 VIP、Endpoint、IP、backend 或 peer key。控制台不能把“编译器给 runtime 的最小验签材料”直接当成员目录返回。
图例:A 权威,C 编译/签发,E 最终执行,U 用户交互,O 观测/运营,T 独立验收。
| 子能力 | Shared | NSD | ns | Client | NSGW | QA |
|---|---|---|---|---|---|---|
| 登录协议/会话 | schema/error | A | Device proof | U | - | T |
| MFA/step-up | claims | A/E | fresh proof binding | U | Edge claim E | T |
| 外部 OIDC/SCIM | claims | A | - | admin U | - | T |
| MachinePrincipal/OAuth client | credential schema | A/issue | workload use | admin/CLI U | verify scoped token | T |
| Organization/Network | ID/revision | A | Profile consume | U | tenant scope | T |
| User/Group lifecycle | selector schema | A | projection only | U | - | T |
| Cross-Organization Share | share schema | resource/consumer A + C | short lease E | U | scoped E | privacy T |
| Admin roles | action matrix | A/E | - | U | - | negative T |
| Enrollment request/grant | state/schema | A | key proof/commit E | U | gateway variant E | fault T |
| Device ownership/posture | posture schema | A | collect/attest | U | optional consume | T |
| Node identity/IP/name | netmap/DNS | A/C | E | U | relay only | T |
| L3 AccessGrant | AST/projection | A/C | source+target E | U | relay opaque | negative T |
| Endpoint discovery/path | candidate schema | coordinate | E | status U | relay E | NAT T |
| Node DNS | DNS projection | A/C | E | status U | - | platform T |
| Local Service Manifest | manifest schema | upper-bound check | local A/E | U | - | T |
| Service identity/catalog | service schema | A/C | consume/publish E | U | scoped E | T |
| Endpoint health/HA | health schema | select/C | report/E | status U | optional endpoint E | T |
| Service AccessGrant | flow schema | A/C | source+publisher E | U | scoped E | negative T |
| Capability application | policy/activation | A/C | request/report E | U | request/report E | quota T |
| Subnet/Domain Route | route/generation | A/C | client+connector E | U | optional connector E | conflict T |
| Base Relay | lease/token | A/C | client E | status U | E | NAT/capacity T |
| Gateway Egress | service/lease | A/C | consumer E | U | E | target T |
| Gateway Exit | profile/selection | A/C | capture/E | U | E | leak T |
| PublicApplication | edge schema | A/C | backend E | admin U | E | exposure T |
| EdgeAuthPolicy | edge claims | A/C policy config | - | admin/visitor U | local final E | method T |
| API/IaC | OpenAPI/schema | A/E | CLI consumer | U | gateway API E | contract T |
| Audit/flow logs | event schema | A | local redacted O | U | edge/flow O | privacy T |
| Entitlement/quota | bundle/schema | A/E | display only | U | lease E | downgrade T |
| Update/uninstall/recovery | manifest/journal | coordinate | A/E local | U | E local | native T |
| Procurement/billing | commercial schema | entitlement consume | - | Billing U | metering O | reconcile T |
| Data export/delete | job/schema | A/orchestrate | local revoke E | U | tenant purge E | restore T |
一项能力不能出现两个 A。NSGW 对 session 的最终执行不使其成为租户策略权威;ns 对 Local Manifest 的本地权威不允许它自行创建远端 Service 授权。
| 模块 | 只负责 | 完成门 |
|---|---|---|
| identifiers | typed opaque ID、scope、解析 | 跨 Organization/Network ID 不能误用 |
| envelopes | version、revision、issued/expiry、signature | 真实 serializer 对 schema;回滚/过期/未知 major 反测 |
| policy AST | selector/action/constraint/provenance | canonical digest 跨语言稳定 |
| errors | code、retryable、operation、details | 不解析 message;所有表面保留 code |
| capability manifest | 各协议面版本区间/feature | 只协商、不降低安全基线 |
跨团队不能把本矩阵中的 flow schema、lease/token 或 E 当作待实现者自行补全的占位符。所有 Relay、ServiceFlow、RouteFlow、Egress、Exit 和 Ingress backend 都必须填满数据面协议的六要素矩阵;所有 Group、Role、AccessRequest、Activation、MachinePrincipal、Posture、Publication、Share/Federation 和 key rotation 都必须使用控制资源生命周期的状态/API。
| fixtures | 正向/反向/演进样本 | Producer 与 Consumer 共用但不自洽造假 |
Shared 不定义数据库模型或 UI 文案,不引入“万能状态”。每个协议面的版本独立,跨面依赖用 feature discovery 表达。
| 模块 | 权威/职责 | 主要依赖 |
|---|---|---|
| identity | Account、ExternalIdentity、session、assurance | 外部/内置 Identity Authority |
| directory | Organization、Membership、Group、Role | identity |
| enrollment | Request/approval/grant/commit、Device/Membership | directory、quota |
| network | Network、IP/DNS lease、Node lifecycle | enrollment |
| policy_kernel | selector/condition/provenance | directory、resource snapshot |
| access_compiler | AccessGrant → 最小双端投影 | policy_kernel |
| capability_controller | request/Activation/Lease/quota | entitlement、resource controller |
| service_controller | Service/Endpoint/health/catalog | capability + compiler |
| route_controller | Route/Connector/generation/conflict | capability + compiler + DNS |
| gateway_controller | Relay/Egress/Exit candidates/config | capability + compiler |
| edge_control | PublicApplication/EdgeAuth/Binding config | Service + gateway |
| projection_service | snapshot/delta/ACK/expiry/rollback | all controllers |
| entitlement | signed bundle/head/quota/reservation | commercial issuer |
| audit_outbox | audit/security/webhook/notification | every write transaction |
这些模块可以部署成一个服务或拆分进程,但权威与事务边界不随部署拓扑变化。任何 controller 都不能直接写另一模块表来绕过其事务。
ns 内部模块| 模块 | 职责 | 不得做 |
|---|---|---|
| identity_store | org-scoped Device Key、Node/WG/staging key | 跨 Organization 派生/复用 |
| enrollment_client | 请求、轮询、commit、恢复 | 自己决定 Policy/Quota |
| control_client | authenticated stream、snapshot/delta/ACK | 把断线当撤权 |
| projection_store | 验签、单调 revision、最后有效缓存 | 接受回滚或空失败 snapshot |
| runtime_owner | local peer credential、owner switch | 信任 username/self-reported UID |
| tun_engine | IP packet、route capture、flow dispatch | 重新判定租户目录 |
| dns_engine | split DNS、origin bypass、cache | 把所有 DNS 交给 NSD |
| path_manager | endpoint/P2P/Relay/roaming | 用路径改变授权 |
| l3_enforcer | Node 双端 rules | 只做源端检查 |
| service_runtime | VIP/proxy/frontend/manifest/endpoint | 远端突破 manifest |
| connector_runtime | Route credential/NAT/target whitelist | 建流回查 NSD 或任意转发 |
| exit_runtime | capture/guard/selection/readiness | 失败后静默本地直出 |
| local_api | App/CLI/helper 命令与状态 | 绕过 runtime owner/version |
| lifecycle | install/update/journal/uninstall | 未恢复网络先删程序 |
Client 使用一个领域状态层承接结构化结果:auth/enrollment、connection、directory、publisher、exit、admin、billing、diagnostics。页面只能发 command 和渲染 view state;不能在 Widget/Controller 中实现 Group 展开、CIDR contains、supports_scope、effective access 或路由冲突。
每个异步操作有 operation ID、阶段、取消边界和互斥范围。会改变 runtime 的流程禁用冲突按钮,但不冻结无关页面;App 被杀后从 daemon/NSD 权威恢复,不靠内存补写成功状态。
| 模块 | 职责 | 隔离边界 |
|---|---|---|
| identity/lease | Gateway key、attestation、Capability Lease | 每 capability/tenant audience |
| config_runtime | staging、health、atomic activate、drain | revision 独立,不共享失败 |
| relay | opaque encrypted frame、fairness、WSS | 无 Service/Grant 目录 |
| egress | Service-bound origin connect、fixed IP | 无任意 CONNECT |
| exit | profile/scope/NAT/source lease | 无 Service 权限 |
| ingress | TLS/listener/WAF/backend binding | 只访问绑定 Service |
| edge_auth | OIDC/key/token/mTLS/signed URL/anonymous | 不创建 Membership |
| session_index | long-flow revoke | 按 app/policy/identity/credential |
| metering | durable usage event/outbox | 不判断 SKU/价格 |
QA 维护跨仓库版本矩阵、真实序列化契约、故障注入代理、NAT/UDP/WSS 网络实验室、Windows/macOS/Linux/iOS/Android 真机、外部 VPN 冲突环境、长连接测试应用、计费/身份 provider sandbox 和证据归档。
单仓库 green 不能替代 Slice green。每个版本发布必须记录 Shared/NSD/ns/Client/NSGW commit、协议 capability、测试环境和已知范围。
首版托管登录方式:邮箱密码、Google、GitHub、企业 OIDC。App 不放密码表单,只用系统浏览器 Authorization Code + PKCE。Web 控制台和 Member Portal 使用同一 Identity Authority;登录成功不等于 Device 已注册。
| 场景 | 交互 | 结果 |
|---|---|---|
| 首次个人登录 | 选择任一登录方式 | 原子创建 Account、Personal Organization、默认 Network 和安全模板 |
| 已有邮箱改用社交登录 | 先登录原账号,再绑定 | 不按邮箱静默合并;冲突显示原登录方式 |
| 企业 SSO | 输入组织域/使用邀请 deep link | 选择 Federation Binding,按 invited/JIT 策略创建组织成员 |
| App 回调 | 浏览器返回 loopback/App Link | 建 App 会话,随后单独开始 Enrollment |
| 无头有人 CLI | Device Code 页登录、核对指纹/短语 | 绑定真人 proof,不把节点变成无人值守服务账号 |
| 无人值守 | Enrollment Key | 创建 MachinePrincipal/managed membership,不建立人类会话 |
登录 assurance 与资源授权分开。AccessGrant 可声明 min_assurance、reauth_within 和 posture 条件,但执行方式必须符合数据面:
reauth_within 约束 peer lease/新流凭据签发;过期后阻止新流并在 Client 显示需要重新认证;已有流按 Grant 的 revoke/drain 策略处理;Client 必须把“身份需要重新验证”与“管理员没有授权”分开显示。
| 动作 | 会话 | Organization Membership | Device/Node |
|---|---|---|---|
| 普通 logout | 撤当前会话/token family | 不变 | 数据面默认不变 |
| 解绑一种登录方式 | 撤该 identity 建立的会话 | 不变 | 不变 |
| 组织 suspend | 撤该组织会话 | 暂停且停止续租 | 组织资产保留 |
| SCIM deprovision/确认离职 | 撤该组织全部会话 | revoke | 用户设备失去该组织;公司设备可重分配 |
| Account 删除 | 完成所有组织影响预览 | 按逐组织退出/转移流程 | 不误删已转移企业资产 |
撤销 SLA 默认不超过 5 分钟,由 peer/flow lease TTL 与 projection delivery 共同保证。
控制 API 的非人类调用统一使用 Organization-owned MachinePrincipal:
边缘 API Key 是 PublicApplication 的访客凭据,不可调用租户控制 API;Enrollment Key 只注册设备,也不可调用控制 API。
首次用户不需要先创建 Organization。Personal Organization 是真实租户,只在 UI 隐藏术语。邀请成员、升级套餐、配置 SSO 时继续使用同一 Organization/Network/Node IP/Service ID/Grant;只有账单、法律或安全边界确实独立时才新建 Organization。
Network 是地址、DNS、Membership、Grant 和路由冲突域。一个 Organization 可有多个 Network;首版一个 runtime Profile 同时只激活一个主 Network,不把多个 Network 自动桥接。切换前显示将撤销和安装的 DNS、route、Exit 与本地系统权限影响。
| source | 编辑规则 | 适用场景 |
|---|---|---|
| manual | NSIO 管理员维护成员 | Personal、小团队、临时项目 |
| directory_synced | 只由 SCIM/IdP 外部 ID 更新,控制台只读 | 企业部门/岗位 |
| dynamic | 由受控表达式和权威用户/成员 claims 计算 | 部门、地区、合同期限等后续场景 |
约束:
| 角色 | 核心权限 | 明确没有 |
|---|---|---|
| Owner | 租户生命周期、Owner 转移、最高风险设置 | 不能绕过数据面 Grant |
| Admin | 日常全局管理 | 不能删除最后 Owner、读取 secret |
| Network Admin | Network、DNS、Route、Gateway、Access | Billing、身份 Provider secret |
| Security Admin | Grant、posture、审批、撤销、审计 | Billing、平台运维 |
| IT Admin | User、Group、Device、Enrollment、更新策略 | Grant 内容、Billing |
| Service Publisher | Service/Endpoint 与批准范围 | User、Route、Public Edge |
| Edge Admin | PublicApplication、EdgeAuth、证书/WAF | 内部 Node Grant、Billing |
| Billing Admin | 套餐、付款、发票、采购 | Network secret、策略修改 |
| Auditor | 只读配置、effective access、审计导出 | 任何写操作 |
| Member | 自己的 Device、目录、允许的发布请求 | 租户管理对象 |
角色是起始模板,持久化使用 resource/action/scope 明确的 AdminRoleBinding。用户不能自行提高角色;高风险权限变更需要 step-up、影响预览和审计。
JIT 访问是 AccessGrant 的工作流,不新增第五个执行策略平面:
authorized_only,未授权成员不可见;管理员可设 requestable 并配置最小展示、eligible selector、最长时长、审批人和是否要求理由/ticket;AccessRequest,服务端重新求值 eligible 条件并进入 pending/approved/rejected/expired;not_after 的独立 GrantSet revision,正常进入 Compiler、projection、audit 和撤销;个人产品可隐藏 JIT;企业按 Entitlement 开启审批、ticket 与最长时长治理,但基础 time-bounded Grant 语义保持一致。
外部合作优先分享一个 Service,不把对方加入整个 Network。资源方创建 ShareOffer,接收方接受后创建 ShareBinding;有效权限始终是资源方 Grant、Offer 范围、接收方主体/姿态 Binding 和有效期的交集。
首版不让 Service Share 隐式创建跨组织 Node 或 Route。跨组织 Node 分享与 Network federation 是后续独立高风险能力,必须重新做 L3 信任面和路由冲突评审。
Network 关闭不是数据库级联删除,而是权威 NetworkClosureRequest:
network.delete 的管理员可发起,提交前 step-up;revoking 后冻结该 Network 的新 Enrollment、Grant、Activation、Share 和 Lease;resource_closing/resource_revoked 事件,接收方保留 tombstone 和审计,不把读取失败显示成“从未分享”;address_quarantine 时 active Network quota 可释放;Managed Resource 等配额只在对应 Activation revoked 后释放。隔离地址属于内部安全保留,不继续向客户计活动资源;deletion_failed,显示已完成与未完成对象、可重试动作和 request ID,不回滚已经生效的安全撤销。Organization 删除是对全部 Network closure、Organization-level identity/Share/Edge/Billing/data workflow 的编排,不是另一套直接级联。所有 Network 至少到 address_quarantine、外部 Share 已失效、托管 NSGW tenant config 已清理后,才删除 active Organization 数据;发票、Legal Hold、备份过期和法定审计按信任与数据权利独立收口。
一台物理安装在每个 Organization 中有独立 Device Key 和 Device 对象;加入一个 Network 才创建 NodeMembership、Node IP 和 Node Key。同一 Device 可加入同组织多个 Network,但每个 Membership 有独立地址、key、Grant 和状态。
管理员识别设备依赖已验证 owner、注册方式、Device Key 指纹、平台 attestation、序列号/MDM ID(若有)和首次/最近活动;hostname 只作为显示建议,不能证明“是谁的设备”。
| 设备类型 | Proof | 默认 owner | 审批建议 |
|---|---|---|---|
| 个人桌面/手机 | 浏览器登录 + Device Key | user | Personal 自动,企业按策略 |
| 有人操作的 Linux | Device Code + Device Key | user | 生产 Network 可禁用或告警 |
| 公司 MDM 设备 | 组织 Enrollment + attestation | organization,assigned user 可变 | 自动或 IT 审批 |
| 服务器/容器 | scoped Enrollment Key | organization/MachinePrincipal | 能力 ceiling 内自动注册,能力仍逐实例审批 |
| ephemeral CI | one-use ephemeral Key | MachinePrincipal | TTL 到期自动移出 active peer map |
Enrollment 完成只创建身份与 Membership,不自动创建 Node/Service/Route AccessGrant。Personal 默认模板的 self 是显式普通 Grant revision。
| 动作 | 产品结果 |
|---|---|
| rename | 改显示名/DNS alias,不改 Device ID、Node IP 或授权 |
| reinstall | 新 Device Key;管理员可确认替换旧 Device,不能仅凭 hostname 自动接管 |
| lost/stolen | revoke Device/Membership、停止租约、轮换受影响 key;不删除 User |
| quarantine | 保留 inventory 和审计,只允许修复/更新/重新认证最小通道,不允许普通资源流量 |
| dormant | 长期离线移出活跃 peer map但不吊销身份;重新认证后可恢复 |
| reassign org-owned | 预览旧 principal 权限,撤旧 Membership/会话,轮换 key,再绑定新操作者 |
| delete | 影响预览 Service/Route/Share;先转移或停用派生资源,再 tombstone |
Device suspend、posture fail、Node offline、key expired 是不同事实,不能都显示“设备离线”。
Posture 输入只接受平台 attestation、ns 可验证平台事实、MDM/EDR Provider 和管理员映射后的 claim。每条信号包含 source、observed_at、expires_at、confidence/verification 与 stable reason。
高安全 Network 可启用客户控制的 Node Key 签名/透明日志能力,使控制面不能单方面插入新 peer;该能力是 Device admission 的附加验证,不替代 Enrollment 和 AccessGrant。
连接后用户通过短名、Node FQDN 或 Node IP 访问节点。Nodes 页面只列:本人节点、可主动访问的节点、明确分享给本人的节点;仅因目标端入站校验而下发的源 peer material 不出现在可访问列表。
Node 详情显示被允许的协议/端口摘要,并只提供真实可用动作:
| 动作 | 出现条件 | 行为 |
|---|---|---|
| Ping | ICMP Grant | ns ping 优先给出 direct/relay 路径诊断 |
| SSH | TCP/22 Grant | 打开系统 SSH/复制命令;首版不声称托管 SSH 身份 |
| RDP | TCP/3389 Grant | 打开系统 RDP 客户端 |
| Copy address | 至少有一个可用 L3 action | 复制 FQDN,详情可复制 IP |
| Request access | 存在 requestable 占位 | 进入 JIT 工作流,不泄露 peer key/IP |
身份感知 SSH、临时 UNIX 用户、会话录制和数据库凭据代理属于后续 privileged access 产品,不能把“打开本机 ssh 命令”营销为已实现这些能力。
AccessGrant connect 可限制 ICMP、TCP/UDP 和端口。源端用于快速拒绝,目标端最终执行;Relay 只校验路径 token 和转发密文。未授权目标不进入源端可用 peer map,伪造目的 IP/公钥仍在目标端失败。
路径状态:direct_lan、direct_wan、relay、wss_relay、no_path。路径变化不改变授权。Client 用“直连/中继/受限网络”表达,不要求普通用户理解 STUN、candidate 或 WireGuard endpoint。
A → B tcp/22 不自动产生 B → A tcp/22。B runtime 会得到验证 A 入站所需的最小材料,但 B 用户不能因此主动访问 A。若产品模板需要互访,应显式创建双向 Grant 或两个规范化方向。
| 资源 | 稳定名称 | 解析结果 |
|---|---|---|
| Node | <node>.<network>.<org>.node.ns.io | 当前 Network Node IP |
| Service | <service>.<network>.<org>.svc.ns.io | Service VIP |
| 自定义内部域名 | git.corp.example | Service VIP 或受控 Route |
| PublicApplication | app.example.com[/path] | NSGW Public Ingress |
短名仅在当前 Network 内解析。同名 Node 与 Service 时短名 withheld,Client 要求使用 FQDN并显示冲突对象;不能随机命中。
ns 只为当前 Profile 接管明确 zone/record,不将所有 DNS 强制送入 NSD。NSD 编译当前主体可见的 Node/Service 记录;本地 resolver 按最具体 suffix 匹配,其他查询走系统原 resolver。
DNS projection 包含 source、revision、TTL、record kind 和 expiry。读取失败保留未过期缓存并标 freshness=stale_valid;过期后不返回假记录。切换 Profile 前先撤旧 zone,再安装新 zone,不能让两个 Network 同名记录做 union。
创建/切换前服务端和 runtime 分别检测:同 suffix 不同权威、Node/Service 短名、VPN 系统 resolver、search domain、Route answer overlap。结果分为 safe、shadowed、conflict、external_owned。conflict 不自动覆盖;用户看到来源和可执行动作。
Service 是稳定逻辑资源;ServiceEndpoint 是一个 ns/NSGW 承载实例;Local Manifest 是发布节点不受 NSD 扩大的本地上限。
发布入口统一写同一份 Local Manifest:App 向导、ns service add、services.toml、受管 desired manifest。NSD 远程请求在 user-owned 设备上必须本地接受;managed device 只能在未撤销的 ManagedConfigAuthorization 范围内自动接受。
| mode | 客户端协议 | 发布端行为 | 可执行约束 |
|---|---|---|---|
tcp | 原始 TCP | L4 forward | port、source、time、posture |
udp | 原始 UDP | L4 forward | port、source、time、posture |
http | HTTP | trusted Service proxy | host/path/method/header size + L4 条件 |
https_terminated | HTTPS | ns/NSGW 终结 TLS,再连 origin | host/path/method + L4 条件 |
tls_passthrough | 原始 TLS | 不解密,保持 SNI | port;可选精确 SNI 仅在受信任 parser 可证时;不能做 path |
硬规则:AccessGrant 含 HTTP path/method 时,Service 必须选择可信 L7 终结模式。原始 TUN TCP 或 TLS passthrough 看不到 HTTP path,NSD 必须拒绝发布不可执行的规则,不能接受后在 UI 声称已保护。
https_terminated 的 user-facing hostname 需要有效证书。NSIO 托管 svc.ns.io 可由部署级内部/公开 CA 自动签发;自定义域名要求 DNS ownership 和 ACME/上传证书。到 origin 的 TLS 有独立验证策略(system CA、pinned CA/SPKI 或明确 insecure-dev),不能复用边缘证书假装验证后端。
目录展示是 Service 元数据,不是新的授权平面:
| mode | 用户体验 |
|---|---|
launchable | Web/可关联客户端服务,显示主“打开”动作 |
listed | 数据库/TCP/UDP,显示地址、端口和命令示例 |
background | DomainService/系统依赖,不出现在普通目录,但仍按 Grant 投影 |
只有已获 AccessGrant 的用户能得到完整目录项;requestable 用户只得到第 5.5 节的最小占位。presentation 绝不能让未授权用户获得 VIP/Endpoint。
同一 Service 可有多个 Endpoint,必须声明相同 frontend contract。Endpoint 单独经历 requested/approved/healthy/draining/offline/revoked;添加 host 不重建 Service ID/VIP/DNS。
默认选择策略为健康优先 + 会话黏性 + region/path cost;可选 round-robin/weighted/region-pinned。HTTP 请求、TCP connection 和 UDP association 是最小调度单位,不在一个流中切 Endpoint。
TUN 与 Local Proxy 共用同一 Service Directory、Flow Credential、Endpoint 选择和目标端校验:
Proxy 入口不接受任意 CONNECT,只接受已授权 Service/DomainService。获得 Service 不获得 host Node 的通用端口权限。
| 动作 | 结果 |
|---|---|
| disable Endpoint | 只停该后端,Service 可由其他 Endpoint 继续 |
| suspend Service | 目录保留状态但不签发新流,Endpoint manifest 保留 |
| retire Service | 撤目录/Flow Lease/DNS,保留 tombstone 和审计 |
| delete local manifest | 停本机 Endpoint,不擅自删除 NSD Service |
| delete Service | 影响预览 Share/PublicApplication/Grant;先解绑或明确级联 |
后端读取失败、NSD 目录读取失败、没有 Grant、全部离线必须分别显示。
| 对象 | 用途 | 例子 |
|---|---|---|
SubnetRoute | 到明确 CIDR 的 L3 访问 | 10.20.0.0/16 |
DomainRoute | 将受控 DNS 结果映射成 L3 路由 | *.corp.example.com |
DomainService | 按 Host/SNI/HTTP 语义访问应用 | git.corp.example.com |
PrivateDnsRoute | 将内部 zone 交给指定 resolver | corp.internal |
ConnectorSet | 同一 Route 的多个承载节点 | 上海两台 Connector |
DomainRoute 是 best-effort IP 捕获,不是严格的应用身份。共享 CDN、DNS 快速变更或同 IP 多域名场景必须使用 DomainService;控制台不能只因用户填写了域名就宣称实现了域名级隔离。
CapabilityPolicy 判断该节点是否可以申请 connector;CapabilityActivation 占受管资源配额并签发 Lease;use_route AccessGrant;“节点已声明”“管理员已批准”“用户已获授权”“Route 当前可用”是四件事,列表和 API 必须分别表示。
客户端投影只包含被授权 Route、精确目标、Connector 候选和短期 RouteAccessCredential。Connector 投影包含 source membership → allowed destination/protocol/port/NAT 白名单。凭据自证并绑定两端 projection digest;Connector 本地验签和判定,建流时不查询 NSD。
任一端缺投影、revision/digest 不匹配、凭据过期或实际目的地越界时不转发。客户端“知道 Route”绝不能令被攻陷客户端访问 Connector 所在网络的其他地址。
同一 ConnectorSet 可有多个已批准实例。选择按 ready、region/path cost、priority 和会话黏性;现有 TCP/UDP association 不在中途迁移,新流避开 draining/unavailable 实例。
snat,远端只需返回到 Connector;preserve_source 仅在管理员提供并验证返回路由时允许;普通成员只看到“企业网络 10.20.0.0/16 · 已连接/暂不可用”,不看到 Connector 私网地址。管理员页面分别列 Route、ConnectorSet、实例健康、授权主体和最近流量;点击某条 Route 可以从任一用户/设备做 Effective Access 模拟。
撤销 Grant 只影响对应消费者;暂停一个 Connector 让新流切到其他实例;撤销最后一个 Activation 先展示会中断的 Route、Service 和 DNS zone。读取故障显示“暂时无法刷新”,不能显示成“没有 Route”。
P2P、community relay、managed relay、dedicated relay 只是同一授权流的传输路径。RelayRouteLease 只允许转发端到端密文,不能获得 Node/Service/Route/Exit 权限;AccessGrant 也不能让一个未分配给该 Network 的 Relay 承载流量。
ns 检查本地投影和 Flow/Route credential;路径发现材料有独立短 TTL。NSD 失联时,未过期 session 可以继续;新建路径只能使用仍有效的授权和候选材料,不能为了“恢复连接”绕过目标端校验。
| 能力 | 捕获对象 | 用户心智 | 最终执行 |
|---|---|---|---|
| Gateway Egress | 一个 Service/DomainService 的连接 | 用固定来源 IP 访问某应用 | Service Grant + Egress Lease |
| Gateway Exit | 默认公网或明确 CIDR 范围 | 把一类网络流量交给企业出口 | Exit Grant + Selection + Capture |
访问 IP 白名单 SaaS 优先使用 Gateway Egress,避免把整机公网交给出口。Exit 不能自动获得 Service 目录,Egress 也不能变成通用 CONNECT 代理。
origin 超出允许目标、DNS 结果变成私网/保留地址、证书失败时该 Endpoint unavailable,不能尝试任意其他目标。需要对方白名单的是 NSGW 的固定公网 IP,不是用户设备或发布节点的公网 IP。
| 轴 | 问题 |
|---|---|
| authorization | 该主体能否使用某 Gateway/Profile/scope |
| selection | 用户/策略选择了哪个出口和范围 |
| availability | Gateway/Profile 当前是否可用 |
| projection | NSD 是否下发了匹配的出口转发证据 |
| capture/runtime | 本机是否已捕获范围内流量且转发 ready |
任何 UI、API 或审计记录都不能压成一个 exit_enabled 布尔值。特别是“有保存配置”不等于“正在使用”,“被授权”不等于“必须使用”。
| policy | 员工交互 | 失败语义 |
|---|---|---|
optional | 用户可在设置中开启并选择出口 | 已捕获后失败保持阻断,用户可明确关闭 |
required_when_connected | 连接该 Network 时必须选可用出口 | 没有 ready 出口则 Network 数据面不建立 |
always_on_required | 受管设备开机守卫,策略锁定不可关闭 | 控制面/出口未就绪时范围内流量保持阻断 |
forbidden | 设置项隐藏或显示由管理员禁用 | 不加载旧 selection,不安装 capture |
策略由 Network/Device policy 决定,用户偏好只在 optional 下生效。策略改变必须预览影响并写审计;从 optional 变 required 不能等同于普通设置同步。
设置页“互联网出口”开关是唯一用户意图源;开启联动 TUN。首次连接先建立可明确展示的标准 TUN 连接,获取已授权候选后弹出单选列表;确认配置后重启为 Exit。取消会恢复原数据面,恢复完成后才提交偏好。
已保存 selection 正常时直接由 daemon 读取并启动;App 的“上次使用”缓存只用于未连接展示,不参与启动或授权。候选失效后不自动替换:连接前已知失效则直接重选;已进入 capture 后出现 mismatch/timed_out 则保持当前事实,并给“重新选择出口”和“关闭出口”两个明确动作。
no_authorized_candidates 是确定状态:optional 用户可明确提示后关闭开关并恢复原数据面;not_ready、read_failed、temporarily_unavailable 保持意图并允许重试,不能伪装成未授权。
Exit scope 必须逐项展示:公网 IPv4、IPv6、CIDR、DNS、private networks。UI 只陈述 runtime 证据:
external_unmanaged:IPv6 由其他 VPN/网络管理,未经过公司出口;macOS/Windows/Linux 与外部 VPN 冲突时默认 fail-closed。兼容策略可允许 external-managed,但本次运行内必须黏性保持,不能在外部 TUN 短暂重启时抢回黑洞路由。
公网发布只能绑定已有 Service:
不能直接填写任意 backend IP/port 绕开 Service 本地 manifest。EdgeIdentity 只描述这次外部访问,不获得 Organization Membership、Node IP、peer map 或横向网络权限。内部 AccessGrant 与 EdgeAuthPolicy 独立;一个应用可同时有内部员工入口和公网访客入口,两边授权互不替代。
| method | 适用主体 | 凭据和绑定 | 用户交互 | 审计主体 |
|---|---|---|---|---|
oidc | 人类员工、合作方 | issuer+subject、audience、session、可选 group/claim | 跳企业/合作方 IdP,回调后建立 Edge session | EdgeIdentity |
api_key | 简单脚本/旧系统 | 高熵 secret hash,绑定 application、scope、expiry | Header 提交;只显示一次 | credential owner + key id |
service_credential | 工作负载 | OAuth client/mTLS/签名交换得到的短 token | 无浏览器,自动轮换 | MachinePrincipal |
signed_url | 临时分享/单对象下载 | path、method、expiry、nonce、可选次数/IP 摘要 | 点击链接 | issuer + anonymous recipient |
mtls | 受管工作负载/设备 | client cert chain、SAN/principal、revocation | TLS 握手 | MachinePrincipal/cert id |
anonymous | 明确公开内容 | 无身份凭据,但仍绑定 application/policy revision | 直接访问 | anonymous + request context |
不提供名为 Bypass 的生产模式。Anonymous 仍执行 TLS、host/path、WAF、rate limit、body/header limits、request audit 和 backend binding;策略或存储故障返回 503,不能因为“无认证”而跳过控制。
API Key 是兼容方式,不是推荐的机器身份:默认最长有效期、最小 scope、可轮换重叠和最后使用时间;高安全应用可禁用。Service Credential 是自动化首选,短期 token 不把 client secret 直接带到每个请求。Signed URL 不能升级为目录浏览权,也不能被换成长期 session。
EdgeAuthPolicy 顺序表达 deny-risk/require-auth/allow 结果,但安全默认仍是无匹配拒绝。条件可引用:应用/path/method、EdgeIdentity、IdP group/claim、认证强度、设备 posture 信号、地理/网络、时间、credential scope 和风险结果。
表单只允许当前 frontend 可执行的条件;高级编辑器保存前调用真实 EdgePolicyEvaluator dry-run。模拟输出匹配规则、身份、条件、结论、kernel/evaluator version 和 provenance;提交时重新计算 digest,不能信任浏览器模拟结果。
任何一步失败保留上一个有效 revision;首次创建失败不留下指向未就绪 listener 的 DNS。
NSGW 会话索引至少支持按 application、policy revision、binding lease、EdgeIdentity、credential、IdP session 定向终止。安全撤销在 SLA 内影响新请求并主动关闭长连接:HTTP 401/403、WebSocket 1008、gRPC UNAUTHENTICATED/PERMISSION_DENIED、raw stream FIN/RST。
| 动作 | 新请求 | 在途请求/流 | 后端 Service |
|---|---|---|---|
| disable credential | 拒绝该凭据 | 终止该凭据会话 | 不变 |
| tighten policy | 按新 revision | 清理不再满足的旧 revision | 不变 |
| suspend application | 全拒绝 | drain 或安全立即终止 | 不变 |
| revoke binding | listener 停止承载 | SLA 内终止 | Service 仍可内部访问 |
| Service unavailable | 502 | 协议化后端错误 | Service 状态保持事实 |
OIDC 页面先显示应用名、请求 Organization、将共享的基本身份信息和返回域名,防止开放重定向和登录钓鱼。无权访问返回企业可配置但不泄露资源存在性的页面;已知登录用户可显示“没有此应用权限”,匿名探测默认统一响应。
Signed URL 过期页面说明链接已过期并允许联系签发者,不提供猜测新 token 的入口。API/机器请求返回稳定 JSON 错误码和 request ID,不重定向 HTML 登录页。
| 表面 | 主要用户 | 职责 |
|---|---|---|
| Desktop/Mobile App | 日常终端用户 | 登录、选择 Network、连接、服务目录、Exit、设备状态 |
ns CLI | Linux/开发者/自动化 | 登录/Device Code、连接、发布服务、诊断、受管运行 |
| Admin Console | 管理员/发布者/审计员 | 成员、Network、Grant、能力审批、应用、账单、审计 |
| Local API | 同机 App/CLI | 受 peer credential 和 runtime owner 约束的运行控制 |
App 和 CLI 是同一 daemon 的控制客户端,不各自启动一套 TUN/WireGuard。单实例锁、owner binding 和操作租约决定谁能控制;系统管理员只能进入 maintenance namespace,不能自动继承当前用户的目录和网络权限。
已有有效 session 时重复注册可由 session + Device Key 签名证明,不强制再次打开浏览器;跨 Organization 必须创建独立 Device Key,并在清晰的 Organization 选择后注册。
有浏览器环境执行 ns up 时打开系统浏览器并用 loopback 回调。无头但有人操作时使用 Device Code:CLI 显示 URL、短码、指纹和校验短语;用户在另一设备登录、选择 Network 并确认;CLI 用 staging Device Key 签名轮询。
无人值守服务器使用单用途/有边界的 Enrollment Key,不使用人的 Device Code。命令必须显式选择 Network、ownership mode、requested capabilities 和 local manifest;默认 server 是 managed_device,但获得 Membership 不自动获得 service_host/subnet_router 等 Activation。
所有命令支持机器可读 JSON、稳定 error code、request ID 和无颜色模式。交互取消不留下正式 Device/Membership,但可恢复 EnrollmentRequest 和 staging key 按 TTL 清理。
Client 只根据下层事实组合页面,不重新实现授权:
| 事实 | 用户状态示例 |
|---|---|
| daemon alive, owner invalid | 后台服务运行中;等待设备所有者登录 |
| authenticated, not enrolled | 已登录;此设备尚未加入网络 |
| grant authorized, target offline | 已授权;目标暂时离线 |
| catalog read failed | 暂时无法刷新服务;保留上次已验证列表 |
| policy compile error | 策略暂时无法应用;旧版本有效至… |
| no grant | 你尚未获得访问权限 |
| protocol unknown | 客户端需要更新 |
connecting 不能只有一个无限旋转状态。每个阶段有来源、超时、取消和重试;超时后显示停在哪一轴,不猜测根因。
资源详情页统一包含:身份/owner、授权、Activation、Availability、Projection、Runtime、依赖、审计和危险动作。列表过滤和详情状态使用同一后端 view,不让列表显示 active、详情显示 unavailable。
删除/撤销必须先做 impact preview;确认框说清受影响用户、节点、Service、Route、Gateway 和现有会话。读失败时禁止把空列表作为影响为零。
owner_inactive,不建数据面;managed_device 按 system identity 无人值守恢复;自动化使用 MachinePrincipal 与 OAuth Client/工作负载身份,不复用 Human User 的长期登录 token。OAuth Client 绑定 Organization、允许 action/resource selectors、环境、owner、expiry 和 rotation policy;换取短 Access Token,审计记录 client 与触发流水线。
首版不把一个无限期 Personal Access Token 作为推荐入口。确需 API Key 兼容时,必须有 scope、expiry、hash-at-rest、一次展示、轮换、last_used、IP/网络条件和明确弃用路径。
资源声明 management_mode = console | api | gitops | local_manifest 和 manager identity。GitOps/API 管理资源在控制台默认只读或通过“接管管理”显式转换;控制台不能悄悄修改后被下一次 reconcile 覆盖。
接管前展示 diff、停止旧 manager lease、提升 revision 并写审计。Local Manifest 是发布节点安全上限,即使 NSD 资源由 GitOps 管理也不能扩大它。
| 类型 | 回答的问题 | 示例 |
|---|---|---|
| control audit | 谁改变了什么 | Grant 发布、设备撤销、套餐变更 |
| security event | 发生了什么风险 | token 重放、钓鱼设备码、异常登录 |
| flow log | 哪个主体连了哪个资源 | Node/Service/Route/Exit allow/deny |
| edge request log | 外部请求结果 | app、EdgeIdentity、status、WAF |
日志有 Organization/Network、actor/principal、resource、action、decision、reason code、policy/projection/kernel/evaluator revision、request/flow/session ID 和时间。默认不记录 payload、密码、token、私钥、完整敏感 URL query。
管理写事务与 audit/outbox 原子提交;审计写失败时高风险写操作失败,不能先改资源再补日志。导出使用独立授权、watermark 和校验哈希;保留期清理、Legal Hold、手动修正配额和归档销毁本身都写不可变审计。
审计详情提供 provenance 跳转:从一次 deny 可查看命中的 Grant/Edge rule、输入 revision、posture、编译器版本和执行组件,但按管理员角色脱敏其他组织/用户信息。
通知只针对可执行事件:邀请、待审批、凭据将过期、设备隔离、Service 全部后端失败、Connector/Exit 无可用实例、策略发布失败、配额阈值、安全事件。每类支持 owner/admin/security/billing 路由、站内/邮件/webhook 和去重窗口。
“管理员后来给了 Exit/Service 权限”可以在已连接客户端观察到从无到有后轻提示一次,但绝不自动启用 Exit、切数据面或打开应用。
用户可生成脱敏诊断包:版本、平台、Profile、状态轴、最近错误码、路由/DNS 所有权摘要、路径和时间窗口。默认排除 key/token、完整成员目录、业务 payload 和无关系统日志;上传前显示内容清单并需用户确认。
管理员远程诊断只能请求采集,user-owned 设备需本地同意;managed device 按预授权策略采集并留审计。诊断读取失败不能被报告为“未发现问题”。
Personal、Team、Enterprise 使用同一套 Organization、Network、Membership、Node、Service、Route、Grant 和 Edge policy。套餐只通过 features、quotas、limits、service_levels 控制能力资格、资源量、托管成本、治理和 SLA;购买不创建 AccessGrant,降档不暗中扩大或删除访问。
CapabilityPolicy 与逐实例 Activation 分工固定:Policy 定义“可以申请什么”,Activation 定义“本实例是否批准”,并承担配额占位、计量、审计和 Lease。auto approval 只是同一事务的一条分支。
单资源准入使用 used + reserved + delta <= limit 的原子条件;缺 quota、投影陈旧、功能不包含和额度已满返回不同错误。Entitlement 激活事务负责 current head、防回滚和 quota projection;注册热路径不选择版本。
批量注册先创建有 TTL 的 QuotaReservation,一次预留 N,再逐设备短事务把 reserved 转 used。默认请求窗口 60 分钟、服务端硬上限 2 小时;接近到期显示未消费数量,结束/到期原子退还差额。SQLite 与 PostgreSQL 语义一致,吞吐不同。
block 只阻止新增/扩大,存量安全流默认不立即切断;not_entitled tombstone,保留 used,不能伪装成 limit=0;| 部署 | Identity/Entitlement | Relay/NSGW | 责任 |
|---|---|---|---|
| NSIO Cloud | 托管登录、签名 entitlement | 托管/专属可选 | NSIO 运维控制面和托管边缘 |
| Enterprise Private | 客户 OIDC/SMTP,离线签名 entitlement | 自建或混合 | 客户掌握数据与升级窗口 |
| Community/Self-hosted | 本地 bootstrap admin/标准 OIDC | 自建基础能力 | 不把本地 license 当不可绕过安全边界 |
协议和安全语义相同;托管价值来自身份治理、区域、容量、固定 IP、合规、支持和 SLA。私有部署的 Google/GitHub 登录需客户自有 OAuth application 或不启用;NSIO 共享 secret 不能覆盖任意客户回调域名。
每个协议面独立版本和 feature discovery;未知 additive 字段按本面规则处理,不能因 Entitlement 版本升级联动 bump 控制面/FFI。Capability Manifest 只用于协商,不能降低 Device Key 绑定、owner authorization、签名、replay 或 MFA 基线。
策略引擎升级先在相同数据驻留边界做 shadow evaluation;确认差异后发布 policy_engine_upgrade,即使策略文本未变也重新投影。运行配置使用 staging/ACK/atomic activate,旧有效版本保留到新版本可证明 ready;安全回滚不能越过已接受单调 revision。
免费注册不要求付款方式。自助购买和企业 Quote/PO/Invoice 最终都只产生可追溯的 Effective Entitlement revision;支付状态不直接创建 Grant。付款成功但能力尚未激活显示处理中并对账,不能重复扣款。
支持系统通过用户授权的诊断包、request ID 和脱敏租户视图排障,不能借 Platform Admin 身份越权进入客户 Network。客户可分别执行 Organization 导出、账号注销、Subscription 取消和 Organization 删除,这四者不是同一动作。
Organization 删除走 step-up、影响预览、可选导出、撤 Membership/Grant/Lease、关闭 Edge、等待期、active data 删除、backup expiry 和 completion report。Legal Hold 只保留明确覆盖的数据;删除失败列出未完成数据集,不显示成功。灾难恢复后以 restore epoch、防回滚水位和删除 tombstone 防止已撤销身份/资源复活。
本节不是教程,而是架构可实现性检查。每个场景都列出权威事实、执行点和收口;任一步依赖尚未存在的后续对象即判定不闭环。
User 和 Personal Organization/默认 Network 创建;win.personal.clark.node.ns.io,Clark 可 ping/SSH/访问被授权端口;闭环判断:不需要管理员手工复制 Network ID 或查询虚拟 IP;注册、命名、授权、路径和撤销都有独立权威。
developers,Grant 允许 developers 访问 service:git,不允许连接 git host Node;闭环判断:用户、设备、Node 和 Service 没有合并成一个主体;离职不会误删公司资产,也不会因 Service Grant 获得宿主机横向权限。
service_host 申请范围;ns,以 managed_device 注册;无需保存运维个人身份;services.toml 声明 git-origin:127.0.0.1:3000 和本地上限;闭环判断:Enrollment Key 只注册身份,不能直接发布或开放服务;本地同意、审批、授权和运行健康四关完整。
connect Grant;db TCP Service,只给 finance group invoke;闭环判断:L3 和 L4 共用隧道但不是同一授权;保留了 NSIO 相比纯节点 VPN 的核心差异。
10.20.0.0/16,逐实例批准后组成 ConnectorSet;10.30.0.1 或 UDP 53,Connector 投影拒绝。闭环判断:Route 的权限在两端取交集,NSD 不在每流关键路径,HA 不扩大目的地。
闭环判断:满足固定源 IP 需求而无需整机 Exit,也不暴露任意代理。
个人可选:Clark 在设置开启出口,连接后选择香港 Gateway,确认后重连;IPv4 capture ready、IPv6 external-managed 时 UI 明确两种去向。Gateway 下线后保持事实和意图,不静默换新加坡或本地直出。
企业强制:Acme 对受管笔记本配置 always-on-required。机器开机先安装策略允许的 guard,owner/Device 认证和 Gateway projection ready 后才放行;用户不能关闭。控制面故障使用未过期材料,过期后范围内流量阻断并显示管理员策略要求。
闭环判断:用户偏好、管理员要求、授权、选择、捕获和可用性彼此独立;每句流量文案都有 runtime 证据。
admin-web HTTPS terminated Service;admin.example.com PublicApplication,选择合作方 OIDC 和 partner-admins claim;闭环判断:公网身份、内部身份和 Gateway 后端身份三层隔离;停入口不删 Service。
闭环判断:自动化拥有明确机器身份和管理边界,不借用离职员工 token,也不与控制台互相覆盖。
| 故障 | 正确行为 |
|---|---|
| NSD 短暂离线 | 未过期 peer/Grant/Service/Route lease 继续;管理写入明确失败 |
| snapshot 解析失败 | 保留旧有效版本并上报 incompatible/invalid,不应用空集合 |
| DNS projection 过期 | 不返回假记录;现有会话按各自 lease 处理 |
| NSGW capability lease 过期 | 只停对应 capability,不退出整个网关 |
| Client 崩溃重启 | journal 恢复系统 route/DNS,owner 未验证时不建 user-owned 数据面 |
| entitlement authority 离线 | 用持久化最后有效声明至 grace;不拒绝 NSD 启动 |
闭环判断:每个组件都能独立区分“读不到”“没有权限”“不可用”和“版本不兼容”,恢复路径不依赖先破坏当前有效状态。
service:reports Offer 给 PartnerCo,动作仅 invoke、有效 30 天;group:auditors;闭环判断:两边各自管理自己有权管理的半边,权限取交集,没有目录 union 或隐式 Network 桥接。
闭环判断:发行生命周期和身份生命周期使用同一 owner/lease/journal 事实,不会因升级或转让留下前用户网络权限。
service_directory_read_failed,不是空 services=[];ns 保留 revision 18,projection=outdated_applied,Client 显示“暂时无法刷新,当前显示 10:32 的已验证目录”;闭环判断:最后有效投影、展示缓存和权威新鲜度是三个事实;用户能知道现在看到的是什么,也不会因系统故障被误告知“管理员没授权”。
Additive:管理员在 Route R 增加 10.20.8.0/24。Connector 先 staging generation N+1 并 ACK;旧 credential N 仍只能访问 N 的目的地,新 credential N+1 才能访问新增网段。两代集合不做 union,切换窗口内旧业务不中断。
Restrictive:管理员从 R 移除 10.20.4.0/24。security-first 流程先把 N+1 窄投影装到 Connector,随后发布 activation epoch;到点后 Connector 拒绝 N 的新流。未收到 N+1 的 Client 保持 fail-closed,不能拿旧 credential 继续。需立即撤销时终止相关在途流;允许 bounded drain 时 UI 明示旧权限最晚失效时间且不得超过 credential TTL。
故障:某 Connector 未 ACK N+1,NSD 将它移出候选但不阻塞其他健康 Connector。全部未 ACK 时 Route 显示 projection failed/unavailable,客户端不把目的地送公网。策略读取失败保留未过期 N,不生成空目的地集合。
闭环判断:更新窗口可能短暂 fail-closed,但不会短暂放宽;管理员可以从 provenance 看到每个 generation 的范围、执行者和最晚失效时间。
闭环判断:策略收紧同时覆盖新请求和长连接,又不越界影响内部 Service 授权;60 秒在线目标与 5 分钟硬上限均可真测。
每个实施任务必须纵向覆盖 Shared schema → NSD 事务/Compiler → ns/NSGW 执行 → Client/Console 展示 → 测试/审计。只做页面或只加数据库表不能宣布能力完成。
| Slice | 首要交付 | 依赖 |
|---|---|---|
| Identity & Enrollment | session、Device Key、Membership、owner binding | Shared IDs/errors |
| L3 Mesh | Node IP/DNS、peer projection、direct/relay | Enrollment |
| Policy Kernel | selector/group/conditions/provenance/simulator | Identity graph |
| L4 Service | manifest、VIP、frontend、Endpoint HA、catalog | Policy + L3 path |
| Route | Connector Activation、双端 projection、DNS/NAT | Policy + Service primitives |
| Gateway | Relay/Egress/Exit capability isolation | Activation + metering |
| Edge | PublicApplication、六种 auth、session revoke | Service + NSGW |
| Automation | OAuth client、dry-run、manager ownership | Core APIs |
| Governance | SSO/SCIM/Posture/Audit/export | Identity + Policy |
| Gate | 必须先证明 | 证据 | 未通过时阻塞 |
|---|---|---|---|
| G0 Shared Contract | Rust/Dart/TypeScript/Go 对 ID、envelope、errors、canonical digest 一致 | 真实 serializer + schema + golden/fuzz | 全部跨仓库开发 |
| G1 Local Runtime | App/CLI/helper 单实例、peer credential、owner switch、journal | Windows/macOS/Linux 多用户真机 | 所有终端功能 |
| G2 L3 Transport | TUN/WG、P2P、Relay、WSS、漫游、目标端 ACL | NAT/CGNAT/symmetric NAT/UDP block 实验室 | “像 Tailscale”基础体验 |
| G3 Projection | snapshot/delta、单调 revision、ACK、过期、last-known-good | 乱序/丢包/回滚/断线故障注入 | Grant、Service、Route、Gateway |
| G4 Service Runtime | VIP、split DNS、TCP/UDP、trusted L7、TLS、manifest 上限 | 双平台消费者 + Linux publisher 真流量 | L4 与 Edge |
| G5 Route/Exit OS | route/DNS ownership、冲突、自愈、fail-closed、IPv6 | 三桌面 OS + 外部 VPN/切网/崩溃 | Route、Exit 企业发布 |
| G6 Mobile | iOS/Android VPN lifecycle、后台、睡眠、网络切换 | 商店签名构建和真机长稳 | 移动产品承诺 |
| G7 NSGW Isolation | capability/tenant config 隔离、lease、drain、metering | 多租户压力 + 越权/故障注入 | 托管 Relay/Egress/Exit/Ingress |
| G8 Policy Scale | §19.5 首发规模下的 Group 展开、最小投影、shadow evaluation 和增量 fanout | 固定数据集 benchmark + access diff;未达到目标即阻塞 | 企业规模与 SLO |
| G9 Revocation | 权威事务提交后立即停签;99% 在线执行者 60 秒内收敛;所有旧 peer/flow/share lease 最迟 5 分钟失效 | 跨组件时钟、漏投影、离线重连和长连接测试 | 企业安全 GA |
| G10 Operations | 签名升级、备份恢复、删除、计费对账 | 空环境恢复与演练证据 | 商业 GA/SLA |
Gate 通过只证明其技术前提,不自动完成上层 Slice。每份证据必须绑定 commit、平台/拓扑、配置、时间和原始结果;测试目标只能经版本化架构决议调整,不能因实现困难在单个仓库里降低。
三个数字的含义不同:首发目标是 GA 前必须通过的支持规模;设计上限要求 ID、schema、分页、流式传输和分片边界不能把系统锁死在首发规模,但不是性能承诺;已验证值只能来自可复现 benchmark,不能用估算填写。
| 维度 | 首发目标 | 设计上限 | 当前已验证值 |
|---|---|---|---|
| active Human Members / Organization | 10,000 | 100,000 | 0(尚无 Next benchmark,G8 阻塞) |
| Networks / Organization | 100 | 1,000 | 0(尚无 Next benchmark,G8 阻塞) |
| active Node Memberships / Network | 10,000 | 100,000 | 0(尚无 Next benchmark,G8 阻塞) |
| Services / Network | 5,000 | 50,000 | 0(尚无 Next benchmark,G8 阻塞) |
| Endpoints / Service | 100 | 1,000 | 0(尚无 Next benchmark,G8 阻塞) |
| Routes / Network | 2,000 | 20,000 | 0(尚无 Next benchmark,G8 阻塞) |
| Gateway instances / Network | 100 | 1,000 | 0(尚无 Next benchmark,G8 阻塞) |
| User Groups / Organization | 2,000 | 20,000 | 0(尚无 Next benchmark,G8 阻塞) |
| total User↔Group membership edges / Organization | 1,000,000 | 10,000,000 | 0(尚无 Next benchmark,G8 阻塞) |
| Group nesting depth | 0(首版不支持) | 0(当前 policy major;未来引入必须升版并重做循环/影响评审) | 0(运行未验证) |
| active authored GrantRules / Network | 50,000 | 500,000 | 0(尚无 Next benchmark,G8 阻塞) |
| resources visible to one Membership | 20,000 | 200,000 | 0(尚无 Next benchmark,G8 阻塞) |
| concurrent control streams / deployment | 100,000 | 1,000,000 | 0(尚无 Next benchmark,G8 阻塞) |
设计不得把 subjects × resources 的 effective edge 全量持久化。Grant 保留 selector/revision,Compiler 按受影响目标增量展开;Effective Access/模拟使用分页查询和真实 Compiler dry-run,否则 10 万成员与 50 万规则会产生不可控笛卡尔积。
| 指标 | 首发通过标准 | 设计边界 | 当前已验证值 |
|---|---|---|---|
| 单 Membership compressed full snapshot | p99 ≤ 8 MiB | chunked stream 支持至 64 MiB;超出显式 projection_too_large | 0(尚无 Next benchmark) |
| 单次 compressed delta | p99 ≤ 512 KiB | 分块至 4 MiB;更大改发 snapshot | 0(尚无 Next benchmark) |
| Policy dry-run / impact preview | 首发规模 p95 ≤ 3 秒,p99 ≤ 10 秒 | 异步 job + progress,不延长管理事务 | 0(尚无 Next benchmark) |
| 单 Network full compile | 首发规模 p95 ≤ 60 秒 | 分片、可恢复、旧投影继续有效 | 0(尚无 Next benchmark) |
| 增量变更到在线目标 applied | 99% ≤ 30 秒 | 超时进入 delivery lag/security alert | 0(尚无 Next benchmark) |
| 身份/Grant/Share 撤销 | 99% 在线目标 ≤ 60 秒;全部旧租约 ≤ 5 分钟 | 高安全 Network 可配置更短 TTL | 0(尚无 Next benchmark) |
| NSGW 单实例并发会话 | 100,000 | 数据结构/计量分片不锁死于 1,000,000 | 0(尚无 Next benchmark,G7 阻塞) |
地址 schema 使用完整 IPv4/IPv6 与可扩展多地址块,不把一个 Network 固化成单个小前缀。默认地址规划必须容纳首发 Node + Service 峰值、30 天删除隔离和至少 2 倍运维余量。
具体扩容闸门:当 12 个月容量预测中 active Node + Service 超过 20,000,或已分配 IPv4 块把 active、quarantine 和保留余量计入后达到 75% 占用时,Network 必须进入 address_capacity_plan_required,禁止继续无提示分配。管理员必须选择并验证:IPv6-first、追加一个或多个不重叠 IPv4 地址块,或客户自定义地址池。IPv6-first 要求所有新 Node/Service 具备稳定 IPv6,IPv4 只作为显式兼容资源分配;依赖 IPv4 的 Route/应用在影响预览中逐项列出。销售和 API 不能在没有已批准 capacity plan 时承诺或创建超过 20,000 个稳定 IPv4 资源的单 Network。
Benchmark 固定数据生成器、拓扑、硬件、数据库、缓存冷热、变更类型和编译器版本。每次回填“已验证值”追加日期与证据链接,不降低原目标;达不到目标时先优化或形成版本化架构决议。
上述能力在结构上可实现,且没有要求 NSD 进入业务流量路径,也没有要求 NSGW 获得整个 Network 权限。最关键的闭环依赖是:统一 ns daemon、Organization-scoped Device Key、Membership、PolicyKernel、短期签名投影、目标端最终执行和多轴状态。
实现顺序必须先完成身份/注册、L3 和 Policy Kernel,再构建 Service、Route、Gateway 与 Edge。后面的能力可以复用前面的身份、租约、投影和审计机制,但不能用“共用底层”把不同授权平面合成一个布尔开关。