v2rayN 自訂路由規則:domain、ip、geosite 語法與比對順序

整理 domain、full、regexp、ip、geosite、geoip 規則語法,說明由上而下的比對順序,以及代理、直連與封鎖規則的排列方式。

本文速覽

本文適合已匯入節點、準備調整分流的桌面版使用者。先分清網域規則與 IP 規則,再將具體例外排在通用規則前方,最後透過記錄檔確認出口。範例採用 Xray/V2Fly 的路由欄位語意;v2rayN 圖形介面會產生設定,不能將完整的核心 JSON 直接貼進單一網域輸入欄。

一、先確認路由規則的比對順序

系統代理決定應用程式是否將要求交給 v2rayN;路由規則則決定核心收到要求後選擇哪個出口。兩者是不同的設定。若應用程式略過系統代理直接連網,修改網域規則不會影響它;使用 TUN 接管流量時,也要確認流量確實進入核心。

Xray/V2Fly 的一般路由規則會依陣列順序逐一檢查,第一條符合條件的規則就會決定出口。並非「越精確就越優先」,也不會自動讓 full: 排在 domain: 前面。若第一條規則已將 domain:example.com 送往代理,後面針對 full:files.example.com 設定的直連例外就不會生效。

排列位置規則用途範例出口
最前面明確指定的網域例外或封鎖目標direct / block
中間業務網域、區域網路 IP、地區集合proxy / direct
最後其餘 TCP、UDP 要求的預設處理proxy 或視需求直連

同一條規則中,domain 陣列裡的多個項目通常採「或」的關係;ip 陣列裡的多個項目也通常如此。不同條件欄位之間則採「且」的關係。例如在同一條規則中設定網域、目標連接埠與網路類型,代表三個條件都符合才會命中,而非符合任一條件即可。

二、domain、full、regexp 的寫法

網域規則填寫主機名稱,不要包含通訊協定、路徑或查詢參數。連線至 https://api.example.com:443/v1/status 時,網域條件應填 api.example.com。連接埠 443 是另一項條件;路徑 /v1/status 不在這類路由規則的比對範圍內。

寫法比對方式常見誤解
domain:example.com比對根網域及其子網域會比對 api.example.com,不會比對 notexample.com
full:api.example.com只比對這個完整主機名稱不會比對 v2.api.example.com
regexp:^api[0-9]+\.example\.com$使用正規表示式比對句點必須跳脫;錨點可限制比對整個網域
example未加類型前綴時,會以一般字串包含關係比對比後綴網域比對範圍更廣,可能發生誤判

domain: 不是萬用字元語法。若要涵蓋整個網域及其子網域,使用 domain:example.com 即可,不要寫成 domain:*.example.com。若只想讓單一主機使用特定出口,請選 full:;只有在需要比對有規律的編號主機時,才考慮使用正規表示式。

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

上方內容是核心 JSON 片段,因此反斜線要寫成 \\。在 v2rayN 一般的網域文字欄位中,通常只需輸入一個反斜線:regexp:^api[0-9]+\.example\.com$。直接將 JSON 的跳脫寫法貼進一般文字欄位,可能會改變正規表示式的意義。請先確認輸入位置是 JSON 編輯器還是規則欄位。

重點:先用 full,再擴大比對範圍

新增業務例外時,先用一個 full: 主機確認出口。確定比對正確後,再改為 domain:;只有確實需要模式比對時,才使用 regexp:,如此更容易找出分流錯誤。

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

IP 條件填在 ip 欄位,常見寫法包括單一位址、CIDR 網段或 geoip: 集合。這裡比對的是目標 IP。不要誤把來源裝置的區域網路位址填成目標規則;依來源分流屬於其他條件,不能用目標 IP 欄位取代。

32 位元
IPv4 位址長度;/32 精確指定單一位址
128 位元
IPv6 位址長度;/128 精確指定單一位址
443
常見的 HTTPS 目標連接埠;不代表固定出口
{
  "type": "field",
  "ip": [
    "192.168.50.0/24",
    "203.0.113.10/32",
    "2001:db8::10/128",
    "geoip:private"
  ],
  "outboundTag": "direct"
}

