状态:产品发行与客户端生命周期实现依据。本文约束 NS App、
nsdaemon/CLI、平台 helper、移动端 Tunnel Extension 和企业托管安装。网络行为仍以统一架构和ns组件规格为权威。
ns 网络运行时。| 平台 | 安装内容 | 长期进程 | 普通入口 |
|---|---|---|---|
| Windows | NS App、ns.exe CLI、Windows Service、受签名 driver/helper | Windows Service | App / PowerShell |
| macOS | NS App、ns CLI、LaunchDaemon/helper、Network Extension | daemon/helper/Extension | App / Terminal |
| Linux desktop | NS App(可选)、ns CLI、systemd service | systemd service | App / shell |
| Linux server | ns CLI、systemd service;可选 kernel WG 集成 | systemd service | shell / automation |
App 可以随安装包携带与自己验证过的 daemon artifact,但不能长期私有运行第二份 daemon。安装器发现现有 Next daemon 时按以下矩阵处理:
| 现场 | 行为 |
|---|---|
| 无 daemon | 安装 daemon,创建本地 API endpoint,再连接 App/CLI |
| 同版本 daemon | 复用,不重启网络 |
| 兼容且更新的 daemon | App 连接并显示由哪个发行通道管理,不降级 daemon |
| 兼容且更旧的 daemon | 先做升级影响检查,用户或 MDM 批准后原子升级 |
| 不兼容 daemon | 不启动第二份;显示组件版本不兼容并给出唯一修复动作 |
| 正在运行旧 NSIO | 使用不同服务名、状态目录、socket、TUN identity 和安装 ID;不读取、不停止、不接管 |
单实例锁必须覆盖 daemon endpoint、状态目录和平台网络所有权。锁冲突返回持有者 PID、版本和安装来源,不通过删除锁文件盲目抢占。
首版采用 single-active-OS-user,不在同一主机上为每个 OS 用户启动独立 daemon/TUN。RuntimeOwnerBinding 是安装级本地安全对象,至少记录 installation_id、owner_mode、平台提供的稳定 OS principal 标识摘要、状态和 revision;用户名、NSIO 邮箱、Organization 和 Network 不写入可被其他本地用户读取的占用信息。
| owner mode | 用途 | 控制主体 | 网络归因 |
|---|---|---|---|
user_session | 个人电脑、员工桌面 | 首次完成本地 claim 的 OS principal | 当前激活的 NSIO Profile;只允许该 OS principal 操作 |
managed_device | 无头服务器、MDM 专机 | system/service principal + 受管策略 | Organization-owned Device/service identity,不随交互用户切换 |
daemon/service 可以随系统开机启动,以恢复未完成 journal、提供版本/维护接口并观察 OS session;这不等于数据面自动连接:
| owner mode | 开机后、尚无交互用户时 | 何时建立控制与数据面 |
|---|---|---|
user_session | 加载加密状态后进入 owner_inactive;不连接 NSD,不创建 TUN/DNS/Route/Exit | 已绑定的 OS principal 登录并通过 peer/client credential 验证后。默认由用户明确连接;可选“该用户登录后自动连接”或受管策略只能在验证完成后触发 |
managed_device | 恢复 journal、校验受管身份和策略 | 校验通过后按受管策略自动连接,不等待交互用户;失败按能力保持 degraded/blocked 并远程上报 |
规则如下:
version、ownership status 和管理员授权后的 repair/update 接口。返回 runtime_owned_by_another_local_user,不得泄露对方用户名、账号、Organization、Network、目录、配置、运行日志或流量状态,也不能 start、stop、switch、publish、configure Exit 或导出对方诊断。owner_inactive。平台不能证明这个顺序时,user-owned 模式保持断开,不能以“快速切换”为由让另一用户经过原隧道。remote_revoke_pending 事实。managed_device 模式;后者按 Device/service identity 审计,不声称提供逐人流量归因。iOS/Android 不发布独立 CLI daemon。NS App 是产品入口,Packet Tunnel Provider/VpnService 是受平台管理的 ns runtime。App 与 Extension 通过平台允许的共享容器和消息接口交换最小配置、operation 和 status;私钥只进入系统安全存储与 Extension 可访问范围。
关闭 App 不等于断开 VPN。Extension 被系统回收后按平台恢复模型重建,不依赖 App 前台存活。
App/CLI 建立本地连接时交换:
本地 transport 必须先取得不可伪造的 OS peer credential,再做 owner authorization 和版本协商。协商只选择双方共同支持的本地 API major。没有交集时只能调用 version、脱敏 diagnostics 和 update; 不允许绕过版本或 owner 检查直接写配置。App 的展示缓存不能代替 daemon 状态。
每个发行 artifact 有不可变记录:product、platform、architecture、version、build commit、build provenance、SBOM digest、artifact digest、signing key ID、not-before/not-after 和 channel。CI 只从受保护 tag 构建;发布服务不能接受开发者本机上传的任意二进制成为 stable。
签名层:
| 通道 | 对象 | 规则 |
|---|---|---|
| internal | 开发/QA | 可频繁更新,不承诺状态保留 |
| canary | 自愿测试设备与内部生产 | 先验证升级、网络切换、恢复和卸载 |
| beta | 外部测试与指定企业 ring | 候选协议和 UI,可回退 |
| stable | 普通用户 | 通过全部发布门后逐步放量 |
| enterprise-pinned | MDM/组策略管理设备 | 管理员控制时间窗,但仍受安全撤销期限约束 |
同一 Installation 只能跟随一个通道。切换到更不稳定通道必须明确确认;从高版本降到低版本仅允许发布系统标记为 rollback_safe 且状态 schema 可回读时执行。
更新 manifest 至少包含:latest、minimum-supported、minimum-secure、rollout cohort、channel、artifacts、release notes、known issues、rollback target、required OS、local API 范围和 Runtime Control 范围。
流程:定期或手动检查 → 验签 manifest → 确认 cohort/channel → 下载临时文件 → 验签 artifact/SBOM 摘要 → 预检查磁盘、权限、状态 schema 和活跃操作 → 写升级 journal → drain 新连接 → 安装 → 启动并完成健康检查 → 提升 active slot → 清理旧 slot。
升级不得默认断开正在工作的隧道。必须重启 runtime 时,App/CLI 展示原因、预计影响和 maintenance window;企业管理员可以计划窗口。安全紧急更新可以设置 deadline,但在 deadline 前持续告警并提供审计证据。
| 发行方式 | 更新权威 |
|---|---|
| App Store / Google Play | 商店签名与商店更新;NSIO manifest 只做版本提示和兼容门 |
| Managed App / MDM | 企业 MDM;NSIO 提供版本/风险 feed,不越过管理员策略 |
| Windows/macOS 官网安装包 | NSIO 签名 updater 或受控 installer service |
| apt/rpm/brew | 对应签名仓库;daemon 不自行覆盖包管理器文件 |
| standalone tar/zip | 明确 opt-in 的 ns update,使用 NSIO manifest 和原子 slot |
| container | immutable image/tag digest;滚动替换,不在容器内自更新 |
Next stable 服务端默认支持当前 Runtime/Enrollment major 与前一 stable major,前一 major 自后一 major 全量可用起至少保留 90 天。新增 major 前必须:
严重安全事件可以缩短窗口。minimum-secure 低于当前版本时,控制面拒绝新敏感操作;是否继续现有数据面由漏洞影响和已签发 lease 决定,必须形成单独安全事件和用户说明,不能借“升级”静默改变授权。
灰度按稳定随机 cohort,不按账号价值或流量内容选择。每一阶段观察 crash-free rate、daemon 启动、TUN 成功、DNS/route restore、登录、enrollment、直连/Relay 和 uninstall cleanup。任一硬门越界自动暂停放量。
回滚分两种:
协议 major 和数据库/本地状态 schema 版本相互独立,不能因为控制协议升级就假定本地状态可降级。
商店要求会变化,每次提交前必须由发行 owner 重新核对官方政策并保存审查快照。
当前依据:Apple App Review Guidelines §5.4 与 Network Extensions Entitlement。
VpnService 必须属于产品核心 VPN/远程访问能力,并完成 Play Console declaration;当前依据:Google Play VpnService policy 与 staged rollout。
卸载向导区分:
移动端由平台删除 App/Extension;服务端 Device 不因本地卸载自动消失,管理端显示离线并允许撤销。
user-owned 桌面上只有 runtime owner 可以选择“仅删除 App UI”或发起带远端撤销的完整移除。其他普通 OS 用户不能停止、删除或撤销该 owner 的运行时。OS 管理员/MDM 可以执行程序移除与网络恢复,但不能解密或使用 owner identity;需要删除密钥时必须明确标记为 destructive reset,并把未完成的服务端撤销显示为待处理。
停止新流量 → 撤 capture/Exit → 撤 owned route → 恢复 DNS/proxy → 删除 TUN/adapter → 停 helper/daemon → 复验公共网络 → 删除程序。只删除带 Installation ID、owner marker 和 journal 证据的对象;发现外部对象冲突时停止清理并提供 ns cleanup --diagnose,不猜测删除。
卸载器必须在 App 文件删除后仍可完成恢复,因此 cleanup helper 是独立、签名、一次性执行的组件。失败保留 recovery journal 和离线修复命令,不显示成功。
企业策略可配置通道、允许延期天数、维护窗口、是否允许用户退出 beta、是否允许自更新和最低版本。管理员看到设备版本、更新状态、失败码和最后检查时间;看不到用户访问的域名或业务流量。
MDM 卸载、人员离职和 Device revoke 是不同事务。离职可以撤销 Membership 而保留 Organization-owned Device;MDM wipe 可以删除本地 identity;普通用户卸载不能伪装成服务端安全撤销。
| 错误 | 用户动作 |
|---|---|
update_signature_invalid | 停止安装,报告安全事件 |
update_not_applicable | 显示平台/架构/OS 不匹配 |
update_state_incompatible | 保持当前版本,等待 forward-fix |
update_health_check_failed | 自动恢复上一 active slot并生成诊断 |
component_version_incompatible | 只允许诊断/更新,不启动第二 runtime |
runtime_owned_by_another_local_user | 显示本机另一用户正在使用 NSIO;不显示其身份或租户资料 |
runtime_owner_inactive | 原所有者返回后明确重连;不自动恢复系统级投影 |
runtime_owner_release_required | 由原所有者释放,或管理员确认破坏性 reset |
concurrent_interactive_sessions_unsupported | user-owned 模式保持断开;使用专机或受管设备模式 |
uninstall_network_restore_failed | 保留 cleanup helper/journal,显示修复命令 |
uninstall_remote_revoke_pending | 本机已清理,明确提示管理员撤销仍待完成 |