規則分流 預計閱讀 13 分鐘

Clash 規則分流實戰:中國大陸直連、境外代理與廣告攔截完整設定

以 rule 模式為主軸,逐段說明 DOMAIN-SUFFIX、GEOIP、RULE-SET 與 MATCH 的寫法及匹配順序,提供可直接套用的分流設定範本。

rule 模式如何決定連線的出口

Clash 的 rule 模式會由上而下檢查 rules 清單,第一條匹配成功的規則會立即生效,後續規則不再參與判斷。規則左側是匹配類型,中間是匹配內容,右側是策略名稱。策略可以是 DIRECTREJECT,也可以是設定中已存在的代理群組,例如 PROXYAuto境外節點

一次請求可用於匹配的資訊通常包括目標網域、目標 IP、目標連接埠、網路類型與程序資訊。不同入站方式取得的資訊不完全相同:系統代理處理 HTTP 或 SOCKS 連線時,網域通常相當明確;TUN 模式接管系統流量後,是否保留網域還會受到 DNS 模式、網域嗅探與應用程式連線方式影響。因此,同一組規則在系統代理與 TUN 下可能出現不同的命中記錄。

四種基本結果

規則結果 連線行為 常見用途
DIRECT 由目前裝置直接連線至目標 中國大陸網站、區域網路裝置、可信任的下載來源
REJECT 拒絕連線,不再交由後續規則處理 廣告網域、追蹤請求、已知干擾位址
代理群組名稱 交由選定節點或自動測速群組處理 境外網站、開發服務、串流媒體
MATCH 接收前面尚未匹配的剩餘連線 規則清單最後的兜底規則

DOMAIN-SUFFIX、GEOIP、RULE-SET 與 MATCH 的寫法

DOMAIN-SUFFIX:依網域後綴處理

DOMAIN-SUFFIX,example.com,PROXY 會匹配 example.com 本身及其子網域,例如 www.example.comapi.example.com。與其逐一撰寫完整網域,這種方式更適合處理同一服務下的多個子網域,也是手動規則中使用頻率較高的類型。

rules:
  - DOMAIN,router.local,DIRECT
  - DOMAIN-SUFFIX,gov.cn,DIRECT
  - DOMAIN-SUFFIX,cn,DIRECT
  - DOMAIN-SUFFIX,example.com,PROXY

DOMAIN 只匹配一個完整網域,不會自動包含子網域。DOMAIN-KEYWORD 只要網域中出現指定字串就會命中,涵蓋範圍較廣,也更容易誤傷。需要精確放行登入網域或更新網域時,優先使用 DOMAIN;需要涵蓋整個網站時,使用 DOMAIN-SUFFIX

GEOIP:依目標 IP 的歸屬地區處理

GEOIP,CN,DIRECT 會使用客戶端載入的 IP 地理資料庫,判斷目標位址是否屬於中國大陸。它適合處理沒有網域、直接連線 IP,或未被網域規則涵蓋的中國大陸請求。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
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

no-resolve 表示該 IP 規則不主動將網域解析為 IP。區域網路 CIDR 規則只需檢查已取得的目標位址,加上此參數可以減少額外的 DNS 查詢。不要機械式地為所有 GEOIP 規則加上 no-resolve,否則只有網域、尚未取得目標 IP 的請求可能會略過地區判斷。

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

當廣告規則、中國大陸網域規則達到數百或數千條時,全部塞進主設定會降低可讀性。rule-providers 用於定義規則檔案,RULE-SET 則在主規則清單中呼叫它。Clash Meta,也就是 mihomo,支援 domainipcidrclassical 等行為類型;不同類型對應不同的載荷格式。

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

  ads:
    type: file
    behavior: classical
    path: ./ruleset/ads.yaml

  direct-domain:
    type: file
    behavior: domain
    path: ./ruleset/direct-domain.yaml

rules:
  - RULE-SET,allow,DIRECT
  - RULE-SET,ads,REJECT
  - RULE-SET,direct-domain,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

behavior: domain 的檔案只存放網域載荷,適合中國大陸網域或放行清單。behavior: classical 可以存放包含類型的完整規則,例如 DOMAIN-SUFFIXDOMAIN-KEYWORDIP-CIDR。本機檔案方便先檢查內容再啟用;需要自動更新時,可改用 type: http,同時設定規則位址、儲存路徑與更新間隔。

MATCH:必須放在最後

MATCH,PROXY 不檢查網域或 IP,會匹配所有尚未命中的連線。只要 MATCH 出現在中間,下面的規則就永遠沒有執行機會。常見目標是「中國大陸直連,其餘代理」,因此先放例外放行、廣告拒絕、區域網路直連、中國大陸網域與 GEOIP,最後再用 MATCH 交給代理群組。

