1. 先設定最精簡的分流規則

已有可用的訂閱時,先保留節點與策略組,只替換規則部分。以下設定會將私有網路位址、中國大陸網域及中國大陸 IP 指向直連,其餘連線則交由 PROXY 處理。這是供合併使用的片段,並非可直接連線的完整設定。

mode: rule
geodata-mode: true

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
  - IP-CIDR6,::1/128,DIRECT,no-resolve
  - IP-CIDR6,fc00::/7,DIRECT,no-resolve
  - IP-CIDR6,fe80::/10,DIRECT,no-resolve
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

此處所說的「中國大陸直連」,是依據資料庫分類所做的路由選擇,並非對網站營運者、使用語言或伺服器所在地的絕對判定。資料庫可能有遺漏,CDN 位址也會變動。重要服務應另外設定明確的網域規則,並查看連線記錄確認結果。

使用訂閱的用戶端也要確認編輯位置:請將修改儲存在用戶端支援的覆寫、合併設定或持久化擴充功能中。直接修改訂閱下載後產生的檔案,下次更新時可能會被覆蓋。各用戶端的設定入口不同,請以目前使用的用戶端說明為準。

2. 規則順序:由上往下,首次符合即採用

mihomo 會依照 rules 的排列順序檢查連線。符合一條可用規則後,就會採用該規則指定的出口,不會再繼續尋找「更精確」的後續規則。規則不會依網域長度自動排序。

將明確例外排在通用分類之前

rules:
  - DOMAIN-SUFFIX,example.com,PROXY
  - DOMAIN,downloads.example.org,DIRECT
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

這兩個範例網域僅用來說明語法,並不代表任何實際服務。DOMAIN-SUFFIX,example.com 會比對根網域及其子網域,例如 api.example.com;DOMAIN 則只比對指定的主機名稱。如果網域已被前面的規則導向代理,後續的中國大陸 IP 規則就不會再將它改為直連。

  • 第一層:需要強制代理、強制直連或拒絕的精確例外。
  • 第二層:區域網路位址與依服務類型劃分的規則集。
  • 第三層:GEOSITE、GEOIP 等涵蓋範圍較廣的分類。
  • 最後一層:MATCH,處理前面規則都未符合的連線。

MATCH 不代表「已成功辨識海外位址」,而是無條件套用的預設規則。本例會將尚未分類的流量送往代理,因此資料庫未收錄的中國大陸網域也可能走代理。若把它放在第一行,後續分流規則就不會生效。

3. GEOSITE 與 GEOIP 的用途

規則類型 比對依據 適用位置
GEOSITE,cn 網域資料庫中的 cn 分類 網域例外之後、IP 分類之前
GEOIP,CN 目標 IP 在資料庫中的分類 補充比對網域規則未涵蓋的連線
MATCH 不再附加其他比對條件 規則清單末尾的預設規則

GEOSITE 不需要先判斷伺服器位於何處

連線帶有可用網域時,GEOSITE,cn,DIRECT 可直接檢查網域分類。中國大陸網站使用海外 CDN,並不會因此自動改變它在網域資料庫中的分類。反過來說,海外服務使用中國大陸 IP,也不代表 GEOSITE 一定會將它歸入 cn。

GEOIP 可能會觸發網域解析

如果連線只有網域、尚未取得實際目標 IP,執行 IP 類規則時可能需要進行 DNS 解析。因此,GEOIP,CN,DIRECT 可補充判斷未符合網域分類的連線,但解析結果與 DNS 路徑都會影響最終判定。

# 必要時允許解析網域,以判斷目標 IP
- GEOIP,CN,DIRECT

# 不主動為此規則解析網域
- GEOIP,CN,DIRECT,no-resolve

no-resolve 不代表「關閉所有 DNS」,也不是「讓所有流量變快」的通用選項。它會限制該 IP 規則主動發起解析;若連線本身已有目標 IP,仍可參與比對。如果希望 GEOIP 補充判斷網域連線,卻加上 no-resolve,部分請求就可能直接落入末尾的 MATCH。

4. 使用 rule-providers 拆分獨立規則集

規則數量增加後,可將網域清單移出主設定檔。rule-providers 用來定義規則集的來源與格式,RULE-SET 則決定它在主規則中的比對位置,以及符合後採用的出口。只定義 provider 而沒有引用,不會產生分流效果。

先從方便檢查的本機網域清單開始

以下定義名為 local-direct 的檔案型規則集。路徑是相對於 mihomo 的工作目錄;請將檔案放在用戶端允許讀取的設定目錄中,並確認實際工作目錄,不要依終端機目前所在目錄推測。

rule-providers:
  local-direct:
    type: file
    behavior: domain
    format: yaml
    path: ./rules/local-direct.yaml

rules:
  - RULE-SET,local-direct,DIRECT
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

建立 rules/local-direct.yaml,完整內容如下。這裡只有兩項明確的直連規則,並不是完整的中國大陸網域資料庫。

payload:
  - '+.baidu.com'
  - '+.qq.com'

behavior: domain 表示檔案只存放網域比對項目,不能把整行 DOMAIN-SUFFIX,baidu.com,DIRECT 放進去。出口已由主設定檔中的 RULE-SET,local-direct,DIRECT 決定。+. 寫法會涵蓋該網域本身及其子網域。

混合規則請使用 classical

