Stash 开了规则分流后,网页能进预期策略组,不代表 DNS 查询也一定跟着同一条规则走。尤其是 iOS 上同时堆了多个 nameserver、DoQ、远程 rule set 和 .stoverride 时,连接日志和 DNS 结果可能出现两套答案。

先判断是哪一类 Stash DNS 跟随规则问题?

现象更可能原因第一处检查
网页策略正确,DNS 返回不符合预期DNS query following rules 未生效或规则未覆盖该域名Stash 版本、DNS 设置、规则日志
只有 DoQ nameserver 经常超时DoQ 服务端响应慢、移动网络抖动或旧版本缺陷改用 DoH/DoT/UDP 做对照
更新 rule set 后部分域名忽左忽右rule set 类型混用、classical 文件过多或旧缓存rule-providers、behavior、更新时间
Override 更新后策略命中变化覆写改了 rules、proxy-groups 或 DNS 段最近更新的 .stoverride
一键更新后某个 Override 不生效同名 Override、安装失败或缓存残留Override 列表、名称、更新时间

这张表的重点是把「DNS 查询」和「网页连接」拆开看。一个域名至少记录 3 个信号:DNS 查询进入哪个策略、最终连接进入哪个策略、规则日志命中了哪条规则。

DNS query following rules 到底解决什么?

Stash iOS release notes 在 v2.6.0 记录了「DNS query following rules」。对应到配置里,核心开关是 dns.follow-rule:默认关闭时 DNS 查询直接发出;设置为 true 后,DNS 查询才按代理规则转发。

dns:
  enable: true
  follow-rule: true

这不是万能加速项,Stash DNS 文档也提醒只在必要时启用,因为它可能影响 CDN 优化并带来一点延迟。它解决的是「解析请求走哪边」的问题,不解决「规则写得对不对」的问题。如果 DOMAIN-SUFFIX,example.com,Proxy 没覆盖到 api.example.net,DNS 跟随规则也不会凭空命中。

还有一个容易踩的点:如果代理端点或 DNS 服务器本身写成域名,先确认不会触发递归解析。排错阶段能用 IP 写清楚的上游就先用 IP,等规则稳定后再恢复长期配置。

排查时建议只拿 1 个域名做样本。例如固定测试 api.example.net,连续查看 DNS 日志、连接记录和最终策略组。不要一边换域名,一边换 DNS,一边改 Override;这样只会把证据打散。

iOS 上 DNS 服务器为什么要控制到 1-2 个?

Stash 的高效配置 FAQ 给了很实用的移动端原则:DNS 服务器不要堆太多,移动端建议 1-2 个。原因是 Stash 会并行查询配置的 DNS,服务器越多,资源消耗和排错分支越多。

一个排错基线可以这样写:

dns:
  enable: true
  nameserver:
    - https://dns.alidns.com/dns-query
    - https://doh.pub/dns-query

这不是说只能用这两个地址,而是先让变量变少。若你同时写了 4 个 DoH、2 个 DoT、1 个 DoQ 和 fallback,某个域名解析结果变化时,很难判断是谁返回了差异结果。

DNS 配置移动端排错价值风险
1 个普通 UDP最容易判断是否为 Stash 规则问题加密能力弱,适合短时对照
1-2 个 DoH/DoT兼顾可用性和排错清晰度仍要看服务端响应速度
多个 DoH + DoT + DoQ看似冗余,实际变量过多并行查询、缓存和超时更难定位
大量 fallback适合复杂网络,不适合第一轮排错返回结果可能前后不一致

DoQ 超时要先换 DNS 还是先升级 Stash?

先做协议对照,再看版本。Stash iOS v2.6.0 release notes 里有「Fixed an issue with DNS over QUIC response timeouts」,中文更新日志也写了修复 DoQ 响应超时的问题。这个事实说明 DoQ 超时曾经是客户端层面记录过的修复项。

实操顺序是:

  1. 保留同一个测试域名和同一条规则。
  2. 把 DoQ nameserver 暂时换成 DoH 或 DoT。
  3. 如果 DoH/DoT 正常、DoQ 异常,再检查 Stash 是否为较新版本。
  4. 如果三种协议都异常,再回到规则集、Override 和系统网络。

不要把 DoQ 超时直接归因给规则分流。DNS 协议握手、移动网络、服务端响应和客户端版本都可能让 DoQ 看起来像「规则没跟随」。

classical text rule sets 什么时候该少用?

Stash v2.6.0 加入 classical text rule sets 支持,这让一些旧 Clash 规则文本更容易接入。但 Stash FAQ 同时提醒:大量 classical 规则集会明显增加内存压力,移动端更推荐 domain / ipcidr 规则集。

