本文重點

本文適合已能連線至節點,並準備調整分流規則的使用者。從網域與 IP 欄位的差異談起,透過五條規則說明比對順序、出站標籤與 DNS 解析策略,再介紹如何在 v2rayN 調整規則並驗證結果。重點是判斷連線為何符合某條規則,而非只看網頁能否開啟,就推測設定是否生效。

連線進入核心後,路由規則才會生效

系統代理、TUN 接管與 Xray 路由分屬不同階段。系統代理會讓支援此設定的應用程式將連線送至本機入口;路由規則則處理已進入核心的連線,再選擇直連、代理或封鎖。若瀏覽器略過系統代理,即使路由規則完全正確,也不會產生相應的路由結果。

應用程式連線 入站接收 目標辨識 規則比對 出站轉送

本文使用 Xray 原生 JSON 欄位。v2rayN 和 v2rayNG 的介面會將設定轉換為核心設定;v2flyNG 使用 V2Fly 核心,不能因此假設所有 Xray 欄位都能直接照搬。編輯前請先確認目前使用的核心,並備份正在使用的路由方案。

domain、full 與 regexp:先界定比對範圍

最常見的分流錯誤,往往是比對範圍設得太廣。只填一般字串時,Xray 會以子字串比對;若要涵蓋「此網域及其子網域」,應明確使用 domain:。規則中請填主機名稱,不要貼上含通訊協定、路徑或查詢參數的完整網址。

寫法比對方式範圍示例
example.com網域中的子字串比對可能也會比對到 notexample.com
domain:example.com該網域及其各級子網域比對到 example.com、img.example.com,不會比對到 notexample.com
full:example.com完整網域精確比對不包含 www.example.com
regexp:^img[0-9]+\.example\.com$正規表示式比對比對到 img12.example.com,不會比對到 img.example.com
geosite:cn引用網域資料檔中的 cn 集合結果取決於目前使用的資料檔,不能直接視為所有中國大陸伺服器

正規表示式還有一層 JSON 跳脫處理。路由編輯欄位中的原始運算式可以包含 \.;寫入 JSON 字串時,反斜線必須寫成 \\。下方展示的是可解析的 JSON 規則物件,並非可獨立啟動核心的完整設定。

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

ip、geoip 與 geosite:資料來源各不相同

geosite 比對網域集合,geoip 比對 IP 位址集合。網站使用多個內容傳遞位址時,網域分類與實際連線位址的地理分類可能不同。若要讓特定網站固定走代理,建議優先新增網域例外,不要只依賴 IP 所屬地區。

{
  "type": "field",
  "ip": [
    "192.168.0.0/16",
    "10.0.0.0/8",
    "geoip:private",
    "geoip:cn"
  ],
  "outboundTag": "direct"
}

上例前兩項示範 CIDR 寫法,涵蓋範圍與 geoip:private 部分重疊;實際使用時可刪除重複項目。只填 IPv4 私有網段不會自動涵蓋 IPv6 本機位址,雙堆疊網路應確認所用私有位址集合的涵蓋範圍。

規則優先順序:由上而下,比對成功即停止

每次路由比對時,Xray 會依照 rules 陣列順序檢查,並採用第一條符合所有條件的規則。後面的網域即使更精確,也不會因此自動優先。請將精確例外放在較廣泛的分類之前,並將兜底規則留在最後。

同一欄位的陣列通常表示「或」:網域陣列中只要有一個運算式符合即可。同一條規則中的不同篩選欄位通常表示「且」:同時設定 domain、port 和 network,就必須同時符合所有條件。將網域條件和 IP 條件放在同一條規則中,不代表「符合任一項就直連」。

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

這是用來說明規則順序的 routing 設定片段,假設已有 direct、proxy、block 三個出站,且資料檔提供範例集合。標籤名稱並非核心保留的動作名稱:常見的直連出站使用 freedom,封鎖出站使用 blackhole,代理出站則參照實際節點通訊協定。

5 條
範例規則依陣列順序執行
3 個
必須使用已存在的出站標籤
443
可用於測試 HTTPS 連接埠條件

先確認例外規則是否應優先於封鎖規則

若某個網域必須直連,即使它也收錄在廣告集合中,仍應將該網域的精確直連規則移到廣告規則之前;只放在 cn 集合之前還不夠。

