Clash 分流規則實戰:從零寫一份好用的 rules 設定
訂閱自帶的規則要麼太粗、要麼根本沒涵蓋你在意的 App。這篇文章從匹配順序講起,教你寫常用規則類型,再用規則集合把維護量降到最低。
為什麼訂閱自帶的規則不夠用
大部分訂閱都會自帶一份分流規則,涵蓋常見的國內直連、境外代理、廣告攔截情境,日常使用基本上就夠用了。但只要你的需求稍微特殊一點——比如某個國內 App 卻要走代理、某個遊戲用戶端必須直連、想自己加一條廣告網域——訂閱自帶的規則往往改不了(訂閱更新時會被覆蓋),這時候就需要自己在設定裡補一段 rules。
大多數用戶端支援把訂閱規則和自訂規則分開管理(比如 Clash Verge 的「覆寫」/「合併」功能),自訂規則寫在覆寫檔案裡,訂閱更新也不會把你的規則沖掉。具體操作請看用戶端文件,本文只講規則本身怎麼寫。
先搞懂匹配順序,再動手寫規則
rules 是一個陣列,Clash 按從上到下的順序逐條比對,命中第一條規則就立刻使用它指定的出站,後面的規則不會再看。這意味著規則的順序比內容本身更容易出錯——把寬泛規則寫在前面,後面再精確的規則也永遠輪不到。
rules: # 從上到下匹配,命中一條就停止 - DOMAIN-SUFFIX,ad.com,REJECT - DOMAIN-SUFFIX,google.com,節點選擇 - GEOIP,CN,DIRECT - MATCH,節點選擇 # 兜底,必須放最後一條
常見踩坑:把 GEOIP,CN,DIRECT(國內直連)寫在廣告攔截規則前面。如果廣告網域解析出的 IP 恰好在國內,就會先命中「國內直連」而不是「攔截」,廣告規則形同虛設。寫規則時始終記住:越具體、越想優先生效的規則,越要往前放。
常用規則類型實戰
規則類型有幾十種,但日常夠用的其實就下面這幾類,按使用頻率排序:
-
網域類:DOMAIN-SUFFIX / DOMAIN-KEYWORD / DOMAIN
DOMAIN-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 解析,加快匹配速度。
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 引用它。
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 代理」設定
把前面講的幾種規則類型組合起來,就能搭出一份滿足大多數人日常需求的設定骨架:
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 裝上試試
全平台安裝包一站取得,跟著推薦標籤選就不會錯,幾分鐘就能用上。