手写 Clash 规则的最大痛点是维护困难:随着规则条目越来越多,配置文件变得臃肿,更新某类网站的域名列表时还要手动修改 YAML。Rule Provider 是 Clash 提供的模块化规则管理机制——将规则列表单独存放在外部文件,Clash 定期自动拉取更新,配置文件只需引用而不需要内联所有条目。本文详解其完整用法与最佳实践。

Rule Provider 的基本结构

Rule Provider 由两部分组成:规则集文件(域名/IP 列表)和配置文件中的引用声明。规则集文件支持两种格式:

  • YAML 格式:每条规则写一行,形如 DOMAIN,example.comIP-CIDR,8.8.8.8/32,有显式的类型前缀,适合复杂混合规则集。
  • text 格式:每行直接写域名或 IP(无类型前缀),Clash 根据 behavior 字段自动推断类型,文件更简洁,适合纯域名或纯 IP 列表。
YAML 格式规则集示例(proxy-list.yaml)
payload:
  - DOMAIN,google.com
  - DOMAIN-SUFFIX,youtube.com
  - DOMAIN-SUFFIX,github.com
  - DOMAIN-KEYWORD,openai
  - IP-CIDR,8.8.8.8/32,no-resolve
text 格式规则集示例(直连域名列表)
baidu.com
taobao.com
jd.com
bilibili.com
iqiyi.com

在配置文件中声明 Rule Provider

使用 rule-providers 字段声明规则集来源,支持 http(远程 URL)和 file(本地路径)两种类型。

rule-providers 声明示例
rule-providers:

  proxy-list:
    type: http
    behavior: classical   # 规则格式:classical / domain / ipcidr
    url: https://raw.githubusercontent.com/yourrepo/rules/proxy.yaml
    path: ./ruleset/proxy-list.yaml
    interval: 86400          # 自动更新间隔,单位秒(此处为 24 小时)

  direct-list:
    type: http
    behavior: domain
    url: https://raw.githubusercontent.com/yourrepo/rules/direct.txt
    path: ./ruleset/direct-list.txt
    interval: 86400

  cn-ip:
    type: http
    behavior: ipcidr
    url: https://raw.githubusercontent.com/yourrepo/rules/cn-ip.txt
    path: ./ruleset/cn-ip.txt
    interval: 604800         # IP 列表更新频率可以低一些(7 天)

behavior 字段详解

behavior 决定了 Clash 如何解析和索引规则集,直接影响匹配性能:

  • classical:规则集中每条都有完整类型前缀(如 DOMAIN-SUFFIX,google.com),可以混合不同类型的规则。灵活,但匹配速度略低。
  • domain:规则集中每行只有域名,Clash 将其建立为域名树(Trie),支持通配符前缀匹配(如 +.google.com 匹配所有子域名)。纯域名场景下性能最优。
  • ipcidr:规则集中每行只有 CIDR 格式的 IP 段,Clash 建立基数树索引,查找速度极快。适合国内 IP 直连等场景。
尽量将规则集按类型拆分:域名规则使用 domain behavior,IP 规则使用 ipcidr behavior,避免都用 classical。专用 behavior 的内部数据结构针对其类型优化,查找速度可提升数倍。

在 rules 中引用规则集

声明好 rule-providers 后,在 rules 字段中使用 RULE-SET 关键字引用:

rules 引用示例
rules:
  - RULE-SET,direct-list,DIRECT   # 直连域名列表 → 直连
  - RULE-SET,proxy-list,节点选择   # 代理域名列表 → 代理策略组
  - RULE-SET,cn-ip,DIRECT         # 国内 IP → 直连
  - GEOIP,CN,DIRECT               # 兜底:GEOIP 国内 IP → 直连
  - MATCH,节点选择                 # 最终匹配 → 代理

规则优先级与顺序设计

Clash 按 rules 列表从上到下匹配,命中第一条即停止。因此规则顺序至关重要。推荐的顺序策略如下:

  1. 内网 / 本地域名DOMAIN-SUFFIX,.localIP-CIDR,192.168.0.0/16)置于最前,防止内网请求被错误代理。
  2. 已知直连域名规则集(国内主流网站)。
  3. 已知代理域名规则集(境外主要服务)。
  4. GEOIP,CN,DIRECT 兜底直连所有国内 IP。
  5. MATCH 兜底代理所有未匹配流量。
避免将 MATCH,DIRECT 作为最终规则——这会让所有未明确标注的境外流量直连,无法享受代理加速,且境外连接可能极慢甚至失败。

本地 file 类型规则集:离线使用

网络受限或需要自定义规则时,使用 type: file 指向本地文件。路径相对于 Clash 的 Home 目录(通常为 ~/.config/clash/~/.local/share/mihomo/)。

本地规则集配置
rule-providers:
  my-custom-rules:
    type: file
    behavior: domain
    path: ./ruleset/my-custom.txt