進階設定 預計閱讀 12 分鐘

Clash 國內外分流規則設定:GEOIP、GEOSITE 與 RULE-SET 實戰

從規則比對順序出發,運用 GEOIP、GEOSITE 與 RULE-SET 設定中國大陸直連、境外走代理,並說明 MATCH 的兜底用途與常見誤判修正方式。

先確認核心與規則模式

國內外分流不是加上一條「中國大陸直連」規則就能搞定。網域分類、IP 歸屬、手動例外與最後的預設出口,各自負責不同環節。實用的組合方式是:先處理明確例外,再比對中國大陸網域,接著用中國大陸 IP 補漏,最後讓其他連線使用指定的策略組。

本文設定以 Clash Meta,也就是目前的 mihomo 核心為目標。Clash 泛指一類核心與用戶端生態,並不代表所有舊版核心都支援相同欄位。尤其是 GEOSITE 與 geodata 設定,不能直接套用到所有傳統 Clash 版本。請先到用戶端的「關於」或核心資訊頁確認實際使用的核心,再修改設定;只看視窗標題上的 Clash 字樣並不足夠。

  • 模式請選 Rule/規則。全域模式不會依本文規則逐條選擇出口,直連模式也不適合用來驗證分流。
  • 確認已有可用的策略組。下文假設現有設定中有一個名為 境外出口 的策略組,且組內已有可用節點。名稱必須完全一致。
  • 保留訂閱原始檔。建議使用用戶端的持久覆寫或合併功能加入自訂規則;直接修改訂閱產生的檔案,可能會在下次更新時遺失。

規則順序比規則數量更重要

規則會由上而下比對,命中一條後就採用該條指定的策略,後續規則不會再為這次選擇重新判斷。所謂「越精確的規則越優先」,不是核心自動比較得出的結果,而是設定者必須將它排在前面。

rules:
  - DOMAIN-SUFFIX,github.com,境外出口
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,境外出口

這四行中,github.com 及其子網域會先使用手動指定的策略組;命中中國大陸網域集合的連線會直連;目標 IP 已知且被資料庫判定為中國大陸地址的連線也會直連;其餘連線則交由 MATCH 處理。第一行只涵蓋這個網域後綴,不會自動包含 GitHub 使用的所有靜態資源網域。

三個容易混淆的名詞

規則類型判斷依據適用情境
GEOSITE網域分類資料庫中的集合依網域類別分流,降低對 IP 歸屬的依賴
GEOIP目標 IP 的國家或地區歸屬補足網域清單未涵蓋的連線
RULE-SET單獨宣告的規則提供者維護專屬例外清單或獨立規則檔

DIRECT 是內建的直連策略,境外出口 是本文約定的策略組名稱,兩者不是同一類物件。規則指向策略組,只代表「交由這個組處理」;還要確認組內目前選的是節點還是 DIRECT。

準備 GEOSITE 與 GEOIP 資料

GEOSITE,cn 中的 cn 是資料庫中的分類名稱,不是核心即時查詢得出的國家標籤。這個分類是否存在、收錄哪些網域,取決於使用的 geosite.dat。同樣地,GEOIP,CN 判斷的是 IP 資料庫中的歸屬,不等於網站公司的註冊地,也不保證伺服器的實際所在地。

以下設定會明確啟用 geodata-mode: true,因此 GEOIP 使用 geoip.dat,GEOSITE 使用 geosite.dat。請透過用戶端既有的資料管理方式準備這兩個檔案,並確認啟動記錄沒有載入失敗。若現有設定使用 MMDB 模式,請勿只切換開關而未備妥對應資料。

  • 資料檔應來自可信任的維護來源,並與目前使用的核心相容;檔名正確不代表內容格式一定正確。
  • 若出現分類不存在的錯誤,請先核對資料庫包含的分類名稱,不要憑印象把 cn 改成其他集合名稱。
  • 更新資料庫可能改變分類結果。請保留舊設定與已知可用的資料,更新後用同一組網站重新測試。

這裡不列出自動下載網址,以免混淆「檔案取得失敗」與「規則設定錯誤」。初次除錯時,先確保本機資料能穩定讀取,再考慮更新週期,會更容易找出問題。

