Clash 規則分流實戰設定:國內外網站自動分流方案

以國內外分流情境為例,示範如何用規則集與策略組架設自動分流:中國大陸站點直連、境外服務走代理、廣告與追蹤網域直接拒絕。全文語法以 mihomo(Clash Meta)核心為準。

一、分流要解決什麼問題

不對流量加以區分時,Clash 只有兩種粗放的運作方式。全域代理(global)把所有連線都交給節點:存取中國大陸站點時繞道境外,延遲明顯拉高;影音與音樂服務因區域版權限制拒絕境外 IP;銀行、政府類站點對境外登入觸發風控。全域直連(direct)則相反,境外服務完全無法連上。

規則分流(rule)是第三種方式:核心依據設定檔中的 rules 清單,對每一個新連線的目標位址逐條判斷去向——中國大陸網域與 IP 直連,境外服務交給代理節點,已知的廣告與追蹤網域直接拒絕。設定一次即可長期生效,日常使用無需再手動切換模式。本文以一份可直接套用的設定為例,完整示範這套方案的架設過程。

二、規則比對的基本原理

rules 是一份有順序的清單。每個新連線進入核心時,從第一條規則開始往下比對,命中第一條符合條件的規則即停止,依該規則指定的出站方式處理;全部未命中時,由清單最後的 MATCH 規則兜底。由此可得兩條推論:

  • 順序即優先權。越具體、越需要優先判斷的規則放越前面;覆蓋範圍廣的規則(如 GEOIP,CN)放後面;MATCH 永遠放在最後。
  • 網域規則先於 IP 規則。連線帶有網域時,核心先用網域比對 DOMAIN、DOMAIN-SUFFIX、RULE-SET 等規則;全部未命中才解析出 IP,再繼續比對 IP-CIDR、GEOIP。為 IP 類規則加上 no-resolve 參數,可讓核心在尚未解析的階段直接跳過該規則,避免為了判斷規則而多發一次 DNS 查詢。

常用規則類型如下表:

規則類型寫法範例說明
DOMAINDOMAIN,www.example.com,節點選擇精確比對單一網域
DOMAIN-SUFFIXDOMAIN-SUFFIX,google.com,節點選擇比對該網域及其所有子網域
DOMAIN-KEYWORDDOMAIN-KEYWORD,google,節點選擇網域含有關鍵字即命中
RULE-SETRULE-SET,proxy,節點選擇引用 rule-providers 宣告的規則集
GEOSITEGEOSITE,cn,DIRECT依網域分類庫比對(mihomo 專屬)
IP-CIDRIP-CIDR,192.168.0.0/16,DIRECT,no-resolve比對 IP 位址範圍
GEOIPGEOIP,CN,DIRECT依 IP 所屬地區比對
MATCHMATCH,節點選擇兜底,比對剩下的所有連線
備註

RULE-SET 與 rule-providers 的寫法在原版 Clash Premium 中同樣成立;GEOSITE 為 mihomo 專屬,使用原版核心時須以 RULE-SET 規則集取代。

三、規劃策略組

分流方案中,每個連線只有三種去向:直連 DIRECT、拒絕 REJECT、交給某個代理節點。代理端通常整理成三個策略組:

  • 節點選擇(select 類型):列出所有可用節點,手動指定出口,作為多數規則的預設出站。
  • 自動選擇(url-test 類型):定時對組內節點測速,自動切換到延遲最低者;把它加進「節點選擇」的候選清單中,需要時可一鍵切換。
  • 廣告封鎖(select 類型):候選只有 REJECT 與 DIRECT。預設指向 REJECT;排查「某網站打不開是否為誤判」時,暫時切到 DIRECT 即可比對驗證。
proxy-groups:
  - name: 節點選擇
    type: select
    proxies:
      - 自動選擇
      - 香港節點
      - 日本節點
      - DIRECT

  - name: 自動選擇
    type: url-test
    proxies:
      - 香港節點
      - 日本節點
    url: http://www.gstatic.com/generate_204
    interval: 300

  - name: 廣告封鎖
    type: select
    proxies:
      - REJECT
      - DIRECT

策略組的名稱會原樣出現在 rules 裡,改名時兩處必須同步,否則規則會指向一個不存在的出站。

四、引入規則集

需要覆蓋的網域數以萬計,手寫規則不切實際。社群維護的規則集依用途整理成清單——廣告網域、中國大陸站點、境外常用服務、中國大陸 IP 範圍——由核心定時下載、本地快取。宣告方式是在設定檔頂層加入 rule-providers:

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

各欄位含義:

  • type:http 表示從遠端位址下載;file 表示讀取本地檔案。
  • behavior:classical 表示清單由經典規則(DOMAIN、DOMAIN-SUFFIX 等)組成;domain 表示純網域清單;ipcidr 表示純 IP 範圍清單。下載來源是哪種格式,這裡就填哪種,填錯會導致規則集載入失敗。
  • path:本地快取路徑。
  • interval:更新間隔,單位為秒;86400 即每天更新一次。

