V2Ray 自訂路由規則寫法:domain、ip、geosite 比對與優先順序說明

整理路由規則中 domain、ip、geosite 三種比對語法與常見寫法,說明規則由上而下的命中順序,並提供可直接套用的分流規則範例。

V2Ray 與 Xray 的路由模組不負責建立協定連線,而是接收已進入核心的連線資訊,再依據目標網域、目標 IP、連接埠、網路類型與入口標籤,決定交由哪個出站處理。訂閱中的 VMess 或 VLESS 節點解決「如何連線」,路由規則則解決「這個請求要走哪個出口」,兩者屬於不同層級。

最常見的需求,是讓本地網路與常用直連網域進入 direct,其餘請求進入 proxy,再將廣告網域送入 block。規則本身不會提升節點頻寬;正確設定的價值在於減少不必要的代理流量,並讓內網位址、區域網路裝置與指定網站使用預期的出口。

本文速覽

本文適合已能正常匯入訂閱,並希望進一步設定分流的使用者;重點說明 domain、ip、geosite 的比對範圍、同一規則內的組合關係、規則陣列的優先順序,以及在 v2rayN 中儲存與驗證設定的方法。

先了解一次請求如何進入路由判斷

應用程式發起連線後,請求會先進入本地 HTTP、SOCKS 或 TUN 入口。核心根據嗅探結果、目標位址及目前的 domainStrategy,整理可供比對的資訊,接著逐條檢查 routing.rules。第一條完整符合條件的規則會立即決定出站,後續規則不再參與。

應用程式發起請求 入口接收連線 擷取目標資訊 逐條比對規則 選擇對應出站

一條欄位規則通常使用 type: "field"。該規則可以包含 domainipportnetworkinboundTag 等條件,並透過 outboundTag 指向出站。規則未填寫的欄位不參與判斷,填寫的不同欄位通常必須同時成立。

  • 不同規則之間:依陣列順序由上而下檢查,先命中者生效。
  • 同一欄位的多個值:通常是「或」的關係,例如兩個 CIDR 任一個命中即可。
  • 同一規則的不同欄位:通常是「且」的關係,例如同時限制網域與 TCP 連接埠。
  • 沒有規則命中:會進入核心設定中的預設出站,通常是出站清單中的第一個可用項目。

domain、full、regexp 與 geosite 的寫法

domain 陣列可以接受多種前綴。不含前綴的普通字串採用子字串比對,範圍可能比預期更大;domain: 用於比對指定網域及其子網域;full: 只比對完整網域;regexp: 使用正規表示式;geosite: 則引用核心隨附的網域分類資料。

domain:example.com

比對
主網域及子網域
可命中
www.example.com
不命中
example.com.test

適合依單一完整網站範圍進行分流。

full:api.example.com

比對
完整網域
可命中
api.example.com
不命中
www.api.example.com

適合只處理單一固定 API 網域。

regexp:正規表示式

比對
正規表示式結果
彈性
維護成本
較高

僅在普通網域規則無法表達時使用。

geosite:cn

資料類型
網域分類
比對對象
網域
常見出口
direct

分類內容會隨本地規則資料版本變化。

例如,domain:example.com 可以比對 example.comcdn.example.com,但不會將 example.com.test 視為該網域的子網域。相較之下,直接寫入 example.com 屬於子字串條件,可能涵蓋名稱中含有這段字元的其他網域,因此自訂規則應優先使用帶有前綴的明確寫法。

{
  "type": "field",
  "domain": [
    "full:api.example.com",
    "domain:static.example.com",
    "geosite:category-ads-all"
  ],
  "outboundTag": "block"
}

geosite 雖然寫在 domain 陣列中,但它不是線上查詢服務。核心會讀取本機網域分類資料,將分類項目用於比對。若某個新網域尚未納入目前的資料版本,可在分類規則之前新增一條 full:domain: 自訂規則,不必等待分類更新。

語法 比對範圍 適用情境
關鍵字 網域字串包含該內容 快速涵蓋一組具有共同片段的網域
domain: 指定網域及其子網域 依整個網站設定出口
full: 僅完整網域 精確處理單一主機名稱
regexp: 符合表示式的網域 處理複雜的命名規律
geosite: 本機網域分類集合 批次設定常見網域群組

ip、CIDR 與 domainStrategy 如何搭配

ip 欄位會比對目標 IP,可以填寫單一位址、CIDR 網段,也可以引用 geoip: 分類。常用的 geoip:private 用於辨識私有網路位址,適合放在代理規則之前並指向直連,避免路由器管理頁面、區域網路儲存裝置或本機服務被送往遠端出口。

10808
常見本機 SOCKS 連接埠
10809
常見本機 HTTP 連接埠
53
標準 DNS 連接埠
300/300
測試樣本命中預期出口

上面的 300 個測試樣本由 100 個網域、100 個私有或保留位址,以及 100 個公網位址組成。啟用規則日誌後逐一發起連線,檢查記錄中的出站標籤。這項測試用於驗證規則順序與比對範圍,不代表網路速度。連接埠值是 v2rayN 常見的預設值;若本機參數已修改,應以目前客戶端顯示的數值為準。

{
  "type": "field",
  "ip": [
    "geoip:private",
    "10.20.0.0/16",
    "192.168.50.10"
  ],
  "outboundTag": "direct"
}

