v2rayN 路由規則實作:geosite/geoip 寫法與中國大陸分流設定

說明路由規則的比對順序,示範如何搭配 direct、proxy、block 三種出口與 geosite、geoip,建立穩定的分流規則。

本文快速導覽

本文適合已匯入訂閱、節點也能連線,但還不確定中國大陸網站與區域網路流量該如何直連的使用者。以下以 v2rayN 管理的 Xray 核心為例,拆解規則順序、網域與 IP 比對、預設出口及驗證方式;讀完即可建立一套可還原的中國大陸分流規則,並分辨「規則未符合」與「請求根本未進入用戶端」。

一、先釐清流量入口、路由規則與出口

系統代理、TUN 與路由分流並非同一個開關。系統代理會讓遵循該設定的應用程式將請求交給本機代理;TUN 接管系統路由範圍內的流量;核心的路由規則則決定收到請求後要交給哪個出口。若請求未進入核心,修改 geosite 清單也不會生效。

應用程式請求 本機入口 比對規則 選擇出口 目標服務

本文以 proxy 表示代理出口標籤、direct 表示直連標籤、block 表示封鎖標籤。標籤只是設定中的名稱,不是填上去就會自動成為可用的協定。實際產生的設定中必須有同名的 outbounds[].tag,否則可能無法載入設定,或發生找不到出口的錯誤。

直連與代理

direct
通常對應 freedom 出口
proxy
對應目前選取的代理節點或代理出口
適用目標
區域網路與中國大陸資源直連,其餘流量依預設出口處理

VMess、VLESS 是節點連線協定,不是 geosite 分類名稱。

封鎖與預設出口

block
通常對應 blackhole 出口
未符合規則
Xray 會使用 outbounds 陣列中的第一個出口
檢查項目
實際執行設定中的 routing 與 outbounds

預設出口不是由標籤名稱決定,請檢查出口順序。

二、geosite 與 geoip 分別要寫在哪裡

geosite:cn 寫在規則的 domain 陣列中,表示比對網域資料庫中的 cn 分類;geoip:cn 寫在 ip 陣列中,表示比對 IP 資料庫中的 cn 位址範圍。兩者都不是線上查詢服務,也無法保證自動正確分類所有中國大陸服務。

表示式欄位比對內容
geosite:cndomain網域集合中的 cn 分類
geoip:cnipIP 位址集合中的 cn 分類
domain:example.comdomainexample.com 及其子網域
full:example.comdomain只精確比對 example.com
192.168.0.0/16ip指定 IPv4 網段

在 Xray 網域規則中,直接填寫 example.com 屬於關鍵字比對,並不等同於「該網域及其子網域」。為特定服務新增例外時,建議明確使用 domain: 或 full:,避免誤比對到名稱中包含相同字串的其他網域。

三、規則由上往下比對,特殊例外要放前面

Xray 會依序檢查路由規則,第一條符合條件的規則就會決定出口。規則不會先計算「哪一條比較精確」再自動挑選。範圍較大的規則若排在前面,後續較精確的規則可能就沒有執行機會。

  1. 服務例外:確實需要強制代理或強制直連的精確網域,請放在一般分類規則之前。
  2. 選用封鎖:確認不會影響服務後,才將廣告網域分類交由 block 處理;若發生誤擋,先移除此規則進行測試。
  3. 區域網路直連:比對私人網域與私人位址,避免將路由器、印表機服務等請求送往遠端。
  4. 中國大陸直連:先以 geosite 比對網域,再以 geoip 補充比對 IP 目標。
  5. 其餘流量:交由確認過的預設代理出口處理,或依所選策略安排備援出口。

同一條規則中的多個不同欄位通常代表「必須同時符合」。例如同時填入 domain 與 ip,並不代表「網域屬於中國大陸或 IP 屬於中國大陸」。若要達成這種「或」的分流目的,應拆成兩條規則,分別比對網域與 IP,再指向同一個 direct。

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

這是用來示範語法的精確網域例外,不代表範例網域需要代理。實際使用時,請將網域換成需要處理的服務網域,並把這條規則放在可能涵蓋它的通用規則之前。若該服務還有登入、靜態資源與 API 網域,也應依據記錄逐一確認,不能只處理瀏覽器網址列中的主機名稱。

四、Xray 中國大陸分流設定範例

以下僅展示 routing 物件,並非可獨立啟動的完整用戶端設定。此範例假設已存在 proxy、direct、block 三個出口,且 outbounds 的第一個出口是 proxy。這裡不加入全域比對的備援規則,目的是保留 IPIfNonMatch 進一步解析的機會。

