規則的執行順序:命中即停止
Clash 的 rules 是一份從上到下順序執行的列表,每一條格式大致為 類型,匹配內容,策略。使用者端拿到一個網路請求後,從第一條規則開始逐條比對,一旦命中就立即套用對應策略,不再繼續往下匹配。這一點是理解規則檔案最關鍵的前提,很多「規則明明寫對了卻不生效」的問題都是因為忽略了這一點。
舉個例子,假設規則檔案裡有這四條:
- DOMAIN-SUFFIX,example.com,DIRECT
- DOMAIN-SUFFIX,google.com,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY
一個存取 www.google.com 的請求會先檢查第一條——不匹配 example.com,跳過;檢查第二條——匹配 google.com 的子網域,命中,直接套用 PROXY 策略並停止,後面的 GEOIP 和 MATCH 規則根本不會被執行到。
常用規則類型完整清單
除了教程頁快速查詢表裡最常用的六種,Clash 實際支援的規則類型更豐富,按用途整理如下:
- DOMAIN:精確匹配單個完整網域,不含子網域。
- DOMAIN-SUFFIX:匹配網域及其所有子網域,最常用的寫法。
- DOMAIN-KEYWORD:網域中包含指定關鍵字即匹配,一次涵蓋多個變體網域。
- DOMAIN-REGEX:用正規表示式匹配網域,適合處理規律性強但難以逐個列舉的網域。
- IP-CIDR / IP-CIDR6:按 IPv4 / IPv6 位址段匹配,常用於內網直連。
- GEOIP:按請求目標 IP 所屬的國家 / 地區分流,例如
GEOIP,CN,DIRECT。 - SRC-IP-CIDR:按發起請求的本機來源 IP 匹配,適合多網卡或區域網路多裝置場景下按來源分流。
- PROCESS-NAME:按發起請求的處理程序名稱匹配,可以給某個具體應用單獨指定策略(桌面端支援較好)。
- MATCH:兜底規則,匹配所有未命中前面規則的流量,必須放在列表最後一行。
Rule Provider:不用手寫、跟著遠端來源自動更新
逐條手寫規則顯然不現實——中國大陸網站幾千個網域不可能一條條列。rule-providers 的作用就是引用一份由社群或服務商維護、遠端託管的規則集合,規則內容會跟著遠端來源自動更新,你只需要在規則列表裡用一行引用它:
rule-providers:
reject:
type: http
behavior: domain
url: "https://example.com/rules/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
rules:
- RULE-SET,reject,REJECT
- GEOIP,CN,DIRECT
- MATCH,PROXY
大多數訂閱服務商已經把這一層配置好了,一般使用者開箱即用;只有當預設規則集無法滿足你的需求(比如想額外攔截某個新出現的廣告網域)時,才需要在它的前面插入自己的規則——因為順序在前的規則優先命中。
新手最容易犯的三個規則錯誤
1. 把 MATCH 寫在中間而不是最後
MATCH 是兜底規則,一旦寫在列表中間,它後面的所有規則都不會再被執行到,因為 MATCH 本身匹配一切流量。永遠把它放在整個 rules 列表的最後一行。
2. 自訂規則寫在了 Rule Provider 引用的後面
如果你想讓自己寫的規則優先於訂閱自帶的規則集生效,必須把它放在 RULE-SET 引用行的前面,否則訂閱規則集會先命中,你的自訂規則永遠排不上號。
3. 忘記給 IP-CIDR 加 no-resolve
匹配內網 IP 段時,建議加上 no-resolve 參數(如 IP-CIDR,192.168.0.0/16,DIRECT,no-resolve),表示不對網域做提前解析,避免因為解析行為觸發不必要的 DNS 查詢。
實戰範例:給某個網域單獨指定策略
假設你想讓某個特定網站始終走代理,而不受訂閱規則集判斷影響,只需要在規則列表最前面加一行:
rules:
- DOMAIN-SUFFIX,example.com,PROXY # 自訂規則放最前面
- RULE-SET,reject,REJECT
- RULE-SET,direct,DIRECT
- RULE-SET,proxy,PROXY
- MATCH,PROXY
因為它排在所有 RULE-SET 引用之前,會最先被匹配到,不會被訂閱規則集「搶先」判定為直連或其他策略。
寫在最後
理解「順序匹配、命中即停」這一條核心邏輯,剩下的規則類型只是詞彙量的積累。不確定某個詞是什麼意思,可以隨時去術語表查一下;如果只是想知道某個網站為什麼打不開,使用教程的排查方法可能比手寫規則更快解決問題。