跳至正文

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

整理 domain、full、regexp、geosite、geoip 等比對方式,說明規則由上而下的比對順序,並提供可直接修改的規則範例。

本文重點

適合已匯入訂閱、準備調整 v2rayN 分流規則的使用者。先分清網域與 IP 比對,再依「明確例外、分類規則、最後兜底」的順序編排。本文範例採用 V2Ray/Xray 的 field 路由結構,提供可修改的 JSON 片段;套用前請確認實際使用的核心、出站標籤與規則資料庫,這些片段不能直接當作完整用戶端設定執行。

一、先了解路由規則

路由不是訂閱節點清單。訂閱提供伺服器連線參數;路由則決定連線要交由哪個出站處理。更換 VMess 或 VLESS 節點,不會自動修正寫錯的網域條件。以下以 direct、proxy、block 作為標籤,分別代表直連、代理與封鎖;這些名稱必須已存在於實際設定的出站中。

連線進入核心 擷取目標資訊 依序比對規則 選擇出站標籤 出站處理連線

最簡單的規則只要說明「比對什麼」以及「交給誰」。以下物件會將 example.com 及其子網域交由代理出站處理。它只是 routing.rules 陣列中的一個元素,並非完整設定。本文的 example.com 網域僅用於說明語法,實際使用時請替換成目標網域。

{
  "type": "field",
  "domain": ["domain:example.com"],
  "outboundTag": "proxy"
}

例如,將 domain 和 port: "443" 放在同一個物件中,表示網域符合且目標連接埠為 443 時才會命中,並非符合其中一項就生效。若要設定「網域符合或 IP 符合」,通常應拆成兩條規則,而非將兩個欄位放進同一條規則。

二、如何選擇 domain、full、regexp

domain 既是 JSON 欄位名稱,也是欄位內的一種比對前綴,兩者不要混淆。欄位中的一般字串預設採子字串比對,範圍往往比預期更廣;若要明確比對某個網站及其子網域,優先使用 domain:。

寫法比對範圍使用提醒
full:api.example.com僅限此完整網域不包含其下層子網域
domain:example.com根網域及其子網域不會比對 notexample.com
example.com網域中包含這段字串比對範圍可能過廣
regexp:...符合正規表示式的網域留意錨點與 JSON 跳脫
geosite:cn網域資料庫中的 cn 分類依據已載入的資料庫內容

網域欄位不支援網頁路徑語意。若要比對 https://api.example.com/v1/items,應填入 full:api.example.com,不要把通訊協定、斜線與路徑一併貼上。一般路由也無法透過這個欄位區分同一個 HTTPS 網站的不同頁面路徑。

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

這三個條件是「或」:符合任一項就會選擇代理。正規表示式可用來比對 edge1.example.net、edge23.example.net 這類帶編號的網域。JSON 中的 \\. 經解析後才會成為正規表示式中的 \.;少寫一層反斜線可能導致解析錯誤或語意改變。

三、ip、geoip 與 geosite 的適用範圍

geosite 用來分類網域,geoip 用來分類 IP,兩者依賴不同資料,不能互換。geosite:cn 不代表「解析結果位於中國大陸的所有網域」;geoip:cn 也不表示伺服器內容一定屬於中國大陸網站。CDN、共用位址與資料庫更新都可能影響比對結果。

網域分類規則

欄位
domain
範例
geosite:cn
資料來源
已載入的 geosite 網域資料庫
比對依據
連線可取得的目標網域

先確認分類存在,再檢查網域是否收錄其中;分類不會即時自動辨識。

IP 分類規則

欄位
ip
範例
geoip:cn
資料來源
已載入的 geoip 位址資料庫
比對依據
目標 IP,或路由解析取得的位址

網域連線是否會觸發解析,取決於 domainStrategy 等設定。

明確的區域網路網段可直接使用 CIDR,避免仰賴網站分類來判斷「本機裝置可否連線」。以下將三個常見的 IPv4 私有網段設為直連;這不涵蓋所有特殊用途位址,也未包含 IPv6 本機位址。若需要更完整的範圍,可使用資料庫中的 geoip:private,並確認其中實際收錄的內容。

{
  "type": "field",
  "ip": [
    "10.0.0.0/8",
    "172.16.0.0/12",
    "192.168.0.0/16"
  ],
  "outboundTag": "direct"
}
/32
單一 IPv4 位址的 CIDR 前綴
/128
單一 IPv6 位址的 CIDR 前綴
443
HTTPS 常用目標連接埠

這些數值是位址與通訊協定的基本參數,並非速度測試結果。連接埠條件使用連線的目標連接埠,例如 "port": "443",不是 v2rayN 的本機監聽連接埠。只依 443 分流會同時影響許多不同網站,通常應搭配網域等條件使用。

四、優先順序:先命中就停止

規則會依陣列順序由上而下檢查,命中一條後就選擇對應的出站,不會繼續尋找後面「更精確」的規則。完整網域不會自動優先於前面的分類規則,較長的網段也不會自動優先於先出現的短網段。若有精確例外,必須主動放在範圍較廣的規則之前。

  1. 先放明確例外:例如單獨封鎖某個網域,或指定某個業務網域使用代理。
  2. 接著放本機連線:讓私有位址直連,減少對區域網路裝置連線的影響。
  3. 再放分類分流:依 geosite、geoip 等分類處理大部分連線。
  4. 最後放兜底規則:明確指定其餘 TCP、UDP 連線的處理方式。

