GeoIP 與 GeoSite:依 IP 或網域分流

mihomo 是負責建立代理連線、解析 DNS 與執行規則的核心。Clash Verge Rev 等桌面用戶端則提供操作介面並管理核心。本文設定適用於 mihomo,無法直接套用至不支援這些欄位的舊版 Clash 核心。

GEOIP 與 GEOSITE 都是規則類型,但比對的對象不同。GeoIP 會將 IP 位址範圍歸類至國家、地區或其他資料集;GeoSite 則將網域歸類至網站、服務或主題類別。兩者都依賴外部維護的資料檔,並非由核心即時查詢線上地理位置服務。

比較項目GeoIPGeoSite
比對對象連線的目標 IP 位址核心已知的目標網域
常見規則GEOIP,CN,DIRECTGEOSITE,cn,DIRECT
常見檔案geoip.dat 或 country.mmdbgeosite.dat
常見限制IP 所屬地區不等於網站服務的所在地分類可能未收錄新網域,也不會自動涵蓋純 IP 連線

例如,某項服務可能透過分布在多個地區的 CDN 提供內容。只看伺服器 IP 所屬地區,未必能判斷服務類型;先用 GeoSite 比對網域,再用 GeoIP 處理其餘連線,通常更能清楚表達分流需求。GeoIP 的結果也不能當作實際地理位置的證明,資料更新頻率及 IP 範圍歸屬變動都會影響判斷。

資料庫來源與檔案格式:先確認載入模式

資料通常由社群專案整理並發布。常見來源包括 MetaCubeX 的 meta-rules-dat,以及其他維護網域和 IP 分類的專案。即使檔名同為 geosite.dat,不同發布者收錄的分類名稱、更新頻率和內容也可能不同。規則中的 cn、google 等名稱,必須確實存在於目前使用的資料集。

geodata-mode 決定 GeoIP 使用的格式

  • geodata-mode: true:GeoIP 使用 DAT 格式,並讀取 geox-url.geoip 指定的資料來源。
  • geodata-mode: false:GeoIP 使用 MMDB 格式,並讀取 geox-url.mmdb 指定的資料來源。
  • GEOSITE 使用 geosite.dat;GeoIP 改用 MMDB 格式,不會讓 GEOSITE 自動停用。

副檔名不會轉換檔案格式。將 MMDB 檔改名為 geoip.dat,DAT 載入器仍無法讀取。同樣地,規則集使用的 YAML、文字或 MRS 檔案,也不能直接填入 geox-url.geosite 作為資料庫網址。

自動更新設定:geox-url 與更新週期

以下範例使用 DAT 模式,資料來源為 MetaCubeX 發布的檔案。範例網址是資料庫來源,並非用戶端安裝檔網址。請將這些項目設在設定檔最上層,與 dns、rules 同一層;不要縮排到策略群組或 DNS 設定之中。

geodata-mode: true
geo-auto-update: true
geo-update-interval: 24

geox-url:
  geoip: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat"
  geosite: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat"
  • geo-auto-update: true:啟用核心的 Geo 資料自動更新功能。
  • geo-update-interval: 24:更新週期為 24 小時,不是 24 秒。
  • geox-url.geoip:DAT 模式下的 GeoIP 資料來源。
  • geox-url.geosite:GeoSite 資料來源,供 GEOSITE 規則使用。

此範例只設定實際會用到的兩種檔案。如果目前設定使用 MMDB,請保留 geodata-mode: false,並設定適用的 geox-url.mmdb;不要只改下載網址,卻忘了切換載入模式。設定更新週期為 24 小時,也不代表資料每 24 小時一定會變動:上游未發布新資料、下載失敗,或核心未持續執行,都會影響更新結果。

