Files
proxy-station/docs/MOBILE-CLIENT-AUDIT-2026-10-04.md

12 KiB
Raw Permalink Blame History

Shadowrocket/ClashMeta 体检:2026-10-04

本文保留体检开始时的快照、代码修复及随后已授权部署的证据。下文 18 个启用节点、14 个组等数量属于历史阶段;最新为 12 个启用节点、12 个组,完整盘点见 当前生产状态。

体检阶段只读盘点生产数据、拉取实际 HTTPS 订阅,对照官方资料审阅生成器,并在本地修复已确认的序列化问题。当时没有部署、修改生产业务数据、提交或推送;订阅访问会正常更新访问统计,自托管规则资源拉取可更新既有缓存。用户后续授权的部署及验收见末尾记录。

之前检查到哪里

2026-10-03 验证记录 已包含实际 Clash 订阅的 mihomo -t,以及 Shadowrocket conf 的 HTTPS 响应与候选一致性。已有测试覆盖两端的 PROTOCOL 处理、Surge AI DNS 不误传给其他端,以及 Shadowrocket 策略名不加引号;还没有两端节点、组、规则的系统体检或 iOS/Android 真机验收记录。

官方依据及边界

  • Android 的目标是 ClashMeta/mihomo,不是早期 Clash 内核。依据 mihomo 节点通用字段、VMess、SS、TLS、Hysteria2、策略组、url-test、fallback、规则、规则资源,必要时核对 官方规则解析源码。本机验证内核为 mihomo 1.19.32;它不能代替用户 Android App 内核版本及 VPN 接管测试。
  • Shadowrocket 官方来源从 App Store 开发者页面 指向 shadowlaunch.com。开发者站只提供产品与联系入口,本次没有找到可核实的完整官方配置语法手册。help.shadowrocket.net 本次不可访问,也不能从开发者入口验证其归属;第三方手册不冒充官方依据。官方更新记录明确提到逻辑规则、QUIC 匹配和 Hysteria2,足以纠正“客户端不支持逻辑规则”的绝对断言,但不足以证明某一 Surge 写法可以直接透传。
  • SS 插件传输的依据为 Shadowsocks 官方 SIP003:插件只转发 TCP。不能因客户端支持 UDP 就宣称 nginx WS 同端口也提供 SS UDP 服务。

体检开始时生产快照(历史)

项目 结果
节点 30 个,18 个启用,12 个停用
实际订阅节点范围 日本、新加坡、美国各 6 个;VMess/Trojan/SS 各 6 个,均为 WS;当时 HY2 与 RN 节点停用
组与规则 14 个启用组;116 条规则,其中 115 启用;62 个规则集记录
Shadowrocket 节点订阅 18 个,排除 0 个;原顺序中 JP/SG 按协议交错
Shadowrocket conf 14 个组,108 条规则,跳过 7 条
Clash 18 个节点,14 个组,113 条规则,60 个 provider;跳过 2 条

四类实际 HTTPS 产物均成功拉取;修复前本地生成的 Surge/Clash/Shadowrocket 节点订阅/conf 与线上逐字节一致,确认审阅的是当前下发逻辑。真实密码、UUID、域名、Host IP、token、配置和快照只保存在权限受限的临时目录,不进入本报告或 Git。

已修复的问题

