Skip to content

Latest commit

 

History

History
258 lines (241 loc) · 28.4 KB

File metadata and controls

258 lines (241 loc) · 28.4 KB

HTTPS 兼容模块

HTTPS 管理插件与协议引擎均为可选包。基础主包不强制依赖管理插件,基础组件更新也不将其重新安装;管理插件安装后通过通用插件管理显式加载;全功能安装在首次安装管理插件时执行同一加载入口,转发总开关仍默认关闭。卸载管理插件前按通用卸载流程排空并卸载引擎,保留私有配置和 CA,基础 gateway 能独立运行。

HTTPS 兼容是原生后端的可选增强,不改变应用 URL、业务鉴权或原有出口策略。 总开关默认关闭,适合需要协议兼容时按需开启;已完成设备信任与目标配置后,在插件 详情页切换总开关即可启停。关闭保留规则、CA 和信任,不要求重新接入;更新不覆盖用户 已保存的开关选择。关闭后的新连接走原路径,已有请求按下述排空合同处理。 设备一次性信任私有 CA,代理按需签发目标证书;CA 属于设备私有状态,不能随普通 更新重新生成。私钥不进入 Git、UI 或普通诊断导出,公开证书可通过认证 RPC 下载。 引擎启动时验证 CA 并续签即将到期的本地探针证书;运行中每小时检查一次证书有效期, 提前七天撤销新连接接管,排空后仅重载引擎。证书更新不更换 CA,也不重启基础网络服务。

独立配置拥有总开关、接入范围和目标规则。现有 devices 配置项可以表示单台设备或管理员明确授权的共享出口;共享出口覆盖该来源地址背后的全部客户端,不宣称能区分 NAT 后的设备。固定出口无需设备地址发现。接入范围使用稳定 ID、显示名,以及明确 IP 地址或设备地址来源提供的来源摘要与网卡 MAC 绑定;规则拥有 ID、显示名、设备引用、精确域名或域名后缀、目标端口、开关和 h2|bypass 策略。精确匹配优先于后缀,较长后缀优先于较短后缀;同一设备、 端口和匹配目标的重复规则拒绝。规则 API 使用 DNS ASCII 域名;界面用浏览器的 标准 URL 域名处理将国际化域名转换为 A-label 后保存。未登记设备、未知 TLS 域名和未匹配目标不解密。

协议引擎采用精简编译的 HAProxy,由同一进程完成 TLS 预筛选、TLS 终止与 HTTP/1.1 → HTTP/2 转换,不加载 Lua、正则表达式扩展、抓包或内容改写组件。 预筛选按设备、原始目标端口与 SNI 选择规则;已提供 h2、未知域名与未命中连接 保留原始 TLS。内部转换入口只接受私有 Unix socket 的 PROXY v2 元数据, 原始源地址与目标不从 HTTP 业务头读取。双栈 NAT 原始目的地址由引擎的 Linux socket 适配读取;IPv6 与 IPv4 均须经过实际内核重定向验证。 转换保留任意方法、路径、业务头与流式正文,上游证书链与 SNI 主机名均验证。 普通 HTTP 使用 h2;WebSocket 使用独立 HTTP/1.1 上游连接。 HTTP 后端限定启用 abortonclose 与 http-no-delay,使客户端关闭释放上游, 同时避免内部转接引起小包延迟;不以缩短长请求超时替代取消传播。 内部端口与管理 socket 不对 LAN 提供显式代理服务。 业务状态码原样返回,不能用 401、429 等业务响应触发模块故障恢复。 客户端取消必须释放活动请求;失败 POST 不自动重放。

