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

整理 domain、full、regexp、geosite、geoip 等比對前綴的語法與差異,說明規則由上而下的比對順序,以及常見衝突的排除方式。

本文快速導覽

適合已匯入訂閱,準備在 v2rayN 中調整分流的使用者。先區分網域比對與 IP 比對,再了解首條命中、解析策略和出站標籤。文中的 JSON 是核心設定片段,並非可直接啟動的完整設定;依範例檢查產生的設定,可排查「規則已寫卻未生效」和「例外被大範圍規則覆蓋」這兩類常見問題。

1. 路由規則:決定請求從哪個出站連線

訂閱提供節點連線參數,路由則決定哪些請求使用這些節點。VMess、VLESS 等協定是節點連線方式,不是路由比對前綴。將節點改成 VLESS,不會自動改變特定網站要直連或透過代理連線。

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

在 V2Ray、Xray 常見的路由架構中,routing.rules 是有順序的陣列。每條規則會比對目標網域、目標 IP、連接埠或入站標籤等條件,符合後透過 outboundTag 指向已定義的出站。標籤只是設定中的名稱,proxy、direct 並非自動存在的內建出站。

2. domain、full、regexp:依比對範圍選擇前綴

domain 既是規則中的欄位名稱,也可能是欄位值中的比對前綴。下表的字串都放在 "domain": [...] 陣列中。不要加上網址的通訊協定、路徑或查詢參數;路由的網域比對方式不同於瀏覽器網址列比對。

寫法比對範圍典型邊界
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
geosite:cn資料檔中的網域集合視本機資料檔是否提供 cn 標籤及其具體內容而定

只讓單一主機透過代理連線,使用 full:。若要統一處理整個網站及其子網域,使用 domain:。一般裸字串適用於明確需要包含比對的情況,不適合當成精確網域的簡寫。也不要寫成 domain:*.example.com:這裡不是萬用字元語法。

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

上方三個陣列項目是「或」的關係,符合任一網域條件即可。正規表示式使用 [.] 表示字面上的句點,避免 JSON 反斜線跳脫造成混淆。若改用正規表示式的 \.,在 JSON 字串中必須寫成 \\.。開頭的 ^ 和結尾的 $ 用來限定完整比對範圍。

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

ip 欄位接受 IP 位址、CIDR 網段或 geoip: 集合;domain 欄位接受網域比對項目及 geosite: 集合。兩種集合不能互換。geoip:cn 表示位址歸屬集合,不代表所有中文網站;geosite:cn 是網域清單,也不保證這些網域永遠解析到同一地區的位址。

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

這段設定示範讓私有網路目標直連。前兩個網段可能與 geoip:private 重疊,實際設定通常選用明確網段或集合即可。若要讓中國大陸網域及中國大陸 IP 都直連,建議拆成兩條規則:一條設定 domain,另一條設定 ip。不要把兩個欄位放進同一條規則,卻預期它們會以「或」的方式比對。

4. 首條命中:例外規則在前,寬泛規則在後

規則依陣列順序逐條檢查,首條符合後便決定路由。規則不會因為「範圍更精確」就自動取得較高優先順序。若先設定 domain:example.com 直連,再設定 full:api.example.com 走代理,後者會被前者覆蓋。

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

這段設定先保留單一主機的代理例外,再處理整個網域的直連,最後讓其餘 TCP、UDP 請求透過代理連線。內容只展示 routing,必須已有名為 proxy 和 direct 的出站才能使用。若核心沒有任何規則符合,常見行為是使用第一個出站;不要只憑標籤名稱猜測預設路徑。

  1. 列出明確例外。例如登入介面、內部服務,或必須使用固定出口的網域。
  2. 加入集合規則。接著加入已確認的 geosite、geoip 分類。
  3. 設定預設處理方式。確認最後的通用規則或第一個出站,避免未涵蓋的請求意外直連。
  4. 檢查產生後的順序。用戶端可能同時產生預設規則與自訂規則,介面上的清單不一定等於最後完整的陣列。

連接埠條件也會改變比對範圍。例如在網域規則加入 "port": "443",只會處理目標連接埠為 443 的請求;同一網域的 80 連接埠連線不會符合。若要讓整個網站都透過代理連線,請勿無意間加上連接埠限制。

5. domainStrategy:何時將網域解析為 IP

網域規則設定正確,IP 規則仍可能不符合,常見原因是解析時機。routing.domainStrategy 控制路由比對過程是否將網域解析成位址,但不保證 DNS 查詢一定會透過代理。核心 DNS、出站解析和用戶端 DNS 設定仍須分別確認。