中國大陸直連、境外代理與廣告攔截的設定範本

以下範本適合合併至既有訂閱設定。假設訂閱中已存在名為 PROXY 的策略群組;如果客戶端顯示的群組名稱是「節點選擇」或「代理」,就需要將規則末尾的 PROXY 改成實際名稱。策略名稱區分大小寫,空格與中文字元也必須完全一致。

mixed-port: 7890
allow-lan: false
mode: rule
log-level: info
ipv6: false

profile:
  store-selected: true

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

  ads:
    type: file
    behavior: classical
    path: ./ruleset/ads.yaml

  direct-domain:
    type: file
    behavior: domain
    path: ./ruleset/direct-domain.yaml

rules:
  - RULE-SET,allow,DIRECT
  - RULE-SET,ads,REJECT

  - DOMAIN,localhost,DIRECT
  - DOMAIN-SUFFIX,local,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

  - RULE-SET,direct-domain,DIRECT
  - DOMAIN-SUFFIX,gov.cn,DIRECT
  - DOMAIN-SUFFIX,cn,DIRECT
  - GEOIP,CN,DIRECT

  - MATCH,PROXY

mixed-port: 7890 會在同一個連接埠接收 HTTP 與 SOCKS5 連線,適合桌面客戶端將系統代理統一指向 127.0.0.1:7890allow-lan: false 表示目前範例不向區域網路開放代理連接埠。如果確實需要讓電視、手機或遊戲主機連線至這台電腦,還要另外設定監聽位址與防火牆規則,不能只修改規則清單。

三個本機規則檔案

allow.yaml 用於覆蓋廣告清單中的誤攔截項目。由於它位於廣告規則之前,相同網域會先被放行。domain 行為的載荷可以寫成以下形式:

payload:
  - 'login.example.net'
  - '+.account.example.net'

ads.yaml 使用 classical 行為,每個項目都包含完整規則類型。廣告清單應盡量使用精確網域與後綴,謹慎使用涵蓋範圍過大的關鍵字:

payload:
  - DOMAIN,ads.example.net
  - DOMAIN-SUFFIX,tracking.example.net
  - DOMAIN-KEYWORD,telemetry-example

direct-domain.yaml 使用 domain 行為,儲存需要直連的中國大陸服務後綴:

payload:
  - '+.gov.cn'
  - '+.edu.cn'
  - '+.example.cn'

匹配順序:放行、攔截、直連與兜底

規則順序不只是整理方式,也會改變最終出口。建議順序是:精確放行清單、廣告拒絕、區域網路位址、中國大陸網域、中國大陸 IP、專用服務策略,最後是 MATCH。將放行清單排在廣告清單之前,可以處理登入介面、驗證碼與付款頁面遭第三方規則誤攔截的情況。

  1. 精確放行:處理必須直連且不能被廣告規則攔截的網域。
  2. 廣告拒絕:對明確的廣告與追蹤網域回傳拒絕結果。
  3. 區域網路直連:確保路由器、NAS、印表機與本機開發服務不進入代理。
  4. 中國大陸網域直連:優先依據網域規則分流,減少不必要的 IP 判斷。
  5. 中國大陸 IP 直連:處理直接存取 IP 或未被網域規則涵蓋的連線。
  6. 境外服務分組:串流媒體、程式碼託管等有獨立策略需求時,放在 MATCH 之前。
  7. MATCH 兜底:將其餘連線交給預設代理群組。

為什麼不能先寫 GEOIP 再寫廣告規則

廣告網域可能會解析到中國大陸 IP。如果 GEOIP,CN,DIRECT 位於廣告規則之前,請求會先依 IP 判定為直連,後面的 RULE-SET,ads,REJECT 就沒有機會執行。將廣告網域規則放在 GEOIP 前面,才能優先依據網域拒絕請求。

為什麼不建議只使用 DOMAIN-SUFFIX,cn

DOMAIN-SUFFIX,cn,DIRECT 能涵蓋大量以 .cn 結尾的網站,但中國大陸服務也可能使用 .com.net 或雲端服務網域;境外服務也可能使用中國網域提供部分介面。更穩妥的做法是讓維護過的中國大陸網域規則集負責主要判斷,再以 .cnGEOIP,CN 補足遺漏。

訂閱更新時如何保留自訂規則

直接編輯訂閱產生的 YAML 檔案,下一次更新通常會覆蓋修改內容。若桌面客戶端提供「全域擴充設定」「覆寫」「Merge」或「腳本」功能,應將自訂 rule-providers 與規則插入邏輯放在覆寫層。選單名稱因客戶端而異,常見入口是「訂閱」→「編輯」→「覆寫設定」,或「設定」→「設定檔」→「全域擴充」。

