Clash 規則分流實作:本機直連與海外代理的 rules、rule-providers 設定方式

整理常見分流情境,說明規則的由上而下比對順序、策略群組引用方式,以及 rule-providers 遠端規則集的管理方法,避免規則順序錯誤,讓流量走錯出口。

先確認分流範圍:規則模式、流量入口與出口

「本機直連、海外代理」可拆成三個動作:區域網路位址交由 DIRECT,明確指定的中國大陸網站依網域或 IP 歸屬直連,其餘連線則交由代理策略群組處理。這裡的「本機」包括路由器、NAS 和內網服務,與「中國大陸網站」並非同一類目標。先區分這兩者,才能避免連線公司內網時誤走遠端節點。

本文範例適用於 mihomo 核心。Clash Nyanpasu 是圖形介面用戶端,實際執行 rules 的是目前運作中的核心。舊版 Clash 對部分欄位的支援有所不同,尤其是下文使用的 include-all,請勿將 mihomo 設定直接套用到所有同名用戶端。

  • 代理模式:選擇「規則 / Rule」。全域模式不會依本文的一般分流清單選擇出口;直連模式也無法提供代理備援。
  • 流量入口:瀏覽器必須實際使用用戶端的代理連接埠,或由 TUN 接管流量。系統代理通常無法涵蓋所有應用程式。
  • 策略群組出口:規則命中代理群組,不代表已選取可用節點。還要確認群組內目前選取的項目。
  • 設定來源:確認目前啟用的是哪份訂閱,以及是否有覆寫或合併指令碼變更最終規則。

請先備份目前使用的設定。訂閱管理工具可能會在更新時重建設定,應透過用戶端支援的持久覆寫或合併機制保存自訂規則,並確認最終生效內容,而非只修改暫存的產生檔案。

rules 比對順序:具體例外優先,MATCH 放最後

一般的 rules 清單會由上往下檢查,首次命中後就採用對應策略,不會繼續尋找「更精確」的下一條規則。規則不會自動依網域長度或 IP 網段大小排序。例如,若將涵蓋整個網站的後綴規則放在前面,後續針對單一子網域設定的例外就沒有機會生效。

規則類型範例比對範圍
DOMAINDOMAIN,example.com,DIRECT只比對這個完整網域
DOMAIN-SUFFIXDOMAIN-SUFFIX,example.com,代理出口比對根網域及其子網域
IP-CIDRIP-CIDR,192.168.0.0/16,DIRECT,no-resolve比對目標 IPv4 網段
GEOIPGEOIP,CN,DIRECT依本機 IP 歸屬資料庫比對
MATCHMATCH,代理出口接管前面未命中的連線

如何讓網域例外優先於後綴規則

rules:
  - DOMAIN,example.com,DIRECT
  - DOMAIN-SUFFIX,example.com,代理出口
  - MATCH,代理出口

這組規則會讓 example.com 直連,www.example.com 走代理出口。若將兩行對調,根網域也會先命中後綴規則。這些保留用的示範網域只用來說明比對關係,不是需要加入設定的實際網站。

no-resolve 表示不為了這條 IP 規則主動將網域解析成 IP;這不代表禁止連線過程中的所有 DNS 查詢。如果連線本身已帶有目標 IP,規則仍可依該 IP 判斷。此選項適合用於區域網路網段規則,避免檢查內網位址時產生不必要的解析。

本機直連與海外代理:可供檢查的設定片段

以下片段用於合併至現有的 mihomo 設定,並非包含節點、DNS 和監聽連接埠的完整訂閱。請保留原有的 proxies 或 proxy-providers,再合併策略群組和規則;若已有同名頂層欄位,請編輯原欄位,不要重複新增另一個 rules:。

mode: rule

proxy-groups:
  - name: 代理出口
    type: select
    include-all: true
    proxies:
      - DIRECT

rules:
  # 個人例外:網域資訊可用時優先比對
  - DOMAIN-SUFFIX,home.arpa,DIRECT
  - DOMAIN-SUFFIX,lan,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

  # 中國大陸 IP 直連,其餘連線交由代理群組
  - GEOIP,CN,DIRECT
  - MATCH,代理出口

先選取節點,再確認代理結果

