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

解析路由規則中 domain、ip、geosite、geoip 四類比對項目的寫法與含義,說明規則由上而下的比對優先順序、outboundTag 的作用,以及規則未生效時的排查方法。

本文速覽

本文適合已能匯入節點、啟用系統代理,並希望在 v2rayN 或 Xray 設定中精準控制連線出口的使用者。重點涵蓋網域與 IP 規則語法、規則陣列的掃描順序、同一規則內的組合邏輯、domainStrategy 的影響,以及如何從日誌與產生的設定定位分流問題。

路由處理鏈與首個命中原則

V2Ray 與 Xray 的路由模組不負責建立節點連線,而是在請求進入核心後,根據目標網域、目標 IP、連接埠、網路類型與入站標籤等資訊選擇出站。最終選擇結果通常由 outboundTag 指向已定義的出站,例如 proxydirectblock

規則存放在 routing.rules 陣列中,核心會從第一條開始依序往下檢查。某條規則符合所有條件後,掃描會立即停止,後續規則不再參與本次請求。因此,「越具體的規則越前面、越寬泛的規則越後面」是穩定設定的基礎。

請求進入讀取目標掃描規則選擇出站建立連線

同一條規則中的不同欄位通常是「且」的關係。例如一條規則同時寫入 domainport,目標必須同時符合網域與連接埠條件。單一欄位中的多個項目通常是「或」的關係,例如 domain 陣列列出三個網域,符合其中任一個即可滿足該欄位。

位置關係 判斷方式 實際結果
不同規則之間 由上而下掃描 第一條完整命中的規則生效
同一規則的不同欄位 必須同時符合 domain 與 port 都符合才會生效
同一欄位的多個值 符合任一項即可 陣列中的項目按「或」處理
沒有規則命中 使用預設出站 通常會套用設定中的第一個可用出站

domain:精確網域、子網域與關鍵字比對

domain 欄位用來處理目標主機名稱。常用前綴包括 full:domain:keyword:regexp:geosite:。前綴會決定比對範圍,選擇不當可能造成規則涵蓋過廣,或完全無法命中。

full:example.com 只會比對完整主機名稱 example.com,不會將 www.example.com 視為同一個目標。domain:example.com 則會比對該網域及其子網域,適合讓同一網站體系使用相同出口。

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

精確介面規則

欄位
domain
寫法
full:api.example.com
範圍
單一完整主機名稱
出站
proxy

用於涵蓋範圍明確、不能連帶子網域的連線。

整站直連規則

欄位
domain
寫法
domain:example.cn
範圍
主網域與子網域
出站
direct

適合目標網站的所有服務都使用相同出口的情境。

如果精確網域需要作為分類規則的例外,應將精確規則放在前面。例如先將 full:download.example.com 指向直連,再將 domain:example.com 指向代理。順序顛倒後,下載網域會先被整站規則接收。

ip 與 geoip:位址區段比對與網域解析條件

ip 欄位可以填寫單一位址、CIDR 位址區段及 geoip: 分類。單一 IPv4 位址可以寫成 198.51.100.20,網段則可寫成 198.51.100.0/24。IPv6 位址區段同樣使用 CIDR 表示,例如 2001:db8:1200::/48

geoip:private 常用於比對區域網路、回送位址與其他非公網位址。將這類位址放在直連規則前方,可以避免本地路由器管理頁面、區域網路檔案服務或本機介面被送往遠端代理。

{
  "type": "field",
  "ip": [
    "geoip:private",
    "192.0.2.0/24",
    "2001:db8:1200::/48"
  ],
  "outboundTag": "direct"
}

IP 規則能否處理最初以網域形式發起的請求,還取決於 domainStrategy。目標只有網域而沒有目標 IP 時,核心必須決定是否解析該網域,再將解析結果交給 ip 規則比對。

10808
常見本機 SOCKS 連接埠
10809
常見本機 HTTP 連接埠
/24
IPv4 網段前綴範例
1 條
一次請求最終命中的規則
domainStrategy 解析行為 適用判斷
AsIs 網域按原樣參與路由,不主動為 IP 規則解析 主要依靠 domain 與 geosite 分流
IPIfNonMatch 網域規則未命中後,再解析 IP 並繼續檢查 網域規則優先,IP 分類作為補充
IPOnDemand 遇到需要目標 IP 的規則時按需解析 前方已有重要 IP 規則的設定

結論:先確定解析策略,再評估 IP 規則

目標以網域進入且設定使用 AsIs 時,後置 geoip 規則未命中不代表位址資料庫失效。先檢查 domainStrategy,再查看日誌中的目標形式,可以避免反覆修改 CIDR 與規則順序。

geosite 與 geoip 的界線

geosite 是網域集合,geoip 是 IP 位址集合。兩者處理的是不同階段的資訊分類問題,不能互相取代。網站採用動態位址、共用雲端服務或頻繁調整解析結果時,網域集合通常比固定 IP 網段更適合表達服務歸屬。

一條 geosite:cn 規則會依據目標網域是否存在於對應分類中進行判斷;一條 geoip:cn 規則則依據目標 IP 是否落在對應位址集合中進行判斷。網域與伺服器所在地並不一定一致,因此兩條規則可能對同一連線得出不同的分類結果。

geosite 網域集合

輸入
目標網域
範例
geosite:cn
依賴
網域資料檔
常見用途
依服務歸屬分流

目標位址變動時,網域規則仍能維持穩定的表達方式。

