先確認核心、規則模式與策略組
「中國大陸直連、海外代理」不是自動判斷服務所在地的開關,而是一組逐條比對連線的規則。Clash 會從 rules 第一行開始往下檢查,遇到第一條符合的規則就採用其出站策略,不會繼續尋找更精確的規則。因此,同一個網域寫在不同位置,可能會產生不同的路由結果。
本文主要以 Clash Meta 後續採用的 mihomo 核心作為設定環境。用戶端負責管理介面,核心才負責解析規則;用戶端名稱相似,不代表支援的欄位也相同。舊版 Clash 核心無法直接套用包含 GEOSITE 的範例。請先在用戶端的核心資訊中確認實際使用的核心,再檢查日誌是否出現「未知規則類型」或資料檔載入失敗。
修改前先確認三件事
- 模式設為 Rule:設定中的欄位為
mode: rule。Global 模式會使用全域策略,Direct 模式則會直連,兩者都不會依本文的規則清單進行分流。 - 代理組確實存在:本文以
海外代理表示已存在的策略組名稱。請替換成目前設定中實際存在的組名,並在代理頁面為該組選擇可用節點;只修改規則不會新增節點。 - 保留原始設定:先複製目前的設定,再使用副本測試。訂閱更新可能會覆蓋直接編輯的內容;若要長期使用,應透過用戶端支援的覆寫或合併功能維護,並檢查最後生效的設定。
四種規則:網域、地理資料與規則集
| 類型 | 比對對象 | 適用情境 |
|---|---|---|
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,與系統能否存取區域網路,是兩項需要分別驗證的條件。
預設規則選擇代理還是直連
MATCH,海外代理:未分類的連線預設走代理,適合希望新出現的海外網站也能透過所選出口存取的情境。MATCH,DIRECT:只有明確符合規則的服務會走代理,適合有固定存取清單,且希望其他連線直連的情境。- 如果擔心未收錄的中國大陸網域走代理,請先查看符合的規則結果並新增網域例外,不要將
GEOIP,CN移到所有網域規則之前。
此處的「海外代理」代表連線策略,不是網路品質保證。若策略組選到 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、符合的規則和策略鏈;再到「日誌」頁面檢查規則檔載入錯誤。不同用戶端的頁面名稱可能不同,重點是找到這四項資訊,而不是只看代理開關。
可重複執行的檢查步驟
- 確認設定中的
mode: rule已生效,並暫時使用log-level: info。需要分析解析過程時,再改為debug;完成後請恢復原設定,避免長時間產生大量日誌。 - 關閉目前的測試連線,再重新發出請求。瀏覽器可能會重複使用既有連線,因此修改規則後仍看到舊連線,不一定表示新規則失效。
- 前往
github.com,預期會符合手動網域規則或overseas-manual,最終連線路徑也應包含所選的代理節點。 - 前往實際使用的中國大陸網站,檢查是否符合
GEOSITE,cn;若落入 MATCH,請先確認網域分類和 DNS 結果。 - 連線至目前網路中確實存在的區域網路裝置,預期會符合對應的私有網段並使用 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、系統路由或應用程式自行建立的連線,都需要個別確認。