include-all: true 會讓這個 mihomo 策略群組納入現有節點,以及代理提供器中的節點。範例保留 DIRECT 作為可選項,套用後必須在「代理出口」群組內主動選取可用節點;若仍選取 DIRECT,即使記錄顯示命中 MATCH,最後仍會直連。若尚未匯入任何節點,這段設定不會憑空產生代理連線。

若原設定已有可用的策略群組,通常最簡單的做法是保留原群組,並將規則中的「代理出口」替換為該群組的正確名稱。名稱有大小寫之分,空格也算名稱的一部分。請勿為了套用範例而刪除訂閱內建的自動選擇群組。

這套基本分流的限制

  • GEOIP,CN 判斷的是目標 IP 在資料庫中的歸屬,不能據此推斷公司註冊地或頂級網域所代表的地區。
  • 中國大陸服務可能使用海外 CDN,海外服務也可能配置中國大陸 IP,因此需要網域規則集補充分流意圖。
  • GEOIP 需要可用的本機資料庫;若檔案遺失或載入失敗,應先排除問題,不能把規則載入失敗當成正常的備援情況。
  • 內網網域必須能正確解析。指定直連不會自動替用戶端設定企業 DNS,也不會自動找到 NAS。

此處的 GEOIP 規則沒有加上 no-resolve,必要時會解析網域,以判斷是否為中國大陸 IP。代價是部分連線會先觸發本機 DNS 查詢。若要嚴格控管網域解析路徑,應一併規劃 DNS 策略,而不是把「走代理出口」等同於「DNS 一定透過代理」。

rule-providers 設定方式:遠端規則集與行為類型

規則較多時,可以將網域清單移出主設定。rule-providers 用來定義規則集的來源、格式與更新方式,RULE-SET 則是在規則清單中引用規則集。只定義提供器卻沒有引用,並不會改變任何連線的出口。

以下使用公開的 Loyalsoldier 直連網域規則集示範 HTTP 提供器。這份清單是維護者整理的直連建議,並非嚴格的中國大陸地域範圍;採用前請確認涵蓋內容符合自身業務需求。此網址僅供核心依設定取得規則,網頁不會自動存取。

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

interval: 86400 的單位是秒,也就是每 24 小時檢查一次更新。path 是核心工作目錄下的本機快取檔案位置,並非相對於目前網頁的位置。首次載入時必須能取得遠端內容,或已有可用快取;不要假設下載失敗後一定會略過規則並繼續啟動。

將規則集接到正確的位置

保留上一節的個人例外和區域網路規則,在這些規則之後、GEOIP 之前插入下方這一行。此處只展示清單末段,請勿直接覆蓋並刪除前面的內網規則。

  - RULE-SET,direct-domains,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,代理出口

建議順序為「個人例外 → 區域網路 → 直連網域集 → 中國大陸 IP → 代理備援」。若某個網域已列入直連清單,但你希望它走代理,請在 RULE-SET 之前新增明確的網域代理規則。將例外放在 MATCH 之後永遠不會生效。

behavior 必須與檔案內容相符

behaviorYAML payload 項目範例適用內容
domain'+ .example.com' 去掉加號後的空格,也就是 '+. 網域格式純網域規則集,支援其定義的萬用字元語法
ipcidr'192.168.0.0/16'IP 網段集合
classical'DOMAIN-SUFFIX,example.com'包含規則類型的傳統規則集

例如,使用本機 behavior: domain、format: yaml 的檔案可寫成下列形式。這裡的 +.example.com 會比對根網域及其子網域,請勿誤寫成一般 rules 中的完整三段式格式。

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

classical 內容則要寫成 DOMAIN-SUFFIX,example.com 這類比對條件,不要在每個 payload 項目末尾加上 DIRECT;使用哪個策略由外層的 RULE-SET,規則集名稱,策略 指定。副檔名不代表實際格式:上方的遠端網址雖以 .txt 結尾,內容仍是 YAML payload。

用三種連線測試:內網、中國大陸網站、代理備援

