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

8.7 KiB
Raw Blame History

移动端生成器修复与验收边界(2026-10-13)

本轮按用户要求,仅修复有官方规范或原生验证支持的项目。代码已按用户后续授权全部部署到 LA;同轮新增用户观察到的 metaaivm.com → AI,未更改节点、策略组、设置或客户端活动配置/保存选择。先前审计描述修复前的生产下发行为;本文件保留候选验证记录并补充发布验收。

已实现的修复与依据

项目 实现 依据
Clash AI DNS 从启用的 IR 域名规则派生有序 nameserver-policy,AI 使用 Cloudflare DoH 并通过 #策略组名 绑定 AI;普通 DNS 保持原国内 DoH;独立 proxy-server-nameserver 防止节点解析依赖 AI 连接形成循环 mihomo DNS 文档、v1.19.32 配置解析源码、DNS 匹配源码
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 域名集规范;Shadowrocket 官方 App Store确认普通域名/后缀规则能力,不假定其原生 DOMAIN-SET 语法
Shadowrocket LAN 将 Surge 官方文档当前列出的 LAN 展开为 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 覆盖、自定义规则/组和分应用接管设置改写活动配置,见 官方配置合并源码。用户 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,未切换客户端活动配置,未进行真实节点金融操作或手机验收。