192.168.50.0/24 涵蓋這個 IPv4 子網路。203.0.113.10 與 2001:db8::10 是文件範例位址,無法用來連線至節點。實際設定時,請改成需要分流的目標網段。區域網路直連規則建議先明確指定網段,再視需求補上 geoip:private。

geoip:cn 會依據載入的 IP 資料集合判斷;geoip:private 則用於該資料集合定義的私有或本機位址範圍。集合內容會隨資料檔變動,不宜將特定集合規則視為永久準確的地區判斷。尤其是 CDN、跨區服務與新分配的網段,可能需要另外新增例外。

四、geosite 資料集合與 DNS 策略

geosite:cn 是網域集合,geoip:cn 是 IP 集合,兩者不能互換。前者不代表「解析結果一定位於中國大陸」,後者也不代表「這個網域屬於中國大陸的服務」。以網域集合分類服務,再用 IP 集合補充分類位址,才能減少判斷混淆。

{
  "type": "field",
  "domain": [
    "geosite:cn"
  ],
  "outboundTag": "direct"
}

在傳統 Xray/V2Fly 設定中引用這些集合時,核心必須能找到對應的資料檔,常見檔名為 geosite.dat 和 geoip.dat。集合名稱以實際載入的資料內容為準。不能只憑文章中的名稱,就假設本機一定有某個分類;資料缺漏或標籤不存在,都可能導致設定載入失敗。

domainStrategy路由解析行為排查重點
AsIs路由階段不會主動解析網域來比對 IP 規則網域要求未符合 IP 集合,不一定是規則語法錯誤
IPIfNonMatch網域階段沒有規則命中時,嘗試解析後再次比對過早命中的通用規則可能會阻止這次補充比對
IPOnDemand比對過程需要目標 IP 時,嘗試解析網域檢查 DNS 是否可用,以及解析結果是否符合預期

特別要留意 IPIfNonMatch 與預設規則的關係:如果第一輪比對網域時,最後的 network: tcp,udp 已命中代理出口,就不會因為前面的 geoip:cn 未命中而自動重試。若要依據 IP 集合分流,必須一併規劃解析策略與預設出口,不能只新增一條 IP 規則。

五、代理、直連與封鎖的設定範例

以下片段會先封鎖明確指定的主機,再允許檔案主機直連,接著讓同一網域下的其他要求走代理。區域網路目標設為直連,其餘 TCP、UDP 要求則走代理。為了讓網域目標也能參與 IP 條件判斷,範例選用 IPOnDemand;使用前請確認核心 DNS 設定可正常運作。