AsIs:先依現有目標比對

設定欄位
routing.domainStrategy
設定值
AsIs
網域請求
不會為路由比對主動解析 IP
IP 請求
仍可比對 ip 條件

適合主要依賴網域規則,並希望減少路由階段解析的設定方式。

IPIfNonMatch:未符合時再解析

設定欄位
routing.domainStrategy
設定值
IPIfNonMatch
觸發條件
網域目標未符合現有規則
後續動作
解析後重新嘗試比對

若前面已有通用預設規則符合,就不會進入未符合後的解析流程。

另一個常見值是 IPOnDemand:比對過程遇到需要 IP 的規則時,可能會觸發目標網域解析。因此,將 IP 規則放得很前面,可能會提早發出 DNS 查詢。選擇策略時,先決定要以「網域分類優先」還是「位址分類優先」,再調整規則順序;不要把切換策略當成萬用修復方法。

6. 在 v2rayN 驗證:檢查產生的設定與連線記錄

請先備份目前的路由方案,再開啟 v2rayN 的路由設定編輯規則。不同桌面介面的選項名稱可能不同,請以目前版本顯示的「路由設定」及規則編輯介面為準。本文的 JSON 展示 V2Ray/Xray 核心欄位,不應直接貼入只接受網域清單的輸入框。

443
常見的 HTTPS 目標連接埠
53
傳統 DNS 常用連接埠
1–65535
規則可指定的連接埠範圍

這些數字代表連接埠用途,不是速度測試結果。連接埠 443 不等於「所有網頁流量」,連接埠 53 也不涵蓋所有加密 DNS。依連接埠分流時,必須同時考慮實際傳輸方式,不能只憑連接埠推斷應用程式用途。

  1. 檢查輸入格式。JSON 使用英文雙引號,不加註解或尾隨逗號;核心欄位名稱維持原樣。
  2. 確認執行中的核心。確認目前選用的是預期的核心,以及用戶端最後產生的規則語法。不要混入其他設定格式的欄位。
  3. 確認標籤與資源。檢查 outboundTag 是否存在,以及集合標籤是否能載入;先排除核心啟動錯誤,再測試分流。
  4. 重新建立連線。儲存並套用路由後,關閉測試應用程式的舊連線,再送出新請求。既有長連線不會因清單變更而自動切換出站。
  5. 查看連線記錄。在可用的記錄詳細資料中檢查目標網域或 IP、目標連接埠、入站與出站標籤。必要時可暫時提高記錄等級,測試完成後再還原。

驗證網域規則時,至少準備三組輸入:精確例外 api.example.com、同網域的其他主機 www.example.com,以及不屬於該網域的目標。前兩項用來區分 full: 和 domain:,第三項用來確認預設規則。範例網域僅用於說明比對範圍;連線測試請改用自己有權使用且確實提供服務的網域。

7. 常見問題:從規則覆蓋、位址輸入和集合錯誤開始排查

只設定了代理規則,為什麼仍然直連?

先檢查前面是否有比對範圍更大的直連規則。將精確例外移到大型集合之前,套用後重新建立連線,再從記錄確認出站標籤。若產生的設定順序與介面不同,也要檢查是否有預設規則先行符合。

已設定 domain 規則,記錄中卻只有 IP,該怎麼辦?

先確認應用程式是否已在本機完成解析,以及入站是否有傳遞網域。接著檢查目前核心的流量嗅探設定;嗅探只能從支援的流量中擷取資訊,無法保證還原所有連線的網域。已知且固定的內網目標可改用明確的 IP 或網段規則。

加入 geosite 後核心無法啟動,應該修改哪裡?

先查看記錄中的資源檔案路徑和標籤名稱。確認目前的資料檔包含所用標籤,必要時透過用戶端提供的資源更新入口進行更新。可暫時用一條 full: 規則驗證基本路由,再恢復集合設定,避免同時變更多個條件。

切換節點後規則失效,是協定不支援分流嗎?

通常應先檢查產生的設定,而不是歸因於 VMess 或 VLESS。確認切換後規則仍引用正確的代理出站,目前仍選用原本的路由方案,也沒有切換到另一份自訂設定。節點連線失敗與路由選錯出站是兩種不同問題,應分別查看記錄。

穩妥的調整順序是:先用單一精確網域驗證出站,再擴大至子網域或集合,最後加入 IP 補充規則與預設規則。每次只變更一類條件,並保留可還原的路由方案。更多基礎概念請參閱概念速查;若要繼續排查 DNS 與分流的互動問題,請參閱進階設定。

從這裡開始安裝用戶端