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

完整整理路由規則三類比對對象的語法差異,搭配實際規則範例說明比對順序與優先順序,協助依需求設定直連、代理與攔截的分流規則。

本文速覽

本文適合已能正常使用 v2rayN、v2rayNG 或 v2flyNG,並希望進一步控制哪些請求直連、代理或攔截的使用者。重點說明 domain、ip、geosite 的比對範圍、由上而下的優先順序,以及多條件組合方式,並提供可直接核對結構的 Xray 路由範例。

先了解路由規則處理的對象

V2Ray 與 Xray 的路由模組不負責建立節點連線,而是處理連線進入核心後應交給哪個出站。常見的出站標籤為 proxydirectblock,分別代表代理、直連與攔截。標籤名稱不是協定關鍵字,而是設定中已定義的 outboundTag;若客戶端產生的標籤不同,規則也必須使用客戶端實際產生的名稱。

一次請求可能同時包含網域名稱、目的連接埠、來源入口與解析後的 IP。規則陣列會依序檢查,通常由第一條完整符合的規則決定出站。因此,「更具體的規則放前面、涵蓋範圍更大的規則放後面」是最重要的排序原則。若將涵蓋範圍很大的 geosite:cngeoip:cn 放在前面,後面的單一網域代理規則可能永遠沒有機會生效。

同一欄位中的多個值是「符合任一項即可」,不同欄位之間則是「必須同時符合」。例如一條規則同時設定 domain 與 port,表示網域條件和連接埠條件都成立才會命中;domain 陣列中列出三個網域時,符合其中任一個即可。這項差異經常讓規則看似正確,實際上卻沒有涵蓋預期的請求。

比對對象 典型寫法 適用情境 關鍵限制
網域名稱 domain:example.com 網站、API 與下載網域分流 應用程式必須將網域名稱提供給核心,或允許核心進行解析
IP 192.0.2.0/24 固定網段、區域網路與解析結果分流 網域請求是否轉為 IP 比對,取決於 domainStrategy
geosite geosite:category-ads-all 依照維護好的網域分類進行批次比對 取決於客戶端目前使用的地理資料檔案與分類標籤
geoip geoip:private 私有位址或國家、地區的 IP 網段 只比對目的 IP,不等同於 geosite 網域分類

domain 的五種常用寫法

domain: 是最適合日常維護的網域寫法。domain:example.com 會比對 example.com 及其子網域,例如 api.example.com,但不會將 notexample.com 視為相同的網域後綴。若希望涵蓋某個網站及其所有服務子網域,優先使用這種寫法。

full: 只進行完整網域名稱比對。full:api.example.com 可以命中該主機名稱,但不會命中 www.example.comv2.api.example.com。適合將某個 API 單獨交給代理,同一主網域下的其他服務則繼續遵循通用規則。

不帶前綴的純字串屬於子字串比對。例如 example 可能命中網域名稱中任何包含該文字的位置,涵蓋範圍通常比預期更大。regexp: 支援正規表示式,彈性最高,但規則數量多時不易除錯,也更容易因邊界撰寫不嚴謹而誤比對。若能用 domain:full: 表達,就沒有必要一開始便使用正規表示式。

domain 後綴比對

推薦

同時涵蓋主網域與所有下層子網域,語意清楚,適合大多數網站規則。

適合:整站代理、整站直連

full 完整比對

只處理一個確定的主機名稱,不延伸到同一主網域下的其他服務。

適合:單一 API、單一下載網域

regexp 正規表示式比對

可以描述複雜的命名規律,但必須自行處理句點轉義以及開頭與結尾的邊界。

適合:大量具規律性的子網域

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

上例中的三個 domain 項目是「或」的關係。請求只要命中其中一個,就會繼續確認該規則的其他欄位;由於範例沒有額外欄位,因此可直接進入 proxy 出站。正規表示式中的句點必須轉義,而 JSON 字串本身還要保留反斜線,因此會在設定文字中看到 \\.

ip、CIDR 與 domainStrategy 的連動

