先把「规则集更新失败」和「节点不可用」分开。三款 iOS 客户端都运行在 Apple 的 Network Extension 体系里,规则、DNS 和隧道网络设置会互相影响;但远程规则失败的第一现场通常还是 URL 响应、DoH 解析和本地缓存。
本文核对日期是 2026-05-24。未覆盖 TestFlight 版本、企业签名版本、旧 iOS 16 以下设备,也不判断第三方规则仓库当天是否可访问。
三个客户端入口有什么不同?
Shadowrocket 更像「把规则文件导进来再引用」,Stash 更像 Clash/Mihomo 的 rule-providers,Loon 则有独立的订阅规则写法。入口不同,排错时看的字段也不一样。
| 客户端 | 远程规则入口 | DNS 相关入口 | 失败时先看 | 官方资料信号 |
|---|---|---|---|---|
| Shadowrocket | 从 URL 或 iCloud Drive 导入规则文件 | App Store 页面列出 DoH、DoT、DoQ 与本地 DNS Mapping | URL 是否返回规则文本,导入后是否被当前规则引用 | App Store 写明支持规则文件导入、DNS 请求记录和 DoH |
| Stash | rule-providers 下声明 url、behavior、format、interval | dns.nameserver 支持 https://.../dns-query 与 doh://... | behavior、format、headers、path 和 RULE-SET 名称 | 官方文档给出 rule-set、headers、path 与 DNS 示例 |
| Loon | 订阅规则用远程链接加策略名 | [General] 里有 doh-server、doq-server、doh3-server | 规则链接是否可读,策略名是否存在,DoH 是否回落 | 官方手册说明订阅规则和 DoH 查询逻辑 |
如果你只想判断是不是远程源问题,把规则 URL 复制到 Safari。返回纯文本、YAML、.list 或二进制规则文件,才继续看客户端;如果返回登录页、GitHub HTML 页面、Cloudflare 验证页、401、403、404 或 5xx,先不用动 App 配置。
先看 URL,还是先看 DoH?
先看 URL。DoH 是第二步,因为 DoH 只负责「怎么解析规则源域名」,不负责判断规则文件格式。
一条可用的远程规则地址至少要满足 4 个条件:HTTPS 证书正常、无需浏览器交互、返回内容不是 HTML、内容类型能被客户端支持。GitHub 仓库文件页面和 raw 地址最容易混,前者是网页,后者才是规则文本。
DoH 只在这些现象出现时提前排查:
| 现象 | 更像 URL 问题 | 更像 DoH 问题 | 快速验证 |
|---|---|---|---|
| Safari 打开就是 404 | 是 | 否 | 改 raw 地址、分支名或文件路径 |
| Safari 能打开,客户端刷新超时 | 可能 | 可能 | 临时切回系统 DNS 再刷新 |
| 只有规则源域名失败,其他网页正常 | 可能 | 可能 | 换一个 DoH 或直接填规则源 IP 做临时测试 |
| 客户端日志出现证书校验失败 | 否 | 是 | 检查 DoH URL 是否写成完整 /dns-query |
| 下载成功但规则不命中 | 否 | 否 | 查规则引用名、策略名和缓存 |
RFC 8484 定义的 DoH 是把 DNS 查询放进 HTTPS 交换里。换句话说,DoH 失败常见表现不是「规则格式错」,而是规则源域名根本没有解析出可用结果。
Shadowrocket 怎么查远程规则?
Shadowrocket 的 App Store 页面写明,它支持从 URL 或 iCloud Drive 导入规则文件,也支持记录 HTTP、HTTPS、DNS 请求。排查时不要先删配置,先保留当前规则,再单独导入 1 个最小规则文件。
第一步,在 Safari 打开规则 URL。你要看到的不是带导航栏的网页,而是纯规则内容。若规则源要求登录、Cookie 或一次性 token,Shadowrocket 后台刷新通常拿不到浏览器里的会话。
第二步,回 Shadowrocket 查看规则文件是否真的被当前配置引用。导入成功只代表文件进了 App,不代表流量已经命中这份规则。用一个只存在于新规则里的测试域名,看 DNS 或请求记录里的策略是否变化。
如果同时改了订阅和规则,建议拆开:先用已有节点验证规则,再换订阅源。需要重新做基础连接测试时,可以用兼容 Clash / Singbox / V2Ray 的订阅承载节点导入,把规则错误和订阅错误分开记录。
Stash 的 rule-providers 卡在哪里?
Stash 官方文档明确把远程规则放在 rule-providers 下,再由 rules 里的 RULE-SET 引用。排查时要看 5 个字段是否一致,单看刷新按钮有没有转不够。
| 字段 | 正常写法 | 常见错误 | 结果 |
|---|---|---|---|
url | 可直接下载的 HTTPS 地址 | GitHub 文件网页、跳转页、过期链接 | 下载失败或下载 HTML |
behavior | domain / ipcidr / classical | 域名规则写成 ipcidr | 下载成功但解析失败 |
format | yaml / text / mrs | 文本文件按二进制格式处理 | 规则不可读 |
headers | 给需要鉴权的规则源加 Authorization 或 User-Agent | 服务端要求请求头但配置为空 | 401、403 或空响应 |
path | 指向 Stash 管理目录内缓存路径 | 多个 provider 复用同一路径 | 覆盖旧缓存或读错文件 |
Stash 的 DNS 文档还提醒,default-nameserver 只用于解析 DNS 服务的域名,nameserver 才是实际查询上游。排查 DoH 时,把 nameserver 暂时缩到 1 个系统 DNS 或 1 个明确可用的 DoH,能减少并发查询带来的误判。
Loon 订阅规则失败怎么分层?
Loon 手册里,订阅规则是一系列规则的集合,写法是远程规则链接加策略名。它还给出过 iPhone 15 Pro、Loon 3.2.0 build 712 的规则查询性能样本,说明订阅规则不是不能承载大量条目;失败更多来自链接、格式、策略名或 DNS。
先确认策略名存在。远程规则下载成功,但策略名拼错,Loon 仍然无法把命中的规则送到正确策略。
再看 DNS。Loon 的 DNS 文档列出标准 UDP、DoH、DoQ、DoH3,并说明同时配置加密 DNS 和常规 DNS 时,会优先进行加密 DNS 查询。若你把 doh-server 写成没有路径的域名,或者 DoH 服务证书不被系统信任,远程规则源就可能解析失败。
最后看缓存。Loon 文档提到 DNS 使用 LRU 缓存,App 关闭后缓存会清除。规则刷新失败如果只在刚切网络后出现,可以先完全退出再打开,避免把旧 DNS 结果和新规则状态混在一起。
iOS 后台刷新为什么不稳定?
Apple 的 Packet Tunnel Provider 文档说明,包隧道扩展会通过虚拟网络接口处理 IP 包,并能设置 DNS resolver、HTTP proxy、路由网络和 MTU。普通用户看到的是一个开关,系统里实际是 App 扩展、DNS、路由和后台调度一起工作。
这也是为什么锁屏后刷新失败不能直接等同于配置坏了。远程规则文件较大、DoH 响应慢、设备刚从蜂窝切到 Wi-Fi、低电量模式开启时,后台任务更容易被系统推迟或中断。
可靠的验证方式是做 2 轮:
- 前台打开客户端,手动刷新远程规则,记录时间。
- 锁屏 10 分钟后解锁,看规则更新时间是否变化。
- 切回系统 DNS,再重复同一轮。
- 只保留 1 个远程规则源,再重复同一轮。
如果只有后台失败,先保留前台手动刷新方案,不要把整个配置推倒重写。
下载成功但规则没命中怎么办?
下载成功只是第一关。规则真正生效要经过「文件下载、格式解析、规则引用、策略存在、日志命中」这 5 个环节。
| 环节 | 验证动作 | 通过信号 | 失败信号 |
|---|---|---|---|
| 文件下载 | Safari 打开 URL | 纯规则内容或客户端支持格式 | HTML、401、403、404、5xx |
| 格式解析 | 只保留一个规则集刷新 | 没有 parse error | behavior / format 报错 |
| 规则引用 | 检查 RULE-SET 或订阅规则行 | 名称完全一致 | 下载了但没有任何引用 |
| 策略存在 | 核对策略组名称 | 日志显示目标策略 | 策略名拼写不一致 |
| 日志命中 | 打开测试域名 | 命中新规则 | 仍走默认 FINAL |
不要用常见大站做第一轮测试。大站域名可能被多条规则命中,日志看起来正常,实际并没有命中新导入的规则。最好临时加入一个只用于测试的域名,确认它能命中新规则后再删除。
这篇不覆盖什么?
本文没有测试所有规则仓库,也没有验证每个 DoH 服务在不同网络里的响应质量。App Store 价格、版本号和规则支持范围会变化,以上判断只以 2026-05-24 能核对到的官方页面和文档为准。
也不要把远程规则失败写成客户端优劣结论。Shadowrocket、Stash、Loon 的配置模型不同,适合的排错入口不同;同一个 URL 在一款客户端失败,未必代表另一款也失败。
相关阅读
FAQ
Shadowrocket 远程规则刷新失败先看哪里?
先把规则 URL 复制到 Safari。能看到纯文本再回 App 查规则引用;看到登录页、HTML、401、403 或 404,就先修地址、鉴权或源站。
Stash 的 rule-providers 为什么下载成功但不生效?
常见原因是 behavior、format 或规则引用名不一致。Stash 要先在 rule-providers 声明,再在 rules 里用 RULE-SET 引用同一个名称。
Loon 订阅规则和普通规则有什么区别?
Loon 订阅规则是一组远程规则集合,写法是规则链接加策略名。它能承载大量规则,但仍要确认远程文件内容符合 Loon 支持的规则类型。
DoH 会导致远程规则更新失败吗?
会。DoH 地址本身需要解析和 TLS 校验,错误的 DoH URL、证书问题或回落策略关闭,都可能让规则源域名解析失败。
iOS 锁屏后规则集没有自动更新怎么办?
先在前台手动刷新一次,记录时间和日志。iOS 的网络扩展受系统调度影响,后台刷新失败时不要直接判断为配置损坏。