V2Ray 自訂路由規則設定:domain、ip、geosite 比對語法與優先順序

整理 domain、full、regexp、ip、geosite 與 geoip 的比對語法,說明規則由上而下的命中順序,以及 domainStrategy 如何影響分流結果。

本文速覽

本文適合需要在 v2rayN 新增網域例外、調整直連與代理順序的使用者。先區分網域、IP 與資料集這三種比對對象,再透過一段 routing 設定說明首條命中、DNS 補充解析與預設出站之間的關係。範例採用 V2Ray 與 Xray 常見的經典 JSON 路由結構;用戶端介面中的規則,仍須轉換為目前核心可辨識的設定。

1. 路由規則的基本結構與比對對象

系統代理會將應用程式的連線送進入站,路由則在流量進入核心後選擇出站。如果瀏覽器未使用系統代理,即使規則設定正確,也可能完全略過這套判斷。因此,排查自訂規則前,應先確認應用程式確實透過用戶端連線,而不是直接檢查網站顯示的出口 IP。

經典設定會將規則存放在 routing.rules 陣列中。每條規則的 type 通常是 field,比對條件可以是 domain、ip、port 或 network,並由 outboundTag 指定結果。標籤是設定中的參照名稱,不是核心內建的固定動作。

{
  "type": "field",
  "domain": [
    "full:api.example.com",
    "domain:example.net"
  ],
  "port": "443",
  "network": "tcp",
  "outboundTag": "proxy"
}

這條規則要求目標網域符合陣列中的任一項,且目標連接埠為 443、傳輸網路為 TCP。網域陣列內的條件是「或」,不同條件欄位之間則是「且」。這條規則不會接管同一網域的 UDP 443 連線,也不會接管 TCP 80。以下三個數字是設定用途的範例,並非速度測試結果。

443
範例規則指定的目標連接埠
53
一般 DNS 常用的目標連接埠
/32
單一 IPv4 位址的 CIDR 前綴

2. domain、full、regexp 與一般字串的寫法

domain 首先是規則中的欄位名稱;欄位陣列中的 domain: 則是比對方式前綴,兩者不可混為一談。陣列項目只填網域或對應的運算式,不要填網址通訊協定、路徑或查詢參數。若要區分同一網站的不同 URL 路徑,一般網域路由無法做到這種細分。

寫法比對範圍比對範例
full:example.com完整網域精確比對符合 example.com,不符合 www.example.com
domain:example.com指定網域及其子網域符合 example.com 和 a.example.com,不符合 notexample.com
example.com一般字串子字串比對可能符合 notexample.com,比對範圍通常比預期更廣
regexp:^api[0-9]+\\.example\\.com$正規表示式比對符合 api1.example.com,不符合 api.example.com

表格中的正規表示式以 JSON 字串形式呈現。正規表示式本身需用 \. 表示字面上的句點,而 JSON 還要跳脫反斜線,因此設定檔中要寫成 \\.。若是在用戶端的一般文字輸入框填寫運算式,通常輸入一層反斜線即可;不要將 JSON 跳脫格式直接複製到所有介面。

{
  "type": "field",
  "domain": [
    "full:example.com",
    "domain:example.net",
    "regexp:^api[0-9]+\\.example\\.com$"
  ],
  "outboundTag": "proxy"
}

結論:網域例外優先使用 full 或 domain

只處理單一主機名稱時使用 full:;處理整個網域及其子網域時使用 domain:。只有在主機名稱有明確的變化規律時才使用正規表示式,並加上首尾錨點,避免一併納入無關網域。

3. ip、geoip 與 geosite 的差異

ip 欄位用於比對目標位址,可填入單一 IP、CIDR 網段或 geoip: 資料集參照。geosite: 則填在 domain 陣列中,代表依網域集合比對。兩類集合的成員不同,不能保證「符合 geosite 就一定符合同名 geoip」。

{
  "type": "field",
  "ip": [
    "192.168.0.0/16",
    "10.0.0.0/8",
    "geoip:private"
  ],
  "outboundTag": "direct"
}

上例先示範 CIDR 的具體寫法,再示範私有位址集合;兩者範圍可能重疊,實際設定通常保留符合需求的一種即可。IPv6 單一位址可使用 /128。不要只涵蓋 IPv4 就認定已處理所有區域網路連線;在雙堆疊網路中,也要檢查 IPv6 目標位址。

同一網域可能使用不同地區的 CDN 位址;DNS 回傳值改變後,IP 規則的結果也可能隨之變動。若希望特定服務固定使用指定出站,應優先新增明確的網域例外,而非長期綁定某次查詢取得的單一 CDN 位址。

4. 生效優先順序:依序比對,第一條命中即採用,不按精確度排序

