為什麼要做規則分流
規則分流的核心目的很簡單:讓存取中國大陸內網站的流量走本地直連,讓存取海外站點的流量走代理節點,兩條路徑互不干擾。直連的好處是延遲低、不佔用節點頻寬;代理節點的好處是能夠存取被限制或速度較差的海外資源。如果不做分流,全域模式下所有流量都走代理,不僅存取本地網站會繞一圈增加延遲,還會佔用節點上行頻寬,遇到高峰期服務商限速時體驗更差。
要實現分流,需要理解 Clash(及其核心實作 Clash Meta / mihomo)設定檔裡兩個互相配合的部分:proxy-groups 定義「有哪些可選的出口策略」,rules 定義「什麼樣的流量應該走哪個策略」。規則本身不選節點,策略群組才選節點;規則只是把流量指派給某個策略群組,再由策略群組內部的選擇邏輯決定具體走哪條線路。這個分層關係是理解後面所有設定的前提。
proxy-groups 怎麼寫
一個策略群組本質上是若干代理節點(或其他策略群組)的集合,加上一種選擇方式。常用的 type 有三種:
- select:手動選擇,客戶端介面上會顯示一個下拉選單,使用者點哪個就走哪個,不自動切換。
- url-test:自動測速,按
url和interval定期探測組內節點延遲,自動選用最快的一個。 - fallback:故障轉移,按節點清單順序嘗試,目前節點不可用時自動切到下一個。
一個典型的地區分流情境至少需要三個策略群組:一個給「海外流量」用的自動測速組,一個固定的 DIRECT(直連,核心內建,不用自己定義節點),再加一個兜底的手動選擇組。範例:
proxy-groups:
- name: 節點選擇
type: select
proxies:
- 自動選優
- DIRECT
- name: 自動選優
type: url-test
proxies:
- HK-01
- HK-02
- SG-01
- JP-01
url: http://www.gstatic.com/generate_204
interval: 300
tolerance: 50
- name: 本地直連
type: select
proxies:
- DIRECT
- 節點選擇
其中 HK-01 等名稱需要與訂閱解析出來的實際節點名一致,通常在客戶端匯入訂閱後可以直接在節點清單裡看到真實名稱,再據此調整策略群組裡的 proxies 欄位。url 是測速請求的目標位址,interval 是測速間隔(單位秒),tolerance 是切換容差,延遲差在容差範圍內不會頻繁切換節點。
rules 規則類型與比對順序
規則是按從上到下的順序逐條比對的,一旦某條規則比對成功就立即生效,後面的規則不再檢查。這意味著規則的排列順序直接決定分流結果,寫反順序是最常見的翻車原因。常用的規則類型有:
- DOMAIN-SUFFIX:按網域後綴比對,例如
DOMAIN-SUFFIX,taobao.com比對該網域及其所有子網域。 - DOMAIN-KEYWORD:按網域關鍵字比對,寫法更寬鬆,容易誤傷,建議只在明確知道關鍵字唯一性時使用。
- DOMAIN:精確比對單一網域,不含子網域。
- GEOIP:按目標 IP 所屬國家/地區比對,例如
GEOIP,CN,DIRECT表示目標 IP 判定為中國大陸時直連。GEOIP 比對依賴內建或外部的 IP 地理資料庫,資料庫版本較舊時可能出現誤判,建議定期讓客戶端更新地理資料庫檔案。 - IP-CIDR / IP-CIDR6:按 IP 段比對,常用於內部網路位址、區域網路位址的直連處理。
- MATCH:兜底規則,放在規則清單最後一行,比對所有未被前面規則命中的流量。
規則的寫法統一為 類型,比對內容,目標策略 三段式,用逗號分隔。一份完整的規則清單大致結構如下:
rules:
- DOMAIN-SUFFIX,cn,DIRECT
- DOMAIN-KEYWORD,baidu,DIRECT
- DOMAIN-SUFFIX,taobao.com,DIRECT
- IP-CIDR,192.168.0.0/16,DIRECT
- IP-CIDR,10.0.0.0/8,DIRECT
- GEOIP,CN,本地直連
- MATCH,節點選擇
這份規則的讀法是:先排除掉明確屬於中國大陸的網域和區域網路位址,把它們交給 DIRECT;剩下的 IP 如果判定歸屬中國大陸,交給「本地直連」策略群組(內部還是走 DIRECT,但留了手動切換的餘地);最後所有沒被前面命中的流量,統一交給「節點選擇」這個自動測速組去處理海外存取。
順序錯誤是最常見的坑:如果把 MATCH,節點選擇 放在中間,後面所有針對中國大陸網域的規則都不會再被檢查,因為 MATCH 會攔截掉它之後遇到的每一條流量判斷。MATCH 永遠只能放在規則清單最後一行。
給串流媒體單獨建一個策略群組
很多使用者希望串流媒體走固定的某幾個節點(例如專門標註解鎖的節點),而不是跟著「自動選優」組一起被測速切換,這樣可以避免看影片時突然切換節點導致卡頓重新緩衝。做法是新增一個專用策略群組,並在規則裡把對應網域單獨指派過去,同時要把這條規則寫在通用規則之前:
proxy-groups:
- name: 串流媒體
type: select
proxies:
- HK-01
- SG-01
- 自動選優
rules:
- DOMAIN-SUFFIX,netflix.com,串流媒體
- DOMAIN-SUFFIX,nflxvideo.net,串流媒體
- DOMAIN-SUFFIX,disneyplus.com,串流媒體
- DOMAIN-SUFFIX,cn,DIRECT
- GEOIP,CN,本地直連
- MATCH,節點選擇
這裡的關鍵點是:串流媒體相關的網域規則必須放在 MATCH 之前,並且最好放在其他通用規則之前,避免被更靠前的寬泛規則(例如某條 DOMAIN-KEYWORD)提前攔截。規則清單裡越具體、越需要精確控制的條目,越應該往前放;越籠統的兜底規則,越應該往後放。
如果同時使用規則集(rule-provider)形式的網域清單來維護串流媒體網域,原理是一樣的,只是把逐條 DOMAIN-SUFFIX 換成了引用一個遠端或本地維護的規則集檔案,寫法上多了一個 rule-providers 欄位和對應的 RULE-SET 規則類型,但比對順序的邏輯完全不變。
規則模式與全域模式的差異
客戶端介面通常提供三種運作模式的切換,理解它們和上面設定的關係很重要:
- 規則模式(Rule):嚴格按照
rules清單逐條比對,是本文講的預設運作方式。 - 全域模式(Global):忽略所有
rules,所有流量統一走某一個手動選定的節點,適合臨時測試某個節點是否可用,不適合長期使用。 - 直連模式(Direct):忽略所有
rules,所有流量直連,不經過任何代理節點,適合臨時排查代理是否影響某個連線問題。
日常使用應固定在規則模式,只有排查問題時才短暫切到全域或直連模式做對照測試,測試完記得切回來,否則規則分流的效果不會生效。
寫完規則之後如何自查
- 儲存設定後,在客戶端裡選擇重新載入設定(不同客戶端叫法可能是「重載」或「重新整理」),避免因為編輯器快取導致規則沒有真正生效。
- 開啟客戶端自帶的連線紀錄或流量面板,存取一個已知的中國大陸網站,確認命中的規則和最終策略是 DIRECT。
- 再存取一個已知的海外網站,確認命中的規則落在預期的策略群組上,且該策略群組目前選中的節點狀態正常。
- 如果發現某個網域走錯了策略,回頭檢查這條網域規則是否被排在它前面的某條更寬泛規則(尤其是 DOMAIN-KEYWORD)提前攔截。
- GEOIP 判斷異常時,檢查客戶端裡地理資料庫檔案的更新時間,過舊的資料庫會導致部分 IP 歸屬判斷不準確。
規則分流不是一次寫完就不用管的東西,隨著存取的網站變化、節點的增減,策略群組的節點清單和部分網域規則可能需要陸續微調。養成先看紀錄再改規則的習慣,比憑感覺猜測更容易定位問題所在。
如果不想手寫全部規則,大多數服務商或社群維護的規則集(例如按中國大陸直連、區域網路直連、常見服務分類整理好的規則檔案)可以透過 rule-providers 引用,減少手動維護的網域條目數量,同時仍然保留自訂規則優先命中的能力。