設定儲存成功只代表編輯完成,不表示新規則已接管連線。重新載入後,先在用戶端的設定頁面確認目前啟用的項目,再查看連線清單與核心記錄。不同版本的頁面名稱可能不同,請以「查看連線命中的規則及完整出口鏈」為目標,而不是只看模式按鈕。

  1. 測試區域網路:若路由器的實際位址是 192.168.1.1,請透過代理入口存取,預期會命中 192.168.0.0/16 並顯示 DIRECT。不要假設所有家庭網路都使用這個閘道。
  2. 測試中國大陸網站:建立一筆新的網站連線,確認是否命中 direct-domains 或 GEOIP CN。若命中 MATCH,先確認目標網域是否列在清單中,再核對解析出的 IP 歸屬。
  3. 測試代理備援:造訪未列入直連集合的海外網站,預期會命中 MATCH,出口鏈應繼續指向選取的實際節點,而非停在 DIRECT。
  4. 測試例外:為指定的精確網域新增一條暫時規則並放在最前面,重新建立連線,確認它確實在規則集之前命中;測試後刪除不需要保留的暫時項目。

用 curl 確認流量經過哪個代理連接埠

若實際設定為 mixed-port: 7890,可使用下列指令建立一筆明確經過 HTTP 代理入口的連線。連接埠請以目前生效的設定為準,7890 並非所有安裝環境的固定值;在 Windows PowerShell 中可使用 curl.exe,避免命令別名造成差異。

curl --proxy http://127.0.0.1:7890 --connect-timeout 10 -I https://example.com/

此指令用來確認流量確實經過本機入口,不能用來證明某個網站一定應走代理。請在連線清單中比對請求時間、目標網域、命中規則和出口鏈這四項資訊。若入口只支援 SOCKS,請使用相應連接埠;socks5h:// 可將網域交由代理端處理,避免測試工具先在本機解析而影響觀察結果。

變更規則通常不會讓已建立的 TCP 連線重新選擇出口。瀏覽器連線池、HTTP/2 和 QUIC 都可能重用工作階段;測試前請關閉相關舊連線,再發出新請求,否則容易誤以為「規則沒有生效」。

分流無效時的逐項排查

命中代理群組,連線卻仍然直連

先展開查看策略群組的最終出口。手動選擇群組可能選到 DIRECT,也可能巢狀包含另一個選擇群組,而該群組最後仍選到 DIRECT。只有完整鏈路顯示實際代理節點,才能確認連線已交由該節點處理;群組名稱叫做「代理出口」並不會強制使用代理。

設定可儲存,遠端規則集卻無法使用

檢查記錄中的提供器名稱、HTTP 狀態碼和解析錯誤。狀態碼 403 表示伺服器拒絕請求,404 通常代表路徑或分支不正確;若回傳的是 HTML 錯誤頁,即使 HTTP 請求已完成,也不代表取得了有效規則。請勿將訂閱代理節點的 URL 填入規則提供器,兩者的資料結構不同。

瀏覽器正常,遊戲或命令列程式卻不遵循規則

先確認連線清單中是否有對應連線。若沒有記錄,應優先檢查應用程式是否使用系統代理、是否自行直連,或 TUN 是否確實接管該流量。TUN 的作用是擴大流量入口範圍,不會自動修正 rules 順序;UDP 流量還需要入口、核心及節點鏈路共同支援。

IP 可直連,內網網域卻無法開啟

通常需要檢查網域解析。printer.home.arpa 是否有路由器或企業 DNS 提供的記錄?應用程式使用系統解析器,還是自行使用加密 DNS?若網域未取得正確的內網 IP,新增 DIRECT 規則無法修復解析問題。另外請注意,.local 常與 mDNS 有關,不宜將它簡單視為一般單播 DNS 後綴。

訂閱更新後,自訂規則消失

確認修改是否寫入可持續保存的覆寫層,並檢查合併規則:有些處理方式會附加陣列,有些則會替換整個陣列。若自訂規則被加在原有 MATCH 之後,雖然內容還在,實際上仍不會命中。每次更新後至少檢查清單開頭、RULE-SET 引用和最後一條 MATCH。

維護分流時,建議保留少量容易理解的例外,將大量網域交由來源明確的規則集處理,再透過連線記錄驗證結果。更多基本設定請參閱使用指南;若要確認 DNS、TUN 與核心參數之間的關係,可接著查看技術參考。規則越多不代表越準確,入口、順序和最終出口一致,才是穩定分流的基礎。

下載 Clash 用戶端