IP 規則可以寫入單一位址,也可以寫入 CIDR 網段。IPv4 單一位址可寫成 192.0.2.10,網段可寫成 192.0.2.0/24;IPv6 則可寫成 2001:db8::/32。CIDR 後面的數字代表網路前綴長度,/24 涵蓋 256 個 IPv4 位址,不能將它理解為連接埠或位址數量。

geoip:private 常用於讓私有位址直連,可涵蓋典型的區域網路位址範圍。實際設定還應保留對迴送位址與本機服務的處理,避免存取路由器管理頁面、NAS 或執行於 127.0.0.1 的程式時被送往遠端代理。v2rayN 常見的本機 SOCKS 監聽連接埠為 10808,HTTP 連接埠可能由同一個混合入口或相鄰連接埠提供,實際值應以「設定」→「參數設定」中的本機監聽設定為準。

{
  "domainStrategy": "IPIfNonMatch",
  "rules": [
    {
      "type": "field",
      "ip": [
        "geoip:private",
        "127.0.0.0/8",
        "192.0.2.0/24"
      ],
      "outboundTag": "direct"
    }
  ]
}

結論:網域例外優先於 IP 大分類

如果某個網域必須使用代理,而它可能解析至會被直連規則涵蓋的位址範圍,應將該網域的代理規則放在對應的 IP 直連規則之前,並透過日誌確認請求最初攜帶的是網域還是 IP。

geosite 分類怎麼使用

geosite 是依網域集合整理的資料分類,不是即時查詢服務。geosite:cn 代表資料檔案中歸入相應分類的網域,geosite:category-ads-all 通常用於廣告網域集合。分類內容會隨客戶端附帶的資料版本變動,因此 geosite 適合負責大範圍的基礎分流;自訂的關鍵網域例外仍應單獨寫在前面。

geosite 與 geoip 不能互相替代。某個網域屬於某個 geosite 分類,不代表它目前解析出的 IP 一定屬於同名的 geoip 分類;使用內容傳遞網路時,同一網域也可能在不同網路環境中取得不同位址。先用 geosite 處理網域語意,再用 geoip 為未命中的連線提供後備處理,通常比只查看 IP 更容易維護。

攔截分類尤其要注意順序。假設某個業務 API 被收錄在廣告分類中,但該 API 又是頁面正常載入所必需,通用攔截規則就會連同它一起擋下。解決方式不是刪除所有廣告分類,而是在攔截規則之前加入一條 full:domain: 例外,並將其指向 directproxy

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

比對優先順序與規則編輯步驟

規則優先順序不是由 domain、ip 或 geosite 的類型自動決定,主要取決於規則在陣列中的位置。核心會從第一條開始檢查,命中後便不再讓後續規則覆寫結果。因此,單一網域例外應排在分類規則前,分類規則應排在最終後備規則前,攔截規則也不能無條件壓在業務例外之上。

v2rayN 7.x 的介面文字可能隨小版本調整,但檢查順序可以維持一致:先確認目前使用的核心,再開啟路由設定,最後核對啟用中的路由方案與規則順序。修改後應重新啟動核心或重新載入設定,不能只儲存視窗內容卻繼續使用舊的執行設定。

  1. 確認核心

    開啟「設定」→「參數設定」→「Core 類型」,確認目前設定使用 Xray 或 v2fly 對應的核心;協定與路由欄位必須受到所選核心支援。

  2. 開啟路由設定

    進入「設定」→「路由設定」,選擇目前啟用的路由設定。若介面中有多個方案,先確認主介面實際選取的方案名稱。

  3. 新增例外

    先新增必須使用代理或必須直連的 full:domain: 規則,再新增 geosite、geoip 等涵蓋範圍較大的分類規則。

  4. 核對出站

    檢查規則目標是代理、直連還是攔截。編輯原始設定時,還要確認 outboundTag 與現有出站標籤逐字一致。

  5. 重新載入並驗證

    儲存後重新啟動核心,分別測試一個命中例外的網域、一個命中分類的網域,以及一個區域網路位址,並查看核心日誌中的實際路由結果。

