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 语法错误。更新失败时,旧缓存是否继续可用以及客户端如何显示状态,取决于内核版本与客户端实现,应以日志为准。
- 先备份:复制当前配置文件或在客户端保留一个可恢复的配置版本。修改主配置前,记录原有规则顺序与策略组名称。
- 检查 URL:在浏览器或命令行中确认规则地址返回的是规则文件,而不是登录页、验证码页面或权限错误。不要把含有访问令牌的完整 URL 贴到公开截图或日志中。
- 检查缓存与解析:更新配置后查看内核日志,重点关注 provider 下载失败、状态码、TLS 错误、路径不可写、YAML 行号及不支持的行为类型。
- 检查策略组:确认组名存在、组内有候选节点,并在客户端中选择预期出口。节点延迟有数值只说明测试地址的结果,不等于目标服务一定可访问。
- 发起新连接验证:重新打开目标页面或启动新的命令行请求,再查看客户端的连接记录。已有长连接可能仍沿用旧路径,不能只观察修改前已建立的连接。
在 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、文件格式和访问权限稳定,并在更改规则前保留版本副本。这样即使远程更新或分流结果异常,也能迅速判断问题来自规则内容、加载过程、优先级还是策略组,而不是反复更换整份订阅。