進階設定 預計閱讀 14 分鐘

Clash 規則分流設定實戰:中國大陸直連、海外流量走代理的 rules 寫法與代理群組設計

以實際 rules 語法解析 DOMAIN-SUFFIX、GEOIP、RULE-SET 的比對順序,整理中國大陸直連、海外代理與廣告拒絕的設定與排錯重點。

先確認規則分流的執行模型

Clash 與 Clash Meta(mihomo)的規則系統會依照清單順序由上到下比對。連線命中第一條符合條件的規則後,後續規則便不再判斷。因此,設定結果不只取決於寫了哪些規則,也取決於每條規則的排列位置。

典型的中國大陸直連、海外代理設定,可以按照「局部例外優先、寬泛規則靠後」的順序編排:先處理區域網路與必須直連的網域,再處理拒絕規則和指定代理網域,接著比對中國大陸網域、中國大陸 IP,最後用 MATCH 接住未命中的流量。

rules:
  - DOMAIN,router.asus.com,DIRECT
  - DOMAIN-SUFFIX,qq.com,DIRECT
  - DOMAIN-SUFFIX,bilibili.com,DIRECT
  - DOMAIN-SUFFIX,github.com,海外代理
  - GEOIP,CN,DIRECT
  - MATCH,海外代理

存取 www.qq.com 會命中 DOMAIN-SUFFIX,qq.com,DIRECT;存取 GitHub 會進入「海外代理」群組;解析後屬於中國大陸位址的其他連線會由 GEOIP,CN,DIRECT 接手;剩餘流量最後交給「海外代理」。

三類動作分別代表什麼

  • DIRECT:連線直接從本機或目前的閘道器發出,不經過代理節點。
  • REJECT:由核心拒絕連線,適合已確認的廣告網域、追蹤網域或不需要存取的目標。
  • 代理群組名稱:將連線交給指定群組,例如「海外代理」、「自動選擇」或「故障轉移」。群組內再決定實際使用的節點。

規則的第三段必須與代理群組名稱完全一致,包括中文、空格與大小寫。若規則寫成 海外代理,而 proxy-groups 中的實際名稱是 海外節點,核心驗證時通常會提示代理群組不存在。

DOMAIN、DOMAIN-SUFFIX 與 DOMAIN-KEYWORD 怎麼選

網域規則通常比 IP 規則更直觀,也更適合處理站點層級的分流。選擇規則類型時,應盡量使用界線明確的比對方式,避免一個短關鍵字影響大量無關網域。

規則類型 比對範圍 適用情境
DOMAIN 只比對完整網域 單獨處理某個 API、下載網域或內網主機
DOMAIN-SUFFIX 比對主網域及其子網域 處理同一網站旗下的大部分服務
DOMAIN-KEYWORD 網域中包含指定字串 網域規律明確、無法用後綴概括的少數情境
rules:
  - DOMAIN,api.example.net,海外代理
  - DOMAIN-SUFFIX,example.org,海外代理
  - DOMAIN-KEYWORD,cdnvideo,海外代理

DOMAIN,api.example.net 只會比對這個完整主機名稱,不會自動比對 www.example.netDOMAIN-SUFFIX,example.org 可以比對 example.orgwww.example.orgstatic.example.org。相較之下,DOMAIN-KEYWORD 的涵蓋範圍難以直接掌握,應限制使用數量。

局部例外必須放在寬泛後綴之前

如果同一網站的大部分請求需要代理,但下載伺服器需要直連,可以先寫完整網域例外,再寫網域後綴:

rules:
  - DOMAIN,download.example.org,DIRECT
  - DOMAIN-SUFFIX,example.org,海外代理
  - MATCH,海外代理

交換這兩條規則後,download.example.org 會先被後綴規則命中,直連例外便不會生效。這是修改 rules 後「規則明明存在,實際卻沒有執行」的常見原因。

用代理群組分開手動選擇、測速與故障轉移

rules 負責決定流量進入哪個策略,proxy-groups 負責決定策略使用哪個節點。把節點名稱直接寫進大量規則雖然可以運作,但節點更新或重新命名後需要逐條修改。更穩定的方式是讓規則統一指向代理群組,再由代理群組管理節點。

proxy-groups:
  - name: 海外代理
    type: select
    proxies:
      - 自動選擇
      - 故障轉移
      - 香港節點 A
      - 新加坡節點 A
      - DIRECT

  - name: 自動選擇
    type: url-test
    proxies:
      - 香港節點 A
      - 新加坡節點 A
      - 日本節點 A
    url: https://www.gstatic.com/generate_204
    interval: 300
    tolerance: 50

  - name: 故障轉移
    type: fallback
    proxies:
      - 香港節點 A
      - 新加坡節點 A
      - 日本節點 A
    url: https://www.gstatic.com/generate_204
    interval: 300