結論:依涵蓋範圍由小到大排序

完整網域名稱、網域後綴、geosite 分類、geoip 網段與最終後備規則依序展開,可以減少大範圍規則過早截走請求的問題;真正的業務例外始終要放在所屬大分類之前。

直連、代理與攔截三向規則範例

以下是一組用於理解結構的完整路由片段。它會先讓指定的 API 走代理,再攔截廣告分類,接著讓區域網路與指定網域直連,最後讓未被前述規則處理的連線走代理。使用前需要確認設定中已存在名為 proxydirectblock 的三個出站。

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:api.example.com",
          "domain:services.example.net"
        ],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "domain": [
          "geosite:category-ads-all"
        ],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": [
          "domain:printer.example.lan",
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private",
          "127.0.0.0/8"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

最後一條規則只限定 network,涵蓋 TCP 與 UDP,因此負責後備處理。它必須位於陣列末尾;如果放在第一條,幾乎所有常見連線都會立即進入代理,後面的直連與攔截規則便不會被檢查。若只希望代理 TCP,不要將 UDP 一併寫入後備規則,否則 DNS 或即時通訊流量也可能改變出站。

連接埠條件同樣可以與網域組合。例如 domain 指定 domain:example.com,port 指定 443,只有存取該網域的 443 連接埠時才會命中。存取同一網域的 80 連接埠則會繼續檢查後續規則。連接埠範圍可依核心支援的格式書寫,但日常設定應盡量限制在明確的業務連接埠,避免涵蓋難以解釋的寬廣範圍。

規則未生效時逐項排查

排查的核心是確認「核心實際收到什麼目標」以及「哪一條規則先命中」。瀏覽器以網域存取網站時,核心可能收到網域名稱,也可能只看到由上游應用程式解析後的 IP;透明入口、系統代理與應用程式內建代理所產生的資訊並不完全相同。不要只根據瀏覽器網址列判斷核心一定取得了網域名稱。

其次要檢查客戶端是否重新產生並載入設定。v2rayN 修改路由方案後,如果目前選取的不是剛編輯的方案,儲存內容就不會影響實際流量。v2rayNG 或 v2flyNG 使用訂閱設定時,也要區分訂閱更新與本機路由修改,避免更新訂閱後覆蓋先前的調整。

明明單獨寫了網域,為什麼還是直連?

將該網域規則移到 geosite:cngeoip:cn 之前,並確認它的 outboundTag 指向代理。接著重新啟動核心,透過日誌檢查是否先命中了位置更前的直連規則。

一加入 geosite 標籤就啟動失敗?

查看核心錯誤日誌中的具體標籤名稱,確認目前的資料檔案包含該分類。先使用常見分類進行最小化測試,不要同時加入多個來源不明的標籤;標籤不存在時,應改用明確的 domain: 規則。

網域規則能命中,IP 規則卻不命中?

檢查 domainStrategy。需要在網域規則未命中後繼續解析並嘗試 IP 規則時,可使用 IPIfNonMatch;修改後也要同時確認 DNS 是否能回傳預期位址。

區域網路管理頁面被送進代理了?

在最終代理後備規則之前加入 geoip:private 與所需區域網路 CIDR 的直連規則。若存取時使用自訂的區域網路網域名稱,再補充對應的 full:domain: 直連項目。

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

確認主介面啟用的是剛編輯的路由方案,然後重新啟動核心。接著檢查「設定」→「參數設定」→「Core 類型」,避免將只適用於另一個核心或另一組資料集的設定,誤當成目前的執行設定。

維護規則時,建議一次只調整一個目標:先處理明確網域的出站,再擴展至 geosite 分類,最後處理 IP 與 geoip 後備規則。每次修改都保留一個代理、一個直連與一個攔截測試目標。即使訂閱、核心或地理資料更新,也能快速定位變化發生在哪一層。

取得圖形客戶端 依平台選擇 v2rayN 或 v2rayNG