V2Ray 路由規則設定

說明 domain:、full:、regexp:、geosite:、geoip: 等前綴的比對方式,解析規則由上而下生效的優先順序,並整理常見設定錯誤。

本文重點

適合已匯入節點、準備調整 v2rayN 分流規則的使用者。本文先釐清網域欄位與 IP 欄位的差異,再以可檢查的 JSON 片段說明前綴、規則順序及網域解析策略;最後整理用戶端的驗證步驟,避免將規則未命中、出站標籤錯誤與 DNS 解析失敗混為一談。

先釐清:欄位、比對值與出站標籤

V2Ray 與 Xray 的常見路由設定位於 routing.rules 陣列中。每個項目描述「哪些連線符合條件」以及「符合後交由哪個出站處理」。domain、ip 是欄位名稱;domain:、full:、geosite: 則是網域比對值的前綴。請勿混淆這兩層語法。

要求進入核心 讀取目標資訊 依序檢查規則 選定出站標籤 建立目標連線

以下是一條完整的路由規則,並非完整的核心設定。它會將目標網域恰好為 example.com、使用 TCP 且目標連接埠為 443 的連線,交由名為 proxy 的出站處理。這裡的連接埠是目標服務的連接埠,不是用戶端的本機監聽連接埠。

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

網域前綴:domain、full、regexp 與 geosite

同一網域使用不同前綴,比對範圍會有明顯差異。若要設定「主網域及所有子網域」,優先使用 domain:;只處理一個精確主機名稱時,則使用 full:。這兩種寫法比範圍較廣的關鍵字比對更容易檢查。

寫法比對範圍注意事項
domain:example.comexample.com 及其子網域,例如 api.example.com不會比對 notexample.com
full:example.com僅限 example.com不包含 www.example.com
regexp:^api[0-9]+\.example\.com$例如 api1.example.com、api20.example.com以正規表示式錨點限定完整名稱
geosite:cn資料檔中 cn 分類的網域項目分類內容依使用的資料檔而異
example.com目標網域名稱中包含該文字單獨使用字串不會比對網域後綴邊界

geosite: 引用的是本機網域分類資料,不是即時查詢網站所屬地區。geosite:cn 也不等於「所有以 .cn 結尾的網域」:其中可能包含其他後綴的網域,也可能暫時未收錄新網站。分類名稱、屬性與項目請以實際安裝的資料檔為準。

正規表示式還涉及一層 JSON 跳脫。表格中的正規表示式是比對用的表達式;寫入 JSON 字串時,代表字面句點的反斜線必須寫兩次。若是在用戶端的一般文字輸入框中填寫規則,請依該欄位的格式輸入,不要機械式地再多加一層跳脫。

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

結論:先用精確規則驗證,再擴大範圍

排查單一網站時,先新增 full: 規則。確認確實命中後,再決定是否改用 domain: 或分類規則;一開始不要用範圍過廣的正規表示式涵蓋大量目標。

IP 規則:位址、CIDR 與 geoip

IP 條件應填在 ip 陣列中。單一位址直接填入,網段使用 CIDR,地區或特殊位址集合則使用 geoip:。標準寫法不是在位址前加上 ip: 前綴;若將 ip:192.168.1.1 當作陣列值,可能會導致設定載入失敗。

位址與網段

設定欄位
ip
單一位址
192.168.1.1
IPv4 網段
192.168.0.0/16
IPv6 網段
fc00::/7

適用於明確指定的裝置位址或內部網段,避免依賴網域分類。

IP 資料集合

設定欄位
ip
地區集合
geoip:cn
私人位址集合
geoip:private
資料依賴
geoip.dat

集合是否存在及涵蓋哪些位址,請以目前使用的資料檔為準。

要求進入核心時若目標已是 IP,IP 規則便可直接參與比對;若目標仍是網域,能否使用解析結果繼續比對,則取決於 domainStrategy。瀏覽器自行解析、應用程式直接連線至 IP,以及用戶端透過嗅探還原網域等因素,也會影響路由器最終取得的目標資訊。

比對優先順序:先命中,不是越精確越優先

路由規則會依陣列順序由上而下檢查,第一條符合條件的規則決定出站。核心不會在所有命中項目中挑選「看起來最精確」的一條。只有將精確網域規則放在範圍較廣的規則之前,才能穩定設定例外。

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

以下是可併入既有設定的 routing 片段,不包含入站、出站與 DNS 設定。假設三個標籤都已定義:ads.example.com 命中第一條規則後會被封鎖;www.example.com 命中第二條規則並走代理;直接連線至私人位址時可命中第三條規則;其餘 TCP、UDP 連線則由最後一條規則兜底。

  1. 先放必須優先於其他規則的精確例外,例如封鎖單一網域,或指定服務走代理。
  2. 接著放網域集合與 IP 集合;若兩者可能重疊,應明確決定希望哪一類先決定結果。
  3. 最後才放範圍較廣的兜底規則。若將對應 network: tcp,udp 的規則移到最上方,後續一般 TCP、UDP 規則便不會有比對機會。