网关接管的准入、epoch 与租约事务由现有 mihomo.interception ucode 服务执行, 高频内核读取与租约事务通过按需加载的受限原生模块执行,不启动 Python。 模块随可选兼容运行包安装,只有现有 gateway 接管服务调用它;准入策略、epoch、 网络锁和故障决定仍属于 gateway。模块只读指定基础对象,只写兼容私有表, 没有独立定时器,不能自主续租。源端口范围通过双栈 socket set/get 验证, 不修改系统临时端口配置。配置、状态、证书编排与恢复由 ucode 管理; 设备包不安装 Python 源码、解释器或 Python 依赖。已签名回退引擎未声明 gateway_io: native 且未安装原生模块时,共享网关保留有界 ucode/CLI 路径;新版声明要求原生模块,加载或调用失败不能转用 CLI 续租。清理与卸载仍可使用有界 CLI 撤销自身许可。Python 旧实现仅留作开发机对照测试。

控制入口、gateway 接管和设备私有配置分别拥有自己的限定写集,共用现有 mutation 锁,不通过全局 disable/compile/enable 应用兼容配置。用户开关与实际接管状态分开。 交互管理动作取得 mutation lock 时最多等待两秒,避免正常健康轮次使启停和信任登记 立即失败;超时仍返回忙碌,不重放已执行的动作。后台健康轮次不等待锁,保持许可自然到期。 关闭先撤销新连接接管,再排空现有连接;进程崩溃时不能恢复原 TCP/SSE 流。 软件包排空向 HAProxy 发出优雅停止信号,关闭空闲持久连接,让活动请求完成; 以原引擎进程退出确认排空,不把停止监听后的健康接口不可达当作排空成功。 三十秒内仍有活动连接时保持旁路并延后替换,不强制终止健康请求。

接管许可使用内核到期机制,最长十秒;健康检查每两秒执行,失联不续期。 目标集合和网关 epoch 不变时,重复续租至少间隔四秒,减少小型设备上的控制开销; 目标变化立即提交,旁路、管理实例替换及任何控制链错误清除续租记录。健康失败仍在 当前健康轮次撤销接管,续租节流不延长已有许可的内核到期时间。 控制器的健康轮次最多复用十秒网关快照,避免与续租重复展开基础规则。 事件循环中的同步命令通过平台有界执行入口收集输出:命令先完成,再读取私有临时文件, 避免异步地址或探针子进程退出的信号打断管道读取。超时、非零退出及输出超限仍拒绝准入; 不重放命令,也不以空输出代替有效状态。临时文件有大小上限并在调用结束后删除。 健康 socket 等待被同类信号打断时继续等待剩余期限,不重新发出请求,也不延长原截止时间。 周期双栈探针复用原生工具的受限会话模式:管理器通过私有 socketpair 请求一轮新连接验证,结果绑定轮次;引擎身份、配置或公开 CA 变化时销毁旧会话。子进程永久降权,沿用管理资源组,无网络管理权限。父子分别执行 1.4 秒截止时间;通道断开、超时或错误后销毁会话并拒绝续租,不接纳上一轮结果。 网关准入实时读取进程状态,并复用归属链存在证据。监听者查询保留独立、限时的 ubus 命令,避免在管理事件循环中引入新的同步总线调用。同一调用中的核心进程身份复用,跨调用不缓存。原生读取核对内核响应序号、完整性和截止时间;对象不存在与读取失败分别处理。租约写入收到提交确认后,以新的请求独立回读实际集合与到期时间,提交缓存不能冒充写后验证。读取失败不能解释为成功旁路。首次建表及移除保留 gateway 的有界 nft 生命周期入口;周期续租和状态读取不展开完整私有表。 该快照不授予接管:每次实际续租仍由网关 owner 重新验证当前配置、选路、进程和 epoch。续租拒绝、控制链错误、管理实例替换或管理锁等待后立即丢弃快照; 未就绪的结果不缓存。续租成功代表 gateway 刚重新验证同一 epoch 的配置、进程、规则及选路;管理进程可以用该成功结果刷新对应预览的验证时间,避免紧接着重复取得相同准入快照。续租失败立即废弃预览,不能由缓存授权续租。管理页面的独立读取始终实时查询。 本地身份已确认的地址增减通过 HAProxy 原生地址 ACL 更新,不重启引擎。 管理器每轮仍核对状态文件的权限和完整字节;字节未变化时复用已解码的事件历史, 只复制本轮可变状态。发布时复用未变化事件的编码,仍原子替换完整状态文件, 不另设持久化 owner 或改变文件格式。外部修改立即使缓存失效;管理读取返回独立副本。 全部地址证据失效时,保留已信任设备的规则结构并清空地址 ACL;未确认流量旁路,其他健康连接不受引擎重启影响。 控制层先同步并回读地址 ACL 与规则开关,再由 gateway 原子更新租约; 移除的地址立即失去解密资格,已有 TLS 连接继续完成。规则结构和证书变化仍先旁路、排空。 单条规则旁路或地址更新不撤销其他规则的健康租约。