使用 RULE-SET 管理手動例外

手動例外應排在分類規則之前。這樣遇到網站分類不合適時,只需修改一份小型清單,不必複製整套大型規則庫。以下使用本機 YAML 檔案,不依賴線上下載規則檔,也方便確認實際載入的是哪一份內容。

第一步:宣告兩個規則提供者

將以下欄位合併至現有設定的頂層。若已有 rule-providers,請在底下新增兩個項目,不要再建立第二個同名的頂層鍵。相對路徑以實際核心的工作目錄為基準,不一定是下載檔案所在的目錄;沙箱用戶端也可能限制可讀取的路徑。

mode: rule
geodata-mode: true

rule-providers:
  local-direct:
    type: file
    behavior: classical
    format: yaml
    path: ./rules/local-direct.yaml

  local-proxy:
    type: file
    behavior: classical
    format: yaml
    path: ./rules/local-proxy.yaml

behavior: classical 表示檔案中使用包含規則類型的項目,例如 DOMAIN-SUFFIX。提供者項目不指定出口;出口由主設定中的 RULE-SET 那一行決定。若改用 behavior: domain,檔案語法也必須相應調整,不能直接混用。

第二步:建立本機清單

以下兩份內容用來示範「指定網域直連」與「指定網域走代理」。example.com 是文件中的示例網域,不是推薦的連線測試網站;實際使用時請刪除該項,再依自身需求維護清單。

rules/local-direct.yaml:

payload:
  - DOMAIN-SUFFIX,example.com

rules/local-proxy.yaml:

payload:
  - DOMAIN-SUFFIX,github.com
  - DOMAIN-SUFFIX,githubusercontent.com

這兩條代理例外僅示範設定方式,不代表相關服務在所有網路環境下都必須走代理,也不涵蓋所有相關網域。若網頁能開啟但圖片載入失敗,請根據失敗請求使用的網域繼續檢查,不宜直接將整個 CDN 網段改用同一出口。

第三步:依層次排列 rules

請將現有的 rules 清單整理成以下順序。範例涵蓋 IPv4 回送位址、常見私有網路,以及 IPv6 回送位址、唯一本機位址與鏈路本機位址;這並非所有特殊用途位址的完整清單。

rules:
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - 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,::1/128,DIRECT,no-resolve
  - IP-CIDR6,fc00::/7,DIRECT,no-resolve
  - IP-CIDR6,fe80::/10,DIRECT,no-resolve
  - RULE-SET,local-direct,DIRECT
  - RULE-SET,local-proxy,境外出口
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,境外出口

先處理本機位址,避免連線至路由器或內網服務時被最後的代理出口接手。不過,這些位址規則帶有 no-resolve,不會為了判斷尚未解析的網域而主動查詢 DNS。若使用情境依賴內網網域,還應在直連清單中加入實際網域,並設定可連線的內網 DNS。

若兩份自訂清單中有重複網域,前面的 local-direct 會優先命中。維護時請盡量讓清單互不重疊,避免幾個月後忘記某條規則為何沒有生效。若訂閱附帶拒絕、應用程式或特殊服務規則,也要依需求重新安排順序,不要直接刪除既有規則。

了解 no-resolve 與 MATCH 的適用範圍

no-resolve 不等於停用 DNS

GEOIP,CN,DIRECT,no-resolve 的意思是:如果目前沒有可用於判斷的目標 IP,就不要只為了這條 IP 規則主動解析網域。若連線本身使用 IP 位址,或核心已取得可用的實際目標 IP,仍可進行比對。這個參數不會讓瀏覽器停止解析網域,也不會關閉整個 DNS 模組。

代價也很明確:若某個中國大陸網域未收錄於 GEOSITE,cn,而比對到 GEOIP 這一行時又沒有可用 IP,它就可能一路落到 MATCH,最後走代理。這是這套保守設定預期會遇到的情況,不應因此直接認定核心忽略了 GEOIP。

  • 優先修正網域清單:將確認需要直連的網域加入 local-direct,判斷結果明確,也方便還原。
  • 必要時允許解析:移除 GEOIP 規則中的 no-resolve,讓 IP 判斷有機會觸發解析,但也要一併檢查解析等待時間與 DNS 路徑。
  • 不要把 fake-ip 位址當成伺服器位址:例如 198.18.0.0/16 可能用作 fake-ip 位址池,不能只憑這個位址判斷業務網站的歸屬。

