用 Clash 系客户端时,分流规则决定了每个请求走代理还是直连。规则写错的表现五花八门:明明开了代理却打不开某个网站、国内网站莫名其妙走了代理、广告规则没生效。理解规则的匹配逻辑后,这些问题都好定位。

核心逻辑:自上而下,第一条命中即生效#
规则列表是按顺序匹配的:一个请求从第一条开始比对,命中哪条就按哪条的策略走,后面的规则不再看。所以顺序就是一切——越具体的规则越要放前面,兜底规则放最后。
最典型的兜底规则是 MATCH 或 FINAL:放在最后,匹配所有前面没命中的流量。日常配置里它一般指向代理组;如果你希望默认直连,就把它指向 DIRECT。
常用规则类型#
- DOMAIN:精确匹配单个域名,如
DOMAIN,www.example.com。 - DOMAIN-SUFFIX:匹配域名后缀,覆盖该域名及其所有子域名,如
DOMAIN-SUFFIX,example.com。这是最常用的类型,写一条就能覆盖一整个站。 - DOMAIN-KEYWORD:域名中包含某个关键词就匹配,范围较宽,容易误伤,少用。
- IP-CIDR:按 IP 段匹配,如
IP-CIDR,192.168.0.0/16,no-resolve。no-resolve表示不解析域名直接按 IP 匹配,适合局域网、内网地址。 - GEOIP:按 IP 归属地匹配,如
GEOIP,CN,DIRECT表示中国 IP 直连。需要客户端内置 GeoIP 数据库。 - GEOSITE:按域名分类匹配,如
GEOSITE,cn,DIRECT,依赖客户端的 geosite 数据。 - DST-PORT:按目标端口匹配,适合某些固定端口的服务。
新手最容易犯的错误是把 DOMAIN-SUFFIX 写成 DOMAIN:只匹配主域名不匹配子域名,导致 www.example.com 走了代理、api.example.com 却直连了,表现就是网站时好时坏。
远程规则集:rule-providers#
自己一条条写规则很快会失控,远程规则集就是把别人维护好的规则列表引用进来。配置里声明一个 rule-provider(给一个 URL 和更新间隔),再在 rules 里用 RULE-SET,提供者名字,策略 引用它。
规则集按内容分三类:域名类(behavior: domain)、IP 类(behavior: ipcidr)、经典类(behavior: classical,域名和 IP 混写)。引用时类型要对上,否则规则集不生效。远程规则集会定时更新,适合放那些经常变化的列表,比如流媒体、广告屏蔽。
自己维护规则和用远程规则集并不冲突:远程规则集管大类,自己再写几条针对个人的规则放前面。比如某个小众网站分流不对,自己写一条 DOMAIN-SUFFIX 放最前面,优先级高于远程规则集。
新手最容易踩的三个坑#
1. 规则顺序反了。 把宽泛规则放前面,精确规则放后面,精确规则永远匹配不到。检查顺序:具体域名 → 分类规则集 → GEOIP/GEOSITE → 兜底 MATCH。
2. 改了规则没生效。 有些客户端会缓存 DNS 和连接,改规则后要刷新配置、清理旧连接再测试。只改配置不刷新,测试结果还是旧的。
3. 直连和代理来回横跳。 某个网站一会儿直连一会儿代理,往往是域名解析结果在变:域名解析到国内 IP 时走直连、解析到国外 IP 时走代理。GEOIP 类规则对这种情况敏感,排查时先看解析结果。
和 sing-box、Loon 的关系#
sing-box 的路由规则和 Clash 规则概念相通,只是写法不同,sing-box 自定义规则教程 里讲过它的 route 写法。Loon 的插件和规则体系也是同一套思路,见 Loon 插件与分流规则指南。理解“自上而下匹配”这个核心后,换客户端只是换写法。
小结#
分流规则就记住三句话:顺序决定一切,越具体越靠前;DOMAIN-SUFFIX 是日常主力;大类用远程规则集、个人需求自己补几条。按这个思路写,绝大多数分流问题都能自己定位。

