Clash 規則分流設定教學:GEOIP、DOMAIN-SUFFIX 與 RULE-SET
整理 Clash 規則比對順序,示範中國大陸直連、海外網站走代理的常見設定,以及 rule-providers 規則集的引用與更新方式。
先確認規則模式與設定入口
規則分流用來決定連線要經過哪個出口,不會建立代理節點。開始前,請先確認已匯入訂閱、節點可以連線,並在用戶端的「代理模式」中選擇「規則」。全域模式通常會將流量交由全域策略處理;直連模式則不會依照本文的規則清單分流。
本文主要介紹 Clash Meta 後續專案 mihomo 使用的 YAML 設定。經典版 Clash 與不同用戶端對規則集格式及更新入口的支援各有差異;編輯前,請在「關於」或「核心資訊」中確認目前使用的核心。以下範例採用 YAML 規則集,不使用 MRS 二進位規則集格式。
- 在「設定」或「訂閱」頁面匯出目前的設定,並保留一份可重新匯入的備份。
- 確認設定中有名為
代理選擇的策略群組。若實際名稱不同,請一併修改範例中的所有引用。 - 找到用戶端提供的「覆寫」、「擴充設定」或「設定編輯」入口,並確認它採用合併還是取代規則的方式。
- 先儲存一份最精簡的規則,確認載入成功後,再加入遠端規則集。
比對順序:第一條符合的規則決定流量出口
rules 是有順序的清單。核心會由上往下檢查;一旦符合某條規則,就採用該規則指定的策略,不會繼續尋找「更精確」的下一條。因此,個人例外規則應放在前面,公用規則集放在中間,最後才放兜底的 MATCH。
mode: rule
rules:
- DOMAIN,github.com,代理選擇
- DOMAIN-SUFFIX,home.arpa,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,代理選擇
這是設定片段,不包含節點與策略群組的定義。合併至現有設定時,請保留一個頂層 rules,不要連續貼上兩個同名的鍵。最後一行表示「前面的規則都未符合時,使用代理選擇」,不代表核心已判定目標一定位於海外。
三個容易混淆的名稱
DIRECT:內建的直連出口,由本機網路直接連線至目標。代理選擇:本例使用的策略群組名稱,必須已經定義,而且目前選取的節點確實可用。MATCH:兜底規則類型,不是策略群組;它後面的欄位才是流量出口。
若將 MATCH,代理選擇 放在第一行,後面的直連規則就不會有比對機會。若策略群組目前選取的是 DIRECT,即使記錄顯示符合「代理選擇」,連線仍可能直接連線。排查時,請同時檢查規則與最終出口鏈。
DOMAIN-SUFFIX:先處理明確的網域範圍
網域規則適合表達明確的網站連線需求。DOMAIN 只符合完整網域;DOMAIN-SUFFIX 則符合該網域及其子網域。規則值只填網域,不要加上通訊協定、路徑或連接埠。
| 規則寫法 | 符合範圍 | 適用情境 |
|---|---|---|
DOMAIN,github.com,代理選擇 | 僅限 github.com | 精確指定單一主機名稱 |
DOMAIN-SUFFIX,github.com,代理選擇 | github.com 與 api.github.com 等子網域 | 涵蓋同一網域下的相關服務 |
DOMAIN-SUFFIX,home.arpa,DIRECT | home.arpa 及其子網域 | 家庭網路中的本機網域 |
DOMAIN-SUFFIX,github.com 不會符合 notgithub.com,也不會自動涵蓋 githubusercontent.com。網站的登入、圖片與下載可能分布在不同網域,不能只看瀏覽器網址列就判定所有請求。請先在連線記錄中確認實際目標,再補上必要規則。
網域規則是否能符合,取決於核心是否取得網域名稱
透過 HTTP 代理送出的網域請求通常會保留主機名稱;應用程式直接連線至 IP 時,情況則不同。在 TUN 情境中,DNS 接管、fake-ip 對應或流量嗅探可能有助於還原網域,但這些機制無法保證所有通訊協定都能還原。若瀏覽器啟用了獨立的加密 DNS,也請確認實際 DNS 路徑是否繞過預期設定。
不要把「啟用 TUN」當成「所有網域規則自然生效」。請先在連線詳細資料中確認目標是網域還是純 IP,再決定是否檢查 DNS、嗅探或 IP 規則。相關概念可參閱概念速查。
GEOIP:依目標 IP 補充地理位置判斷
GEOIP,CN,DIRECT 表示目標 IP 符合目前地理資料庫中的 CN 項目時,直接連線。判斷依據是 IP,不是網域後綴或營運者所在地。中文網站可能使用境外 CDN,海外服務也可能使用中國大陸境內的邊緣節點,因此實際結果可能與直覺不同。
rules:
- DOMAIN-SUFFIX,github.com,代理選擇
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,代理選擇
先列出常見的私有 IP 位址範圍,避免區域網路裝置落入代理兜底規則。這並非完整的特殊位址清單;若環境涉及回送、鏈路本地位址或其他保留位址,也應配合用戶端的 TUN 路由排除設定。規則直連與路由排除屬於不同層次,前者不代表流量沒有進入核心。
no-resolve 的實際影響
IP 類規則檢查網域目標時,可能需要先解析網域。加上 no-resolve 表示不會為了這條規則主動觸發網域解析;這不等於停用整個連線的 DNS,也不會讓已有目標 IP 的連線跳過 IP 判斷。
- 區域網路網段規則通常可以加上
no-resolve,避免在清單開頭就為每個網域觸發解析。 - 若希望
GEOIP,CN也能判斷尚未解析的網域所屬地區,可以像範例一樣不加no-resolve。 - 若為 GEOIP 加上
no-resolve,就要留意部分網域連線可能繼續比對後續規則,最後落入代理兜底規則。
GEOIP 的結果也會受到資料庫來源、更新時間及 DNS 回傳位址影響。修改規則不會同步更新資料庫。若少數服務判斷錯誤,建議先加入已確認的網域例外,不要立刻顛倒整套地理位置規則。
RULE-SET:分開維護公用清單與個人規則
rule-providers 用來定義規則集的資料來源,RULE-SET 則在規則清單中引用規則集。只宣告 provider 不會產生分流效果,必須在 rules 中引用相同名稱。以下片段將公用直連網域與個人區域網路規則分開管理,並將遠端資源的更新間隔設為一天。
rule-providers:
direct-domains:
type: http
behavior: domain
format: yaml
url: https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt
path: ./rules/direct-domains.yaml
interval: 86400
local-policy:
type: file
behavior: classical
format: yaml
path: ./rules/local-policy.yaml
rules:
- RULE-SET,local-policy,DIRECT
- DOMAIN-SUFFIX,github.com,代理選擇
- RULE-SET,direct-domains,DIRECT
- GEOIP,CN,DIRECT
- MATCH,代理選擇
遠端網址指向第三方公開規則來源,由核心在執行時下載;是否能連線及內容如何更新,取決於該專案。副檔名為 .txt 不代表內容一定是純文字清單;此來源採用 YAML 的 payload 結構,因此要宣告 format: yaml。
path 是核心工作目錄中的快取或檔案路徑,不是瀏覽器的下載資料夾。圖形化用戶端可能會將工作目錄設在應用程式資料目錄,不能預設它就在安裝程式旁邊。使用 type: file 時,請先建立檔案,再載入設定。
個人規則檔案的完整內容
將以下內容儲存至工作目錄中的 rules/local-policy.yaml。檔案型 provider 負責提供比對條件,最終策略由外部的 RULE-SET,local-policy,DIRECT 指定,因此檔案內不必再加上 DIRECT。
payload:
- DOMAIN-SUFFIX,home.arpa
- IP-CIDR,10.0.0.0/8,no-resolve
- IP-CIDR,172.16.0.0/12,no-resolve
- IP-CIDR,192.168.0.0/16,no-resolve
- IP-CIDR6,fc00::/7,no-resolve
behavior 必須與內容相符
| behavior | 內容範例 | 注意事項 |
|---|---|---|
domain | '+ .example.com' 的正確寫法是移除加號後的空格,不應寫成含有隱藏字元的 '+.example.com';建議直接使用來源提供的原始內容 | 網域清單,不是完整的 rules 規則列 |
ipcidr | 192.168.0.0/16 | IP 位址範圍清單 |
classical | DOMAIN-SUFFIX,home.arpa | 包含規則類型,不包含最終策略 |
不要將廣告過濾語法、完整 Clash 設定或網頁 HTML 直接當成規則集。成功下載只代表取得了回應內容,不表示內容一定能解析。若發生解析錯誤,請一併檢查 behavior、format、縮排與回應本文。
規則更新:分清訂閱、規則集與地理資料庫
這三類資料的更新流程各不相同。更新訂閱通常會刷新節點與訂閱附帶的設定;HTTP 規則集依照 provider 的 interval 更新;GEOIP 資料庫則由核心或用戶端的相應資料庫更新功能管理。按一次「更新訂閱」,不代表這三類資料都已更新。
- 首次載入:確認規則集是否下載成功並完成解析。若沒有可用快取且下載失敗,設定可能無法如預期載入,不要假設系統會自動取得完整的直連清單。
- 定期更新:
interval: 86400的單位是秒,也就是 24 小時。一般網域清單不需要設定成每 10 秒請求一次。 - 手動驗證:在用戶端的「規則集」或相關管理頁面執行更新;若沒有這項功能,請依照用戶端支援的方式重新載入設定,並查看記錄。
- 本機檔案:
type: file不會從遠端取得內容。修改檔案後,請透過用戶端支援的重新載入功能,讓核心讀取新內容。
遠端規則也是需要審核的設定來源。大量直連清單可能讓某些登入或下載服務繞過代理。對出口有明確要求的網域,應將個人規則放在公用清單之前,並保留一份已驗證的設定以便還原。
驗證順序:先看符合的規則,再檢查最終連線
「網頁能開啟」只能證明某條連線路徑可用,不代表分流符合預期。修改後,請關閉測試頁面的既有連線,再重新送出請求,以免沿用修改前建立的連線。必要時可在用戶端的「連線」頁面結束相關連線,但請注意,進行中的下載也會中斷。
用三類目標驗證規則
- 區域網路目標:若路由器的實際位址是
192.168.1.1,請開啟管理頁面,確認符合區域網路規則,且最終出口為DIRECT。 - 明確指定代理的網域:開啟
github.com,確認符合前置的網域規則,並確認「代理選擇」最後使用的是預期節點。 - 一般直連網域:選擇公用直連規則集中確實包含的網域,確認符合的是
RULE-SET還是後續的 GEOIP 規則,不要只根據頁面內容判斷。
若目前設定的混合代理連接埠確實是 7890,也可以使用以下指令明確透過本機 HTTP 代理。連接埠請以用戶端顯示的值為準;此測試驗證的是明確指定代理的連線路徑,不能取代 TUN 接管測試。
curl --proxy http://127.0.0.1:7890 --head --max-time 15 https://github.com
在 Windows PowerShell 中,若 curl 對應到其他指令,可改用 curl.exe。HTTP 狀態碼不是唯一的判斷依據;即使回應是重新導向,也可以搭配連線記錄確認請求的路徑。
依據現象縮小問題範圍
| 現象 | 優先檢查項目 | 處理方式 |
|---|---|---|
| 所有連線都經過代理 | 全域模式、過早出現的 MATCH | 切換至規則模式,並將 MATCH 移到清單末尾 |
| 網域規則未符合 | 實際請求的網域、連線是否只有 IP | 查看連線詳細資料,再檢查 DNS 與網域還原路徑 |
| 設定載入失敗 | 策略群組名稱、重複的鍵、縮排 | 依照記錄指出的欄位修正後重新載入 |
| 規則集已載入但沒有生效 | RULE-SET 名稱與引用位置 | 確認 provider 名稱,並檢查前面是否已有規則符合 |
| 更新訂閱後規則消失 | 修改的是產生的設定,還是持續性覆寫設定 | 將個人規則移至用戶端的持續性擴充設定入口 |
最後保留一套容易理解的順序:個人例外、區域網路規則、公用網域清單、GEOIP、MATCH。每新增一條規則,都應能說明「符合什麼、使用哪個策略、為什麼放在這裡」。若遇到系統代理或 TUN 接管層的問題,可進一步參閱故障排除手冊;規則清單本身無法修復未進入核心的流量。