MATCH 是未命中時的兜底,不是故障切換

MATCH,境外出口 只確保前面的規則都未命中時,仍有明確的目標策略。若代理節點連線失敗,它不會回頭改走直連;若需要切換故障節點,應在策略組層級使用合適的組態類型並正確設定檢測。反過來,寫成 MATCH,DIRECT 就表示「未識別的連線一律直連」,可能讓未收錄的境外網域直接連線。

本文採用「中國大陸白名單直連,其餘走代理」的策略。這種做法方便讓新增的境外網域沿用代理出口,但無法保證所有中國大陸服務都能正確識別。分流策略無法自動消除誤判,最後仍需要少量手動例外。

透過連線記錄確認實際出口

設定能載入,只代表語法與引用大致正確,不代表流量一定如預期經過核心。請先確認瀏覽器已使用系統代理,或 TUN 已正確接管目標應用程式。系統代理通常只影響遵循代理設定的程式,不能因此推斷所有 UDP 流量或使用獨立網路堆疊的應用程式都已被接管。

  1. 重新載入並檢查記錄。確認沒有規則檔讀取失敗、GEOSITE 分類不存在或目標策略不存在等錯誤。先維持 info;若需要更多細節,可暫時啟用 debug,重現問題後再恢復。
  2. 先測試一條手動例外。造訪清單中的網域,在連線詳細資訊中確認是否命中 RuleSet,並查看對應的提供者與最終策略鏈。
  3. 再測試網域分類。選擇目前資料庫確實收錄於 cn 集合中的網域,確認規則類型為 GeoSite、策略為 DIRECT。
  4. 最後檢查兜底規則。找一筆未命中前面規則的連線,確認它落到 Match,並查看 境外出口 目前選用的實際節點。

每次測試前先關閉相關的舊連線,再建立新連線。既有的 TCP 連線不會因規則檔修改而自動更換出口;瀏覽器重複使用連線時,尤其容易讓人誤以為「規則改了卻沒變」。測試時記錄網域、目標 IP、命中規則與最終出口,比只截取無法連線的畫面更有用。

常見誤判與修正順序

現象優先檢查項目處理方式
中國大陸網站走了代理是否命中 Match、網域是否已收錄確認業務網域後加入 local-direct,再檢查 GEOIP 是否略過了解析
境外網站被判定為直連是否命中 GeoIP 或前置的直連清單將網域加入 local-proxy,並確保排在 GEOSITE、GEOIP 之前
RULE-SET 完全沒有生效提供者名稱、路徑與檔案格式核對 classical 項目語法與 payload 層級,重新載入後檢查錯誤記錄
命中代理組卻仍顯示直連組內目前選項與巢狀策略鏈確認策略組是否選了 DIRECT,並逐層檢查最終出口
首頁正常,但資源載入失敗失敗資源使用的個別網域依實際連線記錄補上資源網域,避免擴大範圍至整個共用 IP 網段
更新訂閱後設定恢復原狀修改是否寫在暫時產生的檔案中移至用戶端的持久覆寫設定入口,確認合併後的最終設定順序

遇到中國大陸網站解析至境外 CDN 的情況時,將網域規則排在 GEOIP 之前就很有用:只要網域已命中直連清單,後續的境外 IP 歸屬就不會改變結果。反過來說,境外服務若使用中國大陸位址,單靠 GEOIP 也可能被判為直連,因此明確的代理例外必須排在 IP 判斷之前。

最後保留一組精簡且穩定的測試清單:一個手動直連網域、一個手動代理網域、一個中國大陸分類網域,以及一筆實際落到兜底規則的連線。每次只修改一處,再用同一組請求重新測試。能說明每筆連線為何使用該出口,才算真正完成分流設定;一味增加規則數量,通常無法解決順序、DNS 或策略組選錯的問題。

下載用戶端