问题 修复及实际影响
Shadowrocket JP/SG 混排 节点订阅对完整名称做确定性的字符串升序排序,不改变 IR、数据库排序或其他客户端顺序。当前顺序为 JP → SG → US;每国内 SS → Trojan → VMess,同协议 Direct → Warp。未来启用 HY2 时按名称自然排入
Clash 未启用 UDP 原产物 18 个节点均省略 udp,VMess/Trojan 默认不能承载 UDP。现在 12 个 VMess/Trojan 显式 udp: true;6 个 SS WS 显式 false。纯 TCP SS 和 HY2 的占位用例也覆盖;UDP 是否成功穿过远端仍需连接验证
Clash 丢失 provider 的 no-resolve 当前 IP reject RULE-SET 的 no-resolve 被丢弃,可能提前解析。现在保留这个参数,不改变规则顺序或业务策略
Clash 逻辑规则只做文字替换 原来任意 PROTOCOL 都变成 NETWORK,遇到 STUN/DOH 子条件会产生无效规则,还可能改写匹配值中的文字。现在按结构递归映射 TCP/UDP,支持明确的等价子类型,任一子条件无法表达时跳过整个表达式;保留当前 googlevideo UDP AND 规则
动态组丢失显式成员 Clash 正则分支、Shadowrocket 正则/全节点分支原来会丢节点、组或内置成员;现在保留完整有序显式成员,并继续动态收节点。当前生产动态组没有显式成员,所以这是潜在缺陷修复
测速容差 两端 url-test 显式零容差不再被省略;fallback 不输出 url-test 专用 tolerance。当前生产容差为 50,不受零值修复影响
Clash TLS/VMess 字段 补上 VMess TLS 与 SS plugin 内层的 skip-cert-verify 映射;VMess IETF cipher 别名转回 mihomo 的名称,未知 cipher 明确排除并过滤组引用。当前节点均 auto、skipCertVerify=false,因此这些修复不额外排除生产节点

Shadowrocket conf 的动态筛选仍以 App 内全部节点为来源;显式成员保留的文本和结构经过测试,但没有 iOS 编译器的实际验证。Clash 正则仅作用于动态引入来源,不能把显式成员误当作需要筛掉的动态节点。

仍存在的客户端差异与待验项

  1. 体检时 Shadowrocket 的 7 条规则缺口:本生成器保守跳过 PROTOCOL,STUN、googlevideo 的 UDP AND、4 个 DOMAIN-SET(reject/apple_cdn/download/cdn)和 SMTP 文本 URL-REGEX。同日后续删除 apple_cdn 规则后,最新产物跳过 6 条,生成器范围没有因此扩大。对应广告拦截、CDN 策略和 UDP 防护不能声称与 Surge 等价。官方版本记录表明逻辑规则支持实际存在;后续应以 App 内帮助和 iOS 编译/匹配日志核实具体语法,再缩小跳过范围。本次已修正源码注释和 AGENTS.md 的错误能力断言。
  2. Shadowrocket RULE-SET,LAN 与 PROCESS-NAME:当前产物保留一个 LAN 内置引用及一个 macOS 进程名规则,尚无官方语法证据或 iOS 匹配结果。56 个远程规则集 URL 可达并不证明这两个本地规则有效;iOS 也不能据 macOS 进程名期待相同匹配。
  3. Clash 的 2 条缺口:STUN 应用协议识别没有 NETWORK 等价物;SMTP 文本 URL-REGEX 被跳过。当前 googlevideo UDP AND 已正确转换。不能用全局拒绝 UDP 代替 STUN 规则,否则会改变业务。
  4. SS WS 没有插件 UDP 转发:选到这类节点时,UDP 无法由 WS 线路承载。mihomo 会继续向后匹配;可能走其他策略或 FINAL。未擅自新增全局 UDP 阻断、UDP-over-TCP 或改变默认选择。需在设备侧分别核对 VMess/Trojan 与 SS 候选的 UDP 行为。
  5. DNS 与原文段落不等价:Clash 使用自己的 fake-ip/DoH 配置,不读取 Surge Host、重写、MITM、Script;Shadowrocket 仅复制 General 白名单及 Host/URL Rewrite/MITM,不下发 Header Rewrite/Script。Surge 自动 AI DNS 映射不会应用到两端。当前保留的 Host/MITM 语法、证书安装、DNS/WebRTC 行为仍需设备侧检查。
  6. 节点 URI 的扩展字段:VMess/Trojan 分享链接编码未完整保留 skipCertVerify;HY2 URI 未表达 up/down 限速;SS plugin 的独立 SNI/WS Host 不一定能同时表达。HY2 解析目前还把 pinSHA256 当成跳过证书验证,却没有保存指纹,应在后续协议字段修复中拒绝或完整保留这类输入。当前启用节点 skipCertVerify 全 false、HY2 停用,18 个节点的实际连接字段往返核对通过;这不构成这些潜在输入的支持证明。
  7. 特殊字符与资源语义:Shadowrocket 正则内逗号、规则扩展参数及复用 Surge 原文段落没有完整官方语法验证;Clash 的 Go 正则也不完全等同 JS 正则。当前地区正则只是普通或分支,可以正常解析。映射到不同维护者的规则列表存在内容差异;资源可达/语法通过不保证逐条业务语义与 Surge 相同。

