先確認核心、規則模式與策略組

「中國大陸直連、海外代理」不是自動判斷服務所在地的開關,而是一組逐條比對連線的規則。Clash 會從 rules 第一行開始往下檢查,遇到第一條符合的規則就採用其出站策略,不會繼續尋找更精確的規則。因此,同一個網域寫在不同位置,可能會產生不同的路由結果。

本文主要以 Clash Meta 後續採用的 mihomo 核心作為設定環境。用戶端負責管理介面,核心才負責解析規則;用戶端名稱相似,不代表支援的欄位也相同。舊版 Clash 核心無法直接套用包含 GEOSITE 的範例。請先在用戶端的核心資訊中確認實際使用的核心,再檢查日誌是否出現「未知規則類型」或資料檔載入失敗。

修改前先確認三件事

  1. 模式設為 Rule:設定中的欄位為 mode: rule。Global 模式會使用全域策略,Direct 模式則會直連,兩者都不會依本文的規則清單進行分流。
  2. 代理組確實存在:本文以 海外代理 表示已存在的策略組名稱。請替換成目前設定中實際存在的組名,並在代理頁面為該組選擇可用節點;只修改規則不會新增節點。
  3. 保留原始設定:先複製目前的設定,再使用副本測試。訂閱更新可能會覆蓋直接編輯的內容;若要長期使用,應透過用戶端支援的覆寫或合併功能維護,並檢查最後生效的設定。

四種規則:網域、地理資料與規則集

類型比對對象適用情境
DOMAIN-SUFFIX指定網域及其子網域少數網站的明確例外
GEOSITE網域分類資料中國大陸網域、海外服務分類
GEOIP目標 IP 所屬區域補充處理已有目標 IP 的分流
RULE-SET外部或本機規則提供者獨立維護一組網站規則

DOMAIN-SUFFIX:適合精確調整

DOMAIN-SUFFIX,github.com,海外代理 會同時比對 github.com 和 api.github.com,但不會比對 githubusercontent.com。後者是獨立網域,需要另外新增規則。若只要比對單一主機,請使用 DOMAIN,api.github.com,海外代理,避免將整個網域下的服務都導向相同出口。

GEOSITE:分類取決於資料檔

GEOSITE,cn,DIRECT 使用地理網域資料中的 cn 分類,並非「所有以 .cn 結尾的網域」。同樣地,常見資料集中的 geolocation-!cn 是一組海外網域分類,不等於數學上 cn 集合的完整補集。分類是否存在、涵蓋哪些網站,取決於實際載入的資料檔及其更新時間。

使用此範例前,請確認 mihomo 已成功載入包含 cn 和 geolocation-!cn 的 geosite.dat,以及可供 GEOIP 使用的地理 IP 資料。設定為 geodata-mode: true 時會使用 geoip.dat;常見的預設模式則使用 MMDB 資料。各用戶端的資料更新入口不同,請以日誌顯示成功載入為準。

GEOIP:判斷 IP,不判斷網站歸屬

GEOIP,CN,DIRECT 用來判斷目標 IP 是否屬於中國大陸的位址範圍。海外服務若使用中國大陸 CDN,其 IP 也可能符合 CN;反過來說,中國大陸服務若使用海外雲端資源,IP 也可能不符合。將網域分類規則放在 IP 分類之前,可優先表達服務層級的連線意圖。

規則尾端的 no-resolve 表示不為這條 IP 規則主動觸發網域解析,並不代表「禁止 DNS」。連線已有真實目標 IP 時仍可比對;若只有網域、沒有可用的真實 IP,則可能略過這條規則。因此,加上它可減少規則比對所觸發的解析,但無法保證所有未收錄的中國大陸網域都會直連。

規則順序:區域網路、明確例外、分類與預設規則