5 條
範例路由規則
3 個
必須存在的出口標籤
10808
下文驗證用的本機連接埠範例
{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": ["geosite:category-ads-all"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": ["geosite:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}

IPIfNonMatch 的意思是:目標為網域且第一輪規則沒有比對結果時,再嘗試解析網域,並使用取得的 IP 繼續比對。直接以 IP 建立的連線,本來就能參與 IP 規則比對。網域若已符合 geosite 規則,就不會為了後續的 geoip 規則再額外執行這輪解析。

這套策略並不保證「中國大陸網域一定直連」。網域分類可能不完整,解析結果也可能受 CDN 調度影響。對穩定性要求較高的服務,請先新增明確的網域規則,再將 geoip 視為補充依據。廣告分類為選用項目,初次設定時可先移除第一條規則,確認基本分流正常後再啟用。

五、在 v2rayN 中儲存、啟用與驗證

先確認目前節點使用的是 Xray。本文的 routing 欄位不能直接套用到其他核心的設定格式。v2rayN 不同桌面版本的視窗標題可能略有差異,以下以繁體中文介面為例,請依序前往「設定」→「路由設定」;在規則視窗中,請分清路由方案清單與方案內的規則清單。

  1. 保留還原方案:在「設定」→「路由設定」記下目前啟用的方案。若支援複製,請先複製再修改;不要直接覆寫唯一可用的規則集。
  2. 新增或編輯方案:依照上述順序新增網域規則與 IP 規則,並選擇 direct、proxy 或 block 作為出口。圖形介面的單項輸入格式請以視窗提示為準,不要將整個 routing 物件貼到「網域」輸入欄。
  3. 設定網域策略:在路由方案的網域解析策略中選擇 IPIfNonMatch;儲存後回到主畫面,切換至剛編輯的路由方案。只儲存但未啟用,不會改變執行結果。
  4. 確認入口:前往「設定」→「參數設定」確認本機監聽連接埠。以下以 10808 為例,實際數值請以介面顯示為準;測試系統代理時,請在主畫面的系統代理選單中選擇「自動設定系統代理」。
  5. 檢查執行結果:套用設定並重新啟動核心,查看記錄中是否出現資源載入、規則解析或出口標籤錯誤。透過用戶端提供的檢視設定功能或執行中的設定檔,核對實際產生的 routing 與 outbounds。

不要直接修改用戶端自動產生的暫存設定,並將其當成長期方案。切換節點、更新訂閱或重新啟動後,這類檔案可能會重新產生。請在路由設定中儲存規則;若確實使用自訂設定,則應由自訂設定完整管理入口、DNS、出口與路由。

curl --proxy socks5h://127.0.0.1:10808 --head https://example.com
curl --proxy socks5://127.0.0.1:10808 --head https://example.com

以上指令用來比較「將網域交由代理端處理」與「先由本機解析」的差異,不是速度測試。socks5h 會將目標網域交給代理端;socks5 通常會先在本機解析,再將 IP 交給代理端。請先確認該連接埠確實接受 SOCKS 請求,且命令列環境已安裝 curl。不要使用 -k 跳過憑證驗證來掩蓋連線問題。

驗證目標預期結果需記錄的資訊
已確認屬於 cn 分類的網域direct目標網域、時間、出口標籤
區域網路位址,例如 192.168.1.1direct目標位址是否實際存在、服務連接埠
不符合直連與封鎖規則的目標預設 proxy第一個出口與記錄中的實際出口
已確認屬於廣告分類的網域block分類是否存在、是否影響服務

記錄顯示的細節會因核心與記錄層級而異,不一定會直接列出「第幾條規則」。可根據連線記錄中的目標與出口標籤判斷;必要時短暫提高記錄層級,重現一次後再還原。測試資料只記錄目標類型與出口,不要公開訂閱網址、節點憑證或完整的私人瀏覽記錄。

六、DNS、流量探測與 TUN 的分流界線

domainStrategy 用來決定路由判斷時是否解析目標網域,並不代表所有 DNS 設定都已完成。用戶端 DNS 設定、系統 DNS、瀏覽器安全 DNS,以及應用程式是否直接傳送 IP,都會改變核心實際收到的目標資訊。不能只因為加入了 geosite,就認定每條連線都有網域可供比對。

修改分流設定時,一次只調整一個環節:先用明確指定代理的指令確認路由,再測試系統代理,最後視需要測試 TUN。如此可避免同時修改 DNS、規則與接管方式後,無法判斷是哪一項解決了問題。更多接管設定步驟請參閱入門指南的 TUN 設定。

七、路由未生效時的四個常見問題

已選擇中國大陸分流,為什麼中國大陸網站還是走代理?

先確認目前啟用的路由方案,而不只是查看已儲存的方案。接著確認該網域是否包含在 geosite:cn 中,以及前面是否有強制代理規則。若需暫時修正,請將該服務的 domain: 規則移到通用規則之前,並從連線記錄確認出口已變成 direct。

已設定 geoip:cn,為什麼還是沒有符合?

確認它寫在 ip 陣列,而非 domain 陣列。若目標以網域形式進入,請檢查 domainStrategy;使用 IPIfNonMatch 時,也要移除會提前符合所有請求的備援規則,或重新評估解析策略。最後確認實際解析出的 IP 是否位於目前資料庫的 cn 範圍內。

加入廣告封鎖後,登入或付款頁面無法開啟怎麼辦?

先停用 category-ads-all 那條規則並重試,確認是否為誤擋。若確實需要保留封鎖,請根據失敗請求的實際網域,新增排序更前面的 direct 或 proxy 例外。不要直接把整個服務涉及的所有位址都加入範圍過大的關鍵字白名單。

更新訂閱後,之前設定的規則會被修改嗎?

一般伺服器訂閱更新主要會變更節點資料,不代表本機路由規則與地理資料也會更新。請先檢查目前的路由方案與所選核心是否切換;若使用自訂設定或額外的設定匯入流程,則需另外確認其覆寫範圍。不要反覆重新整理訂閱來修復規則分類缺失。

判斷一套分流規則是否穩定,重點不在規則數量,而在於能否說明每個測試請求使用哪個出口。保留一份可用方案,記下修改項目與驗證目標;發生異常時,先還原最近的修改,再檢查入口、目標資訊、比對順序與出口。基本操作請參閱路由設定教學;若遇到連線錯誤,請前往疑難排解逐項檢查。

下載v2rayN