宣告之後,在 rules 裡以 RULE-SET,<名稱>,<出站> 引用。mihomo 使用者還有另一條路:核心內建 GEOSITE 與 GEOIP 資料庫,GEOSITE,cnGEOSITE,category-ads-allGEOIP,CN 等寫法無需 rule-providers 即可使用,代價是分類粒度由資料庫維護方決定。

本文範例使用 Loyalsoldier/clash-rules 專案的發布檔案,該專案依用途拆分的 reject(廣告)、direct(中國大陸)、proxy(境外)、cncidr(中國大陸 IP 範圍)等清單更新頻繁、引用廣泛;讀者也可換成任何可信來源,寫法不變。

五、完整設定範例

把上述部件拼起來,得到一份完整的國內外分流設定:

# 基本設定
mixed-port: 7890
allow-lan: false
mode: rule
log-level: info

# 內建 DNS:網域規則未命中時,解析結果用於 GEOIP 判斷
dns:
  enable: true
  ipv6: false
  default-nameserver:
    - 223.5.5.5
    - 119.29.29.29
  nameserver:
    - https://doh.pub/dns-query
    - https://dns.alidns.com/dns-query

# 策略組(見第三節)
proxy-groups:
  - name: 節點選擇
    type: select
    proxies:
      - 自動選擇
      - 香港節點
      - 日本節點
      - DIRECT
  - name: 自動選擇
    type: url-test
    proxies:
      - 香港節點
      - 日本節點
    url: http://www.gstatic.com/generate_204
    interval: 300
  - name: 廣告封鎖
    type: select
    proxies:
      - REJECT
      - DIRECT

# 遠端規則集(見第四節)
rule-providers:
  reject:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/reject.txt"
    path: ./ruleset/reject.yaml
    interval: 86400
  direct:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
    path: ./ruleset/direct.yaml
    interval: 86400
  proxy:
    type: http
    behavior: classical
    url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
    path: ./ruleset/proxy.yaml
    interval: 86400

# 分流規則:自上而下,命中即停
rules:
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - RULE-SET,reject,廣告封鎖
  - RULE-SET,direct,DIRECT
  - RULE-SET,proxy,節點選擇
  - GEOIP,CN,DIRECT
  - MATCH,節點選擇

規則段落的排列邏輯:

  1. 本機與區域網路位址直連,加上 no-resolve 避免不必要的解析。
  2. 廣告與追蹤網域交給「廣告封鎖」組,預設 REJECT。放在最前面,確保後續規則不會把它們放行。
  3. 中國大陸網域直連。
  4. 境外常用服務走「節點選擇」。
  5. 網域規則全部未命中的連線,解析出 IP 後依 GEOIP 判斷是否屬於中國大陸,是則直連。
  6. MATCH 兜底:其餘一律走代理。寧可讓少數中國大陸冷門站點繞路,也不讓境外流量漏成直連。

注意:proxies 一節(節點清單)中必須存在名為「香港節點」「日本節點」的節點,否則策略組引用會落空、設定載入失敗;實際使用時請換成自己訂閱裡的節點名稱。

六、驗證與常見錯誤

驗證分流是否生效

  1. 打開用戶端的連線面板(或 metacubexd、zashboard 等外部面板),每條連線都會標註命中的規則與出站鏈,例如 RULE-SET(direct) → DIRECT
  2. 分別存取一個中國大陸站點、一個境外站點、一個已知廣告網域,對照面板確認三者各歸其位。
  3. 存取境外站點時查詢出口 IP,顯示的應是節點所在地,而非本機寬頻 IP。

常見錯誤

  • 規則順序顛倒。GEOIP,CN 放得太靠前,會把本應走代理的境外子網域提前攔截;MATCH 寫在中間,其後的規則永遠不會生效。
  • 規則集下載失敗。rule-providers 的位址失效時,對應 RULE-SET 規則整體落空,日誌中可見錯誤訊息,須更換鏡像位址或改用 file 類型的本地規則集。
  • DNS 設定缺失。網域規則全部未命中時,核心依賴解析結果做 GEOIP 判斷;若系統 DNS 遭污染,境外網域可能解出錯誤 IP 而被誤判為直連。啟用核心內建 DNS(範例已含)可避免此問題。
  • 節點名稱不一致。proxy-groups 引用的節點名稱必須與 proxies 中的 name 逐字一致,包括空格與全半角差異。
訂閱使用者注意

機場訂閱檔通常已內建一套分流規則,直接編輯訂閱檔會在下次更新時被覆蓋。正確做法是使用用戶端的覆寫(Merge / Mixin)功能,或透過訂閱轉換服務在訂閱基礎上追加自訂規則與規則集。

下載Clash