以下片段適用於「中國大陸常用網站直連,其他流量預設走代理」的需求。順序為:區域網路繞過、手動指定的海外網站、中國大陸網域分類、海外網域分類、中國大陸 IP,最後是預設規則。此處的 MATCH 會無條件比對剩餘連線,因此必須放在最後。

# mihomo 設定片段;海外代理必須是已存在的策略組
mode: rule

rules:
  - DOMAIN,localhost,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

  - DOMAIN-SUFFIX,github.com,海外代理
  - DOMAIN-SUFFIX,githubusercontent.com,海外代理
  - DOMAIN-SUFFIX,githubassets.com,海外代理

  - GEOSITE,cn,DIRECT
  - GEOSITE,geolocation-!cn,海外代理
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,海外代理

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

路由器管理頁面、NAS 和公司內部服務通常使用私有位址。以 192.168.1.1 為例,將連線送往遠端代理,無法連上目前網路中的路由器。先讓私有位址直連,可避免它們被最後的代理預設規則接手。172.16.0.0/12 的範圍是 172.16 到 172.31,別誤寫成只涵蓋較小網段的 172.16.0.0/16。

網域規則只決定出站方式,不保證網域名稱能解析。公司內部網域可能需要企業 DNS;.local 常用於 mDNS,也無法只靠新增一條網域直連規則解決。啟用 TUN 時,也要檢查內部網段的路由及 DNS 接管設定。規則符合 DIRECT,與系統能否存取區域網路,是兩項需要分別驗證的條件。

預設規則選擇代理還是直連

此處的「海外代理」代表連線策略,不是網路品質保證。若策略組選到 DIRECT,即使規則符合該組,最後仍會直連。排查時必須同時查看符合的規則與最終出站路徑。

RULE-SET:獨立維護常用網站規則

手動網域規則逐漸增加時,可以將它們移至規則提供者管理。以下使用本機 YAML 檔案,不依賴遠端下載規則;檔案必須放在核心可讀取的工作目錄中。相對路徑通常以核心工作目錄為基準,不一定是目前訂閱檔所在的目錄。

第一步:建立本機規則檔

將檔案儲存為 rules/overseas.yaml。這是規則集檔案,不是用戶端的主設定;根鍵必須是 payload。以下使用 classical 格式,條目包含規則類型,但不包含出站策略。

payload:
  - DOMAIN-SUFFIX,github.com
  - DOMAIN-SUFFIX,githubusercontent.com
  - DOMAIN-SUFFIX,githubassets.com

第二步:在主設定中宣告並引用

將以下提供者合併至既有的 rule-providers,再用 RULE-SET 取代上一節的三條 GitHub 網域規則。引用位置應在區域網路規則之後、GEOSITE 規則之前;以下只展示該位置附近的片段,實際設定中請保留省略的既有規則。

# 主設定片段:宣告本機提供者
rule-providers:
  overseas-manual:
    type: file
    behavior: classical
    format: yaml
    path: ./rules/overseas.yaml
# rules 清單中對應位置的片段,並非完整清單
  - RULE-SET,overseas-manual,海外代理
  - GEOSITE,cn,DIRECT
  - GEOSITE,geolocation-!cn,海外代理
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,海外代理

behavior: domain、ipcidr 和 classical 分別對應不同的條目格式,不能只更改欄位,卻繼續使用原本的檔案內容。若改用 HTTP 提供者,還需要設定有效的來源、快取路徑和更新間隔,並確認下載成功。規則清單中出現 RULE-SET,不代表規則檔已成功載入;請檢查提供者狀態和核心日誌。

驗證分流:檢查新連線,不只確認網頁能否開啟

網頁能開啟,只能表示某條連線路徑可用,不能證明流量走的是預期出口。儲存並重新載入設定後,請在用戶端的「連線」頁面查看目標網域、目標 IP、符合的規則和策略鏈;再到「日誌」頁面檢查規則檔載入錯誤。不同用戶端的頁面名稱可能不同,重點是找到這四項資訊,而不是只看代理開關。