以下是完整的 routing 片段,仍須與現有的入站、出站等設定合併。它會先封鎖範例遙測網域,再讓區域網路與 cn 分類直連,最後將其餘流量交由代理處理。刪除不需要的規則時,也請確認 JSON 逗號位置正確。

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

沒有規則命中時,通常會使用出站清單中的第一個出站,不一定是名為 proxy 的出站。明確設定兜底規則較容易理解,但也會改變比對行為;刪除兜底規則後,也不能忽略出站順序。若要在代理失敗後自動切換,還需要另外設定策略;一般路由規則不會自動改用下一條規則重試。

五、domainStrategy 決定解析時機

網域規則比對網域,IP 規則比對位址。若應用程式透過代理通訊協定提交的是網域,核心不一定已取得目標 IP。routing.domainStrategy 決定路由階段是否為了比對而解析網域;它不等同於 DNS 伺服器的選擇,也不要與出站中的同名選項混為一談。

策略解析時機注意事項
AsIs路由階段不會主動解析網域以供比對純網域目標無法透過解析結果命中 IP 規則
IPIfNonMatch網域未命中任何規則後,再嘗試解析並重新比對若先命中兜底規則,就不會進行這次額外解析
IPOnDemand比對過程遇到需要 IP 的規則時,嘗試解析前面的 IP 規則可能增加 DNS 查詢,並使流量提早分流

假設某個業務網域必須走代理,就應將它的 full: 或 domain: 規則放在 geoip:cn 之前。使用 IPOnDemand 時,若 IP 分類規則排在前面,網域解析到 cn 位址後可能已被送往直連,後面的網域例外就沒有機會執行。

六、在 v2rayN 中套用與驗證

v2rayN 是桌面用戶端,實際規則由所選核心執行。本文介紹 V2Ray/Xray 的 JSON 結構;編輯規則前,請先記下 v2rayN 版本與目前使用的核心。不同版本的編輯入口與欄位名稱可能有所調整,不能將核心 JSON 物件直接貼入只接受網域清單的輸入框。

  1. 備份目前設定。保留正在使用的路由設定與預設出站。桌面版常見入口為「設定」→「路由設定」;若目前版本的入口不同,請先找出路由設定管理功能,不要藉由修改訂閱網址來調整分流。
  2. 確認標籤。在設定編輯器或產生的核心設定中查看 outbounds 的 tag。將範例中的 direct、proxy、block 對應到實際使用的標籤。
  3. 先新增一條例外規則。先使用一個完整網域進行測試,並將規則放在分類規則之前。儲存後選取這組路由設定,讓用戶端重新產生設定並重新啟動核心。
  4. 檢查啟動記錄。確認沒有 JSON 解析錯誤、分類不存在或找不到出站標籤等問題,再進行連線測試。
  5. 建立新連線進行驗證。關閉舊頁面的連線,再重新發出請求。根據存取記錄中的目標與出站標籤判斷;若目前記錄未顯示這些資訊,可暫時提高記錄詳細程度。
  6. 逐步擴充規則。確認測試成功後,再新增 geosite、geoip 與兜底規則;每增加一層,都保留可還原的設定。

測試時至少準備三類實際目標:應直連的網站、應使用代理的網站,以及區域網路裝置。若需要封鎖,再加入一個可控的測試網域。規則只會影響進入該核心的連線;若應用程式繞過系統代理,即使規則正確也不會留下比對記錄。可參考系統代理使用說明,確認系統代理的接管範圍。

七、規則未生效的四個常見問題

設定了 full 規則,為什麼還是直連?

先檢查上方是否已有 geosite:cn、geoip:cn 或全流量規則先行命中。將完整網域例外移到這些規則之前,儲存後重新建立連線。接著確認連線實際提交的是網域,而不是應用程式預先解析的 IP。

新增 geosite 後,為什麼核心無法啟動?

檢查記錄是否指出分類不存在或資料檔無法載入。確認目前資料庫包含指定分類,並透過用戶端提供的規則資料更新功能更新。不要只因分類名稱看起來合理就直接使用;先移除新增項目,讓核心恢復啟動,再逐項確認。

網域和 IP 都寫在同一條規則裡,為什麼反而沒有命中?

不同欄位之間是「且」的關係,也可能受到網域解析條件影響。若預期是二選一,請拆成兩條規則,並使用相同的 outboundTag。若確實要求兩者同時符合,請再檢查位址是否可用,以及 domainStrategy 的行為。

修改規則後,為什麼瀏覽器還是走舊路由?

路由通常在建立新連線時決定;已建立的長連線不一定會重新選擇出站。先確認目前選取的是修改後的路由設定,再關閉相關應用程式連線;必要時重新啟動核心後再試。若記錄中完全沒有請求,請確認應用程式是否進入代理入口。

整理設定時,保留少量且容易理解的規則即可:先放精確例外,再放本機位址與分類規則,最後明確指定兜底。遇到問題時,依序檢查「連線是否進入核心、目標是網域還是 IP、哪條規則先命中、標籤是否存在」,比不斷疊加規則更容易找到原因。

下載用戶端