V2Ray 路由規則實作:geosite 與 geoip 國內外分流設定

透過實際 routing 範例,示範中國大陸網站直連、境外網站走代理的分流設定,並說明 domainStrategy 的取捨與規則比對順序。

本文重點

本文適合已能連線至節點、準備調整分流規則的使用者。先釐清網域清單與 IP 位址清單的差異,再設定中國大陸網站直連、區域網路直連及預設代理。範例會說明 IPIfNonMatch 的解析條件、第一個出站作為預設出口的作用,以及如何透過用戶端記錄確認實際使用的出口,避免只憑「網頁能開啟」就認定分流設定正確。

一、geosite 與 geoip 分別比對什麼

geosite 是網域分類資料,geoip 則是 IP 位址範圍資料。兩者都不是自動辨識網站歸屬的服務,也不會即時查詢網站營運者。路由結果取決於本機資料檔、請求交給核心時所帶的目標資訊,以及規則順序。

寫法比對目標適用範圍
geosite:cn資料集 cn 分類中的網域核心必須取得網域;並非所有使用中文的網站
geoip:cn資料集中的中國大陸 IP 網段依據目標 IP,無法直接判斷網站隸屬哪家公司
geoip:private私有、保留等特殊用途位址集合常用於區域網路直連;實際範圍依使用的資料檔而定
domain:example.com指定網域及其子網域用來手動新增單一網站,不受分類標籤限制
full:example.com精確網域不會同時比對 www.example.com

網站可能使用跨區域 CDN。同一個網域在不同網路環境中,可能解析出不同位址,因此「網域符合 cn」和「解析出的位址符合 cn」是兩種不同判斷。若瀏覽器先自行解析,再將 IP 交給代理,網域規則可能就沒有機會直接比對;嗅探可在部分協定中補上網域資訊,但無法保證還原所有請求的網域。

二、可合併的 routing 範例與預設出口

以下是完整的 routing 物件片段,並非可直接連線節點的完整設定。合併至現有的 V2Ray 或 Xray 設定前,務必確認出站標籤:本文以 direct 指向使用 freedom 協定的直連出站,proxy 則指向已測試可用的代理出站。標籤只是名稱,不會自動建立出口。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:localhost",
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private",
          "geoip:cn"
        ],
        "outboundTag": "direct"
      }
    ]
  }
}

此片段要求現有設定的 outbounds 第一項是代理出站。在本文這類一般路由設定中,沒有規則符合時,流量會使用第一個出站;出口不會由 proxy 這個標籤名稱自動決定。若第一項實際上是直連,未符合規則的境外網站也會直連。不要只為了符合順序,就複製一個缺少伺服器資訊的代理出站。

此處「境外網站走代理」的準確意思是:未被上述直連規則涵蓋的流量,預設走代理。這並非即時且完整的國家或地區歸屬判斷。若要指定某個網域固定使用特定出口,應新增明確的網域規則,而不是期待 IP 位址的地理歸屬永遠符合需求。

結論:先確認預設出口,再調整分類

儲存規則前,先檢查產生的設定中 outbounds[0] 實際使用的協定與標籤。確認預設出口正確後,再用一條網域例外規則測試順序;否則即使分類清單調得再細,未符合規則的流量仍可能被送往錯誤出口。

三、domainStrategy 的選擇與預設出口陷阱

routing.domainStrategy 用來控制路由階段是否解析網域,以便比對 IP 規則。它不等同於 DNS 伺服器選擇,也不等同於出站連線時的位址選擇策略。若相同名稱的設定出現在不同層級,請先確認它所屬的物件。

IPIfNonMatch

建議設定

先依現有目標資訊比對規則;若沒有規則符合,再嘗試解析網域並重新比對。本文範例採用此策略,並以第一個出站作為預設出口,不另外加入全匹配的末尾規則。

適用情境:優先使用網域分類,並需要以中國大陸 IP 補充直連規則。

AsIs

路由階段不會額外解析網域以取得 IP。已有目標 IP 的請求仍可符合 IP 規則,但僅以網域傳入的請求不會因此取得 geoip 分類結果。連線階段仍可能需要解析網域。

適用情境:以網域規則為主,並希望減少路由階段額外 DNS 查詢的設定。

IPOnDemand

比對過程中若需要判斷 IP 規則,就可能觸發網域解析。IP 規則放得越前面,越可能提早進行查詢;但不能簡單地認定每個請求都一定會先解析。

適用情境:明確需要在規則流程較前段判斷 IP,且可接受相關查詢成本的設定。

常見錯誤是在 IPIfNonMatch 設定的末尾,再加入 network: "tcp,udp" 代理規則。此規則可能在第一輪就直接符合請求,導致「沒有規則符合」的條件不再成立。結果是,不在 geosite:cn 分類中的網域可能直接走代理,無法再透過解析結果符合 geoip:cn。

路由解析也會帶來隱私與連線成本。哪些網域會送往哪台 DNS 伺服器,必須搭配完整的 dns 設定、查詢流量路徑,以及瀏覽器本身的解析方式一起判斷。單獨變更 domainStrategy,無法保證 DNS 查詢會經由代理,也無法單獨解決 DNS 污染問題。

四、規則順序:例外優先,分類其次

每次比對規則時都會由上而下檢查,由第一條符合的規則決定出口。若同一個規則物件包含 domain 與 ip 等多個條件,這些條件必須同時符合;同一個 domain 陣列中的多個項目則符合其中一項即可。若要設定「網域符合或 IP 符合就直連」,應像本文一樣拆成兩條規則。