{
  "routing": {
    "domainStrategy": "IPOnDemand",
    "rules": [
      {
        "type": "field",
        "domain": ["full:telemetry.example.com"],
        "outboundTag": "block"
      },
      {
        "type": "field",
        "domain": ["full:files.example.com"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "domain": ["domain:example.com"],
        "outboundTag": "proxy"
      },
      {
        "type": "field",
        "ip": ["192.168.50.0/24", "geoip:private"],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "network": "tcp,udp",
        "outboundTag": "proxy"
      }
    ]
  }
}

這只是 routing 設定片段,並非完整的節點設定。proxy、direct、block 必須對應實際 outbounds 中的 tag。標籤只是名稱,本身不會建立出口:直連通常對應 freedom 出站,封鎖通常對應 blackhole 出站,代理出口則使用既有節點。

具體例外優先

建議

將單一主機與明確網段排在通用分類前面,較容易確認設定影響範圍。新增例外時,只要檢查前面是否已有提早命中的規則。

適用情境:已有日常分流設定,只想補充少數業務例外

代理作為預設出口

未被直連或封鎖規則涵蓋的要求都交由代理處理。涵蓋範圍明確,但代理節點必須處理更多要求,應事先排除內網目標。

適用情境:多數外部服務需要代理,且能維護直連清單

直連作為預設出口

只有明確列出的服務會交由代理處理,其餘要求一律直連。新服務與遺漏的網域不會自動走代理,因此需要持續維護清單。

適用情境:代理目標少且固定,其餘連線以直連為主

沒有任何路由規則命中時,Xray/V2Fly 通常會使用出站清單中的第一個出口。不要將此預設行為視為「一定直連」。v2rayN 產生設定時可能會調整出站順序,因此請檢查實際設定,或依照目前的解析策略加入明確的預設規則。

六、在 v2rayN 中新增並驗證規則

操作前請先備份現有路由設定。以下以具有「設定」→「路由設定」選項的 v2rayN 桌面介面為例;跨平台版與傳統介面的按鈕位置可能不同。請編輯一套路由方案,再從主介面的路由選擇入口啟用。只儲存規則卻未選用該方案,是常見的「設定未生效」原因。

  1. 備份方案

    前往「設定」→「路由設定」,先匯出或記下目前方案與規則順序。保留原有方案,測試時另建一套,避免一次改動影響所有日常分流。

  2. 開啟規則

    在「路由設定」中選擇要修改的方案,開啟該方案的規則編輯視窗。新增規則時先選擇出口,再於網域欄位填入 full:files.example.com,不要貼上完整 JSON。

  3. 調整順序

    將明確指定主機的例外移到 domain:example.com 等廣泛規則之前。網域欄位與 IP 欄位請分別建立規則;多個項目依介面提示的分隔方式填寫,不要自行假設逗號一定會被拆開。

  4. 啟用方案

    儲存後回到主介面的路由選擇入口,選取剛編輯的方案。確認核心已重新載入;若記錄檔出現設定錯誤,請先還原備份,不要繼續疊加新規則。

  5. 檢查出口

    將範例網域換成自己有權測試的實際主機,建立新連線後查看核心記錄檔。若已開啟存取記錄,請核對目標與出站標籤;不要只憑網頁能開啟,就判定連線已直連。

路由通常會在建立連線時決定。瀏覽器已有的長連線可能繼續使用原出口,因此儲存規則後,請關閉測試網站的連線或重新啟動測試應用程式,再重新連線。不要只重新整理舊頁面一次,就判定規則失效。如果記錄檔中沒有這次要求,請先檢查系統代理、應用程式代理或 TUN 接管狀態,而非立即重寫正規表示式。

七、自訂路由常見問題

設定了 full,為什麼還是走代理?

先到「設定」→「路由設定」確認目前啟用的方案,再將這條精確規則移到通用網域規則前面。關閉舊連線後重新測試,同時確認要求是否實際使用了其他下載或登入主機名稱。

geosite:cn 和 geoip:cn 都要設定嗎?

不必一律同時新增。若需要兩種判斷,請分成兩條規則:一條填入網域集合,另一條填入 IP 集合。接著確認路由解析策略,否則網域要求可能無法參與 IP 集合比對。

可以只讓某個 HTTPS 路徑直連嗎?

本文介紹的網域規則無法依加密要求中的 URL 路徑分流。可以依完整主機名稱分流,或在確有需要時為規則增加目標連接埠 443;但連接埠條件仍無法區分同一主機下的不同路徑。

為什麼加入 geosite 後核心無法啟動?

先查看啟動記錄是否指出資料檔缺漏或集合不存在。使用用戶端提供的路由資料更新功能維護資料,再確認目前核心使用的資料路徑。可暫時改用一條 full: 規則驗證設定,切勿任意替換集合名稱。

更新訂閱會改變自訂規則嗎?

節點訂閱與路由方案屬於不同設定,但切換節點、核心或路由預設方案後,產生的設定可能有所變動。更新後請檢查目前的路由方案與出口標籤;不要將節點訂閱連結貼進網域規則欄位。

排查分流問題時,請依序檢查「要求進入核心 → 目標資訊可用 → 首條命中規則 → 對應出口存在」。網域寫法用來描述目標,解析策略負責補充 IP 資訊,規則順序則決定優先級。每次只修改一個地方,並保留可還原的方案,比反覆切換整套預設設定更容易找出問題。

下載v2rayN