本文適合已能連線至節點,並準備調整分流規則的使用者。從網域與 IP 欄位的差異談起,透過五條規則說明比對順序、出站標籤與 DNS 解析策略,再介紹如何在 v2rayN 調整規則並驗證結果。重點是判斷連線為何符合某條規則,而非只看網頁能否開啟,就推測設定是否生效。
連線進入核心後,路由規則才會生效
系統代理、TUN 接管與 Xray 路由分屬不同階段。系統代理會讓支援此設定的應用程式將連線送至本機入口;路由規則則處理已進入核心的連線,再選擇直連、代理或封鎖。若瀏覽器略過系統代理,即使路由規則完全正確,也不會產生相應的路由結果。
本文使用 Xray 原生 JSON 欄位。v2rayN 和 v2rayNG 的介面會將設定轉換為核心設定;v2flyNG 使用 V2Fly 核心,不能因此假設所有 Xray 欄位都能直接照搬。編輯前請先確認目前使用的核心,並備份正在使用的路由方案。
domain是規則欄位,陣列中可填入domain:、full:、regexp:、geosite:等比對運算式。ip是另一種規則欄位,可接受 IP、CIDR 網段及geoip:集合;請勿誤將它寫成網域陣列中的ip:前綴。outboundTag是出站參照,不是任意備註。它必須對應最終設定中已存在的出站tag。
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 本機位址,雙堆疊網路應確認所用私有位址集合的涵蓋範圍。
- 確認集合存在:引用
geosite:cn或geoip:cn前,請確認核心能讀取相應資料檔,且檔案中包含該集合。 - 分類更新時間:用戶端設定更新和 geo 資料更新是兩回事。訂閱更新成功,不代表網域分類也已更新。
- 擴充集合語法:只有資料檔提供相應屬性時,
geosite:某集合@某屬性才有作用;不是為任何集合加上後綴都能使用。 - 故障徵兆:資料檔遺失或集合不存在,可能導致設定載入失敗。請先查看啟動記錄,不要一概當成節點無法連線。
規則優先順序:由上而下,比對成功即停止
每次路由比對時,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,代理出站則參照實際節點通訊協定。
先確認例外規則是否應優先於封鎖規則
若某個網域必須直連,即使它也收錄在廣告集合中,仍應將該網域的精確直連規則移到廣告規則之前;只放在 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 補充比對:可以移除明確的全匹配兜底,並確認沒有規則符合時使用的第一個出站,正是預期的預設出站。
- 需要在遇到 IP 規則時解析:可評估使用
IPOnDemand。比對需要 IP 資訊的規則時,它會嘗試解析,但也會增加 DNS 參與路由判斷的機會。 - 只需固定單一網站的出口:直接在前段新增
full:或domain:規則,通常比調整整套解析策略更容易驗證。
此外,若入口收到的只有目標 IP,網域規則無法憑空得知原始主機名稱。嗅探可能在可辨識的流量中補充網域資訊,但不能用來還原任意通訊協定的網域。排查時應一併檢查入口目標、嗅探設定與最終出站。
在 v2rayN 調整規則順序並驗證結果
在 v2rayN 開啟「設定」→「路由設定」,選擇要使用的路由方案後進入規則編輯。不同版本的介面中,編輯、上移和下移按鈕位置可能有所不同;判斷時應以最終產生的 routing.rules 順序為準,而非方案名稱或規則備註。
- 複製方案:保留原方案以便還原,只在副本中新增一條針對測試網域的
full:規則。先不要同時調整 DNS、嗅探和核心。 - 分開填寫:將
full:example.com填入網域條件,將geoip:cn填入 IP 條件;若介面採逐行輸入,每行填一個比對項目,不要直接貼上整個 JSON 物件。 - 確認出站:在出站選項中選擇需要的出口。若使用原生設定,請檢查
outboundTag與出站tag完全一致,包括大小寫。 - 調整順序:將測試規則移到可能先行符合的規則上方,儲存後確認已選取此路由方案,再依介面提示重新載入或重新啟動核心。
- 建立新連線:關閉舊的網頁連線後重新造訪。既有長連線通常不會因規則修改而自動切換出口;必要時先關閉瀏覽器再測試。
- 查看記錄:確認核心已成功啟動,再查看測試目標的存取記錄與出站標籤。必要時可暫時提高記錄詳細程度,測試後再調回原設定,避免持續記錄大量連線資訊。
若要驗證「僅 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 規則有命中嗎?
不能。直連和代理都可能成功開啟網頁。請核對核心存取記錄中的目標與出站標籤;若目前記錄未顯示規則編號,請比較修改前後的出站,並一次只變更一條規則。