每轮读取同事件循环的私有状态接口,并验证 IPv4、IPv6 新建回环连接经过 NAT、 生产监听端口和实际 H1→H2 往返。两栈验证由同一个原生探针会话完成,复用 OpenSSL context 和公开 CA, 禁用 TLS session 恢复;每轮每栈仍新建 TCP/TLS 连接并验证随机挑战,任一失败均不能续租;两栈合计 截止时间为 1.4 秒。独立私有入口探针在新 PID、配置变化及每六十秒 执行;失败立即使该验证失效。会话探针以兼容账户执行,不持有管理权限;独立一次性诊断仅在创建 socket 时使用兼容账户身份。探针使用链接系统 OpenSSL 的小型原生程序, 截止时间为 1.4 秒,业务流量不经过探针;管理循环不保存业务正文。 管理进程确认私有接管许可已清空后,不在每轮重复执行相同清空事务;新的准备、续租尝试或进程重启使该判断失效。清空目标许可不销毁已准备的探针链,只有网关代际变化或健康失败才重新准备;恢复续租仍由 gateway 重新准入。状态页面仍读取实际内核许可。 域名规则不因单条上游请求失败而旁路或锁定。已启用的 HTTP/2 规则由引擎在每条上游 TLS 连接上验证证书与 h2 协商;上游不可用或不支持 h2 时,该请求失败,不自动重放,也不让后续请求绕过转换。 故障恢复后连续健康三十秒才重新接管。唯一例外是已接管的同一引擎 PID、配置版本和 处理链仍健康、网关就绪,但双栈透明链探针瞬时失败:失败当轮立即旁路,随后两栈 连续健康八秒才重新接管。同一透明链故障持续多个管理周期时保留该恢复窗;恢复窗内 再次失败或出现其他故障则恢复三十秒观察。引擎与处理链仍健康的透明探针故障先给探针链 三十秒自行恢复,持续不健康才尝试重启引擎;其他引擎健康故障仍按八秒起重启。 模块自身十分钟内第三次故障暂停自动恢复; 模块只统计实际获得接管租约后再次发生的独立故障, 健康检查就绪但尚无地址或 DNS 候选时不算已接管,失败的进程重启尝试另计。 已接管引擎的退出或 PID 变化算一次独立故障,不能被新进程的启动宽限掩盖。 同一故障中的引擎重启不增加故障次数;持续未恢复时按八秒起、最长六十秒的退避间隔 尝试重启,冷启动宽限仍生效。实际恢复接管后清除重启退避,第三次独立故障才锁定模块。 基础配置操作占用共用 mutation lock 时许可仍自动到期;管理循环明确记录的锁等待 不算插件故障。取得锁后重新验证当前网关、配置与完整处理链,全部通过才能恢复续租。 无锁等待证据的管理停顿仍按故障处理。最近模块故障保留固定原因、健康接口错误分类、 本地探针结果和引擎进程标识,重启尝试与独立故障计数分别呈现。 故障诊断保留探测期间的引擎 CPU 节流和 OOM 计数变化;它们是归因证据,不改变准入阈值。 人工锁定期间只维持旁路,不反复执行完整网关检查和 TLS 探测;人工恢复后重新完整验证。 上游连接与响应错误只作为规则诊断记录,不改变接管许可,不运行独立的目标恢复探测。单个请求的中断不能关闭其他请求使用的域名转换。 客户端 TLS 握手失败保留连接诊断,不计入上游规则故障;其他已信任客户端继续使用 该规则。失败客户端仍收到 TLS 错误,模块不放宽证书校验或重放其连接。 出站连接由内核分配源端口,避免客户端端口与路由器现有套接字冲突;未匹配域名的 TLS 旁路采用同一行为。简单数字 SRC-PORT 规则由 gateway 提取为接管排除端口, 命中这些源端口的客户端连接保持原路径。转发引擎使用 HAProxy 的双栈 source 端口区间,从内核临时端口范围中选择不含 排除端口的连续区间;引擎与有界探测使用每 socket 的 IP_LOCAL_PORT_RANGE 保持相同范围, 让内核统一避开其他后端和已有连接占用的四元组,避免独立端口池冲突。 范围与 gateway epoch 和引擎配置绑定,不修改全局 sysctl 或原有选路规则;无法证明 等价时保持旁路。结构配置改变时先撤销接管,现有连接排空后仅替换该引擎实例。 有效配置明确关闭进程查找(find-process-mode: off)时,非空精确 PROCESS-NAME 规则不参与原路径或转发出站的匹配,因此不阻止准入。进程查找开启、未声明或无法确认 时仍保持旁路,不由兼容插件修改该设置或原有进程规则。 规则开关通过 HAProxy 运行时 map 应用并回读;单个请求失败不重启引擎,也不重新启动整个模块的健康等待窗口。 客户端请求校验失败和连接建立期间的取消只影响该连接,不累计为目标规则故障。 转发故障按规则的后端连接/响应错误计数记录,业务 HTTP 状态不进入该计数; 不保存路径、业务头或正文。诊断不保存 HAProxy 原始错误缓冲区或业务日志。 旁路恢复原有 NetFleet 选路,不等于关闭 NetFleet 或强制直连。用户关闭优先于 自动恢复。代理出站不得再次进入兼容接管,无法证明选路等价时不能启用。 基础路径独立保证 TLS 目标身份:启用 DNS 映射嗅探或强制域名嗅探时,原生网关渲染的 TLS 协议配置使用真实 SNI 覆盖拨号域名,避免共享 IP 的 DNS 反查别名进入上游连接。 这项约束不依赖 HTTPS 插件的安装、开启或规则状态,也不回写用户的 Profile/mixin; 端口、跳过域名及其他嗅探协议保持原配置,配置值与实际运行值仍分别呈现。 原生路由器的服务排除规则只有在实际兼容进程的 UID、GID 和 cgroup 均不匹配时 才不影响准入;身份缺失、未知账户或可能匹配的规则继续旁路。