每次掃描規則時,核心會依照 rules 陣列由上而下檢查,命中後就選擇該規則指定的出站。核心不會因為後面的 full: 更精確,就自動覆蓋前面的 geosite:;也不會依網段長度重新排序。所謂「例外優先」,是設定者主動將例外規則往前移。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["full:api.example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}

此處將單一網域例外放在網域集合之前。若同一連線符合第二條,第三條便不會再參與比對。不過,第一條私有 IP 規則能否在初次掃描時比對,仍取決於目標是否已是 IP,以及目前的網域策略是否觸發解析;「排在最上面」不代表一定會先完成 DNS 查詢。

  1. 目標為 api.example.com,且入站保留網域時,第二條可直接選擇 proxy。
  2. 其他網域若符合 geosite:cn,第三條會選擇 direct,不必等到 IP 補充比對。
  3. 網域階段全部未命中時,IPIfNonMatch 才會嘗試解析,並讓取得的 IP 重新參與規則比對。
  4. 仍未命中時,經典設定會使用 outbounds 陣列中的第一個出站;它不一定名為 proxy。

5. domainStrategy 如何改變 DNS 與分流結果

routing.domainStrategy 控制路由比對時是否需要將目標網域解析為 IP。它不等於系統 DNS 設定,也不等於直連出站本身的同名策略。即使名稱相似,所在的設定層級不同,作用階段也不同。

AsIs

路由階段不會主動解析網域以補上 IP;若目標原本就是 IP,IP 規則仍可比對。連線最終是否需要解析,則由後續出站等環節決定。

適用情境:規則以網域為主,且希望路由決策不額外觸發 DNS 查詢。

IPIfNonMatch

建議

先使用現有目標資訊進行比對;若沒有任何規則命中,再嘗試解析網域,讓 IP 規則參與後續判斷。需避免過早命中的全量預設規則。

適用情境:像本文一樣,網域例外優先,以 IP 歸屬作為補充分流條件。

IPOnDemand

比對過程中遇到需要 IP 資訊的規則時,會視需要觸發解析。若前面的 IP 規則命中,可能會在後面的網域例外選定出站之前先行生效。

適用情境:明確要求 IP 規則盡早參與,並能掌控 DNS 結果與規則順序。

例如,第一條是 geoip:private,第二條是某網域的代理例外。若該網域解析到私有位址,IPOnDemand 可能會讓第一條先命中;若使用 IPIfNonMatch,只要第二條已能命中,就不必等待補充解析。調整策略後,不應只確認網站能否開啟,也要檢查實際命中的出站。

6. 在 v2rayN 新增並驗證自訂規則

以下以 v2rayN 7.x 桌面版常見介面為例;不同小版本的按鈕位置可能有所調整,規則欄位請以目前視窗為準。介面管理的規則與完整 JSON 設定不是相同的輸入格式,不要將整段 routing 物件貼進單一「網域」輸入框。

  1. 確認核心

    開啟「設定」→「參數設定」,查看 Core 類型相關設定及目前設定使用的核心;啟動後再核對記錄中的核心名稱。本文語法適用於 V2Ray、Xray 經典路由設定;其他格式需要轉換。

  2. 開啟路由設定

    前往「設定」→「路由設定」,先備份目前使用的方案,再編輯準備啟用的規則集。確認編輯的就是主畫面目前選用的路由,而不是尚未啟用的副本。

  3. 新增例外

    在規則編輯視窗選擇目標出站,並在網域欄位填入 full:api.example.com 或實際需要處理的網域。先不要加入連接埠與網路限制;確認生效後再逐步縮小範圍。

  4. 調整順序

    將例外移到可能涵蓋它的網域集合規則之前,儲存並套用該路由方案。用戶端通常會重新載入相關設定;若記錄未顯示變更,可重新啟動服務後再測試。

  5. 檢查連線

    關閉原有測試分頁並建立新連線,查看連線記錄中的目標與出站標籤。需要更詳細的記錄時,可在「設定」→「參數設定」中暫時提高記錄層級,完成後再恢復常用層級。

路由調整通常只對新連線生效;瀏覽器連線重用與長連線可能繼續使用原本的出站。只重新整理一次,不足以證明新規則未生效。也應同時測試主網域、子網域和直接 IP 三類目標,避免只測首頁,卻忽略頁面資源實際使用了其他網域。

測試項目觀察內容未符合預期時的檢查項目
精確網域完整主機名稱是否選到指定標籤前置規則、目前啟用的路由方案
子網域full 與 domain 的涵蓋範圍差異是否誤用一般字串,或遺漏子網域
直接 IPIP 規則是否獨立生效CIDR 寫法、IPv4 與 IPv6 位址類型
未命中目標是否進入預期的預設出站第一個出站、全量預設規則、解析策略

7. 自訂路由常見問題

把 full 規則放在最後,為什麼仍走直連?

比對更精確不代表優先順序更高。開啟「設定」→「路由設定」,將這條規則移到可能命中的 geosite 或一般網域規則之前,儲存後建立新連線,再查看出站標籤。

設定了 geoip:cn,網域連線卻沒有依地區分流?

先檢查 routing.domainStrategy。若為 AsIs,路由不會主動解析網域供 IP 規則使用;若為 IPIfNonMatch,則檢查前面是否已有網域規則命中,或末尾是否有提早結束比對的全量規則。

新增 geosite 後核心啟動失敗,該怎麼辦?

先移除新加的項目,讓連線恢復,再查看啟動記錄。重點確認核心能否讀取資料檔,以及設定的分類是否存在。不要隨意改動集合名稱反覆試錯;可先用單條 domain: 規則驗證路由流程。

網站首頁符合規則,登入和圖片卻沒有使用相同出口?

查看這些請求實際使用的主機名稱。登入介面、靜態資源與下載服務常使用不同網域;只設定主網域的 full: 不會涵蓋它們。同一個受控網域下可改用 domain:;獨立網域則分別新增,避免直接擴大為模糊關鍵字。

切換核心後,原有規則可以直接沿用嗎?

先確認目標核心接受的設定格式、資料集與出站標籤,再逐條驗證。V2Ray 與 Xray 共用部分經典欄位,但用戶端產生設定的方式與擴充能力可能不同;成功匯入只代表設定已被接受,不代表所有連線都會依照原本的路徑出站。

v2rayN下載