在 Clash Verge Rev 中保存持久設定

  1. 開啟「設定檔」,確認目前啟用的是哪一份訂閱設定。
  2. 使用用戶端提供的合併設定或覆寫功能,加入上述最上層欄位。不同版本的編輯入口名稱可能不同,請檢查最後生效的設定確認結果。
  3. 重新載入設定;如果更新工作或資料庫狀態沒有如預期變動,再重新啟動核心並查看啟動記錄。
  4. 檢查生效設定中是否只有一組明確的 geox-url,以及 geo-auto-update 是否仍為 true。

直接編輯訂閱下載的檔案,可能在下次更新訂閱時被覆寫。使用覆寫功能時也要留意清單的合併方式:某些操作會取代整段 rules,而不是接續在原清單後方。修改前請先備份現有設定,並確認用戶端目前採用的合併順序。

GEOIP、GEOSITE 與規則執行順序

以下片段示範一種常見順序:先處理明確指定的網域,再處理網域分類,最後處理 IP 分類與預設規則。範例中的「節點選擇」必須是現有設定已定義的策略群組名稱;若實際名稱不同,請一併修改。這只是規則片段,不是包含節點、DNS 和監聽連接埠的完整設定。

rules:
  - DOMAIN-SUFFIX,example.com,DIRECT
  - GEOSITE,google,節點選擇
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT,no-resolve
  - MATCH,節點選擇

mihomo 的一般規則會依清單順序由上而下檢查,符合後就採用對應策略。因此,排在前面的明確網域規則可以優先於後方的分類規則,而 MATCH 應放在最後作為預設規則。若將 MATCH 放在第一行,後續 Geo 規則就沒有機會決定這些連線的去向。

GEOSITE 分類名稱並非通用固定字典

GEOSITE,google,節點選擇 表示使用目前資料庫中的 google 分類,並不代表核心會自動收集所有包含該單字的網域。更換 GeoSite 資料來源後,請確認使用的分類仍然存在;若載入時提示分類不存在,應修正規則或改用相容的資料來源,而不是一再切換節點。

GeoSite 比對需要核心掌握網域資訊。若應用程式直接連線至 IP,或接管流量的鏈路未保留或還原網域資訊,就不能期待它只憑目標 IP 命中某個網站分類。TUN 模式擴大的是流量接管範圍,不代表每條連線都會帶有可供 GeoSite 判斷的網域。

no-resolve:避免規則為了比對而主動解析網域

在 GEOIP,CN,DIRECT,no-resolve 中,no-resolve 是規則參數。它會告訴核心:執行這條 IP 規則時,不要只為了判斷 IP 歸屬,就主動將目標網域解析成 IP。它不會全域關閉 DNS,也不會阻止應用程式、代理連線或前置規則進行解析。

連線狀態使用 no-resolve未使用 no-resolve
目標已有可用的實際 IP可使用現有 IP 判斷歸屬可判斷歸屬
只有網域,尚無可用的實際 IP不為此規則主動解析,繼續檢查後續規則可能觸發解析,再判斷歸屬
前面的網域規則已命中不會執行到這條規則不會執行到這條規則

如果想減少不必要的本機解析,可以先用 GeoSite 涵蓋主要網域,再為 GeoIP 補充規則加上 no-resolve。但這也代表,未被網域規則涵蓋且沒有實際目標 IP 的連線,可能直接套用後方的 MATCH。這是規則設計的結果,不應立即判定為 GeoIP 資料損毀。

如果希望其餘網域都先解析,再依 IP 地區決定是否直連,可以使用 GEOIP,CN,DIRECT。此時也要檢查 DNS 解析路徑、上游連線能力及隱私需求。使用 fake-ip 模式時,尤其要區分虛擬位址與實際目標位址,不能把看到的 fake-ip 位址當成 GeoIP 應查詢的公網位址。

驗證更新與分流:分別檢查設定、檔案和連線

驗證時應分成三個層面。設定成功載入,只代表欄位和必要資源通過相關檢查;資料庫下載成功,只代表資源可以取得;實際連線命中預期規則,才表示這次分流達到目的。不要只看用戶端開關或網頁是否能開啟。

