Clash 自訂規則怎麼寫:DOMAIN、IP-CIDR 語法與比對優先順序詳解

完整梳理 Clash 規則的常見類型與寫法,說明規則自上而下逐條比對的優先順序機制、GEOIP 與 MATCH 兜底規則的擺放要點,並提供可直接套用的排序建議。

一、規則條目的基本結構

Clash 的分流能力建立在一條條規則之上,設定檔中 rules: 欄位下的每一行都是一條獨立規則。規則的通用格式是三段式,以英文逗號分隔:

TYPE,ARGUMENT,POLICY

TYPE 表示比對依據的類型,例如網域、IP 位址段或程序名稱;ARGUMENT 是具體的比對值;POLICY 是命中後要套用的策略,可以是某個節點名稱、某個策略群組名稱,也可以是內建的 DIRECT(直連)或 REJECT(拒絕)。部分規則類型還支援第四段選填參數,最常見的是 no-resolve,用於告知核心在比對 IP 類規則時不要先進行 DNS 解析,避免不必要的查詢延遲或隱私外洩。一條完整的規則範例如下:

DOMAIN-SUFFIX,example.com,Proxy
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve

理解這套三段式(加選填第四段)結構,是看懂後面所有規則類型的前提。

二、常見規則類型逐一拆解

Clash 核心(包含 Clash Meta / mihomo 分支)支援的規則類型不少,但日常設定中高頻出現的其實集中在以下幾類,依比對對象可分成網域類、IP 類、地理位置類與程序/連接埠類四組。

1. 網域類規則

2. IP 與網段類規則

IP 類規則通常會搭配 no-resolve 參數使用,尤其是直連規則,因為直連流量本身不需要額外的解析開銷。

3. 地理位置類規則

4. 程序與連接埠類規則

5. 規則集與兜底規則

注意

DOMAIN-KEYWORDDOMAIN-REGEX 比對範圍較廣,若排序靠前,容易在關鍵字重疊時搶先命中不該命中的流量,建議將它們放在精確類規則之後再考慮。

三、比對優先順序:自上而下,一擊即中

理解 Clash 規則最關鍵的一點是:規則比對嚴格依照 rules: 清單中從上到下的順序逐條判斷,一旦某條規則命中,立即依該規則的策略處理,後面的規則不再繼續檢查。這意味著規則的先後位置本身就是一種優先順序設定,與規則類型本身並沒有天生的高低之分——寫在前面的類型,不管是 DOMAIN 還是 GEOIP,只要先被檢查到並命中,就會先生效。

舉一個容易踩雷的例子:

GEOIP,CN,DIRECT
DOMAIN-SUFFIX,example.com,Proxy

如果 example.com 所在伺服器的 IP 恰好被地理資料庫識別為中國大陸 IP,上面這份設定會在第一條 GEOIP 規則處就把流量導向直連,第二條針對該網域的代理規則永遠不會被執行到。想讓某個特定網域始終走代理,就必須把這條網域規則放在 GEOIP 之前:

DOMAIN-SUFFIX,example.com,Proxy
GEOIP,CN,DIRECT

這個順序問題在規則條目較多的設定中非常常見,排查「某個網站明明設了代理卻沒走代理」的問題時,第一件事就該去檢查有沒有更靠前的寬泛規則把它攔截了。

四、GEOIP 與 MATCH 的擺放要點

GEOIP 規則與 MATCH 兜底規則的擺放位置,是整份規則清單裡最值得單獨強調的兩處。

GEOIP 應該放在細分規則之後

GEOIP 判斷的是目標 IP 所屬的國家或地區,涵蓋範圍很大,一條 GEOIP,CN,DIRECT 可能會涵蓋成千上萬個具體網域。如果放在規則清單靠前的位置,很容易把本該走代理的特定服務也一併直連掉。穩妥的做法是先把需要精確控制的網域、應用程式、連接埠規則寫在前面,再把 GEOIP 類規則放在這些細分規則之後、兜底規則之前,讓它負責「大多數未特別標註的本地流量直連」這個角色。

MATCH 必須放在整份清單的最後一行

MATCH 是兜底規則,顧名思義要接住所有前面規則都沒處理到的流量。它不需要參數,格式固定為 MATCH,POLICY,常見寫法是 MATCH,ProxyMATCH,DIRECT,取決於站台的分流策略偏好。這條規則若不放在最後,會導致它前面本該由具體規則處理的流量提前被兜底策略接管,後面寫的所有細分規則形同虛設。可以理解為:MATCH 一旦出現,它之後的規則永遠不會被執行到,所以它只能、也必須是最後一條。

核對方法

寫完一份規則清單後,建議自上而下讀一遍,確認沒有一條「範圍更廣的規則」排在「範圍更窄但需要特別處理的規則」前面,再確認 MATCH 獨占最後一行。

五、可直接套用的排序建議

結合上面的機制,一份結構清晰的規則清單通常遵循「先精確、後寬泛,最後兜底」的排列思路,大致分五層:

  1. 區域網路與私有位址直連:如 IP-CIDR,192.168.0.0/16,DIRECT,no-resolve,避免內網流量繞道走代理。
  2. 特殊應用程式與連接埠的定向規則:如需要單獨控制的 PROCESS-NAMEDST-PORT 規則。
  3. 需要重點關注的網域規則:常用服務的 DOMAIN-SUFFIXDOMAIN 規則,明確指向代理或直連。
  4. 規則集與地理位置規則:RULE-SET 引用的大批量規則,以及 GEOIP 兜底本地流量。
  5. 最終兜底:一行 MATCH,決定所有未命中流量的預設去向。

一份精簡範例大致如下:

IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
PROCESS-NAME,com.example.updater,DIRECT
DOMAIN-SUFFIX,example.com,Proxy
DOMAIN-KEYWORD,ads,REJECT
RULE-SET,proxy-list,Proxy
GEOIP,CN,DIRECT
MATCH,Proxy

需要說明的是,規則集(RULE-SET)本身也是依其內部條目順序參與整體比對的,將它插入清單中的位置同樣遵循「前面已有更精確規則攔截,後面才輪到它」的原則。若同時引用多個規則集,也建議把範圍更窄、更需要優先生效的規則集放在範圍更廣的規則集前面。

六、常見排序失誤自查

實際使用中,規則不生效的原因絕大多數不是語法寫錯,而是順序問題。整理幾個最容易出現的情況:

排查這類問題時,與其反覆檢查單條規則的語法是否正確,更有效的方式是把整份 rules: 清單印出來,依順序在心裡模擬一遍比對過程,通常很快就能定位到是哪一條位置靠前的規則搶先命中了。

下載客戶端