select、url-test 與 fallback 的差異

  • select:由使用者手動選擇群組內項目。適合作為 rules 最終引用的總入口。
  • url-test:定期測試群組內節點,選擇延遲較低的可用項目。範例每 300 秒測試一次,tolerance: 50 表示延遲差距小於 50 毫秒時減少頻繁切換。
  • fallback:依照清單順序使用第一個可用節點。它更重視固定優先順序,而不是單純追求最低延遲。

延遲測試網址應回傳體積小且狀態穩定的回應。一次測速只能說明探測網址的往返時間,不能直接代表影片吞吐量或所有網站的連線品質。實際選擇節點時,還應觀察 5 至 10 分鐘內的連線失敗率、頁面首個封包時間與下載速度。

中國大陸直連與海外代理的完整 rules 順序

只使用 GEOIP,CN,DIRECT 並不能涵蓋所有中國大陸服務。GEOIP 會依目標 IP 所屬區域判斷,只有連線進入 IP 比對階段後才能發揮作用。部分網站使用跨境 CDN、全球 Anycast 或境外位址,即使服務面向中國大陸使用者,也可能不屬於 CN 位址庫。因此,常用的中國大陸網域規則通常應放在 GEOIP 之前。

rules:
  # 區域網路與保留位址
  - 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

  # 明確的網域動作
  - DOMAIN-SUFFIX,qq.com,DIRECT
  - DOMAIN-SUFFIX,weixin.qq.com,DIRECT
  - DOMAIN-SUFFIX,bilibili.com,DIRECT
  - DOMAIN-SUFFIX,github.com,海外代理
  - DOMAIN-SUFFIX,githubusercontent.com,海外代理

  # IP 區域與最終兜底
  - GEOIP,CN,DIRECT
  - MATCH,海外代理

no-resolve 用於告知核心:執行這條 IP 規則時,不要只為了比對規則而額外觸發網域解析。它適合已取得目標 IP 的連線和區域網路網段規則,但不能取代正常的 DNS 設定。對於依賴網域判斷的請求,仍需確保 Clash DNS 模組能穩定取得結果。

為什麼區域網路規則要放在前面

印表機、NAS、路由器管理頁面和區域網路開發服務通常使用 10.0.0.0/8172.16.0.0/12192.168.0.0/16。如果這些位址被兜底規則送進遠端代理,連線往往會逾時。TUN 模式會接管更廣泛的系統流量,因此更需要明確保留私有位址直連。

若企業內網使用自訂網段,還要追加實際網段。例如辦公網路服務位於 100.64.20.0/24,可以增加 IP-CIDR,100.64.20.0/24,DIRECT,no-resolve。注意 100.64.0.0/10 也常用於電信商級 NAT,不了解網路結構時,不應直接擴大直連範圍。

RULE-SET:將大量規則拆成獨立檔案

當網域達到數百或數千條時,直接維護主設定會變得困難。mihomo 支援透過 rule-providers 載入規則集合,再在 rules 中使用 RULE-SET 引用。如此可以分別管理廣告拒絕、中國大陸網域、代理網域與私有網路。

rule-providers:
  reject-domain:
    type: file
    behavior: domain
    format: yaml
    path: ./ruleset/reject-domain.yaml

  domestic-domain:
    type: file
    behavior: domain
    format: yaml
    path: ./ruleset/domestic-domain.yaml

rules:
  - RULE-SET,reject-domain,REJECT
  - RULE-SET,domestic-domain,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,海外代理

對應的 domain 類型規則檔案可以使用 payload 清單。以下內容用於說明格式,實際部署時應替換為經過檢查的網域集合:

payload:
  - '+.ads.example.test'
  - '+.tracker.example.test'
  - 'metrics.example.test'

behavior: domain 適合網域集合;behavior: ipcidr 適合 IPv4、IPv6 網段;behavior: classical 可以容納帶有規則類型的傳統條目。behavior 必須與規則檔案內容相符,將 IP 網段放入 domain 集合會導致載入失敗或無法比對。

遠端規則集的更新策略

使用 HTTP 類型 provider 時,通常需要提供 url、本地快取 path 和更新間隔 interval。例如設定 interval: 86400,代表每 86400 秒檢查一次更新。規則來源短時間無法存取時,核心通常會繼續使用已快取的檔案;首次啟動且本地沒有快取時,則可能無法完成載入。

廣告拒絕規則應放在中國大陸直連集合之前,否則同時存在於兩個集合中的網域會先命中 DIRECT。對登入、付款、驗證碼、媒體播放等關鍵請求,不宜只根據網域中出現 adtrack 等字串就直接拒絕。發生頁面元件缺失時,應先在連線記錄中找出被 REJECT 的主機,再新增精確的放行規則。

rules:
  - DOMAIN,login.example.test,DIRECT
  - RULE-SET,reject-domain,REJECT
  - RULE-SET,domestic-domain,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,海外代理

