Xray 自訂路由規則設定:domain、full、regexp、ip、geosite 前綴與比對順序

比較各種比對前綴與適用情境,說明規則由上而下比對、首條符合即生效的優先順序,並提供在 v2rayN 編寫及調整自訂規則的實用範例。

本文重點

本文適合已能連上節點,接著想微調分流設定的使用者。先分清網域項目與 IP 欄位,再透過三條規則了解首條命中、欄位組合與 DNS 解析之間的關係,最後在 v2rayN 儲存一份可還原的自訂設定。範例使用保留的示範網域說明語法,並非用來測試網路連線。

先分清楚:網域前綴與 IP 欄位

Xray 的 routing.rules 是有順序的規則陣列。每條規則都會指定「哪些連線」交由「哪個出站」處理,其中 domain、ip、port 是比對條件,outboundTag 則指向既有出站。這裡的路由與訂閱節點清單排序無關,也不會修改 VMess 或 VLESS 節點的驗證參數。

寫法填寫欄位比對範圍
full:api.example.comdomain 陣列只比對這個完整網域,不包含其子網域。
domain:example.comdomain 陣列比對根網域及子網域,例如 www.example.com,但不會比對 notexample.com。
regexp:^api[0-9]+\.example\.com$domain 陣列比對符合正規表示式的網域,例如 api12.example.com。
geosite:cndomain 陣列引用目前網域資料庫中的分類,實際涵蓋範圍依使用的資料檔而定。
192.168.0.0/16ip 陣列比對這個 IPv4 網段,前面不應加上 ip:。
geoip:privateip 陣列引用 IP 資料庫中的私有位址集合,並需有相應資料可供使用。

容易混淆的是「ip 前綴」:在此處,ip 是 JSON 欄位名稱,不是與 domain: 對應的通用網域項目前綴。將 ip:192.168.1.1 填入網域清單,無法表示比對目標 IP。沒有前綴的網域字串通常會以子字串比對,因此 example.com 的涵蓋範圍會比明確指定的 domain:example.com 更廣。

依比對範圍選擇寫法

只要讓單一 API 改走代理,通常不需要用正規表示式;若要統一處理整個網站及其子網域,也不必逐一列出主機名稱。優先採用界線明確的寫法,可減少日後排查時的疑慮。

明確指定網域範圍

建議

用 full: 指定單一主機,用 domain: 涵蓋根網域及子網域。兩種寫法都方便逐條檢查,適合作為手動編寫規則的起點。

適用情境:修正單一網站的路由,或為特定 API 設定例外。

引用分類集合

用 geosite: 指定一組網域。分類名稱不是可以任意取用的標籤,必須存在於目前使用的資料庫中;資料更新後,分類內的項目也可能改變。

適用情境:管理地區或業務分類,再用少量特定網域補充例外。

用正規表示式描述模式

用 regexp: 表示編號主機等規律。Xray 使用的正規表示式語法並非所有瀏覽器正規表示式功能的通用版本,不要直接照搬含有環顧或反向參照的表示式。

適用情境:多個主機名稱遵循固定命名規則,且能列出正向與反向測試範例。

正規表示式要留意輸入格式。在圖形介面的純文字網域欄位中,通常填入 regexp:^api[0-9]+\.example\.com$;若寫成 JSON 字串,反斜線還要再跳脫一層,如下所示。開頭的 ^ 與結尾的 $ 可限定完整網域,避免將更長的字串誤判為目標。

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

比對順序:例外在前,集合在後

規則會由上而下檢查,第一條符合條件的規則就會決定出站,不會繼續尋找「更精確」的後續規則。full: 不會自動優先於前面的 domain:,分類項目也沒有獨立於陣列順序之外的優先權。

{
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "domain": ["full:api.example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": ["domain:example.com"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["192.168.0.0/16"],
        "outboundTag": "direct"
      }
    ]
  }
}

這是路由片段,不是完整的用戶端設定,也不應直接當成整份設定匯入。使用前,現有設定必須已定義 proxy 與 direct 出站。以網域為目標時,api.example.com 會符合第一條,www.example.com 會符合第二條;若連線直接以 IP 為目標,192.168.1.20 會符合第三條。

結論:先移動例外,再擴大分類

如果發現特定網域走錯出站,先將它的精確規則移到較廣泛的集合規則之前,再檢查記錄;不要立刻新增一組重複分類,否則只會增加被前面規則遮蔽的項目。

IP 網段如何搭配 DNS 策略

IP 規則比對的是目標位址,不是電腦目前的公網出口位址。用戶端收到網域時,是否先解析並以解析結果參與路由,取決於 domainStrategy。這不等於完整的 DNS 設定:要使用哪個解析器、DNS 查詢如何送出,仍須查看 DNS 與相關路由設定。

