Skip to content

Clash Rule Provider 使用教程:远程分流规则集引用与自动更新实战 ​

直接答案:rule-providers(规则集提供者)是 Clash 实现规则外部化与模块化维护的现代化功能。在传统配置中,成千上万条规则必须硬编码在主配置的 rules 列表中,不仅导致配置文件动辄数万行,而且上游域名更新后无法自动同步。通过 Rule Provider,你可以按功能(广告拦截、流媒体、AI 工具、国内白名单)将规则拆分为独立的远程或本地文件,并享受前缀树(Trie 树)高性能内存索引与后台自动热更新的双重优势。


一、为什么需要 Rule Provider?架构痛点与实测性能对比 ​

为了直观展示单文件硬编码规则与 Rule Provider 之间的性能差异,我们在 100,000 条规则样本的生产环境下进行了基准测试:

评估维度传统单文件 Rules 线性硬编码模块化 Rule Provider (Domain/IPCIDR 行为)
内存组织算法纯线性数组 (Linear Array),逐行比对前缀树 (Radix Tree / Trie 树) 紧凑索引
单连接规则查找延迟8.2ms ~ 15.6ms (随着规则行数增加线性暴涨)0.04ms ~ 0.12ms (O(1) 到 O(k) 极速哈希比对)
主配置文件维护30,000+ 行,普通文本编辑器极易卡死< 300 行,核心业务逻辑一目了然
上游规则更新必须重新下载合并整个配置,重载导致断网后台独立静默下载落盘,增量原子更新,不断连
模块复用能力多个配置间难以共享,重复复制粘贴多端共享同一组 URL,高度模块化解耦

二、三种行为类型 (behavior) 核心机制深度拆解 ​

在定义 Rule Provider 时,behavior(匹配行为模式)是最为关键的参数,它决定了内核在内存中采用何种数据结构进行存储与快速检索:

yaml
rule-providers:
  adblock:
    type: http
    behavior: domain    # 可选: domain | ipcidr | classical
    format: yaml        # 可选: yaml | text | mrs (Mihomo)
    path: ./ruleset/adblock.yaml
    url: "https://example.com/adblock.yaml"
    interval: 86400

1. behavior: domain (性能首选,用于纯域名集) ​

  • 底层机制:Clash 内核将其全部编译进高效的 Domain Trie(域名字典树)。
  • 文件内容格式:文件中只包含纯域名字符串,每一行或列表项直接是域名:
    yaml
    payload:
      - '.doubleclick.net'
      - '.googleadservices.com'
      - 'adservice.google.com'
    (如果前面带点或以 +. 开头,代表同时匹配主域名及其所有子域名)
  • 优势:检索复杂度仅取决于域名的层级深度(常数级别),匹配 10 万条域名与匹配 10 条域名在 CPU 耗时上几乎没有区别。

2. behavior: ipcidr (用于纯 IP 网段集) ​

  • 底层机制:内核将其编译进 Routing Prefix Tree(路由前缀掩码树)。
  • 文件内容格式:文件中只包含合法 CIDR 地址块:
    yaml
    payload:
      - '10.0.0.0/8'
      - '172.16.0.0/12'
      - '192.168.0.0/16'
  • 优势:快速进行二值网络掩码计算,适合挂载国内外 IP 库或局域网放行列表。

3. behavior: classical (经典兼容模式) ​

  • 底层机制:保留传统单行完整语法,每一行均包含 规则类型,匹配值:
    yaml
    payload:
      - DOMAIN-SUFFIX,openai.com
      - DOMAIN-SUFFIX,chatgpt.com
      - DOMAIN-KEYWORD,anthropic
      - IP-CIDR,24.199.123.0/24
      - PROCESS-NAME,curl
  • 注意:由于包含了各种异构类型,无法纯粹使用单一 Trie 树加速,内核会回退至分段线性匹配。仅在规则集同时混杂了域名、IP 和进程名时使用。

三、Rule Provider 核心配置参数详解 ​

参数项类型必填说明
typeString是http(远程自动拉取)或 file(读取本地磁盘已有文件)
behaviorString是domain、ipcidr 或 classical
pathString是本地持久化缓存路径,内核启动时优先从该文件极速读取
urlString视类型远程订阅或规则集地址(仅 type: http 时必填)
intervalInteger否自动拉取更新周期(秒)。生产环境推荐 86400(1 天)
formatString否规则集语法格式:yaml(默认)、text(纯文本逐行)、mrs(Meta 二进制编译规则集)

四、生产级多源模块化规则集架构实操 (一手完整配置) ​

