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

說明 domain 的 full/domain/keyword/regexp 前綴、ip 與 geoip 寫法、geosite 分類引用、規則由上而下的比對順序,以及 domainStrategy 的影響。

本文重點

適合已匯入訂閱、需要調整 v2rayN 路由分流的使用者。本文依 V2Ray/Xray 的 routing 設定說明網域、IP、分類資料與規則順序,並釐清「關鍵字比對」與原生規則中並不存在的 keyword: 前綴。讀完即可撰寫最精簡的規則、找出被前置規則遮蔽的例外,並透過實際連線記錄確認使用的出站。

1. 路由規則處理的是連線,不是訂閱節點

匯入訂閱會取得伺服器位址、驗證資料與傳輸參數;路由分流則決定某條連線要交給哪個出站。VMess、VLESS 是代理協定,routing.rules 是流量選擇規則,兩者不能互相取代。訂閱更新成功,不代表目前使用的設定已啟用自訂路由。

連線進入核心 讀取目標資訊 依序比對規則 選擇出站標籤 建立目標連線

路由取得的目標可能是網域,也可能只有 IP 位址。應用程式透過代理協定傳入網域時,可以直接套用網域規則;若應用程式自行解析,只傳入 IP,網域規則就不一定有可供比對的資訊。嗅探功能可能還原支援流量的網域資訊,但無法將任意加密流量還原成網站名稱。

2. domain 寫法:精確比對、子網域、關鍵字與正規表示式

domain 是字串陣列,同一陣列中的項目彼此為「或」的關係,任一項目符合即可滿足這個欄位。建議優先採用範圍明確的寫法:只比對單一主機時用 full:,涵蓋根網域及其子網域時用 domain:,確實需要搜尋文字時才使用不帶前綴的字串。

寫法比對範圍注意事項
full:example.com僅比對 example.com不包含 www.example.com
domain:example.comexample.com 及其子網域不會比對 notexample.com
example網域中的 example 字串可能同時比對多個無關網站
regexp:^api[0-9]+\.example\.com$例如 api1.example.comJSON 中的反斜線必須跳脫
geosite:cn資料檔中 cn 分類所列的網域視實際安裝的資料檔而定

keyword: 並非原生支援的前綴

有些規則編輯器會將關鍵字選項命名為 keyword,但在 V2Ray/Xray 原生的 domain 陣列中,關鍵字比對使用一般字串。不要把 keyword:example 當成通用寫法直接貼上;它不會自動表示預期的「網域包含 example」。介面提供的類型選項與核心 JSON 屬於不同層次,應檢查最後產生的規則。

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

這是一個規則物件,不是完整的用戶端設定。三個項目分別用來比對登入主機、文件網域及其子網域,以及帶有數字編號的 API 主機。正規表示式中的 \\. 是 JSON 字串表示法,解碼後才會以 \. 傳給正規表示式引擎;若是在用戶端的純文字正規表示式欄位輸入,請依該欄位的格式處理,不要機械式地多加一層反斜線。

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

若要單獨調整登入或付款主機,請先加入精確網域,並放在範圍較廣的分類規則之前。不要用短關鍵字涵蓋整個網站,以免將名稱相似但無關的網域一併改道。

3. ip、geoip 與 geosite:分開設定位址範圍和網域集合

ip 可接受 IP 位址、CIDR 網段及 geoip: 資料引用;domain 則接受網域規則與 geosite: 引用。兩者代表不同維度:網域分類指出某個名稱屬於哪個集合,IP 分類則指出目標位址落在哪個位址集合;這些資訊無法據此保證網站內容、公司歸屬或實體機房位置。

網域分類規則

欄位
domain
引用
geosite:cn
資源
geosite.dat
前提
路由可取得目標網域

分類名稱必須存在於目前使用的資料檔,不能只憑名稱推測是否可用。

IP 分類規則

欄位
ip
引用
geoip:private
資源
geoip.dat
前提
目標是 IP,或已取得解析結果

分類內容會隨資料檔而異;若要測試指定位址,可先使用明確的 CIDR。

以下將網域直連和私有位址直連分別寫成兩條規則,表示「符合任一集合就直連」。若把 domain 和 ip 放在同一條規則中,代表兩個欄位必須同時符合,而不是二選一。

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:private", "192.0.2.10/32"],
        "outboundTag": "direct"
      }
    ]
  }
}

4. 優先順序:由上而下比對,首次命中即停止

路由不會自動把「更精確」的規則排在前面。每次比對都會依照 rules 陣列順序進行,命中一條規則後便選擇對應的出站。即使精確網域比 geosite 分類更具體,若排在已命中的分類規則之後,也不會再執行。

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

以上僅展示 routing 部分,並假設完整設定中已存在標籤為 proxy 和 direct 的出站。這些只是範例標籤,不是所有用戶端都固定使用的名稱;尤其不要誤以為只要寫上 direct 標籤,就會自動建立直連出站。

  1. 先加入明確的例外,例如需要透過代理連線的單一登入主機。
  2. 接著加入基本網路規則,例如明確指定的區域網路目標。
  3. 之後再加入涵蓋範圍較廣的網域或 IP 分類。
  4. 最後設定預設行為;若沒有任何規則符合,V2Ray/Xray 通常會使用出站清單中的第一個出站。

