为什么要做规则分流
规则分流的核心目的很简单:让访问中国大陆内网站的流量走本地直连,让访问海外站点的流量走代理节点,两条路径互不干扰。直连的好处是延迟低、不占用节点带宽;代理节点的好处是能够访问被限制或速度较差的海外资源。如果不做分流,全局模式下所有流量都走代理,不仅访问国内网站会绕一圈增加延迟,还会占用节点上行带宽,遇到高峰期机场限速时体验更差。
要实现分流,需要理解 Clash(及其内核实现 Clash Meta / mihomo)配置文件里两个互相配合的部分:proxy-groups 定义"有哪些可选的出口策略",rules 定义"什么样的流量应该走哪个策略"。规则本身不选节点,策略组才选节点;规则只是把流量指派给某个策略组,再由策略组内部的选择逻辑决定具体走哪条线路。这个分层关系是理解后面所有配置的前提。
proxy-groups 怎么写
一个策略组本质上是若干代理节点(或其他策略组)的集合,加上一种选择方式。常用的 type 有三种:
- select:手动选择,客户端界面上会显示一个下拉列表,用户点哪个就走哪个,不自动切换。
- url-test:自动测速,按
url和interval定期探测组内节点延迟,自动选用最快的一个。 - fallback:故障转移,按节点列表顺序尝试,当前节点不可用时自动切到下一个。
一个典型的地区分流场景至少需要三个策略组:一个给"国外流量"用的自动测速组,一个固定的 DIRECT(直连,内核内置,不用自己定义节点),再加一个兜底的手动选择组。示例:
proxy-groups:
- name: 节点选择
type: select
proxies:
- 自动选优
- DIRECT
- name: 自动选优
type: url-test
proxies:
- HK-01
- HK-02
- SG-01
- JP-01
url: http://www.gstatic.com/generate_204
interval: 300
tolerance: 50
- name: 国内直连
type: select
proxies:
- DIRECT
- 节点选择
其中 HK-01 等名称需要与订阅解析出来的实际节点名一致,通常在客户端导入订阅后可以直接在节点列表里看到真实名称,再据此调整策略组里的 proxies 字段。url 是测速请求的目标地址,interval 是测速间隔(单位秒),tolerance 是切换容差,延迟差在容差范围内不会频繁切换节点。
rules 规则类型与匹配顺序
规则是按从上到下的顺序逐条匹配的,一旦某条规则匹配成功就立即生效,后面的规则不再检查。这意味着规则的排列顺序直接决定分流结果,写反顺序是最常见的翻车原因。常用的规则类型有:
- DOMAIN-SUFFIX:按域名后缀匹配,例如
DOMAIN-SUFFIX,taobao.com匹配该域名及其所有子域名。 - DOMAIN-KEYWORD:按域名关键字匹配,写法更宽松,容易误伤,建议只在明确知道关键字唯一性时使用。
- DOMAIN:精确匹配单个域名,不含子域名。
- GEOIP:按目标 IP 所属国家/地区匹配,例如
GEOIP,CN,DIRECT表示目标 IP 判定为中国大陆时直连。GEOIP 匹配依赖内置或外部的 IP 地理数据库,数据库版本较旧时可能出现误判,建议定期让客户端更新地理数据库文件。 - IP-CIDR / IP-CIDR6:按 IP 段匹配,常用于内网地址、局域网地址的直连处理。
- MATCH:兜底规则,放在规则列表最后一行,匹配所有未被前面规则命中的流量。
规则的写法统一为 类型,匹配内容,目标策略 三段式,用逗号分隔。一份完整的规则列表大致结构如下:
rules:
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-KEYWORD,baidu,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- GEOIP,CN,国内直连
- MATCH,节点选择
这份规则的读法是:先排除掉明确属于国内的域名和局域网地址,把它们交给 DIRECT;剩下的 IP 如果判定归属中国大陆,交给"国内直连"策略组(内部还是走 DIRECT,但留了手动切换的余地);最后所有没被前面命中的流量,统一交给"节点选择"这个自动测速组去处理海外访问。
顺序错误是最常见的坑:如果把 MATCH,节点选择 放在中间,后面所有针对国内域名的规则都不会再被检查,因为 MATCH 会拦截掉它之后遇到的每一条流量判断。MATCH 永远只能放在规则列表最后一行。
给流媒体单独建一个策略组
很多用户希望流媒体走固定的某几个节点(比如专门标注解锁的节点),而不是跟着"自动选优"组一起被测速切换,这样可以避免看视频时突然切换节点导致卡顿重新缓冲。做法是新增一个专用策略组,并在规则里把对应域名单独指派过去,同时要把这条规则写在通用规则之前:
proxy-groups:
- name: 流媒体
type: select
proxies:
- HK-01
- SG-01
- 自动选优
rules:
- DOMAIN-SUFFIX,netflix.com,流媒体
- DOMAIN-SUFFIX,nflxvideo.net,流媒体
- DOMAIN-SUFFIX,disneyplus.com,流媒体
- DOMAIN-SUFFIX,cn,DIRECT
- GEOIP,CN,国内直连
- MATCH,节点选择
这里的关键点是:流媒体相关的域名规则必须放在 MATCH 之前,并且最好放在其他通用规则之前,避免被更靠前的宽泛规则(比如某条 DOMAIN-KEYWORD)提前拦截。规则列表里越具体、越需要精确控制的条目,越应该往前放;越笼统的兜底规则,越应该往后放。
如果同时使用了规则集(rule-provider)形式的域名列表来维护流媒体域名,原理是一样的,只是把逐条 DOMAIN-SUFFIX 换成了引用一个远程或本地维护的规则集文件,写法上多了一个 rule-providers 字段和对应的 RULE-SET 规则类型,但匹配顺序的逻辑完全不变。
规则模式与全局模式的区别
客户端界面通常提供三种运行模式的切换,理解它们和上面配置的关系很重要:
- 规则模式(Rule):严格按照
rules列表逐条匹配,是本文讲的默认工作方式。 - 全局模式(Global):忽略所有
rules,所有流量统一走某一个手动选定的节点,适合临时测试某个节点是否可用,不适合长期使用。 - 直连模式(Direct):忽略所有
rules,所有流量直连,不经过任何代理节点,适合临时排查代理是否影响某个连接问题。
日常使用应固定在规则模式,只有排查问题时才短暂切到全局或直连模式做对比测试,测试完记得切回来,否则规则分流的效果不会生效。
写完规则之后如何自查
- 保存配置后,在客户端里选择重新加载配置(不同客户端叫法可能是"重载"或"刷新"),避免因为编辑器缓存导致规则没有真正生效。
- 打开客户端自带的连接日志或流量面板,访问一个已知的国内网站,确认命中的规则和最终策略是 DIRECT。
- 再访问一个已知的海外网站,确认命中的规则落在预期的策略组上,且该策略组当前选中的节点状态正常。
- 如果发现某个域名走错了策略,回头检查这条域名规则是否被排在它前面的某条更宽泛规则(尤其是 DOMAIN-KEYWORD)提前拦截。
- GEOIP 判断异常时,检查客户端里地理数据库文件的更新时间,过旧的数据库会导致部分 IP 归属判断不准确。
规则分流不是一次写完就不用管的东西,随着访问的网站变化、节点的增减,策略组的节点列表和部分域名规则可能需要陆续微调。养成先看日志再改规则的习惯,比凭感觉猜测更容易定位问题所在。
如果不想手写全部规则,大多数机场或社区维护的规则集(如按大陆直连、局域网直连、常见服务分类整理好的规则文件)可以通过 rule-providers 引用,减少手动维护的域名条目数量,同时仍然保留自定义规则优先命中的能力。