domainStrategy:網域何時參與 IP 比對

IP 規則能否套用於網域目標,取決於路由的 domainStrategy。此欄位控制路由階段是否為了比對而解析網域,不等同於整個用戶端的 DNS 設定,也不等同於直連出站最終如何解析目標位址。

AsIs:保留目標類型

欄位
routing.domainStrategy
說明
AsIs
網域目標
不會為路由比對而主動解析成 IP
IP 目標
可直接參與 IP 規則比對

適合先驗證網域規則,避免初步排查時混入 DNS 解析結果。

IPIfNonMatch:沒有比對結果時再解析

欄位
routing.domainStrategy
說明
IPIfNonMatch
觸發條件
網域目標在第一輪沒有任何規則符合
後續處理
解析後再次嘗試比對,並納入 IP 規則

若最後一條是全匹配兜底,第一輪就會已有結果,不能期待之後再觸發 IP 補充比對。

因此,上一節的五條規則雖然設定了 IPIfNonMatch,但網域目標若比對到最後一條 TCP/UDP 兜底規則,第一輪就已成功,不會再為前面的 geoip:cn 觸發解析。原本就是 IP 的目標仍可比對到第四條。這是「已設定 geoip,網域卻仍走代理」的常見原因。

此外,若入口收到的只有目標 IP,網域規則無法憑空得知原始主機名稱。嗅探可能在可辨識的流量中補充網域資訊,但不能用來還原任意通訊協定的網域。排查時應一併檢查入口目標、嗅探設定與最終出站。

在 v2rayN 調整規則順序並驗證結果

在 v2rayN 開啟「設定」→「路由設定」,選擇要使用的路由方案後進入規則編輯。不同版本的介面中,編輯、上移和下移按鈕位置可能有所不同;判斷時應以最終產生的 routing.rules 順序為準,而非方案名稱或規則備註。

  1. 複製方案:保留原方案以便還原,只在副本中新增一條針對測試網域的 full: 規則。先不要同時調整 DNS、嗅探和核心。
  2. 分開填寫:將 full:example.com 填入網域條件,將 geoip:cn 填入 IP 條件;若介面採逐行輸入,每行填一個比對項目,不要直接貼上整個 JSON 物件。
  3. 確認出站:在出站選項中選擇需要的出口。若使用原生設定,請檢查 outboundTag 與出站 tag 完全一致,包括大小寫。
  4. 調整順序:將測試規則移到可能先行符合的規則上方,儲存後確認已選取此路由方案,再依介面提示重新載入或重新啟動核心。
  5. 建立新連線:關閉舊的網頁連線後重新造訪。既有長連線通常不會因規則修改而自動切換出口;必要時先關閉瀏覽器再測試。
  6. 查看記錄:確認核心已成功啟動,再查看測試目標的存取記錄與出站標籤。必要時可暫時提高記錄詳細程度,測試後再調回原設定,避免持續記錄大量連線資訊。

若要驗證「僅 HTTPS 直連」,可在測試規則中同時設定網域條件、port: "443" 與 network: "tcp"。此時使用 UDP 的 HTTP/3 不符合 TCP 條件,不能只因瀏覽器能開啟同一網站就認定規則失效。通訊協定和連接埠都必須符合測試條件。

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

full:example.com 不包含 www.example.com。先從記錄確認實際目標;若要涵蓋子網域,請改用 domain:example.com;若只需要這兩個主機,則新增兩個 full 比對項目。

規則放在最後,為什麼一直沒生效?

檢查它上方是否已有 network: "tcp,udp"、涵蓋該網域的集合,或範圍更廣的網域比對規則。將測試規則移到這些規則之前,重新載入設定並建立新連線。

更新 geo 資料後,核心反而無法啟動?

查看啟動記錄中提到的檔案與集合名稱。確認資料檔路徑可讀取,且集合確實存在;先移除報錯的集合參照以確認核心能否啟動,再修正資料來源。不要反覆更換節點來掩蓋設定錯誤。

網頁能開啟,就能證明 direct 規則有命中嗎?

不能。直連和代理都可能成功開啟網頁。請核對核心存取記錄中的目標與出站標籤;若目前記錄未顯示規則編號,請比較修改前後的出站,並一次只變更一條規則。