例如,某個網站雖然列在 cn 分類中,但業務測試要求固定走代理,可以將以下物件插入 rules 陣列最前面。此處的 example.com 是用來說明語法的保留網域,實際使用時請填入要測試的網域。

{
  "type": "field",
  "domain": [
    "domain:example.com"
  ],
  "outboundTag": "proxy"
}

「私有 IP 必須最先比對」也不適用於所有情境。若希望網域例外優先於其解析出的位址,就必須維持相應的規則順序;若要求所有私有位址一律直連,還需考量網域例外、DNS 回應結果與解析策略之間的關係。企業內部網路尤其應先確認位址規劃,不要直接將公用網路範例套用至現有策略。

五、在用戶端套用並確認實際設定

v2rayN 是桌面用戶端;v2rayNG 使用 Xray 核心,v2flyNG 使用 v2fly 核心。用戶端介面負責產生或載入設定,實際執行規則的是所選核心。完整自訂設定與一般節點模式的設定入口和套用範圍不同,不要同時修改兩處設定,再猜測哪一處生效。

  1. 備份目前設定

    記下目前啟用的節點、路由方案與本機監聽連接埠,並儲存現有的自訂設定。先確認路由尚未修改時節點可正常連線,再開始調整分流。

  2. 開啟路由設定

    v2rayN 常見入口為「設定」→「路由設定」;v2rayNG 常見入口為側邊選單→「路由設定」。選單名稱可能因版本而異,請以目前介面為準。先檢查現有規則,不要直接刪除整套方案。

  3. 選擇設定方式

    使用介面規則編輯器時,分別填入網域、IP 與目標出口,並確認排序。只有在使用完整自訂設定時,才合併本文的 routing 物件;不要將整個 JSON 物件貼進只接受網域清單的輸入欄位。

  4. 確認實際標籤

    檢查產生或載入的設定,確認 direct、proxy 都存在,並查看第一個出站。介面上的「直連」「代理」選項可能對應到其他標籤,請以實際設定中的名稱為準。

  5. 重新啟動並查看記錄

    儲存並啟用對應的路由方案後,先停止連線再重新啟動。查看執行記錄是否出現規則解析、資源檔或出站標籤錯誤。只儲存編輯視窗,不代表執行中的核心已重新載入設定。

若要比較核心行為,應分別記錄使用的核心及版本,而不只是用戶端版本。v2rayNG 與 v2flyNG 使用不同核心,不能視為同一核心的兩種介面;自訂設定中的擴充欄位與資源載入方式也必須分別確認。基礎欄位的詳細說明請參閱本站的JSON 手冊。

六、透過請求與記錄驗證分流結果

測試時必須先確認請求確實進入核心,再確認使用了預期出口。瀏覽器擴充功能、系統代理略過清單與終端機環境變數都可能改變流量入口。以下假設本機已啟用 127.0.0.1:10808 SOCKS 監聽;10808 是測試連接埠,並非所有安裝環境的預設值,執行前請換成目前使用的監聽連接埠。

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://www.baidu.com/
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/

socks5h 會讓 curl 將網域交由代理端處理,適合用來觀察網域規則;但這不代表 DNS 查詢一定會經過遠端代理。第一個請求用來觀察 cn 網域分類,第二個則用來觀察未符合直連條件時的預設出口。HTTP 回應成功只能證明連線已完成,實際出口仍應以存取記錄中的目標位址與出站標籤為準。

測試項目預期結果異常時優先檢查
資料中屬於 cn 分類的網域記錄顯示選擇直連出口geosite 資料、是否傳入網域、前置規則
網路中實際存在的區域網路位址記錄顯示選擇直連出口private 資料、IP 規則、內網連線狀態
不在直連範圍內的網域記錄顯示選擇代理出口第一個出站、額外規則、解析結果
手動指定走代理的例外網域優先符合例外規則例外規則位置、domain 與 full 的差異

測試區域網路位址時,請使用自己網路中確實存在的裝置,例如管理位址為 192.168.1.1 的路由器;此位址僅供示範。若裝置沒有提供網頁服務,連線失敗不代表路由規則有誤。記錄可以顯示選擇了哪個出站;目標服務是否有回應,則是下一層的檢查。

加入 geoip:cn 後,為什麼部分中國大陸網站仍走代理?

先確認請求是以網域還是 IP 傳入,再檢查 domainStrategy。若使用 AsIs,網域不會為了 IP 規則而額外解析;若使用 IPIfNonMatch,請檢查末尾是否有全匹配規則提早接收請求。最後確認實際解析出的位址是否包含在所用的 cn 資料中。

為什麼中國大陸網域會連到境外位址?

網域分類不保證伺服器位於同一地區。若 geosite:cn 已符合並選擇直連,後續的 geoip 規則就不會再改變出口。若要依 IP 決定出口,請明確調整策略與順序,並重新測試 CDN 的解析結果。

規則已儲存,為什麼記錄仍顯示舊出口?

確認啟用的是剛才編輯的路由方案,接著停止並重新啟動核心。完整自訂設定可能不會使用一般節點模式中的路由編輯結果;請檢查本次實際載入的設定,不要只看編輯視窗。

所有請求都直連,應該先檢查哪裡?

先檢查 outbounds 第一項是否為直連,以及前面是否有全匹配規則。接著使用上述指定 SOCKS 連接埠的 curl 指令,確認流量確實進入核心。若沒有對應的存取記錄,請先排查流量入口,不要急著擴增規則清單。

v2rayN / v2rayNG 下載