適用情境:先確認核心與流量入口

若要讓台灣本地的辦公、影音及下載服務直連,並將海外服務交由指定代理策略組處理,就適合採用境內外分流。這裡的「境內外」是指規則資料庫對網域或 IP 的分類,並非根據網頁語言、公司註冊地或網域後綴直接判斷。海外服務也可能使用台灣本地 CDN,因此網域規則通常應排在 IP 地理規則之前。

本文完整範例適用於 Clash Meta,也就是現稱的 mihomo 核心。經典版 Clash 與不同分支對 GEOSITE、規則集格式及資料檔案的支援各不相同。請先在用戶端的「關於」或核心資訊頁面確認實際使用的核心,不要只憑用戶端名稱判斷。若載入時出現未知規則類型,應先確認相容性,而不是反覆調整縮排。

  • 執行模式:在用戶端的「代理」或「模式」頁面選擇「規則」。全域模式不會依照本文的 rules 清單逐條分流。
  • 流量入口:先透過系統代理測試瀏覽器;若要接管未遵循系統代理的應用程式,再另外檢查 TUN。啟用 TUN 並不能取代規則設定。
  • 策略組:下文使用名為 境外代理 的既有策略組。該組必須包含可用節點,並且確實存在於 proxy-groups 中。
  • 備份:請先匯出目前的設定檔。訂閱用戶建議優先使用用戶端提供的覆寫、擴充或合併功能,避免訂閱更新時覆蓋本機修改。

匹配順序:由上而下,符合第一條規則即生效

規則不會自動依照「越精確,優先級越高」排序。本文列出的常見規則會由清單頂端往下檢查,符合條件後便採用該條規則的目標。即使更精確的網域規則寫在後面,也無法覆蓋前面已匹配的寬泛規則。

rules:
  - DOMAIN,mail.example.com,DIRECT
  - DOMAIN-SUFFIX,example.com,境外代理
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,境外代理

在這段範例中,mail.example.com 會直連,www.example.com 則使用境外代理;兩者都不會再交由 GEOIP 判斷。example.com 是用來說明規則行為的保留範例網域,並非實際測試服務。

建議的排序層級

  1. 自行設定的精確例外,例如指定網域必須直連或必須走代理。
  2. 本機位址範圍,避免 NAS、路由器及區域網路服務經由境外代理連線。
  3. 明確指定的海外服務網域規則與規則集。
  4. 台灣本地域名集合,接著設定台灣本地 IP 地理規則。
  5. 最後放入 MATCH,處理未分類的流量。

GEOIP、GEOSITE 與 RULE-SET 的適用範圍

規則類型判斷依據常見寫法與用途
GEOIP目標 IP 所屬的地理分類GEOIP,CN,DIRECT,no-resolve,用來處理中國大陸 IP 流量。
GEOSITEGeoSite 資料庫中的網域集合GEOSITE,cn,DIRECT,依網域識別中國大陸服務。
RULE-SET指定 rule-provider 提供的規則RULE-SET,overseas-domains,境外代理,引用獨立維護的規則集合。

GEOIP:辨識 IP,不代表辨識整個服務

GEOIP,CN 會依據所使用的地理資料庫判斷目標位址。資料庫更新可能有所延遲,雲端服務和 CDN 也可能讓同一個網域解析到不同地區。明確需要走代理的服務,應優先使用網域規則,不要期待單一 GEOIP 規則就能涵蓋所有需求。

no-resolve 的意思是:不為了檢查這條 IP 規則而主動將網域解析成 IP。這並不代表全域停用 DNS。若連線已有實際目標 IP,仍可進行匹配;若尚無可用 IP,這條規則可能不會命中,並繼續套用後續規則。代理節點本身的位址解析及應用程式的解析功能仍須正常運作。

GEOSITE:需要 GeoSite 資料檔

GEOSITE,cn 需要核心能載入包含 cn 分類的 GeoSite 資料。不同發行版本可能已內建資料,也可能在首次使用時下載。若記錄顯示檔案遺失或找不到分類,請檢查核心的資料目錄、下載連線及資料來源,不要任意將 cn 改成網站網域。GEOSITE 的網域分類與 GEOIP 的 IP 分類使用不同資料。

RULE-SET:格式必須與 behavior 相符

規則集將規則內容與主設定檔分開,適合定期更新。behavior: domain 用於網域集合,ipcidr 用於 IP 網段集合,classical 則用於包含規則類型的傳統規則清單。YAML、純文字及 MRS 的解析方式也不相同;不能只更換 URL,卻保留不相符的 format 與 behavior。

設定實作:台灣本地直連,海外流量走代理

以下提供完整的 rule-providers 與 rules 區段,可合併至現有 mihomo 設定中,並保留原有節點、策略組及 DNS 設定。這不是可獨立執行的訂閱檔案。合併前,請將現有策略組命名為 境外代理,或將程式碼中每個相同名稱的目標改成實際使用的組名。

範例引用 Loyalsoldier 的 Clash 網域規則集 YAML 檔案:先處理海外集合,再處理台灣本地集合,最後由 GEOSITE 與 GEOIP 補充判斷。若網域重複,以清單中較前面的規則為準。如果只想維護一套台灣本地域名來源,可以刪除台灣本地 RULE-SET 或 GEOSITE 其中一項,並一併移除不再使用的 provider。

mode: rule

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,google.com,境外代理
  - DOMAIN-SUFFIX,github.com,境外代理
  - DOMAIN-SUFFIX,githubusercontent.com,境外代理
  - DOMAIN-SUFFIX,qq.com,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-CIDR,169.254.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,境外代理
  - RULE-SET,domestic-domains,DIRECT
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,境外代理

