🧭 代理网络订阅规则与多控制面讨论记录(2026-10-05)
📌 结论摘要
本轮讨论到此结束,不实施任何多控制面、移动端专用订阅或多规则发布层方案。生产侧只执行一项复位:把 RR Master 的 2S-UI subClashExt 恢复为 2026-10-04 冻结快照,移除客户端内部 type: tailscale 代理对象和 100.64.0.0/10 客户端规则。复位后 Android 的 CMFA 继续使用原始 Clash 规则;因此在 Android 系统只允许一个有效 VpnService 的前提下,CMFA 与原生 Tailscale 不能同时运行,手机在使用 CMFA 时无法继续以自身身份进入 Tailnet。2026-10-05 04:17 CST,S20 已完成一次 CMFA 订阅刷新,客户端日志确认关闭旧 AgentMeshOS-tailscale 代理和 Tailscale/WireGuard/DERP 连接;从 RR 和 101 探测 100.64.0.11 均超时。除这一项 Tailnet 能力限制外,普通代理、策略组、订阅更新、节点顺序切换和原有分流规则不受影响。
📚 目录
🧩 背景与目标
讨论起源于一个具体矛盾:Android 上原生 Tailscale 与 CMFA 都需要占用系统 VPN,无法同时运行;此前为了在手机上同时保留 Tailnet 管理能力和 Clash 代理能力,尝试在全局 Clash 订阅中注入 Mihomo 内嵌 Tailscale outbound。该做法虽然能在单一 CMFA VPN 内同时承载代理和 Tailnet,但会把 Tailscale endpoint 分发给所有订阅客户端,造成 Windows、iOS 等平台可能生成额外 Tailscale 身份,配置边界不断扩大。
本轮目标是判断是否存在更简单的架构,例如让五台节点分别成为规则发布者,每个节点生成一套 Clash 订阅,Console 只展示当前对应关系。讨论结论明确为不采用。依据是 2S-UI 的订阅模板、节点同步模型和当前项目控制面边界,均已在本页记录。
📊 当前事实与复位证据
| 项目 | 复位前 | 复位后 | 依据 |
|---|---|---|---|
RR Master subClashExt |
含 AgentMeshOS-tailscale 代理和 IP-CIDR,100.64.0.0/10 规则 |
无客户端代理对象;规则为 GEOIP,Private,DIRECT、MATCH,Proxy |
RR s-ui.db 只读回读 |
| 冻结快照长度 | 1161 字节 | 1161 字节 | /var/backups/agentmeshos/proxy-panel-cutover/master-dog-20261004T035521Z/s-ui.db |
subClashExt SHA-256 |
badbb56c369124a01bd4acba98aef43ea36a9b7d2759958a2e4d34340bd5778d |
986260c99b73b62460b7147e253dc8e1e9f72e36c5eaa4028e2b934ec0238e41 |
复位前后只读哈希 |
| 客户端 Tailscale 配置 | 全局订阅存在 | 不存在 | 公网订阅回读 tailscale_hits=0 |
| S20 CMFA 客户端配置 | 运行内嵌 AgentMeshOS-tailscale |
已刷新并关闭旧代理;代理页仅保留 PROXY、AUTO |
2026-10-05 04:17 CST 客户端日志和界面回读 |
| 策略组顺序 | MM -> d02 -> dog -> dd -> rr |
未改变 | Proxy 与 Auto 组读回一致 |
| 生产变更范围 | 仅订阅字段 | 仅订阅字段 | 未修改节点、入站、端口、协议和客户端凭据 |
复位使用的最小写操作是 2S-UI 管理 API 的 object=settings、action=set,只写入 subClashExt 与配套的 subClashNoDefGrp。写入前,RR 上当前值已备份到 /root/.codex/backups/proxy-network-subclash-ext-restore/20261004T195911Z/,目录权限为 0700,文件权限为 0600。执行后从公网订阅读取到原始规则,format=clash 响应中不再出现 tailscale 或 100.64.0.0/10。
🔍 2S-UI 的真实边界
2S-UI 1.8.3 的 subClashExt 是实例级全局字段,同一控制面下的客户端共享这一份 Clash 扩展。用户管理可以选择节点、入站和外部链接,但不能按 Android、Windows、iOS 覆盖全局 YAML。源码依据是 sub/clashService.go 读取 subClashExt 后直接合并到订阅,以及 service/setting.go 将该值保存在设置表中。
因此,“每个节点一套规则”在概念上成立,但准确条件是:每台机器必须是独立控制面实例,并拥有自己的设置、数据库、订阅入口和客户端域。 如果仍然只有 RR 一个 Master,另外四台只是被纳管节点,那么五台机器不会自动产生五套全局规则。
🧱 多控制面方案的冲突
| 方案 | 表面收益 | 实际冲突 | 结论 |
|---|---|---|---|
| 五套独立面板,各自只管理自己 | 规则互不覆盖 | 每套订阅默认只覆盖本机,跨节点 fallback 和维护一致性下降 | 可作为独立实验,不进入当前架构 |
| 五套面板都管理五个节点 | 每个平台可拿一套订阅 | 五套 Master 会争抢同一节点的 @cluster 客户端集合,存在互相删除和覆盖风险 |
不采用 |
| 一套 Master 加规则发布层 | 单一写权威,多平台输出 | 需要新增轻量服务,且要处理鉴权、缓存、脱敏、回退和健康检查 | 本轮不实施 |
| 客户端内嵌 Tailscale endpoint | Android 单 VPN 可同时访问 Tailnet | 全局模板污染,所有平台可能新增身份 | 已复位并移除 |
2S-UI 的节点同步代码把 Master 推送的客户端统一标记为 @cluster,每次对账会把节点上“属于 @cluster 但不在当前 Master 期望列表内”的客户端删除。这意味着多套 Master 无隔离地管理同一节点不是受支持的 HA 或分权模型。若要实现多控制面,必须额外定义写权威、数据同步和冲突处理,不能仅靠节点数量推导出规则数量。
📱 Android 复位后的能力边界
| 能力 | 复位后状态 | 说明 |
|---|---|---|
| Clash/Mihomo 代理与主备切换 | 保留 | 继续使用原始 Proxy、Auto 和五节点顺序 |
| 订阅更新与节点分流 | 保留 | 仍由 https://proxy.yohan.fun/sub/agentmeshos-main?format=clash 提供 |
| CMFA 内部进入 Tailnet | 移除 | 订阅中不再有 type: tailscale endpoint |
| 原生 Tailscale 与 CMFA 同时运行 | 不支持 | Android 同一用户同一时间只能有一个有效系统 VPN |
| Tailnet 其他节点反向访问 S20 | 不能依赖 CMFA | 需要原生 Tailscale 或另行设计移动端订阅 |
| 中国网站直连规则 | 恢复到冻结快照 | 当前只有 GEOIP,Private,DIRECT 和 MATCH,Proxy |
结论很明确:用户在使用 Clash 时不能同时使用 Android 原生 Tailscale,因此也不能以 S20 自己的 Tailnet 身份访问或接受 Tailnet 流量。这是当前唯一新增的能力损失;普通代理、订阅、规则和故障切换没有被回退影响。若未来必须同时使用两者,只能在 Root 透明代理、独立设备或专门的移动订阅服务三条方向中另行评估,本轮均不执行。
🔧 复位与验证
- 从 RR 冻结快照读取原始
subClashExt和subClashNoDefGrp。 - 将复位前值写入 RR root-only 备份目录,保留精确 YAML 和元数据。
- 通过 2S-UI 管理 API 只写这两个设置字段,不重启核心,不修改节点和入站。
- 只读回读
s-ui.db,确认哈希与冻结快照一致,proxies=0,规则为原始两条。 - 从公网请求
format=clash,确认tailscale_hits=0,策略组仍为Proxy和Auto。 - 在 S20 的 CMFA 中执行一次订阅更新;日志确认
Closing outdated proxy [AgentMeshOS-tailscale]、Client.Shutdown done和Device closed。 - 从 RR 与 101 分别执行 Tailnet 探测,
100.64.0.11均超时,确认旧客户端身份已不再提供连接。 - 删除 RR 上一次性复位脚本,只保留受控备份和本页脱敏记录。
🔁 回退方案
若需要恢复本轮复位前的状态,可使用 RR 上 /root/.codex/backups/proxy-network-subclash-ext-restore/20261004T195911Z/subClashExt.current.yaml。该文件仅用于订阅扩展字段恢复,不能用于恢复整个 2S-UI 数据库。由于本轮没有修改节点、入站、协议、端口或客户端配置,回退不需要重启 s-ui.service,也不应触碰其他面板和证书配置。
⚠️ 风险与未决项
| 事项 | 当前事实 | 影响 | 下一步 |
|---|---|---|---|
| S20 客户端复位 | 已完成 | 服务端订阅和 CMFA 本地配置均已移除内嵌 Tailscale endpoint;代理页仅保留原始 PROXY、AUTO |
无需继续处理 |
| Headscale 中残留 CMFA 身份 | 节点 id=22、名称 agentmeshos-android、显示名 andriod-s20-cmfa、地址 100.64.0.11 的记录仍存在,但 RR 与 101 探测均无响应 |
仅保留一条不再连接的注册记录,不影响当前代理链路 | 若要求彻底清理,再单独删除该节点记录 |
| 多控制面讨论未实施 | 仅保留本评估文档 | 没有新增服务、域名、写权威或同步冲突 | 维持当前单 Master、单全局 Clash 模板 |
需要用户决策:是否清理此前由 CMFA 内嵌 Tailscale 在 Headscale 中产生的额外节点身份。除此之外,本轮无待实施项。