geoip 位址集合

輸入
目標 IP
範例
geoip:private
依賴
位址資料檔
常見用途
區域網路與區域位址分流

網域請求是否進入位址判斷由 domainStrategy 控制。

資料檔需要與核心版本及設定能力相符。出現「failed to load geosite」或無法識別分類名稱時,應先確認資料檔位於核心實際讀取的目錄,再確認分類名稱存在。單純調整規則順序無法修復缺少的資料檔。

outboundTag 與完整規則組合

outboundTag 的值必須與 outbounds 陣列中某個出站的 tag 完全一致,連大小寫差異也會被視為不同名稱。規則寫成 "outboundTag": "direct" 時,設定中必須存在標籤為 direct 的出站。

典型順序可以分成四層:私有位址直連、精確例外、分類分流、兜底處理。阻斷規則若涉及特定網域或連接埠,應放在可能涵蓋它的寬泛代理規則之前。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "domainMatcher": "hybrid",
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["full:updates.example.com"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["geosite:cn"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["geoip:cn"],
        "outboundTag": "direct"
      }
    ]
  }
}
  1. 第一條處理區域網路與本機位址,避免內部服務進入代理鏈路。
  2. 第二條定義明確例外,讓指定的更新網域始終採用直連。
  3. 第三條依網域集合處理已分類網站,不必等待 IP 分類。
  4. 第四條在網域規則未涵蓋時,以解析後的位址集合補充判斷。
  5. 未命中的請求會繼續使用設定的預設路徑,實際出口由完整出站結構決定。

結論:先固定出站標籤,再擴充路由條件

先用三個清楚的標籤建立 proxy、direct、block 出站,再逐條增加規則。標籤穩定後,日誌中的路由結果更容易對應到實際連線,不必同時排查條件與出站定義。

如果設定使用負載平衡器,規則可能透過 balancerTag 指向平衡器,而不是直接指定單一出站。一般自訂分流優先使用 outboundTag,只有確實設定選擇器與平衡器時才引入 balancerTag,避免增加不必要的排查層級。

v2rayN 中的設定路徑與驗證步驟

在 v2rayN 7.x 中,可以先進入「設定」→「路由設定」查看目前的路由設定與預設規則。不同小版本的按鈕位置可能有所調整,但驗證目標相同:確認目前啟用的路由設定、規則排列順序與最終產生的核心設定一致。

修改後不要只看瀏覽器能否開啟網頁。瀏覽器快取、DNS 快取以及既有連線重複使用都可能掩蓋結果。應重新啟動核心,使用新的目標連線,並將日誌層級暫時調整為 infodebug,再觀察路由紀錄。

  1. 在「設定」→「路由設定」確認目前選取的規則集,記錄預期命中的規則位置。
  2. 檢查規則中的 outboundTag,並與產生設定中的 outbounds[].tag 逐字比對。
  3. 在「設定」→「參數設定」確認本機監聽與日誌相關選項,常見 SOCKS 連接埠為 10808,HTTP 連接埠為 10809。
  4. 儲存設定並重新啟動核心,關閉原有瀏覽器連線或改用新的測試網域。
  5. 查看日誌中的目標網域、目標位址與出站標籤,判斷請求在哪一條規則停止掃描。
  6. 一次只移動或修改一條規則,重新測試後再處理下一處,避免多個變更互相干擾。
檢查清單
1. 目標是網域還是 IP
2. domainStrategy 是否觸發解析
3. 精確規則是否位於分類規則之前
4. outboundTag 是否存在且大小寫一致
5. geosite 與 geoip 資料是否成功載入
6. 測試連線是否為修改後的新連線

規則未生效的常見排查問答

路由問題通常不只是單一語法錯誤,而是目標形式、解析策略、排序與出站標籤共同作用的結果。先確認日誌中實際出現的目標,再對照規則條件,比直接擴大比對範圍更可靠。

寫了 geoip:cn,網域仍然走代理?

先檢查 domainStrategy。使用 AsIs 時,網域請求不會僅為後置 IP 規則而主動解析。可根據設定目標改為 IPIfNonMatch,重新建立連線後查看日誌。

為什麼精確網域規則沒有覆蓋 geosite?

檢查精確規則是否排在 geosite 規則前面,並確認使用的是 full:主機名稱。如果前面的寬泛規則已經命中,後面的精確規則就不會繼續執行。

同一規則同時寫入 domain 和 ip 會怎樣?

兩類條件必須同時符合。若目標網域符合 domain,但解析位址不在 ip 集合中,整條規則仍不會命中。需要表達「網域或 IP 任一命中」時,應拆成兩條規則。

outboundTag 拼寫正確,連線仍然失敗?

繼續檢查對應出站是否能獨立建立連線,以及標籤大小寫、節點參數與傳輸設定是否有效。路由命中只完成出口選擇,不代表該出站一定能成功建立連線。

修改規則後結果沒有變化?

儲存後重新啟動核心,關閉既有長連線,並清除測試應用程式的連線重複使用狀態。接著使用未造訪過的測試主機名稱發起新請求,再從最新日誌確認出站標籤。

最終設定應讓規則目的清楚易讀:一條規則處理一個明確意圖,標籤名稱反映出口用途,例外規則緊鄰其涵蓋對象。規則數量增加後,清楚的排序與最小條件比堆疊關鍵字更容易長期維護。

客戶端入口 查看四個平台的安裝包