若所有規則都未命中,一般 V2Ray/Xray 設定會使用第一個出站,不會自動判斷「中國大陸直連、其他流量走代理」。明確設定兜底規則較易閱讀,但也會影響網域解析後的再次比對,因此不能脫離網域策略單獨調整。

domainStrategy:何時解析,何時重試 IP 規則

routing.domainStrategy 控制路由比對階段如何處理網域;它不等同於用戶端的所有 DNS 設定,也不代表應用程式一定會將網域交給核心。請先確認入站收到的是網域還是 IP,再判斷適合採用哪種策略。

策略路由階段的行為適用情況
AsIs不會為了路由比對而主動解析目標網域主要依賴網域規則,或希望減少路由階段對解析的依賴
IPIfNonMatch網域未符合規則時,再嘗試解析並參與 IP 比對網域規則優先,IP 規則作為補充
IPOnDemand比對過程遇到需要判斷 IP 的規則時,嘗試進行解析明確需要讓較前面的 IP 規則參與判斷

重要陷阱在於 IPIfNonMatch 與無條件兜底規則的組合:若第一輪檢查已命中最後的 TCP、UDP 兜底規則,就不算「未命中」,不能期待之後再解析網域並命中 geoip:cn。若要依賴此策略補充分流 IP,應檢查是否有提早結束比對的廣泛規則,並一併確認未命中時的預設出站。

使用 IPOnDemand 時,尤其要留意規則順序。較前面的 IP 規則可能觸發解析並命中,讓後面的網域例外失去比對機會。若要確保特定網域固定走代理,請將它的精確規則放在可能涵蓋該網域的 IP 規則之前。

結論:調整網域策略時,也要檢查兜底規則的位置

將策略切換至 IPIfNonMatch 後,不要只測試單一網站能否開啟。還要檢查目標是否在第一輪就被兜底規則攔截,以及日誌中最後選用的出站是否符合預期。

在 v2rayN 中調整並驗證規則

v2rayN 的路由編輯介面會隨版本更新而調整。常見入口為「設定」→「路由設定」;進入後,先確認正在編輯的規則集,再檢查主視窗目前啟用的路由是否為該規則集。只修改清單中未啟用的規則集,不會改變現有連線的分流方式。

  1. 保存目前設定:備份現行規則,記下目前的核心類型、網域策略及最終出站。本文討論的是 V2Ray/Xray 格式,請勿直接複製到其他核心的不同設定結構中。
  2. 只新增一條可驗證的規則:在網域條件中填入 full: 加上實際目標主機名稱,選擇對應出站,並將規則移至涵蓋該目標的廣泛規則之前。
  3. 套用並重新建立連線:儲存規則,必要時重新啟動核心。關閉測試頁面既有的連線後再試;已建立的長連線不會因調整規則而自動切換出站。
  4. 查看日誌資訊:依目前版本提供的日誌設定,暫時提高至 info 或排查所需的層級,搜尋目標網域、目標連接埠與出站標籤;確認完成後,請恢復日常日誌層級。
  5. 逐步擴大規則範圍:精確網域測試通過後,再改用 domain: 或新增 geosite:。每次只調整一個因素,方便判斷問題原因。

常見設定錯誤與修正方式

設定了 domain:example.com,為什麼其他網站也走代理?

先檢查是否還有裸字串、分類規則或代理兜底規則命中。domain:example.com 本身只涵蓋該網域及其子網域,不會比對 notexample.com。查看實際出站日誌後,再逐條縮小規則範圍。

設定了 geosite:cn,為什麼核心啟動時回報找不到分類?

確認目前核心使用的 geosite.dat 是否存在,以及檔案中是否包含 cn 分類。透過目前用戶端提供的資料更新入口更新後再試;請勿將其他規則格式的檔案直接改名替換。

正規表示式寫進 JSON 後出現跳脫錯誤,該改哪裡?

檢查反斜線:用來比對字面句點的正規表示式 \.,寫入 JSON 字串時應為 \\.。也請檢查英文雙引號及陣列逗號。若設定可載入但沒有命中,再檢查錨點與實際主機名稱。

已新增精確直連規則,為什麼仍然走代理?

將規則移到範圍較廣的代理規則之前,確認修改的是已啟用的規則集,再重新建立連線。若日誌只顯示目標 IP,請檢查應用程式是否自行解析,以及嗅探設定是否適用;核心拿不到網域時,精確網域規則就無法直接命中。

domain 和 ip 放在同一條規則中,任一條件符合就會生效嗎?

不會。不同條件欄位必須同時符合。若要表達「此網域或此網段都直連」,請拆成兩條規則,並為兩條選用相同的直連出站。這樣也更方便分別驗證網域與 IP 條件。

用戶端下載