macOS 安装 Clash 客户端的权限设置:网络扩展授权与钥匙串弹窗处理

针对 ChatGPT、Claude、GitHub、npm 等服务的访问超时与分流不准问题,介绍如何用 rule-providers 编写和维护自定义规则集。文章覆盖 YAML 字段、规则优先级、策略组关联、远程更新及命中验证,帮助技术用户建立可复用、易排障的 AI 与开发工具分流方案。

rule-providers 解决什么问题,适合放哪些规则

ChatGPT、Claude、GitHub、npm 等服务访问超时或走错出口,常见原因不是节点本身故障,而是配置没有把相关域名交给预期的策略组。直接在主配置的 rules 中逐条增加规则虽然简单,但当服务域名变多、规则需要在多台设备复用,或后续要集中更新时,主配置就容易变得难读,也难以追踪改动来源。

rule-providers 可以把一组规则单独保存为远程文件或本地文件,再在主配置中用一条 RULE-SET 引用。它只提供“匹配哪些连接”的规则,不会创建节点,也不会自动决定使用哪个代理出口。命中后的流量交给 RULE-SET 第三个参数指定的策略组;因此,规则集、规则顺序和策略组选择必须一起核对。

配置部分负责内容常见问题
rule-providers定义规则集从哪里加载、如何解释及多久更新远程文件不可达、格式或行为类型不匹配
规则集文件列出域名、IP 或完整规则表达式漏掉子域名、混入不支持的规则类型
rules按顺序引用规则集,并指定命中后的策略被更早的宽泛规则抢先匹配
proxy-groups提供可选的代理出口或选择器组名不存在,或选择器当前选中直连

适合放进独立规则集的内容包括一组需要共同维护的 AI 服务域名、开发平台域名,或需要在多个配置中复用的自定义规则。少量只针对本机的临时例外,放在主配置里往往更清楚;不要为了使用规则集而把每一条规则都拆成单独文件。

编写 YAML:provider 字段与规则格式

下面是 mihomo 风格的远程规则集示例。链接域名使用保留示例域名,不能直接下载;实际使用时应替换为自己维护且能够返回规则文件的 HTTPS 地址。path 是客户端运行环境中的本地缓存路径,目录是否需要预先创建、相对路径从哪里解析,可能受客户端打包方式影响。首次使用前,建议在对应客户端中检查配置校验结果与内核日志。

rule-providers:
  AI-Services:
    type: http
    behavior: classical
    format: yaml
    url: "https://rules.example.net/ai-services.yaml"
    path: ./rules/ai-services.yaml
    interval: 86400

  Dev-Tools:
    type: http
    behavior: classical
    format: yaml
    url: "https://rules.example.net/dev-tools.yaml"
    path: ./rules/dev-tools.yaml
    interval: 86400
  • type: http 表示从 HTTP 或 HTTPS 地址获取规则文件;它不表示连接目标网站时要使用 HTTP 代理。
  • behavior: classical 适合文件中写入 Clash 规则表达式,例如 DOMAIN-SUFFIX、DOMAIN 或 IP-CIDR。
  • format: yaml 表示规则文件采用 YAML 结构。部分 mihomo 版本还支持其他规则集格式;使用前应确认当前内核版本支持相应格式与行为类型。
  • path 指定规则集缓存位置,不是网页 URL。不同规则集应使用不同文件路径,避免缓存相互覆盖。
  • interval: 86400 以秒为单位,示例代表约 24 小时检查一次更新;它不是连接超时时间,也不保证远端文件每次都会变化。

与上述配置对应的 YAML 规则文件可以这样组织。这里的文件内容应保存为独立文件,不要把 payload 整段直接缩进到主配置的 rules 下。规则只列出示例域名,实际覆盖范围需根据服务当前使用的域名核对。

payload:
  - DOMAIN-SUFFIX,openai.com
  - DOMAIN-SUFFIX,chatgpt.com
  - DOMAIN-SUFFIX,oaistatic.com
  - DOMAIN-SUFFIX,oaiusercontent.com
  - DOMAIN-SUFFIX,claude.ai
  - DOMAIN-SUFFIX,anthropic.com

开发工具可以维护为另一份文件,例如:

payload:
  - DOMAIN-SUFFIX,github.com
  - DOMAIN-SUFFIX,githubusercontent.com
  - DOMAIN-SUFFIX,githubassets.com
  - DOMAIN-SUFFIX,npmjs.org
  - DOMAIN-SUFFIX,npmjs.com

如果使用 behavior: domain,规则集适合存放纯域名条目,文件结构和条目语法应符合对应内核版本的 domain 格式;不要把带有 DOMAIN-SUFFIX, 前缀的 classical 规则直接当作纯域名列表。类似地,behavior: ipcidr 面向 IP 网段规则。行为类型描述的是规则文件如何解释,不是策略组或代理类型。混用格式可能导致规则加载失败,或规则没有按预期命中。

关联策略组并安排优先级

定义 provider 后,还要在主配置的 rules 中引用它。下面的组名必须与当前配置中真实存在的策略组名称完全一致,包含大小写和标点。若现有配置使用的是“节点选择”等其他名称,应替换示例名称,而不是另建一个同名空组。

