想擋廣告,就得在 rules 裡手寫幾百條廣告網域嗎?大可不必。規則集(rule-providers)讓你像訂閱節點一樣訂閱規則:社群維護、定時更新,你的設定檔只需要一行引用。

規則集是什麼

一般規則直接寫在 rules 裡,一條管一個比對;規則集則是把成百上千條同類規則打包成一個外部檔案,我定時去抓取更新。兩者搭配使用:

  • rule-providers 區塊:宣告「有哪些規則包、從哪裡下載、多久更新」。
  • rules 區塊:用 RULE-SET,包名,出口 一行引用整個包。

宣告一個規則集

rule-providers 範例
rule-providers:
  reject-ads:
    type: http
    behavior: domain
    url: "https://example.com/ruleset/reject.yaml"
    path: ./ruleset/reject.yaml
    interval: 86400       # refresh once a day

  local-direct:
    type: http
    behavior: domain
    url: "https://example.com/ruleset/direct-local.yaml"
    path: ./ruleset/direct-local.yaml
    interval: 86400

  telegram-cidr:
    type: http
    behavior: ipcidr
    url: "https://example.com/ruleset/telegram.yaml"
    path: ./ruleset/telegram.yaml
    interval: 86400

欄位逐一解釋:

欄位說明
typehttp 遠端訂閱(建議)或 file 本地檔案
behavior規則格式:domain(純網域)/ ipcidr(純 IP 段)/ classical(混合完整規則)
url規則檔案的下載位址
path本地快取路徑,斷網時用快取當備援
interval自動更新間隔(秒),86400 = 24 小時

在 rules 裡引用

RULE-SET 引用
rules:
  - RULE-SET,reject-ads,REJECT       # thousands of ad domains, one line
  - RULE-SET,local-direct,DIRECT
  - RULE-SET,telegram-cidr,節點選擇
  - MATCH,節點選擇

順序依然重要:攔截類規則集放最前面,直連類其次,最後防線 MATCH 永遠排在最後。

behavior 怎麼選

三種格式對應不同的比對效能,選對了能讓比對更快:

  • domain:內容全是網域時用它,我會建構前綴樹,幾萬條規則命中耗時也在微秒級。
  • ipcidr:內容全是 IP 段時用它,底層是高效率的 trie 結構。
  • classical:混合了 DOMAIN、IP-CIDR、PROCESS-NAME 等多種類型時才用,靈活但比對開銷最大。
實用建議 社群維護的常見規則集組合是:廣告攔截 + 本地直連 + 串流媒體分組 + Telegram IP 段。第一次設定直接抄一份成熟的範本改改就好,不必從零開始。

規則集更新失敗怎麼辦

規則集畢竟依賴外部下載,偶爾會遇到更新失敗的情況。排查思路按順序來:

  • 先看本地快取path 指向的檔案如果存在,我會先用舊版本當備援,不會因為一次更新失敗就讓整個規則集失效,所以你可能完全沒感覺到問題——這也是為什麼建議隔一段時間主動檢查一下更新時間。
  • 檢查下載位址是否還有效:社群維護的規則集偶爾會搬移倉庫或改路徑,在瀏覽器裡直接打開 url 看能不能存取,存取不了就去規則集的專案首頁找最新位址替換。
  • 確認 interval 沒設得太離譜:見過有人把 interval 設成幾十秒,觸發了來源站的限流反而經常失敗,日常情境 43200~86400 秒(12~24 小時)就足夠。

常見的規則集去哪裡找

不需要自己從零攢規則,GitHub 上有幾個長期維護、星數很高的規則集倉庫,涵蓋廣告攔截、本地直連、串流媒體解鎖、常見 App 分流等情境,搜尋「clash rule providers」或「ruleset」基本都能找到。挑選時留意兩點:最近是否還在更新behavior 類型是否和你的引用方式相符。規則集和我這個客戶端本身是兩回事——規則集決定「怎麼分流」,我負責「怎麼連線、怎麼排程」,兩者搭配才能既乾淨又好用。

把廣告攔截規則集接進來之後,很多網頁上討厭的橫幅廣告會直接從源頭消失,比裝瀏覽器擴充功能還省心——畢竟這是在網路層攔截,所有裝置、所有 App 都能一起生效。

手寫規則和規則集要怎麼搭配,而不是二選一

很多人一上手規則集就把所有手寫規則全刪了,其實不必這麼徹底。兩者的定位不同:規則集適合處理「數量龐大、更新頻繁、自己維護不現實」的情境,比如成千上萬條廣告網域或是隨時可能變化的串流媒體 IP 段;手寫規則則更適合「數量很少但你非常在意優先權、需要精確控制」的情境,比如公司內網網域、自己常用的幾個特殊網站。

建議的寫法是:把個人化的手寫規則放在最前面,確保它們優先命中;規則集緊接著處理大批量的通用分類;最後用 MATCH 當最後防線。這樣既保留了靈活性,又不用為了幾百條廣告網域把設定檔撐到幾千行,維護成本大幅下降。

一個新手最容易忽略的細節:規則順序真的會影響結果

規則是從上到下逐條比對的,第一條命中就立即生效,後面的規則即使寫得再對也不會被執行到。所以如果你發現某個網站「明明配了規則卻沒生效」,八成不是規則寫錯了,而是前面某一條更寬泛的規則(比如某個規則集裡的通用條目)提前把它擋住了。排查這類問題最快的辦法是打開控制面板的連線頁,直接看這條連線實際命中的是哪一條規則,而不是對著設定檔乾猜——這一點在講控制面板的那篇文章裡也提到過,兩者結合起來用效率會高很多。

小結

規則集把「人工維護規則」這件苦差事交給了社群和自動更新,你要做的只是宣告來源、選對 behavior、按正確順序引用。記住三個關鍵點:攔截類放最前面,直連類緊接其後,MATCH 永遠當最後防線;behavior 要和規則集本身的內容格式對應,選錯會導致比對變慢甚至出錯;更新失敗時先看本地快取是否還在生效,再排查下載位址和更新間隔。設定一旦搭好,後續幾乎不用再手動維護,規則集自己就會隨著社群更新保持新鮮。

如果你目前設定檔裡還堆著幾百條手寫的網域規則,不妨挑個週末抽半小時,把能替換成規則集的部分都換掉——設定檔會立刻清爽很多,日後維護也不再是負擔。