Clash 自訂規則設定教學:DOMAIN-SUFFIX、GEOIP 與 MATCH 的比對順序
整理常用規則語法,說明由上而下採用第一條符合規則的比對方式,並示範如何引用 rule-providers 及排解規則衝突。
先確認規則模式,再調整比對順序
將明確的例外規則放在前面,範圍較廣的規則放在後面,最後用 MATCH 接住其餘連線。Clash 會由上而下檢查一般規則清單,符合一條規則後便依該規則指定的策略處理,不會繼續尋找「更精確」的規則。規則寫得越具體,不代表優先順序就會自動提高。
修改前先確認用戶端處於規則模式。全域模式不會依這份一般分流清單決定連線出口;直連模式也無法用來驗證代理規則。各用戶端介面名稱可能不同,可在模式切換處選擇「規則」或「Rule」,並確認執行中的設定檔包含 mode: rule。
釐清規則、策略與實際出口
- 規則:判斷連線是否符合條件,例如網域是否以
example.com結尾。 - 策略:決定由哪個項目處理,例如內建的
DIRECT、REJECT,或名為PROXY的策略群組。 - 實際出口:策略群組目前選取的節點或直連項目。符合
PROXY不代表一定會經過遠端節點,還要查看群組內的選擇。
本文中的 PROXY 是自訂群組名稱,並非所有設定檔都內建的策略。如果訂閱中的群組名稱是「節點選擇」,規則末尾就應引用這個確切名稱。名稱或大小寫不符,或缺少對應群組,都可能導致設定檔載入失敗。
辨別 DOMAIN、DOMAIN-SUFFIX 與 IP 規則
先依目標資訊選擇規則類型。網域規則適合用於網站與服務分流;IP 規則則適合固定位址、區域網路及地理 IP 判斷。一般格式為 類型,比對內容,策略;MATCH 沒有比對內容,因此只有兩個欄位。
| 類型 | 規則範例 | 比對範圍 |
|---|---|---|
| DOMAIN | DOMAIN,api.example.com,DIRECT |
只比對這個完整網域 |
| DOMAIN-SUFFIX | DOMAIN-SUFFIX,example.com,PROXY |
比對根網域及其子網域 |
| DOMAIN-KEYWORD | DOMAIN-KEYWORD,example,PROXY |
比對網域中包含這段字串的目標 |
| IP-CIDR | IP-CIDR,192.168.0.0/16,DIRECT,no-resolve |
比對指定的 IPv4 網段 |
| GEOIP | GEOIP,CN,DIRECT |
依據 IP 資料判斷是否屬於 CN |
| MATCH | MATCH,PROXY |
接住前面未符合的連線 |
網域欄位只填主機名稱
使用 DOMAIN-SUFFIX,example.com,PROXY,不要寫成 https://example.com/path。這裡不填協定、路徑、查詢參數或連接埠,也不需要加上 *.example.com。後綴規則本身就涵蓋 example.com 和 www.example.com,但不會因為字串相似而比對到 notexample.com。
DOMAIN-KEYWORD 的比對範圍較廣。使用關鍵字 example,也可能比對到與目標網站無關的網域。只有確實需要字串比對時才使用;網站分流通常優先選擇完整網域或網域後綴。
分辨 IP-CIDR 與 GEOIP
IP-CIDR 會直接檢查位址是否落在指定網段內;GEOIP 則依賴核心載入的地理 IP 資料。後者只按目標 IP 的地理歸屬判斷,不依據網頁內容、網域註冊地或訪客所在位置。中文網站使用海外 CDN 時,也可能不符合 GEOIP,CN。
IPv6 網段應使用對應的 IP-CIDR6 規則,例如 IP-CIDR6,fc00::/7,DIRECT,no-resolve。不要只加入 IPv4 例外,就認定同一服務的 IPv6 連線也會使用相同出口。
依第一條符合規則的原則排列例外與兜底規則
先看一個明確的衝突案例:讓 api.example.com 直連,其餘 example.com 子網域則走代理。精確的例外規則必須放在網域後綴規則之前。
rules:
- DOMAIN,api.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY
- 連線至
api.example.com時,符合第一條規則,直接選擇DIRECT。 - 連線至
www.example.com時,第一條不符合、第二條符合,交由PROXY處理。 - 連線至其他網域時,繼續檢查 IP 歸屬;符合 CN 條件便直連。
- 前面的規則都不符合時,最後一條
MATCH會將連線交給PROXY。
如果將前兩條規則對調,網域後綴規則就會先比對到 api.example.com,精確網域規則便不會再執行。若把 MATCH 放在第一條,結果更直接:後面的所有一般規則都不會有比對機會。
用可載入的最小設定檔確認名稱
以下結構用於示範設定項目之間的關係,不含遠端代理節點。為了引用 PROXY,範例建立了同名的選擇群組,並暫時只加入 DIRECT。因此,即使規則符合這個群組,最後仍會直連;實際使用時應保留訂閱中已有的節點與策略群組。
mixed-port: 7890
mode: rule
log-level: info
proxy-groups:
- name: PROXY
type: select
proxies:
- DIRECT
rules:
- DOMAIN,api.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,PROXY
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,PROXY
mixed-port: 7890 在此僅代表本機 HTTP/SOCKS 混合代理連接埠,並非規則比對條件。如果目前用戶端使用其他連接埠,測試時應以實際監聽的連接埠為準。修改現有設定時,也不要重複新增第二個頂層 rules:,應調整原有清單或使用用戶端提供的合併功能。
了解 GEOIP、DNS 與 no-resolve 的關係
先讓明確的網域規則完成比對,再考慮是否需要依 IP 判斷。連線只有網域、尚無可用的目標 IP 時,IP 規則可能會觸發解析。將常用的網域例外放在 GEOIP 之前,有助於清楚表達分流意圖,也能減少不必要的 IP 判斷。
no-resolve 並非停用 DNS
在支援此選項的 IP 規則末尾加上 no-resolve,表示不要為了檢查這條規則而主動解析網域。如果連線已帶有可用 IP,仍可據此判斷。這不會停用系統 DNS,也不保證後續處理連線時完全不進行解析。
rules:
- DOMAIN-SUFFIX,example.com,PROXY
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT,no-resolve
- MATCH,PROXY
這段設定與未加上 no-resolve 的版本,不一定會得到相同結果。如果尚無目標 IP,帶有此選項的 GEOIP 可能無法符合,請求便會繼續交由 MATCH 處理。不要只為了減少解析,就不加判斷地替所有 IP 規則加入這個參數。
核心未取得網域資訊時,網域規則無法憑空比對
應用程式可能直接連線至 IP,或自行透過加密 DNS 解析。這種情況下,連線記錄未必包含原始網域。TUN 接管網路流量,不代表一定能保留每個請求的網域資訊。設定正確的 Fake-IP 對應或嗅探功能,在符合條件時或許能協助還原網域資訊,但不能假設所有協定都能還原。
- 先查看連線詳情中的主機名稱與目標 IP,確認核心實際取得哪些資訊。
- 再檢查 DNS 請求是否依預期進入核心,避免應用程式與系統各自使用不同的解析路徑。
- 最後再調整 DNS 或嗅探設定;不要一直新增網域規則,藉此掩蓋網域資訊缺失的問題。
使用 rule-providers 拆分規則檔
將需要重複維護的規則放入獨立檔案,再以 RULE-SET 引用。rule-providers 用來宣告規則來源,而在 rules 中的引用位置則決定優先順序。只宣告提供器卻未加以引用,這份規則不會自動參與分流。
在主要設定檔中宣告本機規則集
以下範例使用 mihomo 支援的本機檔案提供器,檔案路徑會相對於核心工作目錄解析。用戶端可能使用自己的設定目錄,因此請先確認核心工作目錄,再建立 rules/local-direct.yaml。
rule-providers:
local-direct:
type: file
behavior: classical
format: yaml
path: ./rules/local-direct.yaml
rules:
- DOMAIN,api.example.com,PROXY
- RULE-SET,local-direct,DIRECT
- GEOIP,CN,DIRECT
- MATCH,PROXY
規則檔中只寫比對條件
將以下內容儲存至上述路徑。classical 格式可包含網域、網段等規則條件;每條規則不必再填寫最終策略,因為策略已由主要設定檔中的 RULE-SET,local-direct,DIRECT 指定。
payload:
- DOMAIN-SUFFIX,example.com
- DOMAIN,intranet.example.net
- IP-CIDR,192.168.0.0/16,no-resolve
依照此順序,api.example.com 會先符合主要設定檔中的精確規則,交由 PROXY 處理;其餘符合規則集條件的連線則走 DIRECT。如果將 RULE-SET 移到最前面,規則集中的網域後綴條件就會先比對到該 API 網域。
behavior: domain、ipcidr 與 classical 的內容格式各不相同,不能只修改宣告而保留不相容的檔案內容。使用他人提供的規則集時,請先確認格式、路徑及核心支援狀況,再重新載入並查看記錄。遠端提供器還涉及下載與更新狀態;若下載失敗,應先排查提供器,不要直接認定是規則順序有誤。
從連線記錄找出規則衝突
使用同一個目標建立新連線,並記錄「符合的規則、策略鏈、實際出口」三項資訊。不要只根據頁面能否開啟來判斷規則是否生效:快取、舊連線與策略群組的選擇,都可能讓結果看起來沒有改變。
- 確認流量已接管:開啟用戶端的連線清單並發起一次連線。如果沒有對應的連線,請先檢查系統代理、應用程式代理或 TUN 接管狀態,而不是繼續修改規則。
- 確認模式:檢查目前是否為規則模式,並確認啟用的是剛修改的設定檔。
- 找出第一條符合的規則:在連線詳情或記錄中查看規則類型與比對內容,並找出主要設定檔或規則集中對應的位置。
- 檢查策略鏈:確認群組內目前選取的項目。例如符合
PROXY,但群組內選的是DIRECT,實際結果仍是直連。 - 重新建立連線:儲存並重新載入設定檔後,關閉測試目標的舊連線再試一次。規則更新後,既有連線通常不會自動更換出口。
透過指定的本機連接埠進行測試
如果混合代理實際監聽於 127.0.0.1:7890,可使用以下指令透過該連接埠發出請求。測試目標應選擇需要檢查的實際服務;此處保留的範例網域僅用來示範指令格式,不能代表你的連線狀況。
curl --proxy http://127.0.0.1:7890 --connect-timeout 10 --max-time 20 -I https://example.com
若要透過 SOCKS 測試,並將網域交由代理端解析,可使用 socks5h。這與先在本機解析的測試方式可能提供不同的網域資訊,比較結果時應記錄所用的協定。
curl --proxy socks5h://127.0.0.1:7890 --connect-timeout 10 --max-time 20 -I https://example.com
| 狀況 | 優先檢查 | 調整方式 |
|---|---|---|
| 所有連線都符合 MATCH | MATCH 的位置、目標是否有網域,以及前置規則是否已載入 | 將兜底規則移到末尾,並確認執行中的設定檔與連線中繼資料 |
| 精確網域例外未生效 | 前面的網域後綴、關鍵字或 RULE-SET 規則 | 將明確的例外規則移到會涵蓋它的規則之前 |
| 符合代理群組但仍然直連 | 策略群組目前的選擇及巢狀策略鏈 | 選擇所需的出口,再建立新連線 |
| 設定檔重新載入失敗 | YAML 縮排、策略名稱、規則集路徑與格式 | 根據錯誤記錄找出欄位問題,還原可用設定檔後再逐項修改 |
保留訂閱更新後的自訂規則
優先使用用戶端明確支援的持久化覆寫、合併或自訂規則功能。直接編輯訂閱下載產生的設定檔,可能會在下次更新時遭到取代。不同用戶端的選單名稱與處理方式各異,請先確認該功能是修改來源設定檔、產生設定檔,還是只編輯一次執行中的結果。
確認最終執行的設定檔,而非只看編輯器中的內容
- 檢查插入位置:「前置規則」適合放置精確例外;追加在
MATCH後面的規則不會有比對機會。 - 檢查陣列處理方式:有些合併方式會將規則附加到
rules,有些則會直接取代整份清單。請先用一條測試規則確認實際行為。 - 確認名稱是否固定:訂閱更新若變更策略群組名稱,本機規則也要同步調整,避免引用不存在的策略。
- 檢查提供器狀態:主要設定檔中的引用、提供器檔案與路徑都必須有效,缺少任何一項都可能影響載入。
每次只調整一種類型的規則,並在修改前後各保留一份可用設定檔。先驗證一個精確網域,再擴展至網域後綴或規則集。如此一來,便能分辨「規則未符合」、「符合了錯誤的策略」和「出口本身連線失敗」,訂閱更新後也更容易重新檢查。