为什么「规则集」比订阅更常卡在 pending?

很多 Clash 系用户能正常导入机场订阅,却在日志里看到某条 rule-provider 一直停在更新中,或直接提示超时、TLS 握手失败、连接被重置。配置里引用的地址往往以 https://raw.githubusercontent.com/ 开头——它看起来只是一个静态文本 URL,但背后仍是走你当前网络环境下的 DNS 解析 + TCP 出口策略:若这条链路被错误地设为「必须直连」而事实上直连不可用,或反过来「走了劣质代理」导致握手极慢,现象都会落在「规则集拉不下来」上。

这与你在浏览器里打开网页还不完全一样:浏览器可以跟随系统代理或扩展,而内核去拉 rule-provider时,命中的是 YAML 里的分流规则与 DNS 设置,外加部分客户端对「本机进程发起的 HTTP 请求」还有单独策略。把这条链路捋顺,比盲目换订阅或重装客户端有效得多。若你尚未熟悉 rule-providers 在整份配置中的位置,可先对照本站《Clash YAML 配置深度解析》里的远程规则集章节,再读本篇排错步骤。

典型现象:怎样确认是 rule-provider 而不是别的模块

你可以从三个角度锁定问题域。第一,界面或日志里仅规则集显示失败,而 proxy-providers(机场订阅)仍周期性更新成功——这强烈暗示失败 URL 的域名或路径与你对「GitHub / Raw」相关的分流不一致。第二,规则集偶发成功、多数超时,往往与出口节点质量、国际链路抖动或 DNS 解析偶发污染有关。第三,自从你加了「保护国内直连」或「排除局域网」之类的大段规则后才开始失败,需回头检查是否有规则把 raw.githubusercontent.com 挡在错误的一组策略上。

建议在排错阶段把日志级别调到 infodebug,并关注带 rule-providersdownloadfetch 字样的行。不同客户端展示方式不同,但底层都是内核在按 interval 拉取远程内容。若完全没有任何下载尝试记录,也可能是 path 指向的本地缓存被误删、权限不足,或 YAML 缩进错误导致该段根本没被加载——这类属于语法问题,应先验证配置能否被当前内核版本正常解析。

核心概念:内核拉规则集时走的是哪条「虚拟线路」

mode: rule 下,凡是要落到具体 TCP 连接的请求,都会按 rules 自顶向下匹配。对 raw.githubusercontent.com 这一类域名,若你在靠前位置写了「国内域名直连」或「GEOIP CN 直连」,而本地到 GitHub 的直连又不稳定,就会出现「规则集更新走 DIRECT 卡死」的情况。反之,如果你把所有未知流量一把丢给代理,但代理组当前选中的节点本身访问 GitHub Raw 极慢,就会表现为长时间 pending。

因此排错的第一步不是换 URL,而是在脑海中对这条连接做一次 dry run:这条域名会命中哪条规则?对应的策略组当前选中的是 DIRECT 还是某个代理?策略组里的节点健康吗?这和排查普通网站打不开是同一套逻辑,只是触发方变成了内核自身的 HTTP 客户端。把它与浏览器是否能打开 GitHub 区分开:两边可能命中不同规则,尤其当浏览器走系统代理而内核按自身 YAML 分流时。

小提示

若你使用 Fake-IP,请关注 fake-ip-filter 是否包含异常条目;一般不会单独阻止 raw 域名,但与 DNS 相关的整体策略错误会放大「看似直连、实际解析异常」的问题。更多 DNS 与 Fake-IP 的配合方式仍建议回到 YAML 总览文中系统对照。

步骤一:先排除 DNS 与环境层面的假阳性

在动分流之前,先用系统或命令行工具对 raw.githubusercontent.com 做一次解析,确认得到的地址不是明显异常或被劫持的结果。若解析频繁变化、返回延误极大,可暂时改用可信的 DoH,并在 Clash 的 dns 段保持与规则一致。请注意:即使浏览器解析正常,内核仍可能使用你在 YAML 里为 Clash 单独指定的 nameserver,两处不一致时会出现「人眼看正常、客户端不正常」的错觉。

同一局域网内,若还运行着其他「接管 DNS」的软件(某些安全套件、其他 VPN、公司套件),可能与 Clash 的入站 DNS 监听端口冲突,导致间歇性失败。排错时可以做一个最小对照:暂时关闭其他网络扩展,只保留 Clash,再观察 rule-provider 是否恢复。若只有规则集失败、普通代理上网正常,则仍应回到分流与目标域名是否命中正确的条目,而不是只怪 DNS。

步骤二:为 GitHub Raw 写「看得见」的分流占位

实践上,建议在 rules 前半段为 GitHub 相关域名单独留出几行,避免被过于宽泛的 GEOIP 或「国内直连」提前吞掉。常见写法包括针对 DOMAIN-SUFFIX,githubusercontent.comDOMAIN-SUFFIX,github.com 的专用策略,再结合你对仓库托管、API、网页浏览的细分需求微调顺序。关键是要保证:用于拉规则集的那条主机名,命中的是你期望的策略组,而不是一条你想当然以为不会触发的兜底规则。