合併時要先確認客戶端採用追加還是替換。如果 rules 只是被追加到訂閱規則末尾,而原設定已存在 MATCH,新規則仍然不會命中。正確做法應是將自訂規則插入原有 MATCH 之前,或明確替換整段 rules

原始 Clash 與 mihomo 的相容性界線

基本的 DOMAINDOMAIN-SUFFIXDOMAIN-KEYWORDIP-CIDRGEOIPRULE-SETMATCH 在常見 Clash 設定中都有廣泛支援。mihomo 還提供 GEOSITE、複合邏輯規則、規則集二進位格式與更完整的程序匹配能力。設定需要在不同核心之間共用時,先保留基礎語法,再依客戶端能力加入擴充欄位。

TUN、DNS 與規則命中的關係

TUN 模式接管的不只是瀏覽器流量,還包括不遵循系統代理的應用程式、部分命令列工具與 UDP 連線。此時客戶端需要從網路封包、DNS 對應或嗅探結果中還原目標網域。若只能看到目標 IP,DOMAIN-SUFFIX 與 domain 類型的 RULE-SET 就無法參與,連線會繼續落到 IP-CIDR、GEOIP 或 MATCH。

fake-ip 模式

mihomo 常見的 fake-ip DNS 模式會為網域回傳保留位址,並在核心中儲存「虛擬 IP—原網域」的對應。應用程式連線至這個虛擬位址時,核心仍能取回網域並執行網域規則。遇到區域網路裝置探索、企業內網或依賴真實 DNS 回應的程式時,可以將相關網域加入 fake-ip 過濾清單,而不是切換整個 DNS 模式。

redir-host 模式

redir-host 會回傳真實解析結果,再依網域或 IP 執行分流。它對部分區域網路與特殊應用程式更直觀,但 DNS 查詢路徑與實際連線路徑必須保持一致,否則可能出現解析結果在中國大陸、連線卻進入境外代理的情況。排查時要同時觀察 DNS 記錄與連線記錄,不要只看節點測速結果。

建議的測試流程

  1. 在客戶端的「記錄」頁面將等級暫時調整為 Info,重新造訪目標網站。
  2. 查看連線記錄中的 Host、Destination IP、Rule 與 Chain 欄位。
  3. 確認廣告網域命中 RULE-SET,ads,結果為 REJECT
  4. 確認區域網路位址命中 IP-CIDR,結果為 DIRECT
  5. 確認中國大陸網站命中 direct-domain 或 GEOIP,CN
  6. 確認未分類的境外網站最終命中 MATCH,並進入預期的代理群組。

測試時每次只修改一個條件。調整規則後執行「設定」→「重新載入」,並關閉舊連線後重新發起請求。瀏覽器的長連線、HTTP/2 工作階段與應用程式連線池可能繼續沿用修改前的出口,只重新整理頁面不一定會觸發新規則。

常見故障與定位方法

設定可以載入,但所有流量都經過代理

先檢查模式是否仍為 Rule,再查看規則清單最前面是否出現 MATCH 或涵蓋範圍過大的代理規則。若中國大陸網域規則使用 RULE-SET,確認規則提供器的項目數不為 0,並檢查本機 path 是否以設定檔所在目錄為基準正確解析。

啟用廣告規則後,登入或付款頁面無法開啟

在連線記錄中找出被 REJECT 的具體網域,將必要網域加入 allow 規則集,並確保 RULE-SET,allow,DIRECT 位於廣告規則之前。不要直接停用整份廣告清單,也不要使用過寬的頂級網域放行;優先新增登入介面的完整網域或最小可用後綴。

中國大陸網站命中 MATCH

查看連線記錄是否保留 Host。有網域但未命中時,通常是中國大陸網域規則缺少該項目;只有目標 IP 時,則檢查 GEOIP 資料庫與 DNS 設定。還要確認規則使用的策略名稱確實存在,部分客戶端遇到無效策略時會拒絕載入整份設定。

修改 YAML 後提示解析失敗

YAML 使用空格縮排,不能使用定位字元。rulesrule-providers 必須位於正確層級,清單項目前需要短橫線。包含冒號、井字號或特殊字元的網域載荷可以用單引號包裹。錯誤提示提供行號時,還要檢查上一行是否漏寫冒號,因為實際錯誤位置經常落在下一行。

延遲測試正常,但網頁仍然無法開啟

延遲測試只驗證測試位址經由某個代理群組的連線結果,不代表目標網頁命中了相同策略。開啟連線頁面核對實際 Rule 與 Chain;如果請求被 DIRECT、REJECT 或其他專用群組提前接手,應調整規則順序,而不是反覆切換測速節點。

下載Clash客戶端 查看各平台安裝套件