生产启用要求协议实测、OpenWrt 软件包和 QEMU 故障演练通过;源码或本机协议测试 不能替代目标设备的接管、旁路和应用验收。

运行入口与接入

opl-netfleet-https-compat 是独立可选包。HAProxy 3.2.21 从固定校验和的源码编译, 仅在插件私有路径安装,保留上游 GPL/LGPL 许可;不替换设备的通用 HAProxy 软件。 限定适配负责 Linux IPv6 原始目的地址、通配源地址的端口绑定和 h2-only 后端的严格 ALPN 准入; 握手未协商 h2 时,在发送业务正文之前失败。控制器直接运行在现有 ucode 插件服务内, 证书由 OpenSSL 工具按需管理,不分发 mitmproxy、cryptography 或完整抓包依赖。 procd 管理进程生命周期,C launcher 只施加资源与身份限制后 exec,不另建 supervisor。 构建入口 scripts/https-compat/build-package.sh 的参数依次为 OpenWrt SDK、APK 签名私钥、输出目录和源码 ref。同目录 Dockerfile 只服务于隔离协议测试。 组件包安装验证与基础 NetFleet qualification 分开,二者都不能替代网络验收。控制插件与运行包的兼容范围由 APK 依赖元数据声明,两者通过通用组件入口更新;满足依赖时可以只更新其中一个,不设置专属更新命令。

