分流設定前提:規則模式與代理策略組

中國大陸直連、境外代理根據網域清單、目標 IP 所屬網段與規則順序決定流量出口。中文網頁可能使用境外介面,境外服務也可能接入中國大陸的 CDN。因此,設定目標應是「已知的中國大陸網域直連,其餘連線依明確策略處理」,而不是以網域後綴推斷伺服器所在地。

以下內容適用於使用 Mihomo 核心的用戶端。開始前,請將運作模式切換為 Rule,確認已匯入可用節點,且設定中有名為 PROXY 的策略組。DIRECT 是核心內建的直連策略,不必自行建立;PROXY 只是本文使用的組名,並非預設存在的內建出口。

  • 如果實際使用的組名是「節點選擇」,請將範例中作為規則目標的 PROXY 全部改成「節點選擇」。組名必須完全一致。
  • 請先備份目前的設定,再透過用戶端的覆寫或合併功能儲存本機規則。直接修改訂閱產生的檔案,可能會在下次更新訂閱時被覆蓋。
  • 確認應用程式的流量確實進入核心。啟用系統代理不代表所有應用程式都會使用代理;TUN 可以接管更多流量,但不會改變規則的比對順序。

GEOSITE 設定:先比對網域,再比對 IP,最後設定兜底規則

若已有可用的 GeoSite 與 GeoIP 資料,可先用以下規則建立基本設定。將區域網路位址放在前面,避免本機服務流量進入代理;網域規則排在 IP 歸屬規則之前,避免境外服務因解析到中國大陸 IP 而被提前直連。

mode: rule

rules:
  - DOMAIN-SUFFIX,localhost,DIRECT
  - DOMAIN-SUFFIX,local,DIRECT
  - 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
  - GEOSITE,cn,DIRECT
  - GEOSITE,geolocation-!cn,PROXY
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,PROXY

各層規則的用途

規則層級比對依據處理方式
區域網路例外本機網域、回送位址與私有 IP 網段DIRECT
GEOSITE,cn資料檔中的 cn 網域集合DIRECT
GEOSITE,geolocation-!cn資料檔中對應的網域集合PROXY
GEOIP,CN已知目標 IP 的歸屬地DIRECT
MATCH先前規則皆未命中的連線PROXY

GEOSITE 用來比對網域分類,不會判斷目前伺服器的實際所在地。geolocation-!cn 是資料集中的分類名稱,不是即時反轉 cn 比對結果的寫法。不同資料來源收錄範圍各異,也可能沒有這個分類;若出現分類不存在的錯誤,請先確認用戶端使用的 GeoSite 來源。

GEOIP,CN,DIRECT,no-resolve 中的 no-resolve 表示不為了這條規則主動觸發網域解析。如果連線已有可用的實際目標 IP,就能據此判斷;若目前只有網域,且前面的網域集合都未命中,這條規則可能會略過,接著由 MATCH 處理。這是為了減少額外解析而做的取捨,不代表所有中國大陸 IP 都一定直連。

Geo 資料的更新方式

GeoSite 與 GeoIP 是本機資料檔,首次載入時需要有可用檔案或能連線至下載來源。更新訂閱不一定會同步更新這些資料。請分別檢查用戶端的 Geo 資料管理設定、核心載入記錄與實際資料來源;Geo 資料發生錯誤時,不要只是不斷重新整理節點訂閱。

rule-providers 設定:獨立更新遠端規則集

若需要分別管理規則來源與更新週期,可以改用 rule-providers。提供器負責下載及解析集合,RULE-SET 則負責在規則清單的指定位置引用集合。只宣告提供器不會自動進行分流,也不會自動將集合插入規則清單頂端。

以下以 Loyalsoldier/clash-rules 公開發布的檔案作為語法範例。這兩個檔案都是 YAML 網域集合,因此使用 behavior: domain 和 format: yaml。部署前請確認來源內容及目前網路是否能連線至該來源;這些網址不是節點訂閱網址。

rule-providers:
  overseas-domains:
    type: http
    behavior: domain
    format: yaml
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
    path: ./ruleset/overseas-domains.yaml
    interval: 86400

  domestic-domains:
    type: http
    behavior: domain
    format: yaml
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
    path: ./ruleset/domestic-domains.yaml
    interval: 86400

rules:
  - DOMAIN-SUFFIX,localhost,DIRECT
  - DOMAIN-SUFFIX,local,DIRECT
  - 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,overseas-domains,PROXY
  - RULE-SET,domestic-domains,DIRECT
  - MATCH,PROXY

這份清單可以取代上一節的 rules,請勿將兩份完整清單直接串接。前一份清單中的 MATCH 已比對所有其餘連線,排在它後面的規則都不會再參與判斷。這裡刻意不依賴 GeoIP,未收錄的網域及未命中區域網路規則的 IP 連線,統一由代理兜底。

  • interval: 86400 的單位是秒,也就是每 24 小時檢查一次更新;這並不保證快取檔案的有效期限。
  • path 是相對於核心工作目錄的本機檔案路徑。兩個提供器使用不同路徑,以免檔案互相覆蓋。
  • overseas-domains 和 domestic-domains 是自訂名稱,必須與 RULE-SET 中的名稱完全一致。
  • 此範例將代理集合排在直連集合之前。若兩個集合有重疊,會以先命中的代理規則為準;不同維護者維護的集合不一定完全沒有重疊。

規則格式:domain、ipcidr 與 classical

遠端網址能開啟,不代表內容格式正確。訂閱服務回傳的節點設定、含有登入提示的 HTML,以及單純的網域文字,不能不加區分地使用同一種解析方式。behavior 決定項目的意義,format 決定檔案的格式;兩者都必須符合來源內容。

