規則設定

Clash 分流規則實戰:從零寫一份好用的 rules 設定

訂閱自帶的規則要麼太粗、要麼根本沒涵蓋你在意的 App。這篇文章從匹配順序講起,教你寫常用規則類型,再用規則集合把維護量降到最低。

為什麼訂閱自帶的規則不夠用

大部分訂閱都會自帶一份分流規則,涵蓋常見的國內直連、境外代理、廣告攔截情境,日常使用基本上就夠用了。但只要你的需求稍微特殊一點——比如某個國內 App 卻要走代理、某個遊戲用戶端必須直連、想自己加一條廣告網域——訂閱自帶的規則往往改不了(訂閱更新時會被覆蓋),這時候就需要自己在設定裡補一段 rules

大多數用戶端支援把訂閱規則和自訂規則分開管理(比如 Clash Verge 的「覆寫」/「合併」功能),自訂規則寫在覆寫檔案裡,訂閱更新也不會把你的規則沖掉。具體操作請看用戶端文件,本文只講規則本身怎麼寫。

先搞懂匹配順序,再動手寫規則

rules 是一個陣列,Clash 按從上到下的順序逐條比對,命中第一條規則就立刻使用它指定的出站,後面的規則不會再看。這意味著規則的順序比內容本身更容易出錯——把寬泛規則寫在前面,後面再精確的規則也永遠輪不到。

config.yaml YAML
rules:
  # 從上到下匹配,命中一條就停止
  - DOMAIN-SUFFIX,ad.com,REJECT
  - DOMAIN-SUFFIX,google.com,節點選擇
  - GEOIP,CN,DIRECT
  - MATCH,節點選擇          # 兜底,必須放最後一條

常見踩坑:把 GEOIP,CN,DIRECT(國內直連)寫在廣告攔截規則前面。如果廣告網域解析出的 IP 恰好在國內,就會先命中「國內直連」而不是「攔截」,廣告規則形同虛設。寫規則時始終記住:越具體、越想優先生效的規則,越要往前放

常用規則類型實戰

規則類型有幾十種,但日常夠用的其實就下面這幾類,按使用頻率排序:

  • 網域類:DOMAIN-SUFFIX / DOMAIN-KEYWORD / DOMAINDOMAIN-SUFFIX,google.com 匹配 google.com 及其所有子網域,是最常用的寫法;DOMAIN-KEYWORD 匹配網域裡包含某個關鍵字,適合「只要沾到這個詞就攔截/代理」的情境,但要小心誤傷;DOMAIN 只匹配完全一致的網域,最精確也最少用。
  • GEOSITE:按網域分類打包GEOSITE,youtube,節點選擇 直接命中 YouTube 相關的整批網域,不用自己一條條寫。規則集合社群已經整理好了幾乎所有主流網站/App 的網域分類,比手寫 DOMAIN-SUFFIX 省事得多。
  • GEOIP:按 IP 所屬國家/地區GEOIP,CN,DIRECT 是幾乎所有設定檔的標配兜底規則之一——凡是解析出國內 IP 的請求,直接走直連,不佔用代理流量。
  • IP-CIDR:按 IP 段精確匹配適合內網位址段(如 192.168.0.0/16)、CDN 固定 IP 段等情境,配合 no-resolve 參數可以跳過一次不必要的 DNS 解析,加快匹配速度。
範例片段 YAML
rules:
  # 內網位址直連,no-resolve 跳過 DNS 解析
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  # 按網域分類整批命中
  - GEOSITE,category-ads-all,REJECT
  - GEOSITE,netflix,節點選擇
  # 兜底:國內 IP 直連,其餘走代理
  - GEOIP,CN,DIRECT
  - MATCH,節點選擇

規則太多、太長?用 RULE-SET 引入規則集合

如果要攔截的廣告網域有幾百條,直接寫進 rules 陣列會讓設定檔變得極其臃腫,而且沒法重複使用。這時應該用 rule-providers(規則集合),把一大批規則放到單獨的檔案/訂閱連結裡,設定裡只需要一條 RULE-SET 引用它。

config.yaml YAML
rule-providers:
  reject:
    type: http
    behavior: domain
    url: "https://example.com/reject-list.txt"
    path: ./rule_providers/reject.yaml
    interval: 86400

rules:
  - RULE-SET,reject,REJECT
  - GEOIP,CN,DIRECT
  - MATCH,節點選擇
  • behavior 決定規則集合檔案的內容格式:domain(網域列表)、ipcidr(IP 段列表)、classical(完整規則,支援幾乎所有類型),三者寫法互不相同。
  • interval 讓規則集合像訂閱一樣定期自動更新,廣告網域庫更新了也不用手動改設定。
  • 社群維護的常見規則集合(比如廣告攔截清單、常見串流媒體網域清單)基本都能直接拿來用,不需要自己從零整理。

規則集合內容本身的詳細格式(三種 behavior 分別怎麼寫),可以看文件區的《規則集合內容》,這裡就不重複展開了。

實戰:搭一份「廣告攔截 + 國內直連 + 特定 App 代理」設定

把前面講的幾種規則類型組合起來,就能搭出一份滿足大多數人日常需求的設定骨架:

config.yaml YAML
rules:
  # 1. 區域網路 / 內網位址,直連,跳過解析
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve

  # 2. 廣告攔截,規則集合,優先權最高
  - RULE-SET,reject,REJECT

  # 3. 特定 App/網站,指定必須走代理(寫在國內規則之前!)
  - PROCESS-NAME,SomeApp.exe,節點選擇
  - GEOSITE,netflix,節點選擇
  - GEOSITE,youtube,節點選擇

  # 4. 國內網域/IP,直連
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT

  # 5. 兜底:剩下的都走代理
  - MATCH,節點選擇

第 3 步(指定 App/網站走代理)必須放在第 4 步(國內直連)前面。如果順序反了,只要這些網域解析出的 IP 落在國內網段,就會被第 4 步的 GEOIP,CN,DIRECT 提前攔下,代理規則永遠輪不到。

常見問題

改完規則要重啟用戶端嗎?

大多數用戶端支援熱重新載入設定(一般叫「重新載入設定」或「Reload」),儲存後點一下即可生效,不需要重啟整個用戶端。如果改動沒生效,檢查一下是不是改錯了檔案(訂閱規則和覆寫規則是分開的)。

規則很多的時候,會不會拖慢代理速度?

規則匹配本身是純記憶體操作,幾百條規則的匹配耗時通常在微秒級,感知不到延遲。真正影響體驗的是 DNS 解析和節點本身的網路品質,不是規則數量。

為什麼我加的 IP-CIDR 規則沒生效?

最常見的原因是順序問題——前面有一條更寬泛的規則(比如 MATCH 或範圍更大的 GEOIP)已經先命中了。用控制面板的「規則」頁搜尋對應的 IP/網域,看它實際命中了哪一條,通常一眼就能定位問題。

延伸閱讀

學完了?把 Clash 裝上試試

全平台安裝包一站取得,跟著推薦標籤選就不會錯,幾分鐘就能用上。

前往下載頁
#規則設定 #RULE-SET #分流實戰
返回部落格列表
下載 Clash 用戶端全平台安裝包,即刻開始