GEOSITE 與 GEOIP 各自解決什麼?
GEOSITE 規則的輸入是「主機名是否落在某個 GEOSITE 標籤」:核心會拿連線當下能取得的域名(來自 DNS、SNI、Sniffer 等管道),去查載入的 geosite 資料。好處是一次覆蓋成百上千個相關域名,適合「整個 Google/整個廣告聯播網/整批中資站」這類集合式策略。
GEOIP 規則的輸入是「目的 IP 落在哪個國家或地區」:依賴 GeoIP(mmdb) 資料庫。它適合當兜底分桶——例如「所有判定為 CN 的 IP 直連、其餘走代理」——但對跨國 CDN、Anycast、或握手階段尚無可靠 IP 語意的場景,要與域名規則、Sniffer 搭配,否則容易出現「看起來是海外站、實際命中卻像國內 IP」的體感落差。
兩者都不回答「是哪個應用程式發起的連線」——那是 PROCESS-NAME;也不自動讓 HTTPS 變出域名——若日誌長期只有 IP,請回到 Sniffer 教學 與 TUN/DNS 設定。
1準備 geodata:GeoIP 與 GeoSite 檔從哪裡來?
規則要生效,核心必須能讀到對應的二進位資料。常見做法是讓 Mihomo 在啟動或更新時下載/指向本機路徑:GeoIP 多為 .mmdb,GeoSite 多為 .dat(或依版本與打包方式略有差異)。圖形客戶端常在「設定目錄」下快取這些檔案;純核心則在設定裡寫明路徑或使用預設目錄。
實務上請確認三件事:(1)檔案確實存在且版本夠新(過舊的 mmdb 會讓國家判斷漂移);(2)容器或路由器環境下,掛載卷沒有把資料目錄指到唯讀錯誤的位置;(3)您手動拼的 GEOSITE,某標籤 在當前 geosite 檔裡真的存在——拼錯標籤會變成「靜默不命中」,排查時很容易被誤判成規則壞掉。
提醒:分流與代理行為須符合所在地法規與網路使用政策;教學僅供合法合規的網路除錯與自用學習。
2GEOSITE 規則怎麼寫?
典型列式為:GEOSITE,<標籤>,<策略或策略組名>。標籤名稱來自您載入的 geosite 資料,例如常見的 cn(中國大陸站點集合)、google、telegram 等,實際可用集合請以上游發行說明為準,不要憑印象自造名稱。
策略欄位可以是 DIRECT、REJECT、REJECT-DROP 等內建動作,或您在 proxy-groups 裡定義的英文策略組名(大小寫需一致)。若您從訂閱合併設定,請先確認訂閱方使用的策略組命名習慣,再把自己的 GEOSITE 列接在對應組上,避免「規則寫了卻指向不存在的組」導致載入失敗或落到預設。
# Snippet — GEOSITE examples; policy names must exist in proxy-groups
rules:
- GEOSITE,cn,DIRECT
- GEOSITE,google,PROXY
- GEOSITE,category-ads-all,REJECT
對於HTTPS,若規則引擎在決策時仍拿不到域名,GEOSITE 無從發揮;此時應優先檢查 Sniffer、DNS 與 rules 前段是否有更寬鬆的 IP 規則先命中,而不是急著增刪 GEOSITE 標籤。
3GEOIP 規則怎麼寫?no-resolve 什麼時候加?
典型列式為:GEOIP,<國家碼>,<策略>,例如 GEOIP,CN,DIRECT。國家碼一般採 ISO 3166-1 alpha-2(如 CN、US、TW)。當您希望「只有在已經有 IP、且不想為了這條規則觸發多餘解析」時,可加上 no-resolve 修飾(寫法位置依您使用的設定格式與版本慣例為準,匯出完整 YAML 後對照官方文件最保險)。
no-resolve 的精神是:避免規則引擎在只有域名、尚未有確定 IP 時,為了做 GEOIP 匹配而提前發起解析,進而與 FakeIP、分流 DNS 策略打架或造成循環。若您發現開了某條 GEOIP 後 DNS 行為變得難以預測,請把該列與 DNS 教學 對照,一次只改一個變因。
# Snippet — GEOIP examples; add no-resolve per your schema when needed
rules:
- GEOIP,private,DIRECT,no-resolve
- GEOIP,CN,DIRECT,no-resolve
- MATCH,PROXY
IP 維度兜底通常直接寫明確的 MATCH 列即可維持可讀性;若您使用訂閱產生的特殊寫法,請以該訂閱與 Mihomo 版本文件為準。
4RULE-SET 與 rule-providers:大表怎麼接進 rules?
社群維護的「分流大包」通常不會把數千行直接塞進主設定,而是放在 rule-providers,再在 rules 裡用 RULE-SET 引用。好處是可獨立設定更新間隔、降本體積,並與 ACL4SSR/Loyalsoldier 這類生態對接。
寫 RULE-SET 時,provider 名稱必須與 rule-providers 區塊的鍵名一致;策略欄位同樣必須是存在的策略組或內建動作。載入失敗時,客戶端日誌通常會提示無法取得遠端規則或格式不符——先修復網路與 URL,再談規則細節。
# Snippet — illustrative rule-providers + RULE-SET
rule-providers:
my-rules:
type: http
behavior: classical
url: "https://example.com/rules.yaml"
path: ./rules/my-rules.yaml
interval: 86400
rules:
- RULE-SET,my-rules,DIRECT
5規則順序:最常見的「寫對了卻不生效」
Clash 系規則是有序清單:每一條連線從第一行開始往下找,命中即停。因此寬鬆的 GEOIP,CN,DIRECT 若放在很前面,可能會在域名規則還沒機會出場前就把流量分走;反之,過寬的 MATCH 若太早出現,後面的細緻規則永遠是死碼。
實務上可記一個粗骨架:本機與區網直連 → 明確域名/GEOSITE 例外(廣告攔截、特定站走代理或直連)→ IP/GEOIP 兜底 → MATCH。HTTPS 場景別忘了 Sniffer 與 DNS 是否讓「域名條件」真的存在,否則前段域名規則會長期閒置,流量直接落到後段 IP 規則。
小結:GEOSITE 解決「域名集合」;GEOIP 解決「IP 國別」;RULE-SET 解決「可更新的外部表」。三者都仰賴順序正確與資料檔最新。
常見坑與排查捷徑
GEOIP 放太前,吃掉細域名
症狀是「我明明寫了某個 DOMAIN-SUFFIX 走代理,結果仍直連」。請先在日誌確認第一條命中規則是哪一行;若顯示為某條 GEOIP,就把細域名/GEOSITE 規則上移到該 GEOIP 之前,或縮窄 GEOIP 的適用條件。
GEOSITE 標籤拼錯或資料版本不符
社群教學裡的標籤名會隨上游改版;複製貼上舊文可能導致規則靜默失效。排查方式是:用最小可重現的單條 GEOSITE 測試,並確認 geosite 檔與文件版本一致。
跨國 CDN 與「IP 國別 ≠ 網站國別」
大型站點常把邊緣節點設在您所在區域,導致 GEOIP 判定與直覺不符。此時應以域名規則為主、GEOIP 為輔,或為該站單獨寫明確策略。
HTTPS 無域名,GEOSITE 永不觸發
請對照 Sniffer 教學 開啟 TLS/QUIC 嗅探並檢查日誌是否出現主機名;否則再多 GEOSITE 也只是紙上談兵。
可照抄的最小骨架(請再合併訂閱與節點區塊)
下列片段僅示範 rules 與 rule-providers 的相對位置,不可單獨作為完整可執行設定;請與您的 proxies、proxy-groups、dns、tun 合併。註解使用英文以利部分解析器相容。
# Minimal skeleton — merge with your proxies, proxy-groups, dns, tun
mode: rule
log-level: info
rule-providers:
example-classical:
type: http
behavior: classical
url: "https://example.com/ruleset.yaml"
path: ./rules/example.yaml
interval: 86400
rules:
- GEOSITE,cn,DIRECT
- GEOSITE,google,PROXY
- RULE-SET,example-classical,DIRECT
- GEOIP,private,DIRECT,no-resolve
- GEOIP,CN,DIRECT,no-resolve
- MATCH,PROXY
開源資訊與安裝包取得方式
Mihomo 上游以開源方式維護,查閱授權、Issue 或版本變更時適合前往公開程式庫。日常安裝或更新圖形客戶端,建議優先使用 本站 Clash 下載頁,並搭配 設定說明文件;將「取得安裝包」與「閱讀原始碼」分開,可避免誤以為必須自行從 Release 頁拼裝環境。
結語
掌握 GEOIP 與 GEOSITE 並不是記幾個關鍵字而已,而是理解它們各自依賴哪種輸入(域名集合 vs. IP 國別)、以及您的設定是否提供了這些輸入。把 geodata 準備好、規則順序排對、在需要時為 GEOIP 選擇合適的 no-resolve,再與 Sniffer、DNS、PROCESS-NAME 疊加,就能把「按國家/按域名集合」的分流寫得既簡潔又可維護。
相較於在訂閱裡盲目堆疊別人寫好的大包而不讀命中順序,自己理解這一層語意後,遇到「某站走錯出口」時也能快速從日誌反查是第一條規則、資料過舊,還是 HTTPS 根本沒有域名可供匹配。這正是 Clash Meta/Mihomo 規則模式在長期使用上的優勢。