第一層:檢查核心版本與設定語法

獨立執行 mihomo 時,可以使用以下指令。資料目錄和設定檔路徑必須指向實際使用的位置,否則測試的可能是另一套檔案。桌面用戶端通常有自己的工作目錄;核心執行期間,請勿用其他程序同時改寫該目錄。

mihomo -v
mihomo -t -d ./mihomo-data -f ./config.yaml

-v 用來確認實際執行的核心版本;-t 用來測試設定。若出現未知欄位或資源載入錯誤,請先確認核心是否為支援相關設定的 mihomo,再檢查 YAML 縮排和資料來源;不要只憑用戶端名稱推斷核心功能。

第二層:檢查下載記錄與實際工作目錄

  • 在用戶端的「記錄」頁面,搜尋 Geo 資料載入、下載或更新相關記錄,並留意逾時、HTTP 狀態碼及解析失敗。
  • 請在核心實際使用的工作目錄中檢查 geoip.dat、geosite.dat,或 MMDB 模式所用的對應檔案,不要只查看訂閱檔所在的目錄。
  • 記錄更新前後的檔案修改時間、大小及錯誤記錄。修改時間變動可作為輔助線索,但無法單獨證明分類內容有所更新。

第三層:透過新連線確認命中規則

  1. 將用戶端切換至「規則」模式。全域模式或直連模式不適合用來驗證這份分流清單。
  2. 關閉目標應用程式已有的連線,或在「連線」頁面關閉對應連線,再重新開啟測試網域。
  3. 查看新連線的目標網域、目標 IP、命中規則及策略鏈,確認命中的是 GEOSITE、GEOIP 還是 MATCH。
  4. 每次只調整一項設定,重新載入後再測試一次並記錄結果。

資料庫更新後,舊連線不會自動重新選擇路徑。瀏覽器也可能重複使用 HTTP/2、HTTP/3 連線,因此重新整理頁面不一定會建立全新連線。如果同時啟用系統代理和 TUN,請先確認測試應用程式的流量確實進入目前的核心,再判斷規則是否異常。

常見問題:下載失敗、分類不存在與規則未命中

瀏覽器能開啟資料庫網址,核心卻下載失敗

瀏覽器可能使用代理,而核心的資源下載路徑、DNS 狀態或啟動階段可用的策略都可能不同,兩者不能直接畫上等號。先確認記錄中的實際下載網址和失敗階段:連線逾時優先檢查網路路徑;HTTP 404 優先檢查發布網址;解析失敗則確認下載到的是否為 HTML 錯誤頁或錯誤格式。

首次啟動時若缺少資料庫,也可能遇到依賴循環:規則載入需要資料庫,下載資料庫又需要尚未可用的代理路徑。可以先在網路可連線時取得相關檔案,放入實際工作目錄,再啟動核心。手動放入檔案後,仍應保留正確的來源設定,以便日後更新。

更新成功,卻提示某個 GeoSite 分類不存在

通常是規則名稱與資料來源不相符。請先核對資料發布專案提供的分類清單,再檢查規則拼字和分類屬性。不要把某個訂閱使用的自訂分類名稱,當成所有資料庫都有的標準名稱;也不要試圖透過變更副檔名來修復。

連線至中國大陸網站仍命中 MATCH

請依序檢查:目前使用的 GeoSite 分類是否收錄該網域;前方是否已有其他規則先行命中;連線是否只有網域,而 GeoIP 規則又使用了 no-resolve;最後生效的設定是否被訂閱更新覆寫。確認資料庫確實缺少相關內容後,再考慮新增範圍明確的 DOMAIN 或 DOMAIN-SUFFIX 規則。

需要了解基礎概念時,可參閱術語表;想進一步了解 DNS、規則與核心如何配合,請閱讀協定手冊。排查問題時,保留原始設定和記錄,比同時更換資料庫、節點和 DNS 更容易找出原因。