合併時請檢查三個位置

  • 頂層鍵只保留一份:若已有 rules:,請直接編輯原有清單,不要在檔案末尾新增第二個同名鍵。重複鍵可能導致錯誤,也可能讓前面的內容遭到覆蓋。
  • 名稱必須完全相符:RULE-SET 的第二個欄位必須對應 provider 名稱;最後一個欄位則必須是內建動作或已存在的策略組。請確認名稱、空格及大小寫都一致。
  • 保留實際需要的 IPv6 規則:若應用程式使用 IPv6,只設定 IPv4 的區域網路與公網規則並不足夠。請勿為了簡化排錯而任意停用系統網路功能。

更新規則集:區分訂閱、provider 與地理資料

interval: 86400 的單位是秒,也就是 24 小時。這個設定控制 HTTP rule-provider 的更新檢查,不會同時更新節點訂閱,也不會更新 GEOSITE 使用的資料檔。主設定檔、規則集及地理資料庫的更新都應分別檢查。

  1. 儲存並重新載入設定,先確認核心沒有 YAML 解析錯誤或找不到策略組的問題。
  2. 在用戶端的規則集頁面尋找 overseas-domains 與 domestic-domains。各用戶端的介面名稱可能不同;比起只確認開關,更應檢查項目數量、更新時間及錯誤記錄。
  3. 手動更新一次,確認下載成功。範例快取位置是核心工作目錄下的 ./ruleset/,並非固定的系統絕對路徑。
  4. 接著更新節點訂閱並重新載入,確認自訂規則仍然存在。若規則消失,請將修改移至用戶端提供的持久化覆寫功能。

首次啟動時,如果規則來源無法直連,而代理節點尚未就緒,可能因啟動相依性而無法下載規則集。請先還原可正常運作的基本設定,再下載規則集;若確認 mihomo 支援此欄位,也可為 HTTP provider 設定 proxy: 境外代理,透過現有策略組下載。該組應由已載入的節點提供連線,避免依賴尚未下載的資源而形成循環。

若要離線部署,可以預先儲存相應的 YAML 檔案,並將 provider 改為 type: file,保留正確的 path、behavior 與 format,並移除 HTTP 下載欄位。此時檔案須由本機自行維護,不會再按照 HTTP 更新間隔自動下載。

驗證分流:查看命中規則,不只確認網頁能否開啟

開啟用戶端的「連線」頁面,分別造訪一個明確設定為直連的網域及一個明確設定為代理的網域。檢查目標主機、命中規則、策略鏈及目標 IP。網頁成功載入只能表示請求有結果,不能證明流量經過預期路徑;在節點選擇器中選取節點,也不代表所有連線都會經過該節點。

使用固定入口,減少變數

如果目前設定的混合連接埠是 7890,可以在終端機執行以下指令。若連接埠不同,請依實際設定修改。此指令僅用於驗證 HTTP 請求,不會測試整個系統的 TUN 接管範圍,也不等同於網速測試。

curl -I --proxy http://127.0.0.1:7890 https://www.qq.com/
curl -I --proxy http://127.0.0.1:7890 https://github.com/

依照本文規則,第一個請求應命中 DOMAIN-SUFFIX,qq.com 並直連;第二個請求應命中 DOMAIN-SUFFIX,github.com,並進入境外代理組。伺服器可能回應重新導向,或拒絕 HEAD 請求;判斷分流結果仍應以用戶端的連線記錄為準。

常見偏差與處理方式

  • 總是命中 MATCH:確認網域是否出現在連線記錄中、provider 是否載入成功,以及 GEOSITE 分類是否可用。直接連線至 IP 的請求無法命中一般網域規則。
  • 修改後仍使用舊節點:既有的長連線可能繼續沿用原本的策略。請重新建立測試連線,再查看新的命中記錄;不要只重新整理仍在重複使用同一連線的應用程式視窗。
  • 海外服務被 GEOIP 設為直連:確認是否缺少服務網域規則,並將規則加在 GEOIP 之前。不要用單次解析結果代表整個服務。
  • 瀏覽器與其他應用程式的結果不同:檢查系統代理、應用程式內建代理、TUN 路由及瀏覽器安全 DNS。嗅探可在部分協定中協助還原網域,但無法保證從所有加密流量中取得網域。
  • fake-ip 情境下看到虛擬位址:這是 DNS 對應機制的一部分,核心通常會利用對應資料還原網域。不要將 fake-ip 位址池視為真實的海外位址,再加入代理 IP 清單。

維護順序:先處理小範圍例外,再擴充規則集

日常維護不必不斷新增相似規則。先保留「精確例外、網域集合、IP 補充、最終預設規則」這四個層級,再依據連線記錄處理實際問題。新增規則時,記錄適用網域、目標策略及新增原因;測試通過後再同步至其他裝置。

多裝置使用同一份訂閱,不代表所有核心都能解析相同設定。複製到其他裝置前,請確認是否支援 GEOSITE、IPv6、provider 格式及自訂覆寫功能。完整操作方式請參閱訂閱匯入教學;遇到連線路徑問題時,請檢查系統代理設定與連接埠說明。

完成驗收須符合三項條件:設定能正常載入,台灣本地與海外測試請求分別命中預期規則,規則集手動更新成功且訂閱更新後仍保留自訂內容。三項都通過後再套用到日常應用,比同時修改 DNS、TUN 及所有規則更容易找出問題。