🎯 AgentMeshOS 代理网络生产架构(2S-UI + sing-box,2026-10-04)
📌 结论摘要
新的自用代理网络已经完成部署并通过真实流量验收:rr 作为 2S-UI Master,统一管理 MM、d02、dog、dd 和本机 rr 共五个真实出口;客户端按 MM -> d02 -> dog -> dd -> rr 顺序主备。P17-7 已为五台节点补齐 VLESS + REALITY 的 24443/tcp 入口,并逐台通过真实 Mihomo 连接、ICMP 和吞吐验证;旧 Hysteria2、SS2022、Trojan Inbound 暂时保留,等待离线客户端迁移后再删除。P17 又为四个远程节点增加了 panel-mm、panel-d02、panel-dog、panel-dd 独立面板域名、独立 ECC 证书和 Console 统一架构入口;管理员可以从 https://proxy.yohan.fun/ 管理全局,也可以从 Console #proxyNetwork 直达任一节点面板。Home 和 OfficeSummer 已刷新五节点订阅;360T7 已建立 MM 主 Balancing 和四节点后备 Balancing,但新 Xray 全局透明代理未通过 GitHub 控制面稳定性验收,Global node 已回滚旧路径。Summer、S20、Magic2 当前离线,Android/iOS 真机未完成,因此 P17 尚未关闭。
Mihomo/Stash 的 fallback 只保证健康接替,不保证自动回切。 当前健康备用在 MM 恢复后可能继续保持;2S-UI 的 format=json 订阅可以正常返回五个 outbound,但 sing-box urltest 不具备同等优先级语义,因此正式客户端口径继续以 Clash/Mihomo 兼容订阅为主;严格回切行为由 360T7 的 Xray 主 Balancing + 后备 Balancing 承担。新旧链路并存,原 ss-rust、360T7 旧 HAProxy 路径和原订阅回退材料仍保留。
📚 目录
🧩 架构与角色
| 层级 | 组件 | 已部署职责 | 依据 |
|---|---|---|---|
| 客户端 | Windows / Android / iOS | 消费同一份 Clash 订阅,执行本地健康检查和顺序主备 | Clash 订阅中 Auto 为 fallback,成员顺序为五台 Reality;自动回切仅作尽力而为 |
| 控制面 | rr / 2S-UI Master | 管理节点、客户端、订阅和节点入站 | /usr/local/s-ui/sui -v 返回 S-UI Panel 1.8.3 |
| 控制面 | 五节点 2S-UI Node API | 节点心跳和 inbound 纳管 | Master 幂等执行回读四个 replica 均为 unchanged |
| 控制面入口 | proxy.yohan.fun/ |
直接进入 2S-UI 自身登录;订阅保持同一域名的 /sub/ |
MM 回源 RR Tailnet 100.64.0.1:2095 和 2096 |
| 节点面板入口 | panel-mm/d02/dog/dd.yohan.fun/app/ |
每个节点独立证书、独立登录和本机 inbound 管理 | 四域名 CNAME 到 edge.yohan.fun,由健康 Edge 承接后回源 RR 私有网关 |
| Console 导航 | console.yohan.fun/#proxyNetwork |
展示统一架构,提供 Master 与四个节点面板直达链接 | 页面代码契约与桌面、390x844 浏览器测试通过,不嵌入 iframe |
| 数据面 | MM、d02、dog、dd、rr | 提供五条 VLESS + REALITY 出口,正常时只使用首个健康节点 |
五条真实代理链路均返回目标节点公网 IP |
| 旧链路 | ss-rust / 360T7 | 保持原有服务、端口、密码和订阅 | 本轮未修改旧链路配置或进程 |
2S-UI 1.8.3 的可执行文件内嵌了 github.com/sagernet/sing-box v1.14.1,没有独立 sing-box systemd 服务。五台节点的 s-ui.service 均为 active、enabled,进程重启策略为 Restart=on-failure。这意味着核心版本随 2S-UI 二进制升级,不能再把“单独升级 sing-box”当作独立步骤。
📊 数据面与协议
| 顺序 | 节点 | 协议 | 公网入口 | 故障域 |
|---|---|---|---|---|
| 1 | MM | VLESS + REALITY | mm-proxy.yohan.fun:24443/tcp |
主节点,独立固定 A 记录 |
| 2 | d02 | VLESS + REALITY | d02.yohan.fun:24443/tcp |
备用 1 |
| 3 | dog | VLESS + REALITY | dog-proxy.yohan.fun:24443/tcp |
备用 2 |
| 4 | dd | VLESS + REALITY | dd.yohan.fun:24443/tcp |
备用 3 |
| 5 | rr | VLESS + REALITY | rr-proxy.yohan.fun:24443/tcp |
末位备用,同时承载控制面 |
当前迁移阶段五台节点只对外启用一条 VLESS + REALITY 主链路,旧 Hysteria2、SS2022、Trojan Inbound 仅作为尚未刷新客户端的临时回退材料,不进入 Auto 主备组。每台节点使用独立的 REALITY 私钥、Short ID、SNI 和伪装目标;客户端 UUID 由用户明确接受为五台共享。
mm-proxy.yohan.fun 是 MM 代理出口的稳定 CNAME,指向唯一节点身份 mm.yohan.fun,不参与 P15 的 edge.yohan.fun 自动切流。proxy.yohan.fun 同时作为 2S-UI 控制面和订阅入口;把两者分开后,Edge DNS 切换不会改变订阅中 MM 节点的物理身份。
🧩 订阅与控制面
| 订阅形式 | 地址 | 结果 | 适用性 |
|---|---|---|---|
| 裸订阅 | https://proxy.yohan.fun/sub/agentmeshos-main |
HTTP 200,Base64 节点链接 | 通用客户端导入 |
| Clash | https://proxy.yohan.fun/sub/agentmeshos-main?format=clash |
HTTP 200,含 Auto: fallback |
Windows、Android、Stash |
| JSON | https://proxy.yohan.fun/sub/agentmeshos-main?format=json |
HTTP 200,返回五个 outbound | sing-box 可解析,但无严格优先级保证 |
Master 的 subClashExt 已写入以下策略组:
| 项目 | 当前值 | 验证 |
|---|---|---|
Proxy |
select,首项为 Auto |
配置解析通过 |
Auto |
fallback |
配置解析通过;严格自动回切不承诺 |
| 顺序 | MM,d02,dog,dd,rr |
与五条真实节点标签逐项一致 |
| 健康检查 | http://www.gstatic.com/generate_204 |
现场组探测均返回延迟 |
| 周期 | interval=180、lazy=false |
客户端持续探测,不等待首次使用 |
2026-10-12 Master subClashExt 当前规则为 DOMAIN-SUFFIX,agentrouter.org,Proxy、DOMAIN-SUFFIX,vidhub2.top,DIRECT、GEOIP,LAN,DIRECT、GEOIP,Ads,REJECT、GEOIP,CN,DIRECT、MATCH,Proxy。自定义域名规则统一放在 GEOIP 之前,按第一条命中执行;强制代理使用 DOMAIN-SUFFIX,<域名>,Proxy,强制直连使用 DOMAIN-SUFFIX,<域名>,DIRECT。Ads-Block 必须在 China-Direct 前面,避免中国广告 IP 被直连放行。Private-Direct 已移除,局域网覆盖改由 LAN-Direct 承担。该规则只影响 Clash 客户端,不改变 360T7 PassWall;360T7 当前仍使用旧 Balance 路径,Xray 主备配置保留但未切换为全局入口。
控制面只监听各节点 Tailnet 地址的 2095。管理员入口固定为 https://proxy.yohan.fun/:MM 公网 443 将根路径规范化到 /app/,并直接回源 RR Tailnet 100.64.0.1:2095;2S-UI 使用自身账户完成唯一一层登录。订阅入口保持 https://proxy.yohan.fun/sub/,由同一域名的 MM vhost 回源 100.64.0.1:2096。旧 console.yohan.fun/app/ 只保留到新域名的兼容跳转,不再经过 A-Auth 或 RR 私有回源网关。以 rr 作为独立观测点,五台节点的公网 2095 均为 blocked;从 101 观察到的 d02 异常 SYN 已完成二次验证,确认不是面板公网暴露。Master 与 topology 在 rr 上的 SHA-256 分别为 a656122de35f10c6cb0c9fc255d8af98277d656fe1082984f09ffd0ba620372b 和 79e957f680de1ebba175f992d0e5ff48ef002eacfb39358a449efbcbdbaf481f,与仓库一致。
RR Master 的面板身份固定为 webDomain=proxy.yohan.fun、webURI=https://proxy.yohan.fun/app/;订阅身份保持 subDomain=proxy.yohan.fun、subURI=https://proxy.yohan.fun/sub/。四个远程节点的 webDomain/webURI 分别绑定自己的 panel-*.yohan.fun/app/,subDomain/subURI 保持为空,因为订阅只由 Master 生成。依据是 2S-UI 1.8.3 同时执行 Host 与 Origin 同源校验;面板与订阅共用独立域名,但与 Console A-Auth 认证完全解耦。
🧩 P17 面板入口与生产回读
P17 采用“健康 Edge 终止公网 TLS、RR 私有网关按 Host 转发、节点只监听 Tailnet”的三层路径。每台 Edge 通过 DNS-01 签发同时覆盖 proxy 和四个 panel-* 的 ECC 证书;proxy 回源 RR 2095/2096,面板经 100.64.0.1:39200 回源,RR 再按 Host 把请求转到对应的 100.64.0.x:2095。这样浏览器只访问公网 HTTPS,节点 2095/2096 仍不开放公网,2S-UI 看到的 Host 与浏览器地址也保持一致。
| 回读项 | 当前结果 | 依据 |
|---|---|---|
| DNS | proxy 与四个 panel-* 均为 CNAME edge.yohan.fun,TTL 600 |
AliDNS 权威配置;223.5.5.5 与 1.1.1.1 双解析点回读 |
| 证书 | 四张独立证书 SAN 均只有自己的面板域名,有效期至 2027-01-02 | 公网 openssl s_client 回读 |
| HTTP | 根路径 302 到 /app/,/app/ 返回 307 到各自 /app/login |
从 101 公网请求四个域名 |
| WebSocket | 认证态 https://proxy.yohan.fun/app/ws 返回 HTTP/1.1 101 Switching Protocols |
2S-UI 管理员会话经公网 HTTPS 完成真实 Upgrade |
| Master 拨号 | 四个节点 base_url 均为 http://panel-<node>.yohan.fun:2095,dirty=0 |
RR 只读查询 s-ui.db |
| 节点健康 | 认证后 api/load 返回 MM、d02、dog、dd 全部 online,dog 延迟约 81 ms |
2S-UI Master 实时 nodesStatus,不以 SQLite last_seen 单列代替健康判断 |
| 端口边界 | MM、d02、dog、dd 的公网 2095 和 2096 均超时 |
从 101 发起 TCP/HTTP 探测 |
| 回退快照 | dog、MM、d02、dd 节点和 RR Master 均有独立数据库快照 | /var/backups/agentmeshos/proxy-panel-cutover/ |
RR 的 /etc/hosts 受控区块只登记四个面板域名到 Tailnet IPv4,不改变公网 DNS 或系统主机解析的其他条目。proxy.yohan.fun 的 Master 入口与 /sub/ 订阅保持原路径;proxy 和 panel-* 的公网入口通过 CNAME 跟随 edge.yohan.fun,不再绑定 MM 公网 IP。MM、d02、dd、dog 等 Edge 必须同时具备对应证书、Nginx vhost 和到 RR 2095/2096/39200 的回源能力,控制器才会把该节点判定为健康。旧 console.yohan.fun/app/ 继续只做 308 兼容跳转。
🧪 客户端选型
| 平台 | 推荐 | 依据与边界 |
|---|---|---|
| Windows | Clash Verge Rev v2.5.7 |
官方项目说明其内置 Mihomo 内核;Home 与 OfficeSummer 已刷新五节点 Reality profile |
| Android | Clash Meta for Android v2.11.35 |
MetaCubeX 官方 Android GUI,直接复用 Mihomo/Clash 配置 |
| iOS / iPadOS | Stash v3.4.1 |
官方文档支持 fallback,发布说明确认支持 VLESS-TCP-REALITY、Hysteria2 和 SS2022 |
不存在一个同时覆盖 Windows、Android 和 iOS 且由同一团队维护的客户端,因此“统一客户端”在当前生态中只能落为统一订阅语义、统一策略组和统一节点排序。Windows 与 Android 推荐均使用 Mihomo 核心;iOS 无法运行 Mihomo 官方核心,Stash 是当前配置兼容度和协议覆盖最合适的方案。
P17 真机验收当前口径为:Home 与 OfficeSummer 已完成五节点 Reality 订阅刷新和五台节点回读;Home 当前 Auto 回读为 MM,OfficeSummer 通过本机代理返回 204。Windows 仍未按新五节点订阅完成逐台阻断、切到后备和严格回切验收,因此不能沿用旧协议时代的 12 步结果替代。Android Little 的 S20+ 已建立 Termux、Termius 和 TermRover 对九个在线节点的移动 SSH 管理通道;Honor Magic2 已通过 Home USB ADB 纳管为第二台 Android 移动管理与观测节点,Tailnet 100.64.0.13。两台 Android 与 Summer 当前离线,Clash Meta 的新五节点订阅刷新/切换未执行;iOS 当前没有在线设备。自启恢复与 Clash 真机验收不能用管理通道存在、资料哈希或 Linux Mihomo 测试替代。
官方依据:
- Mihomo Fallback:当前节点超时后,按代理顺序选择第一个可用节点。
- Clash Verge Rev:Windows GUI,内置 Mihomo。
- Clash Meta for Android:MetaCubeX 官方 Android GUI。
- Stash 策略组:支持
fallback,按配置顺序选择健康节点。 - Stash iOS 发布记录:
3.3.3确认 VLESS-TCP-REALITY,后续版本继续支持 Hysteria2 等协议;App Store 当前公开版本为3.4.1。
🧪 真实流量与故障验证
验证使用官方 Mihomo v1.19.32 临时二进制;发布包 SHA-256 为 8451100836c9eda194331c2babfad490b2faf30cebc1a04b0e76fd8ac2d35d10。测试配置关闭 TUN、DNS 和 LAN 暴露,只监听 127.0.0.1:17890,不会接管 101 的系统路由。
| 节点 | 出口 IP | 稳定性 | 代表吞吐 | 结论 |
|---|---|---|---|---|
| MM | mm-proxy.yohan.fun 固定 A 记录 |
10/10 | 0.5174 MiB/s | 24443/tcp REALITY 可用 |
| d02 | 107.172.186.4 |
10/10 | 0.5796 MiB/s | 24443/tcp REALITY 可用 |
| dog | 173.249.205.221 |
10/10 | 0.5287 MiB/s | 24443/tcp REALITY 可用 |
| dd | 192.227.170.39 |
10/10 | 0.4446 MiB/s | 24443/tcp REALITY 可用 |
| rr | 96.44.133.235 |
10/10 | 0.4382 MiB/s | 24443/tcp REALITY 可用 |
当前五节点 Reality 结果来自 P17-7 的 20 秒隔离回归,证据位于 temp/p17-7-<node>-test.json 和 temp/p17-8-<node>-test.json;每台均为 10/10 成功、ICMP 0% 丢包。历史 soak-20261003T1133.json 的 600 秒结果属于旧异构协议阶段,不能替代新 Reality 的长期观察。吞吐数据来自 101 当前线路的 1 MiB 抽样,只用于确认协议和链路可工作,不代表中国移动端、家庭宽带或 360T7 的最终质量。
| 故障阶段 | 初始节点 | 阻断后节点 | 恢复后节点 | 实测结果 |
|---|---|---|---|---|
| 逐台阻断 | MM | d02 | 仍为 d02 | 第一次切换成功 |
| 逐台阻断 | d02 | dog | 仍为 dog | 第二次切换成功 |
| 逐台阻断 | dog | dd | 仍为 dd | 第三次切换成功 |
| 逐台阻断 | dd | rr | 仍为 rr | 末位兜底成功 |
| 单台恢复 | rr | rr | dd | 高优先节点恢复后自动回切 |
| 全部恢复 | dd | dd | MM | 最终回到主节点 |
单次健康检查失败就会改变当前选择,下一次成功检查会回到更高优先节点;该实现没有 rise/fall 连续失败阈值。短于 180 秒且没有跨过健康检查的抖动不会被组状态感知,跨过一次检查的中断则会立即切换。
已有连接不会迁移。 测试中在 MM 上建立慢速下载后阻断 MM,Auto 已切到 d02,但原连接仍在旧出站等待并最终超时,18 秒仅收到约 1.79 MiB。因此该架构的正确表述是“新连接有序主备”,不是会话无损迁移。
🔁 回退与恢复
五台节点已用 2S-UI 自带 backup 生成数据库快照,路径为 /root/.codex/backups/proxy-network-2s-ui/,权限均为 0600 root:root。这些快照只用于恢复节点面板、客户端和订阅元数据,不包含旧 ss-rust 数据。
| 对象 | 回退方式 | 当前限制 |
|---|---|---|
| 2S-UI 配置 | 恢复对应节点数据库快照 | 需要先停止 s-ui,恢复后再启动并回读服务 |
| 2S-UI 二进制 | 使用固定 release 1.8.3 重新安装 |
只有 d02 存在 sui.last-known-good;其余四台为首次安装 |
| 客户端 | 删除新订阅,继续使用旧 ss-rust 订阅 | 新旧链路并行,无强制切换 |
| 控制面 | 保留 rr 上 root-only topology、凭据和节点 token | 丢失控制面不影响已导入客户端的现有策略组 |
⚠️ 风险与未决项
| 风险或未决项 | 当前事实 | 下一步 |
|---|---|---|
| 中国客户端侧验收 | Home 与 OfficeSummer 已刷新五节点 Reality;Windows 新订阅的逐台故障切换尚未执行;Android/iOS 当前无在线可控入口 | Windows 继续按新订阅做故障切换和稳定性观察;Android/iOS 上线后执行同口径验收 |
| 三端 P17 真机验收 | 新五节点订阅已发布,但 Summer、S20、Magic2 当前离线;iOS 无在线设备 | 客户端上线后完成订阅刷新、切换和回切;在闭环前 P17 不归档 |
| iOS 实机验证 | Stash 官方能力已确认,但尚未在真实 iPhone/iPad 导入五节点 Reality 订阅 | 首台 iOS 设备导入后确认 fallback 和 REALITY 的实际表现 |
| 现有连接中断 | 切换不会迁移旧连接 | 长连接业务需依赖客户端重连,不能承诺连接级无缝 |
| 抖动阈值 | 没有连续失败计数 | 若误切明显,评估更换策略组或增加客户端侧脚本,不在当前版本猜改 |
| rr 同时承载控制面和末位出口 | rr 故障会同时影响订阅更新和末位兜底 | 若控制面必须独立,再增一台小 VPS;当前接受该风险 |
| 协议安全评估 | 五台 REALITY 已实际连通;旧异构协议暂时保留但已退出订阅主组 | P17-10 全部客户端迁移后再删除旧 Inbound,并继续按真实网络观测评估 |
| 360T7 | 已建立 MM 主组和 d02/dog/DD/RR 后备组;但新 Xray 全局透明代理在 GitHub 控制面出现连接重置,Global node 已回滚到旧 f9Re2U27 |
先修复 Xray 全局路径稳定性,再重新切换;不清理旧路径 |
⚠️ 需要用户决策
| 决策项 | 推荐 | 理由 |
|---|---|---|
| 正式客户端 | 三端使用不同实现、同一订阅语义 | Windows 用 Clash Verge Rev,Android 用 Clash Meta for Android,iOS 用 Stash;三者均消费同一份 Clash 配置 |
| 主节点验收 | 从实际使用网络完成端到端测试后再固定 MM | 101 测速不能代表中国移动网络和路由器环境 |
| 控制面独立性 | 先接受 rr 同机,后按故障影响再决定是否独立 | 当前五台资源可直接运行,独立控制面会增加维护和成本 |
| 旧链路下线 | 由你保留一个自定回退周期 | 新旧链路已隔离,不会互相覆盖 |
| P17 客户端窗口 | Windows 真机已通过,Android/iOS 仍待验收 | Android 需启用 USB 调试并连接可管理主机,或提供已授权的无线 ADB;iOS 需提供在线真机;P17 保持进行中 |