Files
proxy-station/docs/MOBILE-CLIENT-FIX-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

55 lines
8.7 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.

# 移动端生成器修复与验收边界(2026-10-13)
本轮按用户要求,仅修复有官方规范或原生验证支持的项目。代码已按用户后续授权全部部署到 LA;同轮新增用户观察到的 metaaivm.com → AI,未更改节点、策略组、设置或客户端活动配置/保存选择。[先前审计](MOBILE-CLIENT-AUDIT-2026-10-13.md)描述修复前的生产下发行为;本文件保留候选验证记录并补充发布验收。
## 已实现的修复与依据
| 项目 | 实现 | 依据 |
|---|---|---|
| Clash AI DNS | 从启用的 IR 域名规则派生有序 nameserver-policy,AI 使用 Cloudflare DoH 并通过 `#策略组名` 绑定 AI;普通 DNS 保持原国内 DoH;独立 proxy-server-nameserver 防止节点解析依赖 AI 连接形成循环 | [mihomo DNS 文档](https://wiki.metacubex.one/config/dns/)、[v1.19.32 配置解析源码](https://github.com/MetaCubeX/mihomo/blob/v1.19.32/config/config.go)、[DNS 匹配源码](https://github.com/MetaCubeX/mihomo/blob/v1.19.32/dns/resolver.go) |
| DNS 优先级 | 连续同解析器的显式域名规则合成 inline classical provider;远程资源复用原 provider,均按连接规则顺序写入 DNS policy。早于 AI 的非 AI 域名/资源继续用普通 DNS;同资源首次出现优先;IP/进程/协议条件不转换为 DNS 条件 | 官方源码的 orderedmap、domainMatcherPolicy 与只匹配域名的 rule-set 实现;避免直接使用域名 trie 把“更精确”误当成“更早” |
| Shadowrocket DOMAIN-SET | 服务端将精确主机转换为 DOMAIN,前导点转换为 DOMAIN-SUFFIX;通过已使用的 RULE-SET 引用新的 token 鉴权 `.list` 端点,保留原规则位置和策略 | [Surge 域名集规范](https://manual.nssurge.com/rules/domain.html);Shadowrocket [官方 App Store](https://apps.apple.com/us/app/shadowrocket/id932747118)确认普通域名/后缀规则能力,不假定其原生 DOMAIN-SET 语法 |
| Shadowrocket LAN | 将 [Surge 官方文档当前列出的 LAN](https://manual.nssurge.com/rules/ruleset.html) 展开为 14 条普通 DOMAIN-SUFFIX/IPv4/IPv6 CIDR 规则,保留 policy、位置与原 no-resolve 参数 | 使用发布的具体条目,不猜接收客户端内置 LAN 或 GEOIP,LAN 的写法;这是文档当前版本的固定映射,未来需复核 |
| macOS App 路径 | Shadowrocket 跳过 `/Applications/*.app/…` 的 PROCESS-NAME,并回报 skippedRules;不删除数据库记录,不改 Surge/Clash | 该绝对路径属于 macOS App bundle,不能标识用户目标 iOS App;其他进程规则及远程资源保持原状 |
新增 `.list` 仅处理已登记、behavior=domain 的资源,复用现有 24h/ETag/陈旧缓存逻辑。未知 token/资源返回 404;非法上游格式失败,不返回已转换的一部分以掩盖覆盖缺失。原 Clash `.yaml` 转换逻辑保留。
## 对既有功能的回归
使用管理 API 新近重读的生产数据(265 条规则,263 启用)构造 IR,与先前实际 HTTPS 产物比对:
- **Surge 候选与生产配置逐字节相同**;官方 CLI、49/49 外部规则集快照通过,静态域名遮蔽提示 0。没有修改 Surge 生成器、AI DNS 辅助器、模板、数据库或原文段落。
- Shadowrocket 节点订阅逐字节相同;General、Proxy Group、Host、URL Rewrite、MITM 段落也逐字节相同。节点范围、凭据、排序、独立 All Nodes/AI Nodes 与组选择身份保持。
- Clash 的 12 个节点、13 个组、261 条连接规则及原 49 个 HTTP provider 全部不变;新增 3 个 inline DNS matcher,provider 总数为 52。不改变普通 DNS 的 nameserver,不开启全局 respect-rules,不增加端口 53 接管或 STUN 替代规则。
- 三个实际域名集完整转换:reject 140,433 条、download 1,972 条、cdn 4,686 条,共 **147,091 条,零丢弃**。候选 Shadowrocket 正文为 271 条;新增 3 个资源引用、LAN 由 1 条展开为 14 条,另跳过 Tailscale 与 FFSB 两个 macOS App 路径。
- IR 在各序列化器调用后保持不变;其他规则、显式成员、Finance 顺序和默认美国保持。
## 验证结果
- 三个包全量 typecheck 通过;11 个测试文件、**71 项 Vitest** 通过,包含 token 鉴权、HTTPS 来源、新旧转换端点兼容性、无部分转换输出、域名集精确/后缀语义、DNS 规则顺序与资源名冲突、LAN 参数以及原移动端/Surge 回归。
- 生产快照候选通过官方 mihomo v1.19.32 原生解析。49 个远程 provider 使用既有下载快照;新增 inline matcher 原生加载通过。
- 隔离 mihomo 使用同样的连接规则与资源、localhost 模拟节点:**145/145 个 TCP/域名/IP 用例通过**,googlevideo UDP 原生 AND→REJECT 继续有效。未使用真实节点传输、系统代理或 TUN。
- 另用 localhost DoH 与美国/新加坡模拟 SOCKS 出口实测 **9/9 个 DNS 查询**:早期精确 DIRECT 与 Unbreak 资源例外走普通 DNS;AI 后缀、关键词、AI 资源走 AI DoH;较晚的精确 DIRECT 不抢过早期宽泛 AI;代理节点解析走独立普通 DNS;新建 DNS 连接随 AI 从美国切到新加坡。
DNS 原生测试确实观察到:已有 DoH HTTP 会话可能在切组后复用旧连接,新建连接才采用新选择。本实现没有杜撰“关闭复用”参数,也不主动断开用户连接。不能声称切组立即迁移所有现存 DNS 会话;新连接的选择不等于设备所有应用都使用该 DNS。
## 保留的待验/未修复项
1. Shadowrocket 的逻辑规则/UDP、按策略 DNS、STUN 仍没有取得可核实的完整语法与真机结果。官方更新记录确认能力存在,但不能据此复制 Surge/mihomo 的写法。本轮没有加入猜测配置;其 DNS General 保持现有值,**iOS AI DNS 随出口仍未实现**。
2. STUN 在 Clash 没有 NETWORK 等价物;SMTP 的文本 URL-REGEX 不能表达邮件协议。继续保守跳过,不用宽泛 UDP 拒绝或其他条件冒充修复。
3. Shadowrocket 当前候选 skippedRules 为 5 条:两个 macOS App 路径、STUN、googlevideo UDP AND、SMTP URL-REGEX;不再因 DOMAIN-SET 丢掉三个域名集。其他远程资源里的 PROCESS-NAME/USER-AGENT/IP-ASN 等仍须 iOS 原生确认。
4. Shadowrocket `.list` 端点及大域名资源已经通过服务端转换和路由测试,但没有 iOS 原生编译、资源加载性能/内存或网络验收。部署后三个生产 HTTPS `.list` 端点均已验证,与完整转换内容逐字节相同。
5. FlClash 会按自身模式、DNS 覆盖、自定义规则/组和分应用接管设置改写活动配置,见 [官方配置合并源码](https://github.com/chen08209/FlClash/blob/main/lib/common/task.dart)。用户 Android 的具体版本/覆盖设置、iOS 的活动 conf 与保存选择均未读取。
生产 HTTPS 订阅与转换端点已验收;iOS/Android 仍需刷新配置后复测资源加载、Finance/AI/Telegram/Streaming、DNS 与 UDP。原生解析与隔离模拟出口验证不等于真实设备业务验收。
## 发布与实际 HTTPS 验收
2026-10-13 已执行 `deploy.sh all`,版本基线 `f741aee`,包含本次未提交工作区修改(未执行 Git 提交或推送)。前后端均发布;全量类型检查、71 项测试、前端构建通过。前端指纹 `e11cf89c7ea8`、后端源码指纹 `304e7d23b862` 与远端一致,systemd active,公网 health 正常,未鉴权管理请求为 401。
新增 `DOMAIN-SUFFIX,metaaivm.com,🤖 AI` 位于原 Muse 四条之后,其他规则内容及相对顺序逐项核对不变;旧手动 paypal.com 条目仍不存在。生产为 30 个登记节点/12 个启用、13 个组、25 个显式成员、266 条规则/264 个启用,唯一启用 FINAL 仍末尾。备份 `before-metaaivm-mobile-fixes-20261013-181717.db` 在写入前及部署后均确认 root:root、600、非空(部署脚本递归调整应用目录属主后已恢复该备份的 root 属主)。
实际公网 Surge、Clash、Shadowrocket 节点与 conf 四个订阅逐字节等于本地候选。Surge 与添加新域名后、代码部署前的实际 HTTPS 版本逐字节相同;官方 CLI 与 49/49 外部资源快照再次通过,静态域名遮蔽提示 0。三个新 HTTPS `.list` 端点均与 147,091 条完整转换内容逐字节相同。Clash 当前 262 条连接规则、52 个 provider;Shadowrocket conf 272 条规则,节点与组保留。
实际 Clash HTTPS 配置通过官方 mihomo v1.19.32 原生解析;使用相同规则和资源快照的隔离 localhost 模拟出口复测 **146/146** 个域名/IP/TCP 用例(含 metaaivm.com),googlevideo UDP 的原生 AND→REJECT 通过。未启动系统代理/TUN,未切换客户端活动配置,未进行真实节点金融操作或手机验收。