实现独立加密设备身份、网关 agent、持久生命周期任务和 Surge/FlClash 专属订阅凭证。 完善 Shadowrocket 规则转换与 Clash AI DNS,增加 Surge FFSB 适配、规则快照、运维工具及验收文档。
78 lines
9.8 KiB
Markdown
78 lines
9.8 KiB
Markdown
# Shadowrocket/FlClash 全面校验(2026-10-13)
|
||
|
||
后续本地修复与回归见 [移动端修复记录](MOBILE-CLIENT-FIX-2026-10-13.md)。该候选尚未部署;下文保留生产审计时的行为与数量。
|
||
|
||
主要业务域名与 Finance 的分流结构正确;Clash 实际配置通过官方 mihomo 原生解析及隔离匹配测试。但两端并未完全实现 Surge 的全部规则与 AI DNS 行为,iOS Shadowrocket 真机编译、Android FlClash 的活动配置与 VPN 接管尚未验收。
|
||
|
||
## 生产变更
|
||
|
||
用户要求删除旧的手动 PayPal 规则。管理 API 确认 `DOMAIN-SUFFIX,paypal.com` 仍存在,已改指向 Finance;本次删除这条记录,保留 `DOMAIN-KEYWORD,paypal → 💰 Finance`。主站及子域仍匹配 Finance,其他规则逐项比对不变,没有重置规则或部署代码。
|
||
|
||
在线备份:`/opt/proxy-station/data/backups/before-remove-manual-paypal-mobile-audit-20261013-172618.db`,删除前已确认 root 属主、600 权限、非空。最新数据库 265 条规则(263 启用),13 个组、25 个成员,Finance 86 条。节点仍为 30 个登记、12 个启用;节点、组成员、设置及设备保存选择未修改。
|
||
|
||
## 官方依据
|
||
|
||
Android 目标已由用户确认为 FlClash。其[官方项目](https://github.com/chen08209/FlClash)基于 ClashMeta;[内核子模块](https://github.com/chen08209/FlClash/blob/main/.gitmodules)指向作者维护的 Clash.Meta FlClash 分支。本次查询的子模块提交为 `8597778c7df410ebe88c57e59eaab32d203156df`;用户设备的 App/内核版本尚未取得,不声称临时官方内核与手机内核逐字节相同。
|
||
|
||
配置审阅依据 [mihomo 路由规则](https://wiki.metacubex.one/config/rules/)、[策略组](https://wiki.metacubex.one/config/proxy-groups/)、[规则资源](https://wiki.metacubex.one/config/rule-providers/)、[DNS](https://wiki.metacubex.one/config/dns/)、[VMess](https://wiki.metacubex.one/config/proxies/vmess/)和 [Trojan](https://wiki.metacubex.one/config/proxies/trojan/)。官方规定规则按顺序匹配、DOMAIN-SUFFIX 包含根域和子域、NETWORK 区分 TCP/UDP;UDP 选中不支持 UDP 的代理时会继续往下匹配。正则只过滤动态引入的节点,不过滤显式组成员;默认选择未指定时为首项。
|
||
|
||
iOS 目标已由用户确认为 Shadowrocket。[官方 App Store 页面](https://apps.apple.com/us/app/shadowrocket/id932747118)确认域名、CIDR、GeoIP、DNS、用户代理规则、DNS 加密等能力,更新记录也确认逻辑规则和 QUIC 匹配存在。该页面链接的[开发者站](https://shadowlaunch.com/)没有完整配置语法手册或可调用的原生校验器。本次未将第三方手册或 Surge 编译器作为 Shadowrocket 官方语法证据;`policy-regex-filter` 等细节仍须 App 内帮助及真机编译/匹配确认。
|
||
|
||
## 检查范围与结果
|
||
|
||
所有真实 token、密码、UUID、节点主机、Host 映射及配置只保存在权限受限的私有临时目录。实际 HTTPS 四类订阅均成功下载、非空、结构正确,删除的规则均不再下发;Surge 的 self URL 正确。
|
||
|
||
| 检查 | 结果 |
|
||
|---|---|
|
||
| 本地生成器与生产产物 | Clash、Shadowrocket 节点订阅、Shadowrocket conf 逐字节一致 |
|
||
| 节点 | 两端各 12 个,6 VMess+6 Trojan,均 WS/TLS;无排除;分享 URI 的凭据及连接字段往返一致 |
|
||
| 安全/UDP 字段 | Clash 12 个节点均 udp=true,未启用跳过证书校验;Shadowrocket 当前节点 skipCertVerify=false |
|
||
| 组与引用 | 13 组,所有引用存在;地区动态组各 4 节点,两个独立全节点组各 12;Finance 美国、日本、新加坡、DIRECT,默认美国,无 All Nodes |
|
||
| Clash 正文 | 261 条规则、49 个 provider,唯一末尾 MATCH |
|
||
| Shadowrocket conf | 257 条规则、46 个远程 RULE-SET,唯一末尾 FINAL;策略名裸写,无 Surge use= 引用 |
|
||
| 外部资源 | 95 个不同 URL 全部下载;Clash 资源 157,260 个条目;Shadowrocket 资源 24,000 个条目 |
|
||
| 官方 mihomo | v1.19.32 darwin arm64;官方发布 SHA256 核验后仅解压至临时目录。原订阅和 file-provider 快照配置均通过 -t |
|
||
| 全部 Clash 资源子规则 | 展开为 157,472 条规则,补齐官方 Country/ASN 数据后,通过原生解析 |
|
||
| 隔离内核运行 | 49 个真实 file-provider 初始化,无错误;动态组与 Finance 默认值经 API 核对 |
|
||
| 原生路由 | 145/145 个受控 TCP/域名/IP 用例匹配预期策略链;额外 googlevideo UDP 用例原生匹配 AND→REJECT |
|
||
| Shadowrocket 静态路由 | 最后一次共 143 个域名样例;按域名/后缀/关键词/通配规则及资源展开核对。不是原生 Shadowrocket 引擎;不模拟 IP 解析、进程、协议或设备缓存 |
|
||
| Surge 回归 | 官方 CLI、49/49 外部资源快照通过,静态域名遮蔽提示 0 |
|
||
| 现有移动端测试 | 2 个测试文件、8 项 Vitest 通过,包括新取得的 mihomo 原生解析用例 |
|
||
|
||
原生路由测试使用独立 localhost 入站与 controller,不开 TUN、不改系统代理;原规则顺序、provider 内容和策略组保持,但所有节点传输临时替换成本地 SOCKS 模拟端点,DNS 为受控主机映射。没有使用真实节点连接支付服务。该结果证明受控元数据下的内核规则/策略选择,不能证明真实节点可连接、地区出口稳定、真实解析出的 IP 路由或手机 VPN 接管。少数 DIRECT 域名使用受控本机地址,不能据此推断其真实公网 IP 的 GEOIP 路径。
|
||
|
||
## 明确的差异与缺口
|
||
|
||
1. Clash 跳过 2 条:`PROTOCOL,STUN → REJECT` 和 SMTP 文本 `URL-REGEX → DIRECT`。NETWORK TCP/UDP 无法代替应用协议 STUN,不能称全局 WebRTC 防护已通过。
|
||
2. Shadowrocket 跳过 6 条:STUN、googlevideo UDP AND、reject/download/cdn 三个 DOMAIN-SET、SMTP 文本 URL-REGEX。这是生成器的保守范围,不等于 App 不支持逻辑规则。其 googlevideo 域名静态路径是 Streaming,不能继承 Clash 的 UDP 拒绝结果。三个 DOMAIN-SET 缺失会改变部分广告、下载和 CDN 覆盖,即使相邻 RULE-SET 可能覆盖部分域名,也没有证明完全等价。
|
||
3. Shadowrocket 仍下发 `RULE-SET,LAN,DIRECT` 及 macOS 的 FFSB 进程例外。没有取得其在 iOS 的原生语法/匹配证据;macOS 进程规则不能用于证明 iOS 分流。远程资源还含 IP-ASN、USER-AGENT、PROCESS-NAME、URL-REGEX 等类型,资源下载成功与域名模型通过均不证明这些类型已由 iOS 正确编译。
|
||
4. Clash DNS 为国内 DoH+fake-ip,没有 nameserver-policy/respect-rules 的 AI 随出口配置。Shadowrocket 的 General 使用国内普通 DNS,未继承 Surge 派生的 Cloudflare AI Host 映射。依据 [mihomo DNS 官方说明](https://wiki.metacubex.one/config/dns/),DNS 连接遵守路由需要相应配置及 proxy-server-nameserver。因此两端业务连接进入 AI 不代表 DNS 查询也随 AI 出口,不能沿用 Surge 的 Net.Coffee 无泄漏结论。
|
||
5. 两端 FINAL/MATCH 没有 Surge 的 dns-failed 语义;不同内核的 DNS 失败、预匹配、REJECT 变体与 UDP 行为不能由字符串相近认定等价。Finance 选择美国地区组,该组为 url-test,首项美国也不等于固定单一节点/出口 IP。
|
||
6. Shadowrocket 动态正则会从 App 中所有订阅收节点,All Nodes/AI Nodes 可能包含本服务之外的节点;此次 12 个成员只是本订阅的预期范围。手机已保存的组选择不一定因刷新订阅变回美国。
|
||
|
||
以上未通过修改生产设置、泛拦 UDP、加入全局 DNS 接管或擅自扩大生成器语法来掩盖;本次范围为删除指定规则与审计。
|
||
|
||
## FlClash 的活动配置需另外核对
|
||
|
||
其[官方配置合并源码](https://github.com/chen08209/FlClash/blob/main/lib/common/task.dart)会将 App 的 mode、TUN、监听端口及其他运行设置覆盖到原配置;DNS 覆盖或追加系统 DNS 开关也能改变解析。自定义新增规则可置顶,非空的规则覆盖列表可替换订阅 rules,代理与组覆盖可替换对应列表。脚本覆盖同样需检查。由此可见“订阅写 mode: rule”不足以证明手机正在按它分流。
|
||
|
||
## 真机收尾矩阵
|
||
|
||
先更新 Shadowrocket 的节点订阅和独立 conf,并选择使用该 conf;FlClash 更新并启用 Clash 订阅,确认运行在规则模式。记录 App/内核版本、活动配置、相关组保存选择、覆盖设置和 Android 分应用接管范围。以下请求通过手机浏览器或对应 App 发起,查看其连接/请求记录中的命中规则和完整策略链;不需要支付、转账或重新注册账号。
|
||
|
||
| 用例 | 预期策略/关注点 |
|
||
|---|---|
|
||
| PayPal 主站与 paypalobjects.com | Finance;删除旧规则后命中 paypal 关键词 |
|
||
| Plasma 官网、plasma-one.tech API/WS、auth.privy.io | Finance;核对 App 登录/会话的其他实际请求 |
|
||
| Muse 主站/登录/Meta API | AI |
|
||
| Claude、ChatGPT、Gemini、ip.net.coffee 探测 | AI;另检查 DNS 日志与实际探测结果 |
|
||
| Telegram 域名及数据中心 IP | Proxy |
|
||
| Netflix、YouTube、Disney、TikTok、GoogleSearch | Streaming,受更早 AI/例外规则影响 |
|
||
| Google 更新/翻译、App Store 例外 | 以规则命中及 DIRECT 最终路径确认,不凭页面成功推断 |
|
||
| Bybit | 独立 Bybit 组,未迁入 Finance |
|
||
| 无已知规则的请求 | FINAL/MATCH→NoAuto→Mainland→DIRECT |
|
||
| googlevideo TCP/UDP | FlClash TCP 通常 Streaming,UDP 应拒绝;Shadowrocket 当前不下发该 UDP 防护 |
|
||
| IPv6、DNS/WebRTC、Wi-Fi/蜂窝切换 | 独立实测;不能用 IPv6 开关或 TCP 页面成功代替 |
|
||
|
||
没有接入用户的 iOS/Android 设备,本次未读取其活动配置、记录、VPN 权限或保存选择。完成上述原生设备核对后才能将“订阅与受控内核正常”提升为“这两台手机实际按预期分流”。
|