· 規則進階 · 預計閱讀 12 分鐘
Clash 自訂規則設定教學:DOMAIN-SUFFIX、IP-CIDR 與 RULE-SET 的比對順序
整理常用規則類型的語法,說明規則由上而下比對、命中即停止的機制,以及自訂規則放在訂閱規則前後的差異。
規則比對順序:由上而下,命中即停止
替某個網站指定直連,連線卻仍走代理,常見原因不是選錯規則類型,而是前面的規則已先命中。Clash 的 rules 是有順序的清單。核心會從第一條開始檢查,遇到適用且符合的規則,就使用該規則指定的出口,不會繼續往下找「更精確」的規則。
這裡所說的核心,是實際處理連線並執行分流的程式。Clash Meta 後續以 mihomo 之名持續發展;用戶端則是管理訂閱、開關與連線記錄的介面。以下以 mihomo 常見的 YAML 設定為例。YAML 是以縮排表示階層的文字格式,請使用空格縮排,勿混用定位字元。
具體規則不會自動取得較高優先順序
rules:
- DOMAIN-SUFFIX,example.com,PROXY
- DOMAIN,docs.example.com,DIRECT
- MATCH,PROXY
造訪 docs.example.com 時,第一條後綴規則已符合,因此會使用 PROXY。第二條即使寫得更具體,也不會有執行機會。若要讓文件網站直連,請將第二條移到第一條之前。
本文中的 PROXY 是範例策略群組名稱,並非所有設定都內建的固定關鍵字。請替換成目前設定中實際存在的策略群組名稱,大小寫與空格也須一致。DIRECT 是內建直連策略,REJECT 是內建拒絕策略,可直接使用。
DOMAIN 與 DOMAIN-SUFFIX:網域精確比對與後綴比對
常見規則格式為「類型、比對內容、目標策略」,欄位之間以英文逗號分隔。網域規則只填主機名稱,不要加上 https://,也不要填路徑、查詢參數或結尾斜線。網址中的 /account 並非網域的一部分。
| 規則類型 | 範例 | 比對範圍 |
|---|---|---|
| DOMAIN | DOMAIN,docs.example.com,DIRECT | 只比對該主機名稱,不包含其子網域。 |
| DOMAIN-SUFFIX | DOMAIN-SUFFIX,example.com,PROXY | 比對 example.com 本身及其各層子網域。 |
| DOMAIN-KEYWORD | DOMAIN-KEYWORD,example,PROXY | 比對網域中含有 example 的連線,範圍比後綴規則更廣。 |
後綴規則依網域邊界比對
DOMAIN-SUFFIX,example.com,PROXY 可比對 example.com、api.example.com 和 a.b.example.com,但不會比對 notexample.com。不必寫成 *.example.com,也不要在比對內容前加點。
如果只想讓登入主機直連,建議使用 DOMAIN,login.example.com,DIRECT。若同一組織的所有子網域都需要使用相同出口,再使用 DOMAIN-SUFFIX。關鍵字規則適用於確實需要廣泛比對的情況,不宜用來取代所有網域後綴規則,否則可能連不相關的網站也一起分流。
IP-CIDR 與 no-resolve:依目標位址分流
IP-CIDR 用來比對 IPv4 目標位址範圍。CIDR 是「位址加上前綴長度」的表示法,例如 192.168.50.0/24 表示從 192.168.50.0 到 192.168.50.255 的位址範圍,並非只比對最後寫出的單一位址。單一 IPv4 位址可用 /32 表示。
rules:
- IP-CIDR,192.168.50.0/24,DIRECT,no-resolve
- IP-CIDR,10.20.30.40/32,DIRECT,no-resolve
- IP-CIDR6,fd00::/8,DIRECT,no-resolve
- MATCH,PROXY
上例中的 IP-CIDR6 用於 IPv6。這三個位址範圍僅示範寫法,請依實際區域網路範圍調整。尤其不要將過大的位址範圍直接加入直連清單,否則可能改變原本預期透過代理連線的流量。
no-resolve 不等於關閉 DNS
DNS 是將網域名稱解析為 IP 位址的過程。對於有網域名稱、但尚未取得目標 IP 的連線,IP 類規則可能會觸發解析,以判斷是否符合條件。在結尾加上 no-resolve,表示不要只為了檢查這條規則而主動解析網域;若連線本身已有可用的目標 IP,仍可進行比對。
因此,no-resolve 不會關閉整個用戶端的 DNS,也不會讓特定網域自動繞過代理。若要讓某個網站固定直連,通常應先設定網域規則;若要讓某段內網位址直連,再設定 IP 規則。網域取得方式、DNS 模式與嗅探設定都會影響核心實際掌握的資訊,排查時應查看連線詳細資料,而非只看瀏覽器網址列。
RULE-SET:引用規則集合,不會改變先後順序
RULE-SET 用來引用規則提供者(rule-provider)。提供者負責載入一組網域或位址;rules 中的引用則決定這些內容符合條件後要使用哪個策略。集合名稱、提供者類型與檔案內容必須彼此相符,不能只貼上一條引用,就期待集合自動出現。
本機網域集合範例
以下是供合併使用的設定片段,並非可獨立執行的完整訂閱。請先確認現有設定中已有名為 PROXY 的策略群組,再將提供者與規則合併至各自的頂層欄位。
rule-providers:
work-domains:
type: file
behavior: domain
format: yaml
path: ./rules/work-domains.yaml
rules:
- DOMAIN,login.example.com,DIRECT
- RULE-SET,work-domains,PROXY
- IP-CIDR,192.168.50.0/24,DIRECT,no-resolve
- MATCH,PROXY
接著在核心使用的工作目錄下建立 rules/work-domains.yaml。相對路徑是以用戶端實際使用的核心工作目錄為準,不一定是安裝目錄。檔案內容可如下:
payload:
- 'example.com'
- '+.example.org'
在這種網域集合中,example.com 代表該網域,+.example.org 代表 example.org 及其子網域。由於提供者的 behavior 是 domain,這裡應填網域比對內容,不應寫成 DOMAIN-SUFFIX,example.org,PROXY。
domain、ipcidr 與 classical 的差異
domain:集合內容採用網域比對語法,適合用於網域清單。ipcidr:集合內容為 IP 位址範圍,例如192.168.50.0/24。classical:集合內容採用規則類型與比對條件,例如DOMAIN-SUFFIX,example.org;出口仍由外層RULE-SET指定,不需在集合中的每條內容後再加上策略群組。
遠端提供者還需要設定 URL、更新間隔等資訊。使用訂閱附帶的遠端集合時,請先確認載入成功,再檢查命中順序。檔案下載失敗、內容格式不符、集合名稱拼錯,與規則被前面的項目搶先命中,是不同的問題。
自訂規則要放在訂閱規則前面還是後面?
訂閱更新通常會重新產生設定。直接編輯下載的 YAML,可能在下次更新時被覆寫。較穩妥的做法是使用用戶端提供的持續性覆寫或規則合併功能。覆寫是指在訂閱原始設定之外儲存自訂修改,啟用後再合併成核心設定。
不同用戶端的選單名稱、合併方向與指令碼介面各不相同。不要只因為「已新增」就認定規則已生效。重點是確認最終生效設定中的位置:是加在前面、加在末尾,還是整份取代。若需要了解介面基本操作,可先參閱使用手冊。
建議順序:例外規則在前、集合居中、兜底規則置末
rules:
# 自訂例外:優先處理
- DOMAIN,docs.example.com,DIRECT
- DOMAIN,blocked.example.net,REJECT
# 既有訂閱規則:以下僅示範其位置
- DOMAIN-SUFFIX,example.com,PROXY
- RULE-SET,work-domains,PROXY
- IP-CIDR,192.168.50.0/24,DIRECT,no-resolve
# 最後處理未命中前述規則的連線
- MATCH,PROXY
MATCH 是兜底規則,不需要比對內容。所有執行到這裡的連線都會使用其目標策略。如果用戶端將自訂規則附加在既有的 MATCH 之後,這些規則就不會有機會執行。請將自訂規則加在前面,或插入最終兜底規則之前,而不是繼續重複新增相同項目。
規則未生效:依連線記錄逐項檢查
修改規則後,請先重新載入設定,再關閉目標應用程式的舊連線並重新送出請求。瀏覽器可能會沿用已建立的連線;規則變更後,舊連線通常不會自動切換到新的出口。測試時一次只調整一兩條規則,較容易比較結果。
- 確認目前使用的設定與模式。檢查目前啟用哪一份訂閱,以及運作模式是否為規則模式。編輯未啟用的設定,不會影響目前流量。
- 確認流量已進入核心。開啟用戶端的「連線」頁面,搜尋目標網域或目標 IP。若沒有記錄,請先檢查系統代理、應用程式本身的代理設定,以及 TUN 接管範圍。
- 查看命中的規則。在連線詳細資料中查找規則類型、規則內容與策略鏈。各用戶端的欄位名稱可能不同,重點是找出實際命中的規則。
- 核對最終設定的規則順序。若顯示命中較廣泛的後綴規則或集合,請將更精確的例外移到前面;若顯示命中
MATCH,請確認規則內容與提供者是否真的符合條件。 - 確認出口是否符合預期。命中
PROXY只表示流量交由該策略群組處理。如果群組目前選擇的是DIRECT,最終仍會直連。 - 更新一次訂閱後重新測試。確認自訂規則仍然保留,且位置沒有變動。這能找出「暫時編輯成功,更新後卻消失」的問題。
用三次請求驗證規則先後順序
以先前的網域範例為準:造訪 docs.example.com,預期會命中精確網域規則並直連;造訪 api.example.com,預期會命中後綴規則並使用 PROXY;造訪未被其他規則涵蓋的目標,預期會套用 MATCH。這些網域僅用來說明規則關係,實際測試時請改用可連線且用途已確認的網域。
同一個網頁可能會連線至登入、圖片、影片與 API 等多個主機。只為主網站設定規則,不代表所有資源都會使用相同出口。若網頁能開啟但圖片載入失敗,請先從連線記錄找出失敗資源的網域,再決定要新增精確規則,還是擴大後綴比對範圍。
常見規則問題
DOMAIN-SUFFIX 與 IP-CIDR 同時符合時,哪一條優先?
通常取決於它們在規則清單中的先後順序,沒有固定的「網域一定優先於 IP」原則。同時也要確認連線是否具備判斷所需的網域或 IP,以及 no-resolve 是否阻止該規則主動解析。將明確的網域例外放在前面,通常會比較容易理解與維護。
切換至 TUN 後,還需要自訂規則嗎?
視分流需求而定。TUN 是透過虛擬網路介面接管流量的方式,不會建立一套新的比對優先順序。流量進入核心後,規則模式仍會依規則順序選擇策略。若特定區域網路目標甚至無法建立連線,也應一併檢查路由、TUN 排除範圍與防火牆。
為什麼 REJECT 規則沒有封鎖網頁?
先確認該網域是否被更前面的規則放行,再確認網頁是否使用其他資源網域,或仍有既存連線。REJECT 只會影響實際命中該規則的連線,不會根據網頁標題辨識整個服務。修改後請重新建立連線,並以連線詳細資料中的命中記錄為準。
維護規則時,建議優先保留少量且目的明確的例外。每次修改都記錄「比對什麼、交由哪個策略處理、放在哪裡」,再透過連線記錄驗證。只要分開檢查流量接管、規則命中與策略群組出口,大多數「寫了規則卻沒有變化」的問題都能定位到具體環節。