浏览器通过通用 plugin_read/plugin_call 的 config-get/config-set/enable/disable/probe/public-ca 动作到达 https-compat.control,macOS 接入工具的 compatibility-* CLI 命令调用同一 controller。配置同时校验插件代码 revision 与私有配置 revision。独立引擎包的 extension.json 声明接口 major;组件状态从安装记录和该声明投影,不启动兼容引擎。 所有 mutation 使用当前 revision;revision 同时绑定配置和信任记录。 probe 的 trust_record、trust_revoke、recover 操作分别记录接入工具证明、撤销 设备接管和人工解除故障锁定。ca 只返回公开 PEM 及 SHA-256,不接受任意文件路径。

私有配置和稳定 CA 位于 /etc/opl-netfleet/compatibility,运行状态与有效规则位于 /var/run/opl-netfleet-compat。插件自身的 procd manager 每两秒执行健康循环;基础 gateway 观察进程只负责核心生命周期,不加载或调用 HTTPS controller。管理动作 只保存意图并唤起插件,不同步等待远端探测。后台 tick 在身份来源、引擎健康、 本地处理链验证期间释放全局 mutation 锁;上游与 DNS 探针异步运行; 重新取得锁后核对配置、信任、状态、有效配置及基础运行身份,变化时丢弃该次结果, 不续租也不覆盖新的用户意图。引擎使用专用 netfleet-compat 用户,配置、信任记录与状态仍由 root 管理; 引擎仅可读取有效规则与本插件 CA,健康 socket 位于独立可写子目录。启动前必须落实 cgroup v2 的内存、CPU 与进程数限制,并设置文件描述符及单文件大小限制;缺少所需 控制器时拒绝启动引擎,接管继续旁路。该约束提供进程资源与文件权限隔离,不是完整 文件系统沙箱。引擎无网络管理权限,回环探针通过专用 socket priority 与实际 UID 匹配。nftables 租约只存在于 inet netfleet_compat,不修改基础 NetFleet 表。 管理循环与引擎使用独立 cgroup:引擎预算为 192 MiB、半核 CPU、32 个进程和 512 个 文件描述符,管理循环为 96 MiB、半核 CPU、16 个进程和 128 个文件描述符。 管理循环及其子进程使用允许 CPU 集合中的同一逻辑 CPU,地址同步以低调度优先级运行; 避免后台子进程在其他 CPU 并发耗尽共享配额,妨碍有期限的网关调用。该限制不改变 HAProxy 或基础代理的 CPU 亲和性。两组都 禁止 swap 和 core dump,单文件上限 8 MiB;运行文件位于 OpenWrt tmpfs,页计入 所属进程组内存限制。引擎不输出业务日志,控制状态与事件使用有界对象保存。 管理循环直接调用同一插件图中的网关受限服务,不启动第二个网关 worker,也不逐次 加载解释器。插件图的共享代码锁随管理进程生命周期释放,网络事务仍逐次验证 mutation 锁。管理进程或任一有界工具退出、卡住时停止续租,十秒内核到期不依赖退出钩子。 DNS 与远端 TLS 验证由事件循环异步调度,最多四个有界原生探针并发;每个结果绑定 目标和出站策略,不阻塞其他规则的健康轮次。DNS 结果十秒刷新,超过二十秒即不能授权 接管;地址来源的 TTL 独立约束客户端地址。管理实例冷启动时,尚未返回的解析不视作解析失败;配置、目标和健康条件未变时保留原有内核许可至其原截止时间,等待结果期间不续租。真实解析失败仍撤销许可。控制或续租失败重置连续健康计时, 基础网关拒绝准入不累计插件故障;管理链失效只在此前实际接管后统计独立故障。 网关快照在引擎进程身份与降权尚未就绪时返回引擎启动中,不能误报为 LAN 访问策略不等价。 新引擎进程在内核记录的启动时间后有六十秒冷启动宽限,期间不接管、不累计启动故障, 也不因正常健康失败窗口提前重启。该进程一旦报告就绪便失去宽限;此后的持续不健康 达到八秒后,在网络就绪且未熔断时调度重启。实际判定时刻受两秒管理循环与探针耗时影响, 不保证先于十秒内核租约到期;撤销接管及租约到期仍独立保障旁路。冷启动宽限到期仍未 就绪时进入既有故障恢复,不能无限显示启动中。 原生 gateway 合同保留 conntrack mark 的 0x01000000 位标识兼容连接归属;它与 Mihomo 的 packet mark 分开。兼容模块在 conntrack 后、TPROXY 前,仅为未确认的 首个 TCP SYN 按有效租约设置该位。原生 LAN TPROXY 跳过这类连接,兼容 NAT 完成 重定向;连接归属不会随租约失效而改变。没有有效租约的新连接不带该位,走原路径。 显式禁用或卸载先撤销兼容租约,立即删除带该私有位的 conntrack 条目,再删除兼容表; 随后停止自身监听器,因此新流量立即回到基础 TProxy,既有兼容流可能中断。包更新保留 优雅排空并在监听器退出后执行相同清理。两条路径都回读过滤结果为空;清理失败就保留 插件资源并报告失败。不会清空共享 conntrack 表,也不触碰 Mihomo 的 packet mark。 兼容表已不存在时仍清理私有 conntrack 条目,不能把表缺失当作退出完成。基础网关的 停止和异常恢复也清理该私有位;增强层清理失败不阻止基础接管退出,但保留失败与 接管登记以便重试,不报告清理成功。重复退出与重新启用不继承上一代的兼容连接归属。 精确域名仅为当前 DNS 解析出的候选 IP 建立许可,解析失败撤销该规则许可,不能 扩为全部目标地址。共享 IP 仍须在 TLS 阶段确认域名;域名后缀规则需要候选端口 范围的 TLS 筛选,因此其接管范围比精确规则大。 接管前读取内核实际的 LAN mangle 链,确认首条规则按上述归属位返回;旧核心、 规则丢失或顺序不匹配时保持旁路,不能仅凭安装版本或服务 ready 状态准入。 停止命令先进入维护旁路。包更新使用有界优雅排空窗口;用户显式禁用、卸载或重启 插件则立即撤销新连接接管,删除兼容表及私有 conntrack 标记,再停止自己的 procd 服务。已有兼容连接可以被中断,但基础 TProxy 的新连接路径必须在清理回读后恢复; 网关健康查询暂时不可用不能阻塞这次所有权交接。清理失败时保留插件资源并返回失败, 不报告一个半生效的停用状态。 管理代码更新可保留正在运行的引擎及连接,仅重启管理进程。恢复必须核对原引擎 PID、新管理进程、健康轮次及网关许可;安装及回退使用同一生命周期。磁盘引擎变更在以后自然重启时生效,不宣称运行映像已热替换。无法满足保留条件时,包更新和软件包钩子最多等待三十秒排空,健康连接未排空时拒绝替换。 管理插件与可选引擎包均使用标准插件 lifecycle.drain/resume 和包钩子。暂停先进入 维护旁路、排空并停止自己的服务,恢复仅重启此前实际运行且配置 revision 未变的实例, 不能推翻用户关闭或运行模式选择。维护不计作故障;暂停与恢复保留模块和规则的故障计数、 人工锁定与最近故障现场。未锁定模块恢复后重新完成三十秒健康观察,锁定只能由明确的 人工恢复操作解除,不能由升级解除。已有维护旁路同样保留;仅标准插件生命周期明确发起的 临时暂停允许自动恢复。直接暂停或旧版未记录恢复意图的暂停保持维护旁路,用户从诊断页 明确恢复后才重新验证接管。APK 忽略钩子失败退出码,因此统一包入口在排空未完成 时保持旧代码。基础网关关闭不调用该排空操作;它独立撤销接管并完成自己的清理。 接管通过网关受限 TCP 服务申请,插件不直接执行 nft。 包钩子继承更新进程的 mutation lock 时,控制器核验 root 祖先进程、同一锁文件 的设备号与 inode,以及内核记录的排他 flock,沿用该锁完成排空;环境变量不能 跳过锁检查,无关进程持锁仍返回忙碌。 安装体积按设备缺少的依赖闭包计算,不能把引擎二进制或压缩包大小当作完整成本。 兼容模块的 QEMU 验证使用 512 MiB 根分区,分别测量引擎、管理组的空闲与负载增量。

