手寫 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