V2Ray 自訂路由規則寫法:domain、ip 與 geosite 比對優先順序詳解

拆解 routing 規則中的 domain、ip、geosite 比對語法與格式,說明規則由上而下的命中順序及常見衝突情境,並提供可直接套用的分流規則整理方式。

本文速覽

本文適合已能匯入節點,並希望進一步控制直連、代理與攔截範圍的使用者。重點涵蓋網域與 IP 條件的實際比對方式、geosite 與 geoip 資料集的用途、規則衝突時的處理順序,以及可依現有出站標籤調整的 routing 設定。

先了解 routing 的比對流程

V2Ray 路由不會改變 VMess、VLESS 等節點協定本身,而是處理請求進入核心後應交給哪個 outbound,也就是決定某個連線要走代理、直連、攔截出站或其他已定義的出口。路由結果取決於請求目標、規則順序與出站標籤;節點能連線不代表分流規則一定正確。

一次請求通常先由本機 SOCKS、HTTP 或透明代理入口接收,再進入 routing.rules。核心會從陣列中的第一條規則開始檢查,遇到第一條符合條件的規則便停止繼續比對,並使用該規則的 outboundTag 或 balancerTag。後面的規則即使寫得更具體,也不會覆蓋已命中的前置規則。

應用程式發起請求入口接收連線讀取目標資訊逐條比對規則選擇對應出站

同一條規則中的多個欄位通常必須「同時符合」。例如一條規則同時設定 network: "tcp"port: "443",只會比對 TCP 443 連線;欄位內的陣列則是「符合任一項即可」,例如 domain 陣列包含三個網域條件,命中其中一個便符合該欄位。

domain、full、regexp 與 geosite 的寫法

domain 欄位接收字串陣列,但陣列中的字串可以採用不同的比對語法;普通字串用於網域子字串比對;domain: 用於比對指定網域及其子網域;full: 只比對完整網域;regexp: 使用正規表示式;geosite: 則引用外部網域分類資料。日常分流優先使用 domain、full 與 geosite,只有現有語法無法表達目標範圍時才考慮 regexp。

精確與後綴比對

完整網域
full:api.example.com
網域及子網域
domain:example.com
普通字串
example
正規表示式
regexp:^.+\.example\.com$

已知固定主機名稱時優先使用 full;要涵蓋整個網站及其子網域時使用 domain。

分類資料比對

中國大陸常見網域
geosite:cn
廣告分類
geosite:category-ads-all
非中國大陸分類
geosite:geolocation-!cn
資料來源
核心載入的資料檔案

能否使用某個分類名稱,取決於目前核心實際載入的資料檔案及其版本。

domain:example.com 可以涵蓋 example.comwww.example.com,適合套用整站策略;full:example.com 不會自動涵蓋子網域,適合只處理單一固定主機名稱。普通字串的範圍更廣,可能意外比對到網域中含有相同字元的其他網站,因此不建議將過短的單字作為規則。

{
  "type": "field",
  "domain": [
    "full:api.example.com",
    "domain:static.example.com",
    "geosite:cn"
  ],
  "outboundTag": "direct"
}

geosite 不是即時連線查詢服務,而是核心讀取的本機網域分類資料。更新用戶端或核心後,分類內容可能會隨資料檔案變更。如果日誌顯示找不到某個 geosite 分類,應先確認分類名稱是否存在,再檢查用戶端使用的是 V2Ray 還是 Xray 核心,不要靠反覆調整規則順序來掩蓋資料缺失問題。

ip、CIDR 與 geoip 的比對條件

ip 欄位會針對連線目標的 IP 位址進行判斷,可以填寫單一位址、CIDR 網段或 geoip: 分類。常見寫法包括 127.0.0.0/8192.168.0.0/16geoip:privategeoip:cn。CIDR 後綴代表網路前綴長度,寫錯一位就可能擴大或縮小比對範圍。

10808
常見本機 SOCKS 連接埠
10809
常見本機 HTTP 連接埠
53
傳統 DNS 服務連接埠
5 組
建議的基礎規則層級

如果應用程式直接請求 IP,核心可以立即使用 ip 規則判斷;如果應用程式請求的是網域,是否為路由比對執行解析,取決於 routing.domainStrategy。AsIs 主要保留原始網域進行判斷;IPIfNonMatch 會在網域規則沒有結果時嘗試解析,並繼續進行 IP 比對;IPOnDemand 則可能在比對過程需要 IP 條件時觸發解析。

寫法 比對範圍 典型用途
127.0.0.0/8 本機迴路位址範圍 避免本機服務進入遠端代理
192.168.0.0/16 常見區域網路位址範圍 存取路由器、儲存裝置與內網服務
geoip:private 資料檔案定義的私有位址 集中處理多個私有網段
geoip:cn 資料檔案歸類的中國大陸位址 作為網域分流以外的補充條件

結論:網域規則負責主要分流,IP 規則負責補充

先用 full、domain 與 geosite 清楚表達業務範圍,再用 geoip:private、geoip:cn 或明確的 CIDR 處理直接存取 IP 的連線。如此可減少不必要的 DNS 解析,也更容易從日誌判斷請求為何命中某個出站。

