Clash 规则分流配置实战:国内直连国外代理的完整写法与匹配顺序

以国内外分流为场景,讲解 DOMAIN-SUFFIX、GEOIP、RULE-SET 的组合写法,规则自上而下的匹配顺序,以及 MATCH 兜底与常见误写导致的漏匹配问题。

B-01分流的基本原理:规则、策略组与匹配顺序

Clash 的分流本质是一张"从上到下逐条比对"的清单。配置文件里的 rules 字段是一个数组,每一行都是一条独立规则,格式统一为 规则类型,匹配内容,策略名 三段式。当一次网络请求进入 Clash 内核,内核会按照数组里从第一行到最后一行的顺序依次比对,一旦命中某一条,立刻按该条指定的策略(直连、代理、拒绝)处理,后面的规则不再继续比对。这个"命中即停"的机制是理解分流配置的核心,也是后文排查漏匹配问题的关键切入点。

策略这一段填的不是具体节点,而是策略组名称,比如 DIRECT(直连,内核内置)、REJECT(拒绝,内核内置),或者你在 proxy-groups 里自定义的组名,例如 国外代理。策略组内部再决定具体走哪个节点,规则层只负责"该走哪条路",不管"这条路上具体是哪台车"。这种分层设计的好处是,换节点、调整延迟策略都只需要改策略组,不用动规则本身。

B-02国内直连、国外代理的标准写法

国内直连国外代理是最常见的分流场景,核心思路是:先把明确属于国内的域名和 IP 段挑出来走直连,再把明确属于国外或需要代理访问的域名挑出来走代理,最后用一条兜底规则把剩下所有流量归到某一策略,通常也是代理组,避免遗漏。

实践中主要用到三类规则:

  • DOMAIN-SUFFIX:按域名后缀匹配,适合已知域名的网站,例如 DOMAIN-SUFFIX,google.com,国外代理 会匹配 google.com 以及所有子域名。
  • GEOIP:按目标 IP 所属地理位置匹配,适合处理没有固定域名规律、但服务器归属地明确的流量,例如 GEOIP,CN,DIRECT 表示目标 IP 属于中国大陆则直连。
  • RULE-SET:引用一份预先整理好的规则集文件(本地或远程),把成千上万条域名/IP 规则打包成一个引用,避免规则文件本身写得又长又乱。

一份最基础的国内直连、国外代理规则段落大致如下:

rules:
  - DOMAIN-SUFFIX,cn,DIRECT
  - DOMAIN-SUFFIX,baidu.com,DIRECT
  - DOMAIN-SUFFIX,qq.com,DIRECT
  - DOMAIN-SUFFIX,google.com,国外代理
  - DOMAIN-SUFFIX,youtube.com,国外代理
  - DOMAIN-SUFFIX,github.com,国外代理
  - GEOIP,CN,DIRECT
  - MATCH,国外代理

这段规则的逻辑是:先精确处理几个明确要直连或明确要代理的域名,再用 GEOIP,CN,DIRECT 兜住所有目标服务器落在中国大陆的流量,最后 MATCH,国外代理 把没有命中任何前面规则的流量统一交给代理组。实际使用中,前面手写的 DOMAIN-SUFFIX 条目往往会替换成 RULE-SET 引用的规则集,因为手动维护几十条域名远不如引用一份持续更新的规则集省心。

B-03用 RULE-SET 引用规则集的写法

RULE-SET 分两步:先在 rule-providers 字段里声明一个规则集的名称、来源和更新周期,再在 rules 里用 RULE-SET,规则集名称,策略名 引用它。示例如下:

rule-providers:
  cn-domain:
    type: http
    behavior: domain
    url: "https://example.com/rules/cn-domain.yaml"
    path: ./rules/cn-domain.yaml
    interval: 86400
  proxy-domain:
    type: http
    behavior: domain
    url: "https://example.com/rules/proxy-domain.yaml"
    path: ./rules/proxy-domain.yaml
    interval: 86400

rules:
  - RULE-SET,cn-domain,DIRECT
  - RULE-SET,proxy-domain,国外代理
  - GEOIP,CN,DIRECT
  - MATCH,国外代理

behavior 字段要与规则集文件的实际内容对应,常见三种:domain 表示文件里是域名列表,ipcidr 表示文件里是 IP 段列表,classical 表示文件里混合了完整的规则语句(每行自带类型前缀)。填错 behavior 是规则集不生效的高频原因之一,内核解析时会按声明的 behavior 去理解文件格式,一旦不匹配,规则集实质上等于空文件,却不一定会报明显的错误。

注意 NOTE 规则集通过网络下载后会缓存到 path 指定的本地文件,interval 是下次自动刷新的间隔秒数。如果怀疑规则集没更新到最新版本,先看本地缓存文件的修改时间,再决定是否手动删除缓存触发重新下载。