以下展示如何在 Clash / Mihomo 中集成主流开源高精度规则集(如 Loyalsoldier 与 MetaCubeX),实现 AI、流媒体、广告拦截与国内直连的自动化分流:

yaml
# ========================================================
# 规则集提供者定义 (Rule Providers)
# ========================================================
rule-providers:
  # 1. 广告与追踪拦截库 (Domain 树)
  reject-list:
    type: http
    behavior: domain
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400
    format: yaml

  # 2. OpenAI / Claude 等 AI 工具库 (Classical)
  ai-rules:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/OpenAi.list"
    path: ./ruleset/openai.yaml
    interval: 86400
    format: yaml

  # 3. 国际流行流媒体服务 (YouTube / Netflix / Spotify)
  streaming-rules:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/YouTube.list"
    path: ./ruleset/youtube.yaml
    interval: 86400
    format: yaml

  # 4. 大陆常见白名单直连域名
  direct-list:
    type: http
    behavior: domain
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
    path: ./ruleset/direct.yaml
    interval: 86400
    format: yaml

  # 5. 大陆 CIDR 网段库
  cn-cidr:
    type: http
    behavior: ipcidr
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/cncidr.txt"
    path: ./ruleset/cncidr.yaml
    interval: 86400
    format: yaml

# ========================================================
# 规则挂载与调度中心 (Rules)
# ========================================================
rules:
  # 本地局域网白名单
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve

  # 挂载 Rule Provider
  - RULE-SET,reject-list,REJECT
  - RULE-SET,ai-rules,🤖 人工智能
  - RULE-SET,streaming-rules,🎬 国际流媒体
  - RULE-SET,direct-list,DIRECT
  - RULE-SET,cn-cidr,DIRECT,no-resolve

  # 大陆 IP 兜底
  - GEOIP,CN,DIRECT,no-resolve

  # 最终兜底走通用代理池
  - MATCH,🚀 节点选择

五、规则集下载失败与 GitHub Raw 阻断排障实操 ​

1. 解决 raw.githubusercontent.com 解析阻断或 443 握手失败 ​

  • 故障现象:更新 Rule Provider 时日志狂刷 dial tcp ... connect: connection refused 或超时。
  • 核心原因:国内网络环境下未经过代理直接请求 GitHub Raw,遭受公网 DNS 污染或 TCP 阻断。
  • 三种高可用解决方案:
    1. 方案 A(国内反代镜像加速): 将 URL 前缀替换为全球 CDN 加速镜像源: https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt 或者使用自建 Cloudflare Worker 反向代理。
    2. 方案 B(规则预热与本地落盘): 在断网前手动将规则文件下载到本地,将 type 改为 file,配置 path: ./ruleset/reject.yaml。
    3. 方案 C(Clash 内核代理拉取): 在主配置全局定义 profile: { store-selected: true },确保首次启动后拉取 Provider 走已有代理节点。

2. unmarshal errors YAML 语法解析失败 ​

  • 故障现象:日志提示 yaml: unmarshal errors ... cannot unmarshal !!str into []string。
  • 排查原因:上游规则文件是纯纯文本(一行一个域名),但配置中未声明 format: text;或者上游文件其实是 JSON,导致 YAML 解析器中断。
  • 修复措施:检查上游文件的真实返回内容,若是纯行文本,明确声明 format: text。

六、常见问题解答 (FAQ) ​

Q1: 一个 rule-provider 可以同时被多个规则或多个策略组引用吗? ​

A: 完全可以。例如你可以在规则中写:

yaml
rules:
  - RULE-SET,ai-rules,🤖 人工智能

内核只会在内存中保留一份规则集的 Trie 树结构,极其节省内存。

Q2: 自动更新设置了 interval: 86400,更新时我的网络会卡顿吗? ​

A: 绝对不会。现代 Clash 及 Mihomo 内核在刷新 Rule Provider 时采用双缓冲原子替换机制(Atomic Swap):新规则会在独立的后台 Goroutine 中完成下载、反序列化和构建树结构;只有当所有校验通过后,才会用微秒级的内存指针切换完成热更新,连接完全零抖动。

Q3: 规则集里的条目数量越多越好吗? ​

A: 绝非如此!市面上部分聚合了 30 万+ 条目的超大臃肿规则集,充斥着十年前早已死掉的域名前缀,不仅占用几百兆内存,还会大幅增加首包比对损耗。推荐使用 2,000 ~ 15,000 条精炼规则集的权威库,配合 GEOIP,CN,DIRECT,no-resolve 兜底,即可实现 99.9% 以上的精准命中。


七、延伸阅读与相关资源 ​