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/
- 中國大陸網域:查看是否符合
GEOSITE或自訂的RULE-SET,並確認出口是否為DIRECT。 - 未列入直連分類的海外網域:查看是否套用
MATCH,並確認PROXY目前選取的是代理節點,而非DIRECT。 - 區域網路服務:使用實際存在的路由器或 NAS 位址進行測試,確認私有網段規則是否生效。區域網路連線是否經過代理,也取決於應用程式的繞過清單與 TUN 排除路由。
以上網域僅用來說明檢查方式,不代表它們在任何版本的資料庫中一定會符合規則。HTTP 狀態碼為 200、301 或 403,都不足以單獨證明分流正確;還需查看連線詳細資訊中的規則類型、出口鏈與記錄。
7. 依層級排查常見問題
中國大陸網站仍經由代理
- 先檢查前面是否有更早符合的代理規則,尤其是訂閱內建的服務規則集。
- 確認網域是否收錄於目前的 GEOSITE 資料中;若連線記錄只有 IP,請改查 GEOIP 與 DNS 辨識流程。
- 確認修改的是目前啟用的設定,而非未選取的訂閱副本;重新載入後,建立新連線再測試。
所有請求都從同一個出口連線
依序確認 mode: rule、MATCH 的位置,以及 PROXY 組內實際選取的項目。策略組名稱叫「代理」,不代表組內一定選到了代理節點。修改規則後,現有長連線可能仍沿用原本的出口;請關閉相關連線或重新啟動測試用的應用程式。
更新訂閱後,自訂規則消失
將規則移至用戶端支援的持久化覆寫或合併設定中,並檢查合併順序。若將自訂規則加在原有的 MATCH 後面,即使成功儲存也不會生效。每次更新訂閱後,至少重新檢查一個直連網域和一個代理網域。
網頁能用,但遊戲或 UDP 仍有問題
先確認應用程式流量已被接管,再檢查節點協定、伺服器與策略組選項是否支援所需的 UDP 轉發。TUN 只能處理部分流量接管問題,不會讓不支援 UDP 的出口自動具備轉發能力。IPv6 也需要另外檢查,不能以一次 IPv4 請求成功就認定雙協定堆疊測試完成。
最後請維持清楚易懂的規則順序:明確例外在前,網域分類居中,IP 分類補充,最後以 MATCH 收尾。每新增一條規則,就先在連線記錄中確認實際符合項目,再繼續擴充清單。