如果同一個檔案需要同時設定網域與 IP 條件,可改用 behavior: classical,並採用對應的規則語法。以下是規則集檔案的內容,每個項目後面一樣不必填寫出口名稱:

payload:
  - DOMAIN-SUFFIX,baidu.com
  - IP-CIDR,192.168.0.0/16,no-resolve

不要只修改檔案內容,卻忘記更新 provider 的 behavior。使用遠端規則集時,也要確認其宣告格式:YAML、純文字與二進位規則集不能任意混用。HTTP 類型可用 interval: 86400 設定每 86400 秒檢查一次更新;本機檔案類型不會透過此參數同步檔案。

5. DNS、fake-ip 與 TUN 的適用範圍

分流規則只會處理已進入 mihomo 的連線。系統代理只涵蓋遵循代理設定的應用程式;命令列工具、遊戲或其他自行連網的程式可能會繞過代理。TUN 模式會透過虛擬網卡接管更多 IP 流量,但能否接管仍取決於路由、權限與排除設定。

  • 流量接管:先確認應用程式的請求是否出現在用戶端的連線清單中。如果沒有連線記錄,請優先檢查系統代理、應用程式的代理設定或 TUN 路由。
  • 網域辨識:確認連線記錄中有網域名稱,還是只有 IP。若缺少網域資訊,GEOSITE 通常沒有可直接比對的資料。
  • 規則判定:檢查符合的規則、選取的策略組與實際使用的節點,釐清規則判定和節點選擇的差異。

使用 fake-ip 模式時,DNS 可能會回傳合成位址,例如常見設定所用的 198.18.0.1/16 位址池。核心會透過對應關係找回原始網域;不能依地理位置將這個合成位址視為真實伺服器 IP。請勿為了「修復 GEOIP」而將整個 fake-ip 位址池設為直連。

同時使用瀏覽器加密 DNS、獨立 DNS 用戶端與 TUN 時,請確認網域資訊仍能傳入核心。嗅探可在部分協定中補充網域資訊,但無法保證所有連線都能還原網域,也不能取代對 DNS 流量接管路徑的檢查。

6. 檢查設定並驗證三種連線

先檢查語法,再載入用戶端

可直接使用 mihomo 的設定檢查功能。以下命令假設設定檔位於目前目錄;若用戶端使用獨立工作目錄,請一併指定正確路徑,並在該目錄準備資料庫與本機規則集。

mihomo -t -f ./config.yaml

檢查通過只代表設定檔可以載入,不代表節點能連線,也不代表所有網域都會依預期分流。載入後請確認用戶端使用規則模式,避免全域模式或直連模式影響測試結果。

固定測試方式,觀察實際比對結果

如果用戶端實際使用的 HTTP 或 mixed 監聽連接埠是 7890,可以明確指定代理進行測試。此處的連接埠僅為範例,請以目前設定為準;只測試 HTTP 代理時,不需要為此額外啟用 TUN。

curl -I --proxy http://127.0.0.1:7890 https://www.baidu.com/
curl -I --proxy http://127.0.0.1:7890 https://www.wikipedia.org/
  1. 中國大陸網域:查看是否符合 GEOSITE 或自訂的 RULE-SET,並確認出口是否為 DIRECT。
  2. 未列入直連分類的海外網域:查看是否套用 MATCH,並確認 PROXY 目前選取的是代理節點,而非 DIRECT。
  3. 區域網路服務:使用實際存在的路由器或 NAS 位址進行測試,確認私有網段規則是否生效。區域網路連線是否經過代理,也取決於應用程式的繞過清單與 TUN 排除路由。

以上網域僅用來說明檢查方式,不代表它們在任何版本的資料庫中一定會符合規則。HTTP 狀態碼為 200、301 或 403,都不足以單獨證明分流正確;還需查看連線詳細資訊中的規則類型、出口鏈與記錄。

7. 依層級排查常見問題

中國大陸網站仍經由代理

  • 先檢查前面是否有更早符合的代理規則,尤其是訂閱內建的服務規則集。
  • 確認網域是否收錄於目前的 GEOSITE 資料中;若連線記錄只有 IP,請改查 GEOIP 與 DNS 辨識流程。
  • 確認修改的是目前啟用的設定,而非未選取的訂閱副本;重新載入後,建立新連線再測試。

所有請求都從同一個出口連線

依序確認 mode: rule、MATCH 的位置,以及 PROXY 組內實際選取的項目。策略組名稱叫「代理」,不代表組內一定選到了代理節點。修改規則後,現有長連線可能仍沿用原本的出口;請關閉相關連線或重新啟動測試用的應用程式。

更新訂閱後,自訂規則消失

將規則移至用戶端支援的持久化覆寫或合併設定中,並檢查合併順序。若將自訂規則加在原有的 MATCH 後面,即使成功儲存也不會生效。每次更新訂閱後,至少重新檢查一個直連網域和一個代理網域。

網頁能用,但遊戲或 UDP 仍有問題

先確認應用程式流量已被接管,再檢查節點協定、伺服器與策略組選項是否支援所需的 UDP 轉發。TUN 只能處理部分流量接管問題,不會讓不支援 UDP 的出口自動具備轉發能力。IPv6 也需要另外檢查,不能以一次 IPv4 請求成功就認定雙協定堆疊測試完成。

最後請維持清楚易懂的規則順序:明確例外在前,網域分類居中,IP 分類補充,最後以 MATCH 收尾。每新增一條規則,就先在連線記錄中確認實際符合項目,再繼續擴充清單。