rules:
  - RULE-SET,AI-Services,AI-Select
  - RULE-SET,Dev-Tools,Dev-Select
  - DOMAIN-SUFFIX,example.com,DIRECT
  - MATCH,Proxy

RULE-SET,AI-Services,AI-Select 的含义是:连接匹配 AI-Services 规则集后,交给 AI-Select 处理。它不会强制选择某个具体节点;如果 AI-Select 是手动选择组,仍需在客户端选择可用出口。如果该组当前选中 DIRECT,命中规则的流量仍会直连。

规则按列表顺序检查,通常在首次匹配后就确定该连接的策略。因此,要让自定义规则集生效,应将它放在可能覆盖相同域名的宽泛规则之前。例如,如果前面已有把所有域名交给 Proxy 的规则,后面的 AI 规则不会再得到匹配机会;如果更早的规则把相关域名交给 DIRECT,同样会先命中直连。

规则位置建议处理原因
本机或局域网直连例外通常放在较靠前位置避免内网地址被交给远程代理
AI、开发工具等自定义规则集放在覆盖面更广的规则之前确保具体分流先获得匹配机会
较宽泛的地区或类别规则放在具体例外之后减少宽泛规则抢先命中
MATCH通常作为最后一条兜底前面未命中的连接才交给兜底策略

若规则集和主配置中都包含同一个域名,首先命中的规则决定该连接的策略。可以在主配置中对少数例外写更具体的规则,但应说明例外原因,并确认它位于规则集引用之前或之后,符合预期顺序。避免同时保留多条互相矛盾的同类规则,否则后续排障时很难从文件内容看出实际生效项。

策略组名称是配置引用,不是自由文本标签。检查 proxy-groups 中是否存在 AI-Select 和 Dev-Select,并确认组内有可用节点或合适的子策略组。若希望 AI 与开发工具共用同一个出口,也可以让两条规则都指向已有组;是否拆分,应按访问稳定性、出口要求和维护成本决定。

更新与命中验证:从配置加载到实际连接

远程规则集需要先成功取得并通过解析,才能参与匹配。interval 只控制内核检查更新的大致周期,不代表每次访问目标网站都会刷新规则,也不能解决远程地址不可达、返回 HTML 错误页或 YAML 语法错误。更新失败时,旧缓存是否继续可用以及客户端如何显示状态,取决于内核版本与客户端实现,应以日志为准。

  1. 先备份:复制当前配置文件或在客户端保留一个可恢复的配置版本。修改主配置前,记录原有规则顺序与策略组名称。
  2. 检查 URL:在浏览器或命令行中确认规则地址返回的是规则文件,而不是登录页、验证码页面或权限错误。不要把含有访问令牌的完整 URL 贴到公开截图或日志中。
  3. 检查缓存与解析:更新配置后查看内核日志,重点关注 provider 下载失败、状态码、TLS 错误、路径不可写、YAML 行号及不支持的行为类型。
  4. 检查策略组:确认组名存在、组内有候选节点,并在客户端中选择预期出口。节点延迟有数值只说明测试地址的结果,不等于目标服务一定可访问。
  5. 发起新连接验证:重新打开目标页面或启动新的命令行请求,再查看客户端的连接记录。已有长连接可能仍沿用旧路径,不能只观察修改前已建立的连接。

在 Clash Verge Rev 等图形客户端中,配置、代理和连接页面的名称会随版本变化。验证时重点查找目标域名、命中规则类型或规则集名称、最终策略组以及所选节点。若连接记录显示命中的是更早的规则,应先调整顺序;若显示命中自定义规则集但访问仍超时,则检查策略组选择、节点可用性、DNS 解析和目标服务本身,不要立刻继续增加域名。

命令行也可用于单独验证本地代理入口。例如下面以常见的混合端口 7890 为例,通过代理发起 HTTPS 请求;端口必须替换为客户端当前实际监听的值。此测试能够确认请求是否经本地代理发出,但不会直接证明 Clash 命中了哪一条规则,命中情况仍应结合连接页面或日志判断。

curl --connect-timeout 10 --max-time 30 \
  --proxy http://127.0.0.1:7890 \
  -I https://chatgpt.com/
观察结果优先排查
配置加载时报 provider 或 YAML 错误字段缩进、行为类型、文件格式、URL 返回内容和缓存路径
连接命中自定义规则集,但出口不对RULE-SET 第三个参数及策略组当前选择
连接命中更早的 DIRECT 或宽泛规则调整规则先后顺序,核对重复和重叠条目
规则命中且出口正确,仍然超时节点可用性、DNS、目标服务状态和连接记录中的错误阶段
浏览器访问正常,终端请求失败终端是否使用代理环境变量或显式代理参数

规则集应尽量小而明确:按 AI 服务、代码托管、包管理器等维护职责拆分,避免一份文件混入大量无关规则;每次只调整一类域名,更新后检查实际命中结果。若规则由个人或团队自行托管,还应确保 HTTPS、文件格式和访问权限稳定,并在更改规则前保留版本副本。这样即使远程更新或分流结果异常,也能迅速判断问题来自规则内容、加载过程、优先级还是策略组,而不是反复更换整份订阅。

下载Clash