可以按下面的规则整理:

规则集类型适合放什么Stash iOS 建议
domain域名、后缀、关键词类规则首选,适合大多数站点分流
ipcidrIP 网段规则首选,和域名规则分开管理
classical混合 DOMAIN、IP-CIDR、PROCESS 等旧格式少量保留,别当通用容器
script / rewrite 相关覆写需要 Stash 特有能力的修改单独放 Override,便于禁用

如果一个 classical 文件里既有域名又有 IP,又被多个 Override 引用,DNS 命中异常时很难判断是解析阶段、规则匹配阶段还是覆写阶段出错。先把能拆的规则拆成 domain 和 ipcidr,排错会清楚很多。

Override 一键更新后怎么排查域名命中变化?

v2.6.0 release notes 还记录了「one-click update for all overrides」和「same-name Override install fix」。这两个点很容易被忽略:Override 更新能力增强后,旧覆写、同名覆写、缓存和规则集同时变化,域名命中就可能看起来忽然变了。

推荐按这个顺序排:

  1. 在更新前导出当前 Profile 或至少截图 Override 列表。
  2. 使用一键更新全部 Override 后,记录更新时间。
  3. 只拿一个失败域名复测,不要换测试样本。
  4. 禁用最近更新的 Override,观察 DNS 和连接策略是否回到旧表现。
  5. 若存在同名 Override,改名后重新安装,避免误判当前启用的是旧文件。

Override 最容易改到 dnsrulesrule-providersproxy-groups 四块。只要其中一块被替换,DNS 查询跟随规则的结果就会跟原订阅不同。

哪些不是 Stash 配置问题?

有些现象不是 Stash DNS 跟随规则本身能修的。比如订阅源返回 HTML 登录页、远程 rule set 的 raw 地址 404、网络出口频繁切换、DNS 服务商对 DoQ 响应慢,这些都在 Stash 配置外面。

跨设备维护时,最怕的是 iPhone、iPad、Mac 各用一份不同模板:一台开 DoQ,一台堆 fallback,一台覆盖 Override。此时排错不是看谁「更快」,而是先选一份兼容 Clash / Singbox / V2Ray 的订阅做基线输入,再逐台确认 Stash 本机的 DNS、规则集和 Override 差异。

也不要把「测速失败」当成 DNS 故障。测速请求可能走的是固定 URL,不能代表所有域名的 DNS 查询都跟随规则。要用真实失败域名复测。

如何确认 Stash DNS 已经恢复?

修完以后,不看一句「能打开」就结束。用同一个域名做 3 轮验证:

验证项正常信号异常信号
DNS 日志查询进入预期策略或预期 nameserver同一域名前后进入不同路径
连接记录Web 请求进入预期策略组DNS 对了,连接落到兜底
rule set 时间rule-provider 更新时间已变化仍显示旧缓存时间
Override 状态最近更新的覆写可单独禁用复现差异禁用后无变化但日志仍引用旧名称
DoQ 对照DoH/DoT/DoQ 结果能解释只有 DoQ 超时且版本较旧

最后保留一行记录:Stash 版本、iOS 版本、测试域名、DNS nameserver 数量、启用的 Override 名称、失败前后的规则集更新时间。下次更新 rule set 或 Override 时,这行记录比重新猜一遍快得多。

相关阅读

FAQ

Stash DNS 跟随规则必须打开吗?

如果你依赖规则分流处理不同域名的解析路径,就应该确认该能力可用。只做简单全局代理时,它的收益没那么明显,反而更要保持 DNS 配置简单。

DoQ、DoH、DoT 哪个更适合 Stash iOS?

排错阶段优先用 DoH 或 DoT 做基线,因为可用性和日志判断更直观。DoQ 可以保留为长期选项,但一旦出现超时,先用同一域名切回 DoH/DoT 对照。

为什么 rule set 更新成功,DNS 还是旧结果?

rule set 更新成功只说明文件被拉取,不代表 DNS 缓存、Override 引用和规则命中都变了。重启 Stash、清理相关缓存,再用固定域名查看日志。

classical text rule set 和 domain rule set 能混用吗?

可以混用,但不要把 classical 当作所有规则的容器。移动端配置越重,内存压力越大;能拆成 domain 和 ipcidr 的内容尽量拆开。

Override 一键更新安全吗?

功能本身是为了减少逐个更新的成本,但批量更新会让多个变量同时变化。第一次排错时先记录旧列表;出问题后按最近更新时间逐个禁用,而不是立刻重装 Stash。