進階設定 預計閱讀 12 分鐘

Clash 規則分流設定教學:GEOIP、DOMAIN-SUFFIX 與 RULE-SET

整理 Clash 規則比對順序,示範中國大陸直連、海外網站走代理的常見設定,以及 rule-providers 規則集的引用與更新方式。

先確認規則模式與設定入口

規則分流用來決定連線要經過哪個出口,不會建立代理節點。開始前,請先確認已匯入訂閱、節點可以連線,並在用戶端的「代理模式」中選擇「規則」。全域模式通常會將流量交由全域策略處理;直連模式則不會依照本文的規則清單分流。

本文主要介紹 Clash Meta 後續專案 mihomo 使用的 YAML 設定。經典版 Clash 與不同用戶端對規則集格式及更新入口的支援各有差異;編輯前,請在「關於」或「核心資訊」中確認目前使用的核心。以下範例採用 YAML 規則集,不使用 MRS 二進位規則集格式。

  1. 在「設定」或「訂閱」頁面匯出目前的設定,並保留一份可重新匯入的備份。
  2. 確認設定中有名為 代理選擇 的策略群組。若實際名稱不同,請一併修改範例中的所有引用。
  3. 找到用戶端提供的「覆寫」、「擴充設定」或「設定編輯」入口,並確認它採用合併還是取代規則的方式。
  4. 先儲存一份最精簡的規則,確認載入成功後,再加入遠端規則集。

比對順序:第一條符合的規則決定流量出口

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,DIRECThome.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 規則列
ipcidr192.168.0.0/16IP 位址範圍清單
classicalDOMAIN-SUFFIX,home.arpa包含規則類型,不包含最終策略

不要將廣告過濾語法、完整 Clash 設定或網頁 HTML 直接當成規則集。成功下載只代表取得了回應內容,不表示內容一定能解析。若發生解析錯誤,請一併檢查 behavior、format、縮排與回應本文。

規則更新:分清訂閱、規則集與地理資料庫

這三類資料的更新流程各不相同。更新訂閱通常會刷新節點與訂閱附帶的設定;HTTP 規則集依照 provider 的 interval 更新;GEOIP 資料庫則由核心或用戶端的相應資料庫更新功能管理。按一次「更新訂閱」,不代表這三類資料都已更新。

  1. 首次載入:確認規則集是否下載成功並完成解析。若沒有可用快取且下載失敗,設定可能無法如預期載入,不要假設系統會自動取得完整的直連清單。
  2. 定期更新:interval: 86400 的單位是秒,也就是 24 小時。一般網域清單不需要設定成每 10 秒請求一次。
  3. 手動驗證:在用戶端的「規則集」或相關管理頁面執行更新;若沒有這項功能,請依照用戶端支援的方式重新載入設定,並查看記錄。
  4. 本機檔案: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 接管層的問題,可進一步參閱故障排除手冊;規則清單本身無法修復未進入核心的流量。

下載 Clash