使用 IPIfNonMatch 時也要注意解析路徑:路由判斷得到的 IP 與實際遠端連線使用的解析結果應盡量一致。若內建 DNS、系統 DNS 與遠端解析採用不同結果,同一網域可能在不同時間落入不同的位址分類。遇到分流偶爾變動的問題時,應同時檢查 dns 設定、domainStrategy 以及核心日誌中的目標位址。

規則優先順序與常見衝突

V2Ray 不會自動判斷哪條規則「更具體」。陣列位置越前,優先順序越高,因此規則整理應遵循「例外在前、範圍在後、兜底最後」。例如某個網域需要代理,但同時屬於 geosite:cn,就必須先寫該網域的代理規則,再寫 geosite 的直連規則。

  1. 先放必須攔截或必須單獨處理的精確規則,例如 full: 網域。
  2. 接著放區域網路與私有位址的直連規則,避免本機裝置請求進入代理。
  3. 然後放業務網域群組、geosite 分類與指定網段規則。
  4. 最後放涵蓋範圍較大的代理或直連兜底規則。
  5. 修改後使用核心日誌,逐一驗證網域、IP、TCP 與 UDP 請求。
{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:service.example.com"
        ],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": [
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

上面的第一條規則是 geosite 直連範圍中的例外,因此放在最前面;第二條先保護區域網路存取;第三、第四條分別處理中國大陸網域與位址;最後一條將剩餘的 TCP、UDP 請求交給 proxy。實際使用前必須確認 outbounds 中確實存在 proxydirect 兩個標籤,否則核心會因引用不存在的出站而啟動失敗。

在 v2rayN 中設定與驗證路由

v2rayN 的選單名稱可能會隨版本調整,常見入口是「設定」→「路由設定」。建立自訂規則集後,應先確認目前已選取該規則集,再儲存設定並重新啟動目前的核心。若使用完整自訂設定檔,則要檢查用戶端是否會在切換節點或更新訂閱時重新產生設定,避免手動修改遭到覆蓋。

檢查項目 具體操作 預期結果
本機入口 在「設定」→「參數設定」核對 SOCKS 10808、HTTP 10809 瀏覽器或測試程式連線至實際啟用的連接埠
出站標籤 檢查規則中的 proxy、direct 是否對應現有的 outbound tag 核心啟動日誌未出現未知出站標籤
規則順序 分別測試精確網域、geosite 網域、直接 IP 與區域網路位址 四類請求命中預期出站
UDP 請求 確認兜底規則包含 udp,並核對節點及入口相關設定 DNS 或其他 UDP 流量未被遺漏

驗證時不要只看網頁能否開啟。應開啟核心日誌,準備至少六個目標:一個精確代理網域、一個 geosite 直連網域、一個中國大陸 IP、一個區域網路 IP、一個應被攔截的網域,以及一個未被前述規則涵蓋的網域。逐一請求後記錄命中的 outboundTag;能比對規則序號時也應一併記錄。

結論:每次只調整一組條件

先固定 domainStrategy 與出站標籤,再移動一條規則或修改一個比對項目。一次同時變更 DNS、geosite 分類與規則順序,會讓日誌結果無法對應單一原因,反而增加排查時間。

常見問題與排查順序

路由問題通常表現為某個網站走錯出口、區域網路裝置無法存取、規則儲存後沒有變化,或核心直接啟動失敗。排查時應先確認設定是否確實載入,再檢查標籤與順序,最後才處理 DNS 解析與分類資料。依照這個順序,可以先排除設定未生效等基礎問題。

寫了 domain 規則,為什麼還是命中前面的 geosite?

將精確 domain 或 full 規則移到 geosite 規則之前,儲存後重新啟動核心。規則不會依精確程度自動排序,先命中的 geosite 已經結束本次比對。

存取 IP 能分流,存取網域卻沒有走 geoip?

檢查 routing.domainStrategy。使用 AsIs 時,網域請求不會為了所有 IP 規則統一執行解析;需要在網域規則未命中後再嘗試 IP 判斷時,可評估使用 IPIfNonMatch。

加入 geosite 後核心啟動報錯怎麼辦?

先刪除剛加入的分類並恢復啟動,再核對分類名稱與目前核心載入的資料檔案。分類不存在或資料檔案無法讀取時,調整規則順序無法解決錯誤。

區域網路位址為什麼被送進代理?

在寬泛代理規則之前加入 geoip:private,或明確加入 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。接著測試路由器與內網服務位址是否命中 direct。

規則看起來正確,儲存後仍然沒有變化?

確認目前啟用的是剛編輯的路由設定,然後重新啟動核心並查看產生的設定。若切換節點後規則消失,應檢查用戶端是否重新產生了 routing 區段。

一套易於維護的分流設定不需要堆積大量重複規則。先保留精確例外、私有位址、主要 geosite 或 geoip 分類,以及最終兜底,再依日誌補充確實必要的項目。新增規則時註明用途、目標出站與驗證結果,之後更新資料檔案或更換核心時,就能快速判斷哪些規則仍然必要。