Files
proxy-station/docs/MOBILE-CLIENT-AUDIT-2026-10-13.md
YANG JIANKUAN a5d980a5e9 feat: 添加 WireGuard 设备管理并完善客户端分流
实现独立加密设备身份、网关 agent、持久生命周期任务和 Surge/FlClash 专属订阅凭证。

完善 Shadowrocket 规则转换与 Clash AI DNS,增加 Surge FFSB 适配、规则快照、运维工具及验收文档。
2026-11-02 22:44:23 +08:00

78 lines
9.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 权限或保存选择。完成上述原生设备核对后才能将“订阅与受控内核正常”提升为“这两台手机实际按预期分流”。