欄位之間通常是「且」的關係,欄位陣列內的項目通常是「或」的關係。例如,一條規則同時設定 domain: ["domain:example.com"] 和 port: "443",就只會處理該網域及其子網域中目標連接埠為 443 的連線。這裡的連接埠是目標連接埠,不是用戶端的本機監聽連接埠。

443
HTTPS 常用目標連接埠
53
傳統 DNS 常用目標連接埠
/32
IPv4 單一位址的前綴長度

5. domainStrategy:是否解析,以及何時解析

routing.domainStrategy 決定路由階段如何使用網域解析結果,不是瀏覽器的 DNS 設定,也不能取代出站模組中同名的選項。切換此設定可能改變比對結果與解析時機,但不會改變規則陣列的基本優先順序。

設定值路由階段的處理方式排查重點
AsIs不會為路由比對主動解析網域原始目標為 IP 時,仍可比對 ip 規則
IPIfNonMatch網域請求第一輪未符合規則後,解析並重新比對規則若先符合網域規則或預設規則,就不會進入這個流程
IPOnDemand網域請求比對到需要 IP 判斷的規則時,才依需求解析前面的 IP 規則可能先於後面的網域規則命中

例如,將 geoip:cn 放在某條網域代理規則之前:使用 IPOnDemand 時,前面的 IP 條件可能觸發解析;若位址屬於該集合,就會直接選擇直連。使用 AsIs 時,只有網域的請求不會為了這條 IP 規則主動解析,可能繼續符合後面的網域規則。兩種設定得出不同結果,不代表規則順序失效,而是可用來比對的資料不同。

再看 IPIfNonMatch:第一輪網域規則未命中,且沒有其他規則接收請求時,核心才會解析並重新掃描。若目標進入入站時原本就是 IP,就不需要先進行一輪網域比對。排查時請先記錄輸入目標的類型,避免一概把所有連線當成網域請求分析。

6. 驗證 v2rayN 自訂規則是否生效

圖形介面中的路由方案、正在執行的核心設定,以及磁碟上的編輯檔案,可能不是同一份內容。操作前請先儲存目前的路由方案;在 v2rayN 主視窗的路由設定入口確認目前使用的方案,再檢查產生設定中的 routing.domainStrategy 和 routing.rules。不同版本的介面配置可能不同,請以欄位和實際執行設定為準;不要直接編輯暫存產生檔,然後期待修改永久保留。

  1. 建立單一測試規則。選擇自己能連線的完整主機名稱,使用 full: 並將規則放在最上方,指向已存在的出站標籤。先不要加入正規表示式或分類資料。
  2. 儲存並重新套用設定。透過用戶端重新載入設定或重新啟動核心,讓修改套用到目前執行的設定。確認啟動輸出中沒有未知欄位、找不到出站或分類載入失敗等錯誤。
  3. 建立新連線。關閉相關網頁後重新開啟;必要時重新啟動測試用的應用程式。HTTP/2 長連線與連線重用可能繼續使用舊出站,重新整理頁面不一定會建立新連線。
  4. 查看實際記錄。啟用存取記錄後,確認目標及出站標籤;必要時可短暫提高記錄層級。記錄格式會因核心而異,不應只憑網頁能否開啟,就推斷命中了哪條規則。
  5. 逐步恢復複雜條件。精確網域測試通過後,再加入網域分類、IP 條件與 DNS 策略。每次只變更一個項目,並保留修改前後的記錄以供比較。

瀏覽器請求也可能涉及主網站、靜態資源、登入介面與媒體網域。網頁能成功載入,不代表所有子連線都經過同一個出站。檢查記錄時請以具體目標主機為單位,不要把同一頁面的所有請求都視為同一條連線。

設定了 domain:example.com,為什麼其他網域也跟著走?

先檢查實際儲存的項目是否漏了 domain:。一般字串 example.com 採用子字串比對,範圍較廣;若只要比對單一主機,請改用 full:example.com,重新套用設定後再建立新連線。

geosite 規則已儲存,為什麼核心啟動時出錯?

查看啟動輸出,確認是否提示分類不存在或無法讀取資料檔,再檢查目前核心的資料資源位置及實際分類名稱。先改用一條 full: 規則驗證基本路由,不要把資源載入失敗誤判為節點無法使用。

啟用 IPIfNonMatch 後,IP 規則還是沒有執行?

檢查前面是否已有網域規則命中,以及結尾是否有 network: "tcp,udp" 之類的預設規則。只要第一輪已有規則符合,就不會因為這項策略而重新解析;接著確認請求進入核心時的目標究竟是網域還是 IP。

將連接埠 53 設為直連,就能控制所有 DNS 嗎?

不行。目標連接埠 53 只涵蓋符合條件的傳統 DNS 連線;加密 DNS 可能使用其他連接埠,核心本身的 DNS 查詢也有獨立的處理流程。應同時檢查應用程式的 DNS 設定與核心 DNS 設定,而不是只新增一條連接埠規則。

結論:記錄目標、順序與出站,逐項驗證

每次修改都記下「測試主機名稱、規則位置、記錄中的出站標籤」。先確認精確規則生效,再擴大到分類集合,就能分別排查語法錯誤、比對範圍錯誤與 DNS 解析時機問題。

下載 v2rayN選擇平台與安裝套件