若你希望规则集走代理而日常 GitHub 网页走直连,需要更细地拆分域名后缀或使用规则集文件中的明细列表;若你接受「所有 GitHub 统一走同一出口」,维护成本会低很多。本文不展开具体社区规则集名单,只强调顺序与策略组名称必须与你真实存在的分组一致——这一点与订阅转换、proxy-providers 维护时是同一套命名纪律,可参考《Clash 订阅转换详解》中关于策略组命名的段落。

步骤三:在支持的客户端上让「下载走指定出口」

部分基于 mihomo 的内核为 rule-providers(及 proxy-providers)提供了在拉取远程 URL 时指定出口的能力(具体字段名以你所用内核与文档为准,常见为在某个 provider 下增加指向策略组的键)。当你已经确认浏览器里走代理可以秒开 Raw,而直连超时,把规则集的 HTTP 下载显式绑定到稳定代理,往往能立刻消除 pending。若你的构建版本较旧不支持该能力,只能通过上一节的规则分流,让内核在发起连接时自然命中代理。

下面是一段仅作结构演示的示例,请按你的内核文档与实际分组名改写,勿原样抄入生产环境:

rule-providers:
  example-rules:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/org/repo/refs/heads/main/rules.yaml"
    path: ./ruleset/example.yaml
    interval: 43200
    proxy: PROXY
注意

并非所有 Clash 衍生内核都识别 provider 级别的代理字段;添加后若启动报错,应查阅对应版本发行说明并回退到「仅依赖 rules 分流」方案。

步骤四:换镜像与固定路径时的注意点

当 raw 主线长期不可达,可考虑第三方加速或镜像服务替换 url。风险在于:镜像由非官方运维,完整性与可用性随时间变化;更稳妥的做法是改用 jsDelivr 等对公开仓库提供稳定 CDN 的路径格式,或把规则文件同步到你自有的对象存储再填自己的 URL。无论选哪一种,都要核对文件内容是否与预期一致(哈希或行数对比),并理解镜像供应商的隐私与合规政策。

换了 URL 仍失败时,切忌只反复点「更新」而忽视底层仍指向同一不可达主机。你可以把新 URL 粘到同一网络环境下的 curl 或 wget 里试拉取:若命令行直连失败而翻墙成功,就再次证明问题在出口策略而非 Clash 语法。将结论写回 YAML,比分版本迷信「某个魔法链接」可靠。

步骤五:TLS、时钟与中间人设备

日志若出现证书校验失败、握手超时,除节点问题外,还应检查系统时间是否严重偏移——这在虚拟机或双系统场景里偶发。某些企业网络会通过 HTTPS 检查设备签发中间证书,若你把 Clash 运行在需要信任额外根证书的环境,也要确认操作系统信任链完整。极少数情况下,本地「抓包 / 安全审计」与内核内置的 HTTP 客户端冲突,可暂时在可信网络下对照验证。

若你启用了自定义 TLS 相关高级选项,回顾近期是否改动过 tun、系统防火墙或路由表;这些层面不会让「只有 raw 失败」特别常见,但一旦与策略路由联动错误,仍可能造成特定目标不可达。此时结合 tracert、ping 与连接日志中的远端地址,比单纯调整 YAML 更快定位。

可打印自检清单(按顺序执行)

把下列条目从上到下勾一遍,通常能覆盖九成 rule-provider 拉取失败:一、确认 rule-providers 段被内核加载且无缩进错误。二、用日志确认更新任务确有触发。三、解析 raw.githubusercontent.com 并记录是否稳定。四、在规则表中找到该域名将命中的行,核对策略是 DIRECT 还是代理。五、临时把 GitHub Raw 指到你当前最稳定的代理组做 A/B。六、必要时更换镜像 URL 并验证文件内容。七、恢复日志级别,避免长期 debug 刷盘。

完成上述步骤后,建议保留一版「已知可拉取」的 url 与精简规则片段作为备份;当上游仓库改分支名或默认分支时,你也能快速发现是路径失效而非网络问题。把排错过程结构化,比每次出错都从零开始搜索更有效率。

结语

rule-provider 拉取失败,本质上是「内核作为 HTTP 客户端」的一条出网路径没走通:要么 DNS 与解析环境不净,要么分流把 GitHub Raw 放到了错误的策略组上,要么你需要显式指定更稳的下载出口。把这条链路与普通网页访问拆开思考,很多 pending 与 timeout 会立刻变得可解释、可修复。

相比在无日志的情况下反复改规则碰运气,能同时看到连接日志、规则命中与远程资源刷新状态的客户端,会把排查周期压得很短。如果你希望在一套界面里对照 YAML、命中结果与 rule-provider 更新情况,不妨前往本站下载页选择适合自己系统的版本,把本文的步骤与实时日志一起用,往往几次尝试就能恢复规则集自动更新。→ 立即免费下载 Clash,开启流畅上网新体验