Clash 規則分流實作:本機直連與海外代理的 rules、rule-providers 設定方式
整理常見分流情境,說明規則的由上而下比對順序、策略群組引用方式,以及 rule-providers 遠端規則集的管理方法,避免規則順序錯誤,讓流量走錯出口。
先確認分流範圍:規則模式、流量入口與出口
「本機直連、海外代理」可拆成三個動作:區域網路位址交由 DIRECT,明確指定的中國大陸網站依網域或 IP 歸屬直連,其餘連線則交由代理策略群組處理。這裡的「本機」包括路由器、NAS 和內網服務,與「中國大陸網站」並非同一類目標。先區分這兩者,才能避免連線公司內網時誤走遠端節點。
本文範例適用於 mihomo 核心。Clash Nyanpasu 是圖形介面用戶端,實際執行 rules 的是目前運作中的核心。舊版 Clash 對部分欄位的支援有所不同,尤其是下文使用的 include-all,請勿將 mihomo 設定直接套用到所有同名用戶端。
- 代理模式:選擇「規則 / Rule」。全域模式不會依本文的一般分流清單選擇出口;直連模式也無法提供代理備援。
- 流量入口:瀏覽器必須實際使用用戶端的代理連接埠,或由 TUN 接管流量。系統代理通常無法涵蓋所有應用程式。
- 策略群組出口:規則命中代理群組,不代表已選取可用節點。還要確認群組內目前選取的項目。
- 設定來源:確認目前啟用的是哪份訂閱,以及是否有覆寫或合併指令碼變更最終規則。
請先備份目前使用的設定。訂閱管理工具可能會在更新時重建設定,應透過用戶端支援的持久覆寫或合併機制保存自訂規則,並確認最終生效內容,而非只修改暫存的產生檔案。
rules 比對順序:具體例外優先,MATCH 放最後
一般的 rules 清單會由上往下檢查,首次命中後就採用對應策略,不會繼續尋找「更精確」的下一條規則。規則不會自動依網域長度或 IP 網段大小排序。例如,若將涵蓋整個網站的後綴規則放在前面,後續針對單一子網域設定的例外就沒有機會生效。
| 規則類型 | 範例 | 比對範圍 |
|---|---|---|
| DOMAIN | DOMAIN,example.com,DIRECT | 只比對這個完整網域 |
| DOMAIN-SUFFIX | DOMAIN-SUFFIX,example.com,代理出口 | 比對根網域及其子網域 |
| IP-CIDR | IP-CIDR,192.168.0.0/16,DIRECT,no-resolve | 比對目標 IPv4 網段 |
| GEOIP | GEOIP,CN,DIRECT | 依本機 IP 歸屬資料庫比對 |
| MATCH | MATCH,代理出口 | 接管前面未命中的連線 |
如何讓網域例外優先於後綴規則
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 必須與檔案內容相符
| behavior | YAML 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。
用三種連線測試:內網、中國大陸網站、代理備援
設定儲存成功只代表編輯完成,不表示新規則已接管連線。重新載入後,先在用戶端的設定頁面確認目前啟用的項目,再查看連線清單與核心記錄。不同版本的頁面名稱可能不同,請以「查看連線命中的規則及完整出口鏈」為目標,而不是只看模式按鈕。
- 測試區域網路:若路由器的實際位址是
192.168.1.1,請透過代理入口存取,預期會命中192.168.0.0/16並顯示 DIRECT。不要假設所有家庭網路都使用這個閘道。 - 測試中國大陸網站:建立一筆新的網站連線,確認是否命中 direct-domains 或 GEOIP CN。若命中 MATCH,先確認目標網域是否列在清單中,再核對解析出的 IP 歸屬。
- 測試代理備援:造訪未列入直連集合的海外網站,預期會命中 MATCH,出口鏈應繼續指向選取的實際節點,而非停在 DIRECT。
- 測試例外:為指定的精確網域新增一條暫時規則並放在最前面,重新建立連線,確認它確實在規則集之前命中;測試後刪除不需要保留的暫時項目。
用 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 與核心參數之間的關係,可接著查看技術參考。規則越多不代表越準確,入口、順序和最終出口一致,才是穩定分流的基礎。