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 查询。

常用规则类型如下表:

规则类型写法示例说明
DOMAINDOMAIN,www.example.com,节点选择精确匹配单个域名
DOMAIN-SUFFIXDOMAIN-SUFFIX,google.com,节点选择匹配该域及其全部子域
DOMAIN-KEYWORDDOMAIN-KEYWORD,google,节点选择域名包含关键词即命中
RULE-SETRULE-SET,proxy,节点选择引用 rule-providers 声明的规则集
GEOSITEGEOSITE,cn,DIRECT按域名分类库匹配(mihomo 专有)
IP-CIDRIP-CIDR,192.168.0.0/16,DIRECT,no-resolve匹配 IP 段
GEOIPGEOIP,CN,DIRECT按 IP 归属地匹配
MATCHMATCH,节点选择兜底,匹配全部剩余连接
批注

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,cnGEOSITE,category-ads-allGEOIP,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,节点选择

规则段的排列逻辑:

  1. 本机与局域网地址直连,加 no-resolve 避免无谓解析。
  2. 广告与追踪域名交给「广告拦截」组,默认 REJECT。放在最前,确保后续规则不会把它们放行。
  3. 国内域名直连。
  4. 境外常用服务走「节点选择」。
  5. 域名规则都未命中的连接,解析出 IP 后按 GEOIP 判断是否归属国内,是则直连。
  6. MATCH 兜底:其余一律走代理。宁可让少数国内冷门站点绕路,也不让境外流量漏成直连。

注意:proxies 一节(节点列表)中必须存在名为「香港节点」「日本节点」的节点,否则策略组引用落空、配置加载失败;实际使用时替换成自己订阅里的节点名。

六、验证与常见错误

验证分流是否生效

  1. 打开客户端的连接面板(或 metacubexd、zashboard 等外置面板),每条连接都标注了命中的规则与出站链,例如 RULE-SET(direct) → DIRECT
  2. 分别访问一个国内站点、一个境外站点、一个已知广告域名,对照面板确认三者各归其位。
  3. 访问境外站点时查询出口 IP,显示的应是节点所在地,而非本机宽带 IP。

常见错误

  • 规则顺序颠倒。GEOIP,CN 放得太靠前,会把本应走代理的境外子域提前截留;MATCH 写在中间,其后的规则永不生效。
  • 规则集下载失败。rule-providers 的地址失效时,对应 RULE-SET 规则整体落空,日志中可见错误,需要更换镜像地址或改用 file 类型的本地规则集。
  • DNS 配置缺失。域名规则全部未命中时,内核依赖解析结果做 GEOIP 判断;若系统 DNS 被污染,境外域名可能解出错误 IP 而被误判为直连。启用内核内置 DNS(示例已含)可规避。
  • 节点名不一致。proxy-groups 引用的节点名必须与 proxies 中的 name 逐字一致,包括空格与全半角差异。
订阅用户注意

机场订阅文件通常已内置一套分流规则,直接编辑订阅文件会在下次更新时被覆盖。正确做法是使用客户端的覆写(Merge / Mixin)功能,或经订阅转换服务在订阅基础上追加自定义规则与规则集。

下载Clash