分流設定前提:規則模式與代理策略組
中國大陸直連、境外代理根據網域清單、目標 IP 所屬網段與規則順序決定流量出口。中文網頁可能使用境外介面,境外服務也可能接入中國大陸的 CDN。因此,設定目標應是「已知的中國大陸網域直連,其餘連線依明確策略處理」,而不是以網域後綴推斷伺服器所在地。
以下內容適用於使用 Mihomo 核心的用戶端。開始前,請將運作模式切換為 Rule,確認已匯入可用節點,且設定中有名為 PROXY 的策略組。DIRECT 是核心內建的直連策略,不必自行建立;PROXY 只是本文使用的組名,並非預設存在的內建出口。
- 如果實際使用的組名是「節點選擇」,請將範例中作為規則目標的
PROXY全部改成「節點選擇」。組名必須完全一致。 - 請先備份目前的設定,再透過用戶端的覆寫或合併功能儲存本機規則。直接修改訂閱產生的檔案,可能會在下次更新訂閱時被覆蓋。
- 確認應用程式的流量確實進入核心。啟用系統代理不代表所有應用程式都會使用代理;TUN 可以接管更多流量,但不會改變規則的比對順序。
GEOSITE 設定:先比對網域,再比對 IP,最後設定兜底規則
若已有可用的 GeoSite 與 GeoIP 資料,可先用以下規則建立基本設定。將區域網路位址放在前面,避免本機服務流量進入代理;網域規則排在 IP 歸屬規則之前,避免境外服務因解析到中國大陸 IP 而被提前直連。
mode: rule
rules:
- DOMAIN-SUFFIX,localhost,DIRECT
- DOMAIN-SUFFIX,local,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-CIDR6,::1/128,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- IP-CIDR6,fe80::/10,DIRECT,no-resolve
- GEOSITE,cn,DIRECT
- GEOSITE,geolocation-!cn,PROXY
- GEOIP,CN,DIRECT,no-resolve
- MATCH,PROXY
各層規則的用途
| 規則層級 | 比對依據 | 處理方式 |
|---|---|---|
| 區域網路例外 | 本機網域、回送位址與私有 IP 網段 | DIRECT |
| GEOSITE,cn | 資料檔中的 cn 網域集合 | DIRECT |
| GEOSITE,geolocation-!cn | 資料檔中對應的網域集合 | PROXY |
| GEOIP,CN | 已知目標 IP 的歸屬地 | DIRECT |
| MATCH | 先前規則皆未命中的連線 | PROXY |
GEOSITE 用來比對網域分類,不會判斷目前伺服器的實際所在地。geolocation-!cn 是資料集中的分類名稱,不是即時反轉 cn 比對結果的寫法。不同資料來源收錄範圍各異,也可能沒有這個分類;若出現分類不存在的錯誤,請先確認用戶端使用的 GeoSite 來源。
GEOIP,CN,DIRECT,no-resolve 中的 no-resolve 表示不為了這條規則主動觸發網域解析。如果連線已有可用的實際目標 IP,就能據此判斷;若目前只有網域,且前面的網域集合都未命中,這條規則可能會略過,接著由 MATCH 處理。這是為了減少額外解析而做的取捨,不代表所有中國大陸 IP 都一定直連。
Geo 資料的更新方式
GeoSite 與 GeoIP 是本機資料檔,首次載入時需要有可用檔案或能連線至下載來源。更新訂閱不一定會同步更新這些資料。請分別檢查用戶端的 Geo 資料管理設定、核心載入記錄與實際資料來源;Geo 資料發生錯誤時,不要只是不斷重新整理節點訂閱。
rule-providers 設定:獨立更新遠端規則集
若需要分別管理規則來源與更新週期,可以改用 rule-providers。提供器負責下載及解析集合,RULE-SET 則負責在規則清單的指定位置引用集合。只宣告提供器不會自動進行分流,也不會自動將集合插入規則清單頂端。
以下以 Loyalsoldier/clash-rules 公開發布的檔案作為語法範例。這兩個檔案都是 YAML 網域集合,因此使用 behavior: domain 和 format: yaml。部署前請確認來源內容及目前網路是否能連線至該來源;這些網址不是節點訂閱網址。
rule-providers:
overseas-domains:
type: http
behavior: domain
format: yaml
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/proxy.txt"
path: ./ruleset/overseas-domains.yaml
interval: 86400
domestic-domains:
type: http
behavior: domain
format: yaml
url: "https://raw.githubusercontent.com/Loyalsoldier/clash-rules/release/direct.txt"
path: ./ruleset/domestic-domains.yaml
interval: 86400
rules:
- DOMAIN-SUFFIX,localhost,DIRECT
- DOMAIN-SUFFIX,local,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-CIDR6,::1/128,DIRECT,no-resolve
- IP-CIDR6,fc00::/7,DIRECT,no-resolve
- IP-CIDR6,fe80::/10,DIRECT,no-resolve
- RULE-SET,overseas-domains,PROXY
- RULE-SET,domestic-domains,DIRECT
- MATCH,PROXY
這份清單可以取代上一節的 rules,請勿將兩份完整清單直接串接。前一份清單中的 MATCH 已比對所有其餘連線,排在它後面的規則都不會再參與判斷。這裡刻意不依賴 GeoIP,未收錄的網域及未命中區域網路規則的 IP 連線,統一由代理兜底。
interval: 86400的單位是秒,也就是每 24 小時檢查一次更新;這並不保證快取檔案的有效期限。path是相對於核心工作目錄的本機檔案路徑。兩個提供器使用不同路徑,以免檔案互相覆蓋。overseas-domains和domestic-domains是自訂名稱,必須與RULE-SET中的名稱完全一致。- 此範例將代理集合排在直連集合之前。若兩個集合有重疊,會以先命中的代理規則為準;不同維護者維護的集合不一定完全沒有重疊。
規則格式:domain、ipcidr 與 classical
遠端網址能開啟,不代表內容格式正確。訂閱服務回傳的節點設定、含有登入提示的 HTML,以及單純的網域文字,不能不加區分地使用同一種解析方式。behavior 決定項目的意義,format 決定檔案的格式;兩者都必須符合來源內容。
| behavior | YAML payload 項目範例 | 適用內容 |
|---|---|---|
| domain | '+ .example.com' 寫法不正確;'+\.example.com' 也不是正確格式,標準寫法 '+ .' 同樣不可用。正確項目請見下方程式碼 | 網域比對集合 |
| ipcidr | '192.168.0.0/16' | IP 位址網段集合 |
| classical | 'DOMAIN-SUFFIX,example.com' | 包含規則類型的項目 |
網域集合的簡潔寫法如下。+.example.com 表示比對根網域及其子網域,中間不留空格,也不需要反斜線:
payload:
- '+.example.com'
- 'api.example.net'
若使用 classical,同類內容應採用以下格式。規則集項目不必指定出口;出口由外層的 RULE-SET,集合名稱,策略 設定。
payload:
- DOMAIN-SUFFIX,example.com
- DOMAIN,api.example.net
副檔名不是判斷解析方式的依據。上文的 direct.txt 雖然以 .txt 結尾,內容仍是包含 payload 的 YAML,因此要設定為 format: yaml。只有在改用每行一個項目的純文字來源時,才應依來源格式使用 format: text。
例外規則與 DNS:避免中國大陸介面誤走代理
將特定例外規則放在集合之前
若某項服務因登入風控、內網存取或本機裝置探索而需要直連,請先從連線記錄找出實際請求的網域,再新增精確規則。不要因單一介面異常,就將整組境外網域改為直連。以下為語法範例;example.com 是保留作為說明用途的網域,實際使用時請換成連線記錄中的目標。
rules:
- DOMAIN,api.example.com,DIRECT
- DOMAIN-SUFFIX,example.com,PROXY
- RULE-SET,overseas-domains,PROXY
- RULE-SET,domestic-domains,DIRECT
- MATCH,PROXY
依照這個順序,api.example.com 會先命中直連規則,其他 example.com 子網域則交由代理處理。這呈現的是先比對具體項目、再比對較廣範圍,而不是 DOMAIN 天生優先於 DOMAIN-SUFFIX;交換兩條規則的位置,結果也會跟著改變。
分流規則不等於 DNS 分流
GEOSITE,cn,DIRECT 決定連線出口,但不會直接指定由哪一台 DNS 伺服器查詢網域。DNS 上游的選擇應檢查 dns 中的相關設定,例如 nameserver 與 nameserver-policy。若啟用 respect-rules,讓 DNS 連線遵循路由規則,還應依照目前核心文件設定解析節點網域所需的 proxy-server-nameserver,避免形成解析依賴迴圈。
Fake-IP 會回傳合成位址,由核心維護網域與連線之間的對應;不能只看到合成 IP,就拿來判斷實際歸屬。redir-host 則更依賴實際解析結果。兩種模式都應先查看連線記錄中的網域、命中規則與最終出口,再判斷問題出在解析階段還是分流階段。
驗證與疑難排解:逐項檢查連線記錄
儲存設定後,先確認設定驗證及重新載入都成功,再測試新連線。既有的長連線可能繼續使用原本的出口;變更規則後,關閉相關連線或重新啟動測試應用程式,比反覆重新整理同一個頁面更有助於判斷。
- 檢查運作模式。確認目前使用
Rule模式。在Global模式下看到的全域出口,不能用來驗證這份規則清單是否正確。 - 檢查流量入口。如果用戶端顯示的本機混合連接埠確實是
7890,可以使用下方指令明確指定代理進行測試。若連接埠不同,請使用介面顯示的實際值。 - 檢查比對結果。在用戶端的連線清單中,分別記錄目標網域、規則類型、規則負載、策略組與實際節點。命中
PROXY不代表最後一定會使用遠端節點;該組也可能選到DIRECT。 - 檢查提供器狀態。確認更新時間與項目數量。若記錄顯示下載逾時,請優先檢查遠端網址與下載連線;若出現解析錯誤,先確認檔案回傳的是 YAML、純文字還是 HTML。
- 檢查最終合併的設定。確認本機覆寫未被訂閱規則覆蓋、自訂規則位於兜底規則之前,且所有規則目標名稱都存在。
curl --proxy http://127.0.0.1:7890 --head https://www.baidu.com
curl --proxy http://127.0.0.1:7890 --head https://www.wikipedia.org
以上指令僅用來建立便於追蹤的 HTTP 代理連線,不代表這兩個網域在所有資料來源中都一定會命中某個集合。HTTP 狀態碼也無法單獨證明分流成功:伺服器可能回傳重新導向或拒絕存取,仍須搭配核心連線記錄確認出口。
常見狀況與處理順序
- 中國大陸網站走代理:先確認是否命中
MATCH。若有,檢查網域是否收錄於直連集合;若沒有,檢查前置代理規則或集合重疊。 - 境外網站顯示直連:檢查是否命中前面的網域例外規則或
GEOIP,CN,再確認代理組是否選到直連出口。 - 瀏覽器正常,其他應用程式異常:確認該應用程式是否遵循系統代理,以及是否需要由 TUN 接管。不要一開始就認定是規則集缺少網域。
- 規則更新後沒有變化:確認更新的是規則提供器,而不是節點訂閱;接著建立新連線再次測試,並確認用戶端是否仍載入另一份設定。
維護時保留一份精簡且明確的本機例外清單,再選擇 GeoSite 或遠端規則集作為主要分類來源。每次只修改一類規則,並記錄變更前後的命中結果。如此可分辨資料收錄、規則順序、DNS 解析與流量接管四種問題,避免不斷疊加集合來掩蓋真正原因。