32 位元
IPv4 位址長度;/32 對應單一位址
128 位元
IPv6 位址長度;/128 對應單一位址
65,536
192.168.0.0/16 包含的位址總數
策略值處理方式檢查重點
AsIs路由階段不會主動將網域解析為 IP。網域未命中時,不要預期 IP 規則會自動補上;原本就是 IP 的目標仍可比對。
IPIfNonMatch網域依現有條件未比對到規則時,會嘗試解析後再進行比對。若前面已有較廣泛的網域規則命中,就不會為了尋找更合適的 IP 規則而重新選擇。
IPOnDemand比對過程中遇到需要 IP 的規則時,才會進行所需的解析。IP 規則的位置會影響解析時機;過早放置涵蓋範圍廣的 IP 規則,可能改變網域例外的比對結果。

例如,要讓辦公設備 192.168.1.20 的管理頁面直連,可在 IP 欄位填入 192.168.1.20/32,不必加入整個私有位址範圍。若透過網域存取頁面,也要確認連線交給核心時是網域還是 IP;應用程式的代理方式、DNS 快取及嗅探設定,都可能影響核心實際看到的目標資訊。

在 v2rayN 建立可還原的規則設定

以下以中文桌面介面常見的操作路徑為例。不同版本可能將編輯功能放在按鈕或右鍵選單中,請先找到「路由設定」及目前啟用的方案;不要將路由片段貼到節點的伺服器位址、訂閱連結或傳輸參數欄位。

  1. 確認核心類型

    開啟「設定」→「參數設定」,檢查目前節點協定對應的核心類型是否為 Xray。如果版本在設定頁另外列出核心對應關係,請依該頁確認;先確保節點本身可以連線。

  2. 備份方案

    進入「設定」→「路由設定」,記下目前使用的路由方案,並使用介面提供的匯出或複製功能保留副本。若已有自訂規則,修改前請先保存規則順序。

  3. 新增例外規則

    編輯準備使用的方案,新增一條規則:網域填入 full:api.example.com,出站選擇代理,其餘不需要的條件留白。圖形化表單只填欄位值,不要貼上整段 JSON。

  4. 調整規則順序

    接著新增一條網域為 domain:example.com、出站為直連的規則。使用介面上的移動功能,讓精確例外排在涵蓋整個網站的規則之前;也要檢查是否有更前面的分類規則會覆蓋它。

  5. 啟用並驗證

    儲存方案並設為目前使用的路由,依介面提示重新載入或重新啟動服務。將示範網域換成實際要管理的目標後,關閉舊連線並重新送出請求;若結果不如預期,切回備份方案以找出變更原因。

驗證時一次只修改一個條件。分別選一個應走代理的網域、一個應直連的網域,以及一個區域網路 IP,重新建立連線並記錄時間與目標。修改規則通常不會立即將已建立的長連線切換到另一個出站;瀏覽器重複使用連線,也可能讓結果看起來像是「儲存後沒有生效」。

常見問題:規則設定正確,為何沒有生效?

已使用 full,為什麼仍然走直連?

先檢查前面是否已有 domain:、geosite: 或其他涵蓋範圍較廣的規則先行命中,再確認實際連線使用的主機名稱。網頁、API、圖片及登入服務可能各自使用不同網域,只為首頁設定例外不會涵蓋所有請求。

加入 geosite 分類後核心無法啟動,該怎麼辦?

查看記錄中是否有檔案載入失敗或找不到分類的訊息,確認目前資料檔是否包含該分類,以及核心實際讀取的檔案位置。先移除新增項目,恢復連線後,再透過用戶端的規則資料更新功能處理;不要只憑分類名稱猜測它一定存在。

網域和 IP 分別都能命中,放在同一條規則卻不行?

同一條規則中的不同條件通常必須同時成立。如果目的是「這個網域或這個網段都直連」,請拆成兩條規則;如果確實要限定在同一組目標,還要檢查 DNS 策略與核心實際取得的位址。

正規表示式測試通過,貼進 JSON 卻出錯?

先檢查反斜線跳脫:在 JSON 中,要比對一個字面句點通常寫成 \\.;純文字輸入欄位通常寫成 \.。接著移除目前正規表示式引擎不支援的語法,並分別用一個應命中及一個不應命中的網域進行驗證。

穩定的自訂路由通常由少量精確例外、明確的集合規則及清楚的預設處理方式組成。每次修改都記錄「目標、規則位置、預期出站、實際出站」四項,比不斷堆疊相似項目更容易維護;資料庫更新後,也應重新檢查先前需要例外處理的網域。

v2rayN / v2rayNG 下載