behaviorYAML payload 項目範例適用內容
domain'+ .example.com' 寫法不正確;'+\.example.com' 也不是正確格式,標準寫法 '+ .' 同樣不可用。正確項目請見下方程式碼網域比對集合
ipcidr'192.168.0.0/16'IP 位址網段集合
classical'DOMAIN-SUFFIX,example.com'包含規則類型的項目

網域集合的簡潔寫法如下。+.example.com 表示比對根網域及其子網域,中間不留空格,也不需要反斜線:

payload:
  - '+.example.com'
  - 'api.example.net'

若使用 classical,同類內容應採用以下格式。規則集項目不必指定出口;出口由外層的 RULE-SET,集合名稱,策略 設定。

payload:
  - DOMAIN-SUFFIX,example.com
  - DOMAIN,api.example.net

副檔名不是判斷解析方式的依據。上文的 direct.txt 雖然以 .txt 結尾,內容仍是包含 payload 的 YAML,因此要設定為 format: yaml。只有在改用每行一個項目的純文字來源時,才應依來源格式使用 format: text。

例外規則與 DNS:避免中國大陸介面誤走代理

將特定例外規則放在集合之前

若某項服務因登入風控、內網存取或本機裝置探索而需要直連,請先從連線記錄找出實際請求的網域,再新增精確規則。不要因單一介面異常,就將整組境外網域改為直連。以下為語法範例;example.com 是保留作為說明用途的網域,實際使用時請換成連線記錄中的目標。

rules:
  - DOMAIN,api.example.com,DIRECT
  - DOMAIN-SUFFIX,example.com,PROXY
  - RULE-SET,overseas-domains,PROXY
  - RULE-SET,domestic-domains,DIRECT
  - MATCH,PROXY

依照這個順序,api.example.com 會先命中直連規則,其他 example.com 子網域則交由代理處理。這呈現的是先比對具體項目、再比對較廣範圍,而不是 DOMAIN 天生優先於 DOMAIN-SUFFIX;交換兩條規則的位置,結果也會跟著改變。

分流規則不等於 DNS 分流

GEOSITE,cn,DIRECT 決定連線出口,但不會直接指定由哪一台 DNS 伺服器查詢網域。DNS 上游的選擇應檢查 dns 中的相關設定,例如 nameserver 與 nameserver-policy。若啟用 respect-rules,讓 DNS 連線遵循路由規則,還應依照目前核心文件設定解析節點網域所需的 proxy-server-nameserver,避免形成解析依賴迴圈。

Fake-IP 會回傳合成位址,由核心維護網域與連線之間的對應;不能只看到合成 IP,就拿來判斷實際歸屬。redir-host 則更依賴實際解析結果。兩種模式都應先查看連線記錄中的網域、命中規則與最終出口,再判斷問題出在解析階段還是分流階段。

驗證與疑難排解:逐項檢查連線記錄

儲存設定後,先確認設定驗證及重新載入都成功,再測試新連線。既有的長連線可能繼續使用原本的出口;變更規則後,關閉相關連線或重新啟動測試應用程式,比反覆重新整理同一個頁面更有助於判斷。

  1. 檢查運作模式。確認目前使用 Rule 模式。在 Global 模式下看到的全域出口,不能用來驗證這份規則清單是否正確。
  2. 檢查流量入口。如果用戶端顯示的本機混合連接埠確實是 7890,可以使用下方指令明確指定代理進行測試。若連接埠不同,請使用介面顯示的實際值。
  3. 檢查比對結果。在用戶端的連線清單中,分別記錄目標網域、規則類型、規則負載、策略組與實際節點。命中 PROXY 不代表最後一定會使用遠端節點;該組也可能選到 DIRECT。
  4. 檢查提供器狀態。確認更新時間與項目數量。若記錄顯示下載逾時,請優先檢查遠端網址與下載連線;若出現解析錯誤,先確認檔案回傳的是 YAML、純文字還是 HTML。
  5. 檢查最終合併的設定。確認本機覆寫未被訂閱規則覆蓋、自訂規則位於兜底規則之前,且所有規則目標名稱都存在。
curl --proxy http://127.0.0.1:7890 --head https://www.baidu.com
curl --proxy http://127.0.0.1:7890 --head https://www.wikipedia.org

以上指令僅用來建立便於追蹤的 HTTP 代理連線,不代表這兩個網域在所有資料來源中都一定會命中某個集合。HTTP 狀態碼也無法單獨證明分流成功:伺服器可能回傳重新導向或拒絕存取,仍須搭配核心連線記錄確認出口。

常見狀況與處理順序

  • 中國大陸網站走代理:先確認是否命中 MATCH。若有,檢查網域是否收錄於直連集合;若沒有,檢查前置代理規則或集合重疊。
  • 境外網站顯示直連:檢查是否命中前面的網域例外規則或 GEOIP,CN,再確認代理組是否選到直連出口。
  • 瀏覽器正常,其他應用程式異常:確認該應用程式是否遵循系統代理,以及是否需要由 TUN 接管。不要一開始就認定是規則集缺少網域。
  • 規則更新後沒有變化:確認更新的是規則提供器,而不是節點訂閱;接著建立新連線再次測試,並確認用戶端是否仍載入另一份設定。

維護時保留一份精簡且明確的本機例外清單,再選擇 GeoSite 或遠端規則集作為主要分類來源。每次只修改一類規則,並記錄變更前後的命中結果。如此可分辨資料收錄、規則順序、DNS 解析與流量接管四種問題,避免不斷疊加集合來掩蓋真正原因。