体检阶段验证

  • 全仓类型检查通过,51 项 Vitest 通过;新增测试覆盖四种节点协议、完整名称排序与 IR 不变、动态组显式成员、零容差、provider 命名冲突/no-resolve、逻辑子规则映射/整条跳过、TLS/cipher、排除后的组引用,并调用本机 mihomo 原生解析器。
  • 线上旧 Clash 配置与本地修复候选都通过 mihomo -t。60/60 Clash provider 下载成功;把当前资源展开为 152,295 条辅助规则后也通过原生解析,覆盖资源内的 IP-ASN 等类型。展开检查用于核对子规则语法,不替代 Android provider 初始化、域名匹配语义或规则更新行为。
  • Shadowrocket 18 个 URI 与原始节点的相关协议字段逐项核对,名称顺序正确;14 个组、108 条规则引用完整,FINAL 唯一且末尾,没有 use=。56 个远程规则集属于 Surge 检查已下载的资源。没有官方 iOS CLI,所以这是结构和序列化检查,不能称为 iOS 编译通过。
  • 实际 HTTPS Surge 运行 scripts/check-surge.py --fetch-rulesets:官方 CLI OK,60/60 资源下载,本地快照 CLI OK,静态域名遮蔽提示 0。候选 Surge 与实际产物一致。
  • git diff --check 通过。未切换活动配置、启动代理服务、导入 CA、测速或测试节点连接;iOS/Android 的订阅更新、编译、默认选择、规则命中、DNS/WebRTC、TCP/UDP 连接仍需真机验收。

后续本地变更至少执行 pnpm -r typecheck、pnpm test;Clash 使用独立临时目录 mihomo -t -d <目录> -f <配置>。涉及真实订阅仍按 Surge 变更验证 检查实际 HTTPS 产物,生产部署和数据变更分别遵循 deploy/update-db 技能。

后续部署与验收:2026-10-04

用户明确授权后,通过 deploy 技能执行 deploy.sh server --skip-checks。跳过脚本内重复检查前,已重新完成全仓类型检查、51 项测试、最新生产快照的候选 Surge/Clash 解析与规则集快照校验。

  • 部署完成:server @ 349ab83,包含工作区未提交的修复;后端源码指纹前缀 b3aaeb92cba2 与远端一致,旧源码保留为 src.old。systemd active、公网健康及未带 token 的管理接口返回 401 均正常。
  • 部署前最新生产节点范围已变为 12 个:日本/新加坡/美国各 4 个 VMess/Trojan 节点。本次保留当前启用状态,没有恢复体检快照里的其他节点或修改业务数据。
  • 部署后四类实际 HTTPS 订阅与最新已验证候选逐字节一致。Shadowrocket 的 12 个节点按完整名称升序排列,国家顺序 JP → SG → US,国内 Trojan → VMess,同协议 Direct → Warp。
  • 实际 Surge:官方 CLI OK、60/60 规则资源下载成功、本地快照 CLI OK、静态域名遮蔽提示 0。实际 Clash:mihomo 解析通过。

设备需要重新更新节点订阅;此次确认的是线上响应顺序,尚未操作 iOS/Android 客户端。前述客户端能力缺口与真机验收边界仍然适用。没有创建 Git 提交或推送。