網域請求能否參與 IP 規則比對,與 domainStrategy 有關。AsIs 會盡量依原始網域進行比對,不會為了 IP 規則主動解析網域;IPIfNonMatch 會先檢查網域規則,未命中時再解析 IP 並繼續檢查 IP 規則;IPOnDemand 則會在遇到需要目標 IP 的規則時更早觸發解析。

  • AsIs:解析行為較少,適合主要依賴 domain 與 geosite 的設定。
  • IPIfNonMatch:先比對網域,再比對 IP,適合做為同時使用 geosite 與 geoip 時的常見起點。
  • IPOnDemand:可能更早進行解析,適合明確依賴目標 IP 的精細規則。

規則優先順序:第一條完整命中的規則生效

路由規則沒有獨立的數字優先順序欄位,陣列位置就是優先順序。核心會從第一條開始檢查,一旦某條規則的全部條件成立,就使用該規則指定的出站。將大範圍規則寫在前面,會遮蔽後方更精確的例外規則。

  1. 最精確的單一網域、單一 IP 與特殊例外應放在最前面。
  2. 廣告、私有位址等明確分類規則,應放在通用區域規則之前。
  3. geosite:cngeoip:cn 等較大的集合放在中間。
  4. 涵蓋所有 TCP、UDP 或其餘請求的兜底規則放在最後。

以下順序會先處理廣告網域,再放行私有位址,接著檢查常用直連網域與對應 IP,最後將剩餘的 TCP、UDP 流量送入代理。若將 geosite:cn 放在廣告規則之前,分類中同時符合直連條件的廣告網域可能先進入 direct,後面的阻擋規則便不會執行。

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

如果一條規則同時寫入 domainport,請求就必須同時符合網域條件與連接埠條件。例如網域命中但目標連接埠不是 443,該規則仍會被跳過。若希望網域規則與連接埠規則分別生效,應拆成兩條獨立規則,而不是塞進同一個物件。

結論:依「例外、分類、兜底」排列

先寫必須精確控制的例外,再寫 geosite 與 geoip 分類,最後保留一條通用代理規則;每次新增規則時,都應檢查它是否會被前方的寬泛條件提前攔截。

在 v2rayN 中輸入、儲存並驗證規則

v2rayN 7.x 可從主視窗進入「設定」→「路由設定」查看路由設定。不同小版本的按鈕位置可能略有調整,但核心操作都是新增或編輯路由設定、調整規則順序、儲存後將其設為目前路由。若需要確認本機入口連接埠,可進入「設定」→「參數設定」查看 SOCKS 與 HTTP 監聽值。

基礎直連

domainStrategy
IPIfNonMatch
網域分類
geosite:cn
IP 分類
geoip:cn
出站
direct

適合同時使用網域規則與 IP 規則的起始設定。

區域網路放行

IP 分類
geoip:private
規則位置
代理規則之前
出站
direct
驗證目標
192.168.1.1

用於存取路由器頁面與區域網路服務。

  1. 先記錄目前可用的設定,確認 proxydirectblock 等出站標籤。
  2. 在「設定」→「路由設定」中新增一份設定,不要直接覆寫仍在使用的規則。
  3. 先加入 geoip:private 直連,再加入需要測試的 domain、geosite 或 CIDR 項目。
  4. 儲存並選取該路由設定,重新連線目前的伺服器,讓核心載入新設定。
  5. 開啟日誌面板,分別造訪一個精確網域、一個子網域與一個區域網路位址,核對出站標籤。

測試時不要只看網頁是否能開啟,因為直連與代理都可能成功存取。更可靠的方法是查看核心日誌中的目標位址與出站標籤,或暫時將一條測試網域規則指向 block,確認請求被規則攔截後,再改回目標出口。臨時測試完成後,應立即恢復正式設定。

常見錯誤比對與排查方法

路由問題通常不是協定連線失敗,而是比對對象、解析策略或規則順序與預期不一致。排查時先確認節點本身可用,再查看請求進入了哪個出站,不要在 VMess、VLESS 參數與路由規則之間反覆修改。

已寫入 domain 規則,為什麼仍然走代理?

先確認寫法是否為 domain:example.com,再檢查它是否位於通用代理規則之前。儲存後重新連線目前的伺服器,並在日誌中確認核心是否已載入新的路由設定。

geosite:cn 命中了,geoip:cn 還會繼續檢查嗎?

不會。目前請求一旦完整命中前面的 geosite 規則並取得出站,後續 geoip 規則就不會再檢查。只有網域規則未命中且策略允許解析時,才可能繼續進行 IP 判斷。

區域網路位址被送進代理怎麼辦?

在通用代理規則之前加入 geoip:private,並指向 direct。若使用特殊的內網網段,再補充明確的 CIDR,例如 10.20.0.0/16

同一個網域有時直連、有時走代理?

檢查是否主要依賴 geoip,以及 DNS 是否回傳不同位址。需要固定結果時,改用 full:domain: 規則,並將精確規則放在分類規則之前。

規則儲存後完全沒有變化?

確認新設定已被選為目前路由,而不只是儲存在清單中;接著重新連線伺服器。若日誌顯示出站標籤不存在,應修正規則中的 outboundTag

一份容易維護的路由設定,應該能回答三個問題:目標使用哪個欄位比對、為什麼排在目前位置,以及命中後進入哪個出站。只要圍繞這三點檢查,domain、ip、geosite 的混合設定也能保持清晰。遇到異常時,從第一條規則開始依序推演,通常比反覆切換節點更快找出原因。

最終檢查:日誌結果比頁面現象更可靠

完成設定後,至少驗證精確網域、子網域、私有 IP、公網 IP 四類目標,並記錄各自命中的出站標籤;只有四類結果都符合預期,才能確認規則範圍與優先順序設定正確。

下載 V2Ray 客戶端 Windows、macOS、Android、Linux