DNS、TUN 模式與規則結果的關係

系統代理模式主要接管遵循 HTTP 或 SOCKS 代理設定的應用程式;TUN 模式則透過虛擬網卡接管更多 TCP、UDP 流量。兩種模式最終都可以使用同一套 rules,但 DNS 解析路徑和流量涵蓋範圍不同。

fake-ip 模式下看到保留位址是否正常

啟用 enhanced-mode: fake-ip 後,客戶端可能先向應用程式回傳 198.18.0.0/15 範圍內的映射位址,再由核心根據原始網域執行規則。這不代表目標網站實際位於該網段。排查時應查看連線詳情中的 Host、Rule 與 Rule Payload,而不是只根據應用程式顯示的目標 IP 判斷。

dns:
  enable: true
  listen: 0.0.0.0:1053
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  fallback:
    - tls://1.1.1.1:853
    - tls://8.8.8.8:853

範例將 Clash DNS 監聽在 1053 連接埠,避免與本機既有的 53 連接埠服務直接衝突。具體客戶端通常會自動管理監聽位址與 DNS 劫持,不應在不了解其覆寫邏輯時,同時修改圖形介面和訂閱原始檔案。

TUN 開啟後無法存取區域網路

先確認私有網段 DIRECT 規則是否位於 MATCH 之前,再檢查 TUN 的路由排除項目、嚴格路由設定和 DNS 劫持。mihomo 設定常見的 DNS 劫持寫法包括 any:53,目的是將進入 TUN 的 53 連接埠查詢交給核心處理。若本機同時執行 AdGuard Home、systemd-resolved 或企業 VPN DNS,應避免多個服務爭用相同連接埠。

設定驗證、命中檢查與常見錯誤

完成修改後,先進行語法驗證,再重新載入設定。mihomo 1.19.x 可以在命令列中使用設定目錄執行測試;不同安裝方式的二進位檔名稱和目錄可能不同:

mihomo -t -d /etc/mihomo

測試通過後,在客戶端執行「設定」→「重新載入」,或在伺服器端執行對應的重新啟動命令。部分桌面客戶端會將設定目錄入口放在「設定」→「設定目錄」。訂閱設定重新更新時,直接編輯的檔案可能被覆蓋,長期自訂規則應放入客戶端支援的覆寫、合併設定或獨立維護的 provider 檔案中。

規則未命中的排查順序

  1. 在連線頁面找到目標網域,記錄實際命中的 Rule 與策略群組。
  2. 檢查目標網域是否經過 CNAME 跳轉,實際連線主機可能與瀏覽器網址列不同。
  3. 搜尋 rules 上方是否已有更寬泛的 DOMAIN-SUFFIX、RULE-SET 或 GEOIP 規則。
  4. 確認規則引用的代理群組名稱與 proxy-groups 完全一致。
  5. 重新載入設定,並確認目前啟用的是修改後的設定檔。
  6. 清除應用程式本身的 DNS 快取或中斷舊連線,再發起一次新的請求。

中國大陸網站仍然走代理

先查看它是否在 GEOIP 之前命中了代理規則集。若沒有網域規則,檢查目標 IP 是否被識別為 CN。使用全球 CDN 的網站可能解析到境外位址,應為其主要業務網域增加 DOMAIN-SUFFIX 直連規則,而不是擴大 GEOIP 或 IP-CIDR 範圍。

海外網站間歇性直連

檢查是否存在過寬的中國大陸網域集合、關鍵字規則或自訂 IP 直連網段。還要確認瀏覽器是否啟用了獨立安全 DNS;當網域解析和連線由不同軟體接管時,記錄可能缺少預期的網域資訊。排查階段可暫時統一由 Clash DNS 處理,再逐項恢復其他 DNS 設定。

代理群組有節點但顯示不可用

分別測試節點本身與健康檢查網址。若所有節點恰好同時失敗,可能是測試網址受到目前網路限制,而不是所有節點都失效。可以更換為穩定且回應較小的網址,並將測試間隔維持在 300 至 600 秒,避免過於頻繁的探測增加連線數量。

一份可維護的分流設定應具備什麼

穩定的規則設定不以條目數量為目標,而是維持清楚的優先順序:私有網路和精確例外在前,拒絕集合與業務網域接續處理,中國大陸網域和 GEOIP 用於大範圍分類,MATCH 負責最終兜底。代理節點透過 select、url-test、fallback 等代理群組統一管理,rules 不直接依賴頻繁變動的節點名稱。

每次調整建議只修改一個層級,並透過連線記錄驗證。一次同時更換 DNS 模式、開啟 TUN、替換規則集和修改代理群組,會讓問題來源難以定位。依照「語法驗證、重新載入、建立新連線、檢查命中規則」的順序測試,通常可以在幾分鐘內判斷問題位於規則順序、DNS、節點還是系統接管範圍。

下載 Clash 客戶端