Clash 自訂規則語法與比對優先順序全解析
逐條拆解 DOMAIN、DOMAIN-SUFFIX、IP-CIDR、GEOIP 等規則類型的語法與比對順序,說明規則自上而下命中即停的原則,並提供編寫自訂分流規則時避免互相覆蓋的排序建議。
規則(rules)是 Clash 設定裡決定「這個連線走哪個代理」的核心模組。很多人第一次自己改設定檔時,把規則隨手堆在一起,結果發現某條規則明明寫對了卻從來沒生效——原因幾乎總是比對順序出了問題。這篇筆記按規則類型逐條拆解語法,講清楚比對引擎從上到下命中即停的運作方式,並提供一套實用的排序思路,協助在自訂分流規則時避免規則互相覆蓋。
規則的基本結構與執行方式
Clash 設定檔裡的 rules 是一個清單,每一行對應一條規則,格式統一為三段式:
RULE-TYPE,VALUE,PROXY
第一段是規則類型,第二段是比對值(部分規則類型沒有這一段,例如 MATCH),第三段是命中後使用的代理或代理群組名稱。理解這套系統最關鍵的一點是:Clash 在處理每一個新連線時,會按照規則清單從上到下逐條檢測,一旦某條規則命中,就立即採用對應的代理並停止繼續往下比對。後面即便還有能比對上的規則,也不會再被檢查。
這個「命中即停」原則決定了規則的排列順序本身就是邏輯的一部分,而不只是排版好看。寫規則時要始終記住:越靠前的規則優先順序越高,越具體、越例外的判斷應該放在越靠前的位置,籠統的、兜底性質的規則應該放在最後。
規則清單末尾通常都會有一條 MATCH,PROXY 作為兜底規則,用於處理前面所有規則都沒能命中的連線。這條規則理論上必須放在整個清單的最後一行,否則它後面的規則永遠不會被執行到。
常見規則類型逐條拆解
下面按使用頻率從高到低,說明幾種最常用的規則類型的語法與比對邏輯。
DOMAIN:精確網域比對
DOMAIN 只比對完全一致的網域,不做任何模糊或子網域擴展。
DOMAIN,ads.example.com,REJECT
DOMAIN,api.example.com,Proxy
上面第一條規則只會攔截 ads.example.com 這一個確切位址,像 cdn.ads.example.com 或 example.com 都不會被這條規則命中。適合用於精確封鎖或精確放行某個具體介面位址。
DOMAIN-SUFFIX:網域後綴比對
DOMAIN-SUFFIX 比對指定後綴及其所有子網域,是日常寫分流規則時用得最多的類型。
DOMAIN-SUFFIX,youtube.com,Proxy
DOMAIN-SUFFIX,cn,DIRECT
第一條規則會同時命中 youtube.com、www.youtube.com、music.youtube.com 等所有以該後綴結尾的網域。第二條則會把所有以 .cn 結尾的網域直接連線,不走任何代理。這個類型覆蓋範圍廣,寫自訂規則時最先想到的通常就是它。
DOMAIN-KEYWORD:網域關鍵字比對
DOMAIN-KEYWORD 只要網域字串裡包含指定關鍵字就會命中,不區分關鍵字出現的位置。
DOMAIN-KEYWORD,google,Proxy
這條規則會命中 www.google.com,也會命中 googleapis.com、googlevideo.com 等任何包含 google 字串的網域。這個類型比對範圍最寬,寫的時候要注意誤傷——例如關鍵字 ad 就可能連帶命中大量與廣告無關但網域裡恰好帶 ad 字母組合的正常網站,建議盡量用更完整的關鍵字或改用 DOMAIN-SUFFIX。
IP-CIDR 與 IP-CIDR6:按 IP 段比對
IP-CIDR 使用 CIDR 表示法比對一段 IPv4 位址,IP-CIDR6 對應 IPv6。
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
這兩條常見於放行區域網路內部網段,讓存取路由器、NAS、區域網路裝置等流量不經過代理。末尾的 no-resolve 參數很關鍵:它告訴 Clash 不要對這條規則嘗試反向 DNS 解析,直接按目標 IP 判斷,這樣可以避免對網域類規則做多餘的解析開銷,也能防止一些邊緣情況下的誤判。
需要注意的是,IP 類規則預設只對連線的目標位址是 IP 的情況生效;如果連線是透過網域發起、Clash 還沒有解析出目標 IP,這類規則通常不會在網域階段命中,而是要等 DNS 解析完成後才能參與比對,這也是為什麼很多人建議把網域類規則盡量寫在前面處理。
GEOIP:按國家/地區 IP 資料庫比對
GEOIP 依據內建或外部載入的 IP 地理位置資料庫,判斷目標 IP 所屬的國家或地區。
GEOIP,CN,DIRECT
GEOIP,JP,Proxy
第一條規則會讓所有解析歸屬為中國大陸的 IP 直連,第二條讓歸屬日本的 IP 走名為 Proxy 的代理群組。GEOIP 規則依賴的地理資料庫有更新週期,極少數邊緣 IP 段可能出現歸屬判斷滯後的情況,遇到明顯誤判時可以搭配具體的 IP-CIDR 規則單獨修正。
GEOSITE:按網域分類集合比對
GEOSITE(在部分核心如 mihomo 中支援)使用預先分類好的網域規則集,一條規則就能覆蓋某一類服務下的大量網域,例如串流媒體、社群平台等,避免手寫成百上千條 DOMAIN-SUFFIX。
GEOSITE,netflix,Proxy
GEOSITE,cn,DIRECT
使用這類規則前需要確認用戶端已經下載並載入了對應的規則集檔案,否則規則會因為找不到分類資料而無法生效。
PROCESS-NAME 與 MATCH
PROCESS-NAME 按發起連線的處理程序名稱做比對,適合給某個具體應用單獨指定代理策略,常見於桌面端場景。MATCH 則不帶比對值,代表「以上都不滿足時統一如何處理」,永遠作為規則清單的最後一行使用。
PROCESS-NAME,Steam.exe,Proxy
MATCH,DIRECT
比對優先順序與命中即停原則
把前面各類規則放進同一份設定後,真正決定行為的是它們的排列順序,而不是類型本身的「權重」。Clash 並不會因為一條規則是 DOMAIN 就自動優先於排在它前面的 DOMAIN-KEYWORD——順序完全由清單中的實際位置決定。
來看一個容易踩坑的例子:
DOMAIN-KEYWORD,youtube,Proxy
DOMAIN-SUFFIX,youtube.com,DIRECT
本意可能是想讓 YouTube 走代理,但特定的子網域(例如某個直連可用的靜態資源網域)直接連線。可是因為 DOMAIN-KEYWORD 那條規則排在前面,只要網域裡帶 youtube 字串就會先被它命中並走代理,後面那條更精確的 DOMAIN-SUFFIX 規則永遠沒有機會被執行到。要讓例外規則生效,必須把它調整到更寬泛的規則之前:
DOMAIN-SUFFIX,youtube.com,DIRECT
DOMAIN-KEYWORD,youtube,Proxy
調整後,精確的網域後綴規則先被檢測,命中就直連並停止比對;只有不滿足這條精確規則的其餘含 youtube 關鍵字的網域,才會繼續往下走到關鍵字規則並使用代理。
寫規則時如果發現某條明明格式沒錯卻「從不生效」,第一時間要檢查的不是語法本身,而是它前面有沒有一條更寬泛的規則已經把同樣的流量攔截並命中了。
編寫自訂規則的排序建議
結合上面的原則,整理一套實用的排序思路,可以顯著減少規則互相覆蓋導致的除錯成本。
- 區域網路與內部網段位址放最前:用
IP-CIDR搭配no-resolve放行私有網段,避免任何後續規則誤把內部網路流量送進代理。 - 精確例外規則緊隨其後:凡是需要「大類走代理、個別子項直連」或反過來的場景,把針對具體網域的
DOMAIN、DOMAIN-SUFFIX例外規則排在對應大類規則之前。 - 分類規則集居中:
GEOSITE、常見的廣告或隱私攔截規則集放在例外規則之後、寬泛關鍵字規則之前,讓分類庫先處理好大部分常規網域。 - 寬泛的關鍵字比對靠後:
DOMAIN-KEYWORD命中範圍最廣,容易造成誤判,應該放在所有更精確規則都判斷過一遍之後才輪到它。 - 地區與 IP 歸屬規則次之:
GEOIP一般用來處理網域規則沒能覆蓋、且已經解析出具體 IP 的連線,通常排在網域類規則之後。 - MATCH 兜底規則放最後一行:所有未被前面規則命中的連線,最終交給這一條統一處理,通常指向預設代理群組或者直連,視網路策略而定。
按這個順序整理後的一份簡化範例:
IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
DOMAIN-SUFFIX,cn-cdn.example.com,DIRECT
GEOSITE,cn,DIRECT
GEOSITE,geolocation-!cn,Proxy
DOMAIN-KEYWORD,ads,REJECT
GEOIP,CN,DIRECT
MATCH,Proxy
這份範例的邏輯讀下來是連貫的:先處理內部網路,再處理明確要直連的特定 CDN 網域,接著讓分類規則集分別處理中國大陸和境外站點的大多數網域,再用關鍵字規則擋掉零散的廣告網域,GEOIP 兜住前面網域規則沒處理到但已經能判斷歸屬的 IP,最後 MATCH 收尾,把剩下所有連線送去代理群組。
常見錯誤與排查思路
整理幾個實際除錯規則時最常遇到的情況,便於快速定位問題。
- 規則永遠不生效:優先檢查它前面是否存在範圍更寬的規則已經先命中;可以暫時把這條規則挪到清單最上面測試,確認語法本身沒問題後再考慮排序調整。
- MATCH 後面還有規則:這些規則永遠不會被執行,需要把它們移到
MATCH之前。 - IP 類規則對網域連線不生效:檢查用戶端的 DNS 與解析模式設定,確認連線在比對階段已經取得目標 IP,必要時改用對應的網域類規則代替。
- 關鍵字規則誤傷過多網域:把關鍵字換成更完整的字串,或改用
DOMAIN-SUFFIX限定具體後綴,減少無關命中。 - 規則集載入失敗導致分類規則整體不生效:確認對應的規則集檔案已經正確下載到本地並在設定裡正確引用路徑,網路問題或路徑寫錯都會導致這一整塊規則失效。
修改規則後,建議先在小範圍內測試單條新增或調整的規則,確認命中結果符合預期,再繼續疊加下一條,避免一次性改動過多導致排查困難。多數用戶端在儲存設定後會自動重新載入規則,如果沒有觀察到預期效果,也可以嘗試手動觸發一次設定重新載入來排除快取問題。
把頻繁變動的自訂例外規則集中放在檔案靠前的位置維護,把穩定不變的分類規則集和兜底規則留在後面,日後調整時只需要關注開頭一小段,能大幅降低維護成本。