可重複執行的檢查步驟

  1. 確認設定中的 mode: rule 已生效,並暫時使用 log-level: info。需要分析解析過程時,再改為 debug;完成後請恢復原設定,避免長時間產生大量日誌。
  2. 關閉目前的測試連線,再重新發出請求。瀏覽器可能會重複使用既有連線,因此修改規則後仍看到舊連線,不一定表示新規則失效。
  3. 前往 github.com,預期會符合手動網域規則或 overseas-manual,最終連線路徑也應包含所選的代理節點。
  4. 前往實際使用的中國大陸網站,檢查是否符合 GEOSITE,cn;若落入 MATCH,請先確認網域分類和 DNS 結果。
  5. 連線至目前網路中確實存在的區域網路裝置,預期會符合對應的私有網段並使用 DIRECT。若沒有該裝置,請勿將連線逾時誤認為規則故障。

使用指定的代理入口測試

若實際生效的設定使用 mixed-port: 7890,可執行以下命令,明確透過本機 HTTP 代理入口連線,以排除系統代理未套用至終端機的問題。連接埠並非固定標準;若實際使用的連接埠不同,請修改命令中的數字。

curl --proxy http://127.0.0.1:7890 --head --max-time 15 https://github.com

--max-time 15 會將整個請求的最長等待時間設為 15 秒,這並非實際測得的連線速度。HTTP 狀態碼和回應時間無法單獨證明規則是否符合,應搭配連線頁面中的路由記錄確認。此命令測試的是明確指定的代理入口,不代表所有 TUN 流量都已接管。

常見設定錯誤,以及 DNS、TUN 的適用範圍

現象優先檢查項目修正方式
所有連線都走同一個出口模式不是 Rule,或 MATCH 放在最前面啟用規則模式,並將預設規則移至最後
設定無法載入策略組名稱、YAML 縮排、核心支援狀況根據日誌找出問題,確認組名完全一致
GEOIP 看起來沒有生效no-resolve 設定,以及目標真實 IP 是否可用先確認 DNS 與網域規則的符合情況
訂閱更新後規則消失修改的是產生的檔案,而非覆寫來源透過支援的覆寫機制維護,並重新檢查最終設定
海外服務部分資源載入失敗資源網域與首頁網域不同根據失敗連線記錄,新增獨立網域規則
無法開啟區域網路網域內部 DNS、TUN 路由、目標是否可連線先確認能否解析至正確位址,再檢查直連規則

DNS 分流不等於連線分流

nameserver-policy 用來選擇網域解析時使用的 DNS 伺服器;rules 則決定應用程式連線使用的出口,兩者用途不同。為中國大陸網域設定本機 DNS,不會自動讓其連線直連;反過來說,DIRECT 規則也不保證查詢會使用本機 DNS。若要控制 DNS 解析路徑,應另外檢查 dns 設定。

在支援相關欄位的 mihomo 中,respect-rules 可讓 DNS 上游連線遵循路由規則,但啟用前必須正確設定 proxy-server-nameserver 等引導解析項目,避免代理伺服器網域的解析反過來依賴代理本身。這不是隨意加入任何設定就能解決所有 DNS 問題的開關。

Fake-IP 與 TUN 不會改變首條符合規則的原則

Fake-IP 的作用是將映射位址與網域建立關聯,以供後續連線處理;它不會自動將所有網站分成中國大陸和海外網站。若看到目標位址屬於常見的 198.18.0.0/16 映射範圍,不應將整個範圍設為 DIRECT 來「修復分流」,而應確認網域映射及規則比對是否正常。

TUN 擴大的是接管範圍,不會將規則模式變成全域代理。系統代理只影響遵循代理設定的應用程式;TUN 則可接管更多 IP 流量,但仍受權限、路由及排除項目影響。只有進入核心的連線才會套用這些規則;其他 VPN、系統路由或應用程式自行建立的連線,都需要個別確認。