B-04规则顺序为什么决定结果:一个真实会出错的例子

规则顺序不是排版习惯,而是直接决定分流结果的逻辑结构。看下面这段容易出错的写法:

rules:
  - GEOIP,CN,DIRECT
  - DOMAIN-SUFFIX,google.com,国外代理
  - MATCH,国外代理

这段配置把 GEOIP,CN,DIRECT 放在了最前面。问题在于,一些通过 CDN 分发的国外网站,其某个接入节点的 IP 恰好落在中国大陆的 CDN 节点上,或者反过来,不少国内服务商在海外也部署了加速节点。GEOIP 判断的是"这次连接实际到达的 IP 归属地",不是"这个网站的主体归属地"。如果 GEOIP,CN,DIRECT 排在 DOMAIN-SUFFIX 之前,某次访问 google.com 恰好解析到一个被 GEOIP 库标记为中国大陆的 IP,就会在到达下面那条本该生效的 DOMAIN-SUFFIX 规则之前被直连规则先行拦截,导致该请求走直连、连接失败或被污染。

正确的顺序原则是:越精确、越具体的规则放在越靠前的位置,笼统的兜底判断放在后面。域名类规则通常比 GEOIP 更精确,因为域名是网站的身份标识,不会因为 CDN 调度而变化;GEOIP 更适合放在域名规则之后,专门处理那些没有域名规则覆盖、但可以按 IP 归属地简单判断的剩余流量。前面示例里把 DOMAIN-SUFFIX / RULE-SET 放在前、GEOIP 放在中间、MATCH 放在最后,正是这个原则的体现。

B-05MATCH 兜底规则:必须写、必须放最后

MATCH 是一条特殊规则,不需要匹配内容,表示"前面所有规则都没命中的流量,统一按这里指定的策略处理"。它必须是规则列表的最后一行,否则会造成两个问题:如果漏写 MATCH,某些配置在没有命中任何规则时会按内核默认行为处理(不同客户端默认行为不完全一致,有的直连有的拒绝),行为不可预期;如果 MATCH 没放在最后,它后面的规则永远不会被执行,因为 MATCH 本身逢流量必中。

  1. 检查规则文件最后一行是否为 MATCH,策略名
  2. 确认 MATCH 后面没有再跟其他规则行,有则删除或前移。
  3. 确认 MATCH 指定的策略组存在且能连通,建议指向国外代理组而不是某个具体节点,避免该节点失效时兜底规则也失效。

B-06常见误写与漏匹配排查清单

规则不生效或者分流结果和预期不一致,大多逃不出以下几类原因,按顺序自查通常能定位问题:

现象常见原因排查方法
某网站应走代理却走了直连DOMAIN-SUFFIX 规则排在 GEOIP 之后,或规则集 behavior 声明错误调整规则顺序,检查规则集缓存文件是否为空
某网站应走直连却走了代理域名被更泛化的规则提前匹配,例如误写了通配范围过大的 DOMAIN-KEYWORD把范围更窄的精确规则前移,收窄或删除过泛的关键词规则
新增规则完全无效果规则写在 MATCH 之后,永远比对不到确认 MATCH 是最后一行,新规则插入到 MATCH 之前
规则集更新后仍是旧结果本地缓存未过期,interval 设置过长删除本地缓存文件并重启内核,或缩短 interval
整体分流全部失效策略组名称与 rules 里引用的名称拼写不一致逐条核对 proxy-groups 的 name 字段与 rules 里的策略名

其中"策略组名称拼写不一致"是最容易被忽略的一类错误,因为大多数客户端加载配置时不会因为策略名不存在而直接报错,而是静默地把该规则视为无效,表现出来就是"配置看起来没问题,但分流没生效"。养成规则改动后用具体网址逐条验证的习惯,比事后排查更省时间。

B-07验证分流是否按预期生效

写完规则不要只靠感觉判断,建议用以下方式逐条验证:

  • 在客户端的连接日志或规则命中记录里,访问目标网站后查看这次请求实际命中了哪一条规则、走了哪个策略组,大多数图形客户端在"日志"或"连接"面板里能看到。
  • 针对国内网站和国外网站各挑两三个有代表性的域名分别测试,不要只测一个网站就下结论,因为个别网站可能有独立的 CDN 特殊情况。
  • 规则集引用类的配置,首次生效前先确认规则集文件下载成功、本地缓存不是空文件。
建议 规则文件建议保留清晰的分组注释,把"国内直连""国外代理""兜底"分成几段,方便后续排查时按顺序快速定位到出问题的区间,而不用从头逐行看到尾。

按图施工:下载 Clash 客户端

规则写法理清楚之后,配合图形客户端的日志面板验证分流结果,调试效率更高。

下载客户端