LuCI 的 HTTPS 插件以“HTTP/2 转发”单页呈现开关、网站与生效结果,组件列表通过声明的“配置”入口 进入同一页面。页面、样式、状态轮询与动作全部由插件拥有,页面退出时释放轮询和弹窗。 独立保存规则,不调用全局配置应用,首页和全局诊断不加载 HTTPS 资源。React 是参考界面。 页面保留本浏览器的有界只读展示摘要,再次进入先显示上次内容及读取时间,同时刷新。 摘要按设备访问地址、插件资源 revision 隔离,只含规则和设备的显示字段、信任结果及最近 协议状态,不含配置 revision、身份绑定、凭据、证书、连接或事件。摘要不得授权任何写入; 当前读取成功后才启用操作。读取失败保留内容并禁用写入,不把历史状态称为当前运行。 关闭且已排空的页面不轮询;开启期间每十秒回读状态,恢复或排空期间每三秒回读。 普通页面读取通过现有 config-get 的 diagnostics: false 参数省略事件、本地探针、 最近故障和引擎重启详情;当前接管、规则准入与恢复操作判断仍来自同一次实时状态。 展开技术诊断后回读完整状态,未取得完整结果前显示读取提示,不把缺省字段解释成无故障。 未指定该参数的调用及 CLI 状态读取保留完整结果。该投影不改变管理循环和健康探测。 请求失败同样继续有界回读,不按原因码白名单停止刷新。后台标签暂停,回到前台刷新一次, 页面退出取消定时器。地址发现、来源配置与同步归设备地址插件;本页不调用它的管理接口。 新增网站默认精确域名、443 端口和 HTTP/2。只有一个已配置接入范围时沿用该范围; 存在多个范围时必须显式选择,不自动扩大范围。名称、后缀、端口、旁路例外与范围选择 放入高级选项,编辑时保留原值。接入与证书、技术诊断默认折叠,无范围时展开接入引导。 接入区保留手工地址配置及已有动态身份绑定的选择,动态来源只读使用当前状态中的证据。 接入验证记录仅证明相应记录,不表示共享出口后的所有客户端均已信任证书。 规则只有在模块实际接管且该规则被 owner 接纳时显示已就绪;历史 HTTP/2 记录单独标注, 没有请求记录时显示等待请求。页面不展示规则熔断或目标恢复探针,模块故障锁定仍提供恢复。 macOS 工具通过已验证主机身份的 SSH 获取公开 CA,使用 系统 security 安装、验证或撤销信任。工具不会改应用 URL。下载后可执行:

python3 netfleet-macos-trust.py install --target router-admin --device mac
python3 netfleet-macos-trust.py verify --target router-admin --device mac
python3 netfleet-macos-trust.py revoke --target router-admin --device mac

系统信任证明只证明系统证书库,不能由安装成功推导为所有应用已经可用。 Codex App、CLI 和图片运行时的专项验证保留在接入记录与诊断导出,不作为日常页面任务; 没有实际验证结果时保持未知。 手工地址变更使旧信任接入记录失效。动态设备的信任绑定来源与网卡身份,地址更新不使 信任失效;身份变化需要重新验证。手工设备转为动态绑定时,仅当旧信任有效、来源新鲜且 旧地址与当前归属有交集,管理员的绑定动作才保留原有信任。来源过期或失效时不续期其 地址许可,不回落到可能已经转让的旧地址,也不累计为 HTTP/2 规则故障。 动态地址仅进入有效运行配置,不写回用户规则或改变配置 revision;冲突地址不接管。 撤销接管后,工具确认连接排空才移除系统信任。

设备管理员通过 ucode /usr/libexec/opl-netfleet/main.uc compatibility-private-backup /root/netfleet-compat-private.tar.gz 生成 包含配置、接入记录和 CA 私钥的私有备份。目标目录必须仅管理员可访问,备份文件 使用 0600 权限;此动作不暴露给 rpcd 或浏览器。普通诊断导出不包含这份备份。