Clash 规则分流配置实战:国内外网站自动分流方案
以国内外分流场景为例,演示如何用规则集与策略组搭建自动分流:国内站点直连、境外服务走代理、广告与追踪域名直接拒绝。全文语法以 mihomo(Clash Meta)内核为准。
一、分流要解决什么问题
不对流量加以区分时,Clash 只有两种粗放的工作方式。全局代理(global)把所有连接都交给节点:国内站点绕道境外,延迟明显升高;视频与音乐服务因区域版权限制拒绝境外 IP;银行、政务类站点对境外登录触发风控。全局直连(direct)则相反,境外服务完全不可达。
规则分流(rule)是第三种方式:内核依据配置文件中的 rules 列表,对每一个新连接的目标地址逐条判定去向——国内域名与 IP 直连,境外服务交给代理节点,已知的广告与追踪域名直接拒绝。一次配置完成后长期生效,日常使用无需再手动切换模式。本文以一份可直接套用的配置为例,完整演示这套方案的搭建过程。
二、规则匹配的基本原理
rules 是一个有序列表。每个新连接进入内核时,从第一条规则开始向下比对,命中第一条符合条件的规则即停止,按该规则指定的出站处理;全部未命中时,由列表末尾的 MATCH 规则兜底。由此得出两条推论:
- 顺序即优先级。越具体、越需要优先判定的规则越靠前;覆盖面宽的规则(如 GEOIP,CN)靠后;MATCH 永远放在最后。
- 域名规则先于 IP 规则。连接携带域名时,内核先用域名比对 DOMAIN、DOMAIN-SUFFIX、RULE-SET 等规则;全部未命中才解析出 IP,继续比对 IP-CIDR、GEOIP。给 IP 类规则追加 no-resolve 参数,可让内核在尚未解析的阶段直接跳过该规则,避免为判断规则而额外发起 DNS 查询。
常用规则类型如下表:
| 规则类型 | 写法示例 | 说明 |
|---|---|---|
DOMAIN | DOMAIN,www.example.com,节点选择 | 精确匹配单个域名 |
DOMAIN-SUFFIX | DOMAIN-SUFFIX,google.com,节点选择 | 匹配该域及其全部子域 |
DOMAIN-KEYWORD | DOMAIN-KEYWORD,google,节点选择 | 域名包含关键词即命中 |
RULE-SET | RULE-SET,proxy,节点选择 | 引用 rule-providers 声明的规则集 |
GEOSITE | GEOSITE,cn,DIRECT | 按域名分类库匹配(mihomo 专有) |
IP-CIDR | IP-CIDR,192.168.0.0/16,DIRECT,no-resolve | 匹配 IP 段 |
GEOIP | GEOIP,CN,DIRECT | 按 IP 归属地匹配 |
MATCH | MATCH,节点选择 | 兜底,匹配全部剩余连接 |
RULE-SET 与 rule-providers 的写法在原版 Clash Premium 中同样成立;GEOSITE 为 mihomo 专有,使用原版内核时需以 RULE-SET 规则集替代。
三、规划策略组
分流方案中,每个连接只有三种去向:直连 DIRECT、拒绝 REJECT、交给某个代理节点。代理一侧通常组织为三个策略组:
- 节点选择(select 类型):列出全部可用节点,手动指定出口,作为多数规则的默认出站。
- 自动选择(url-test 类型):对组内节点定时测速,自动切换到延迟最低者;把它挂进「节点选择」的候选列表,需要时一键切换。
- 广告拦截(select 类型):候选只有 REJECT 与 DIRECT。默认指向 REJECT;排查「某网站打不开是否为误杀」时,临时切到 DIRECT 即可对照验证。
proxy-groups:
- name: 节点选择
type: select
proxies:
- 自动选择
- 香港节点
- 日本节点
- DIRECT
- name: 自动选择
type: url-test
proxies:
- 香港节点
- 日本节点
url: http://www.gstatic.com/generate_204
interval: 300
- name: 广告拦截
type: select
proxies:
- REJECT
- DIRECT
策略组的名字会原样出现在 rules 里,改名时两处必须同步,否则规则会指向一个不存在的出站。
四、引入规则集
需要覆盖的域名数以万计,手写规则不现实。社区维护的规则集按用途整理成列表——广告域名、国内站点、境外常用服务、国内 IP 段——由内核定时下载、本地缓存。声明方式是在配置顶层添加 rule-providers:
rule-providers:
reject:
type: http
behavior: classical
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
各字段含义:
- type:http 表示从远程地址下载;file 表示读取本地文件。
- behavior:classical 表示列表由经典规则(DOMAIN、DOMAIN-SUFFIX 等)组成;domain 表示纯域名列表;ipcidr 表示纯 IP 段列表。下载源是哪种格式,这里就填哪种,填错会导致规则集加载失败。
- path:本地缓存路径。
- interval:更新间隔,单位秒;86400 即每天更新一次。
声明之后,在 rules 里以 RULE-SET,<名称>,<出站> 引用。mihomo 用户还有另一条路:内核内置 GEOSITE 与 GEOIP 数据库,GEOSITE,cn、GEOSITE,category-ads-all、GEOIP,CN 等写法无需 rule-providers 即可使用,代价是分类粒度由数据库维护方决定。
本文示例使用 Loyalsoldier/clash-rules 项目的发布文件,该项目按用途拆分的 reject(广告)、direct(国内)、proxy(境外)、cncidr(国内 IP 段)等列表更新频繁、引用广泛;读者也可换成任何可信来源,写法不变。
五、完整配置示例
把上述部件拼合,得到一份完整的国内外分流配置:
# 基础设置
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
# 内置 DNS:域名规则未命中时,解析结果用于 GEOIP 判断
dns:
enable: true
ipv6: false
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://doh.pub/dns-query
- https://dns.alidns.com/dns-query
# 策略组(见第三节)
proxy-groups:
- name: 节点选择
type: select
proxies:
- 自动选择
- 香港节点
- 日本节点
- DIRECT
- name: 自动选择
type: url-test
proxies:
- 香港节点
- 日本节点
url: http://www.gstatic.com/generate_204
interval: 300
- name: 广告拦截
type: select
proxies:
- REJECT
- DIRECT
# 远程规则集(见第四节)
rule-providers:
reject:
type: http
behavior: classical
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
direct:
type: http
behavior: classical
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
proxy:
type: http
behavior: classical
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
path: ./ruleset/proxy.yaml
interval: 86400
# 分流规则:自上而下,命中即停
rules:
- IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- RULE-SET,reject,广告拦截
- RULE-SET,direct,DIRECT
- RULE-SET,proxy,节点选择
- GEOIP,CN,DIRECT
- MATCH,节点选择
规则段的排列逻辑:
- 本机与局域网地址直连,加 no-resolve 避免无谓解析。
- 广告与追踪域名交给「广告拦截」组,默认 REJECT。放在最前,确保后续规则不会把它们放行。
- 国内域名直连。
- 境外常用服务走「节点选择」。
- 域名规则都未命中的连接,解析出 IP 后按 GEOIP 判断是否归属国内,是则直连。
- MATCH 兜底:其余一律走代理。宁可让少数国内冷门站点绕路,也不让境外流量漏成直连。
注意:proxies 一节(节点列表)中必须存在名为「香港节点」「日本节点」的节点,否则策略组引用落空、配置加载失败;实际使用时替换成自己订阅里的节点名。
六、验证与常见错误
验证分流是否生效
- 打开客户端的连接面板(或 metacubexd、zashboard 等外置面板),每条连接都标注了命中的规则与出站链,例如
RULE-SET(direct) → DIRECT。 - 分别访问一个国内站点、一个境外站点、一个已知广告域名,对照面板确认三者各归其位。
- 访问境外站点时查询出口 IP,显示的应是节点所在地,而非本机宽带 IP。
常见错误
- 规则顺序颠倒。GEOIP,CN 放得太靠前,会把本应走代理的境外子域提前截留;MATCH 写在中间,其后的规则永不生效。
- 规则集下载失败。rule-providers 的地址失效时,对应 RULE-SET 规则整体落空,日志中可见错误,需要更换镜像地址或改用 file 类型的本地规则集。
- DNS 配置缺失。域名规则全部未命中时,内核依赖解析结果做 GEOIP 判断;若系统 DNS 被污染,境外域名可能解出错误 IP 而被误判为直连。启用内核内置 DNS(示例已含)可规避。
- 节点名不一致。proxy-groups 引用的节点名必须与 proxies 中的 name 逐字一致,包括空格与全半角差异。
机场订阅文件通常已内置一套分流规则,直接编辑订阅文件会在下次更新时被覆盖。正确做法是使用客户端的覆写(Merge / Mixin)功能,或经订阅转换服务在订阅基础上追加自定义规则与规则集。