適合已匯入節點、準備調整 v2rayN 分流規則的使用者。本文先釐清網域欄位與 IP 欄位的差異,再以可檢查的 JSON 片段說明前綴、規則順序及網域解析策略;最後整理用戶端的驗證步驟,避免將規則未命中、出站標籤錯誤與 DNS 解析失敗混為一談。
先釐清:欄位、比對值與出站標籤
V2Ray 與 Xray 的常見路由設定位於 routing.rules 陣列中。每個項目描述「哪些連線符合條件」以及「符合後交由哪個出站處理」。domain、ip 是欄位名稱;domain:、full:、geosite: 則是網域比對值的前綴。請勿混淆這兩層語法。
以下是一條完整的路由規則,並非完整的核心設定。它會將目標網域恰好為 example.com、使用 TCP 且目標連接埠為 443 的連線,交由名為 proxy 的出站處理。這裡的連接埠是目標服務的連接埠,不是用戶端的本機監聽連接埠。
{
"type": "field",
"domain": ["full:example.com"],
"network": "tcp",
"port": "443",
"outboundTag": "proxy"
}
- 同一欄位內通常採「或」:
domain陣列中的任一網域條件符合,即視為該欄位符合。 - 不同條件欄位之間採「且」:上例必須同時符合網域、TCP 和目標連接埠 443,才會選用該出站。
- 標籤必須確實存在:
outboundTag引用的是outbounds中的tag,不是節點備註,也不能任意填寫中文動作說明。
網域前綴:domain、full、regexp 與 geosite
同一網域使用不同前綴,比對範圍會有明顯差異。若要設定「主網域及所有子網域」,優先使用 domain:;只處理一個精確主機名稱時,則使用 full:。這兩種寫法比範圍較廣的關鍵字比對更容易檢查。
| 寫法 | 比對範圍 | 注意事項 |
|---|---|---|
domain:example.com | example.com 及其子網域,例如 api.example.com | 不會比對 notexample.com |
full:example.com | 僅限 example.com | 不包含 www.example.com |
regexp:^api[0-9]+\.example\.com$ | 例如 api1.example.com、api20.example.com | 以正規表示式錨點限定完整名稱 |
geosite:cn | 資料檔中 cn 分類的網域項目 | 分類內容依使用的資料檔而異 |
example.com | 目標網域名稱中包含該文字 | 單獨使用字串不會比對網域後綴邊界 |
geosite: 引用的是本機網域分類資料,不是即時查詢網站所屬地區。geosite:cn 也不等於「所有以 .cn 結尾的網域」:其中可能包含其他後綴的網域,也可能暫時未收錄新網站。分類名稱、屬性與項目請以實際安裝的資料檔為準。
正規表示式還涉及一層 JSON 跳脫。表格中的正規表示式是比對用的表達式;寫入 JSON 字串時,代表字面句點的反斜線必須寫兩次。若是在用戶端的一般文字輸入框中填寫規則,請依該欄位的格式輸入,不要機械式地再多加一層跳脫。
{
"type": "field",
"domain": [
"domain:example.com",
"regexp:^api[0-9]+\\.example\\.net$"
],
"outboundTag": "proxy"
}
結論:先用精確規則驗證,再擴大範圍
排查單一網站時,先新增 full: 規則。確認確實命中後,再決定是否改用 domain: 或分類規則;一開始不要用範圍過廣的正規表示式涵蓋大量目標。
IP 規則:位址、CIDR 與 geoip
IP 條件應填在 ip 陣列中。單一位址直接填入,網段使用 CIDR,地區或特殊位址集合則使用 geoip:。標準寫法不是在位址前加上 ip: 前綴;若將 ip:192.168.1.1 當作陣列值,可能會導致設定載入失敗。
位址與網段
- 設定欄位
ip- 單一位址
192.168.1.1- IPv4 網段
192.168.0.0/16- IPv6 網段
fc00::/7
適用於明確指定的裝置位址或內部網段,避免依賴網域分類。
IP 資料集合
- 設定欄位
ip- 地區集合
geoip:cn- 私人位址集合
geoip:private- 資料依賴
geoip.dat
集合是否存在及涵蓋哪些位址,請以目前使用的資料檔為準。
要求進入核心時若目標已是 IP,IP 規則便可直接參與比對;若目標仍是網域,能否使用解析結果繼續比對,則取決於 domainStrategy。瀏覽器自行解析、應用程式直接連線至 IP,以及用戶端透過嗅探還原網域等因素,也會影響路由器最終取得的目標資訊。
- 不要依網域後綴推測伺服器所在地區:同一網域可能解析至多個地區的位址,使用 CDN 時更是如此。
- 不要只設定 IPv4:如果應用程式實際連線至 IPv6 位址,只設定 IPv4 網段就無法涵蓋該連線。
- 私人位址直連需配合網路環境:本機區域網路通常需要直連;若需透過遠端網路存取內部位址,應另外設計規則,並放在範圍較廣的直連規則之前。
比對優先順序:先命中,不是越精確越優先
路由規則會依陣列順序由上而下檢查,第一條符合條件的規則決定出站。核心不會在所有命中項目中挑選「看起來最精確」的一條。只有將精確網域規則放在範圍較廣的規則之前,才能穩定設定例外。
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"domain": ["full:ads.example.com"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
以下是可併入既有設定的 routing 片段,不包含入站、出站與 DNS 設定。假設三個標籤都已定義:ads.example.com 命中第一條規則後會被封鎖;www.example.com 命中第二條規則並走代理;直接連線至私人位址時可命中第三條規則;其餘 TCP、UDP 連線則由最後一條規則兜底。
- 先放必須優先於其他規則的精確例外,例如封鎖單一網域,或指定服務走代理。
- 接著放網域集合與 IP 集合;若兩者可能重疊,應明確決定希望哪一類先決定結果。
- 最後才放範圍較廣的兜底規則。若將對應
network: tcp,udp的規則移到最上方,後續一般 TCP、UDP 規則便不會有比對機會。
若所有規則都未命中,一般 V2Ray/Xray 設定會使用第一個出站,不會自動判斷「中國大陸直連、其他流量走代理」。明確設定兜底規則較易閱讀,但也會影響網域解析後的再次比對,因此不能脫離網域策略單獨調整。
domainStrategy:何時解析,何時重試 IP 規則
routing.domainStrategy 控制路由比對階段如何處理網域;它不等同於用戶端的所有 DNS 設定,也不代表應用程式一定會將網域交給核心。請先確認入站收到的是網域還是 IP,再判斷適合採用哪種策略。
| 策略 | 路由階段的行為 | 適用情況 |
|---|---|---|
AsIs | 不會為了路由比對而主動解析目標網域 | 主要依賴網域規則,或希望減少路由階段對解析的依賴 |
IPIfNonMatch | 網域未符合規則時,再嘗試解析並參與 IP 比對 | 網域規則優先,IP 規則作為補充 |
IPOnDemand | 比對過程遇到需要判斷 IP 的規則時,嘗試進行解析 | 明確需要讓較前面的 IP 規則參與判斷 |
重要陷阱在於 IPIfNonMatch 與無條件兜底規則的組合:若第一輪檢查已命中最後的 TCP、UDP 兜底規則,就不算「未命中」,不能期待之後再解析網域並命中 geoip:cn。若要依賴此策略補充分流 IP,應檢查是否有提早結束比對的廣泛規則,並一併確認未命中時的預設出站。
使用 IPOnDemand 時,尤其要留意規則順序。較前面的 IP 規則可能觸發解析並命中,讓後面的網域例外失去比對機會。若要確保特定網域固定走代理,請將它的精確規則放在可能涵蓋該網域的 IP 規則之前。
結論:調整網域策略時,也要檢查兜底規則的位置
將策略切換至 IPIfNonMatch 後,不要只測試單一網站能否開啟。還要檢查目標是否在第一輪就被兜底規則攔截,以及日誌中最後選用的出站是否符合預期。
在 v2rayN 中調整並驗證規則
v2rayN 的路由編輯介面會隨版本更新而調整。常見入口為「設定」→「路由設定」;進入後,先確認正在編輯的規則集,再檢查主視窗目前啟用的路由是否為該規則集。只修改清單中未啟用的規則集,不會改變現有連線的分流方式。
- 保存目前設定:備份現行規則,記下目前的核心類型、網域策略及最終出站。本文討論的是 V2Ray/Xray 格式,請勿直接複製到其他核心的不同設定結構中。
- 只新增一條可驗證的規則:在網域條件中填入
full:加上實際目標主機名稱,選擇對應出站,並將規則移至涵蓋該目標的廣泛規則之前。 - 套用並重新建立連線:儲存規則,必要時重新啟動核心。關閉測試頁面既有的連線後再試;已建立的長連線不會因調整規則而自動切換出站。
- 查看日誌資訊:依目前版本提供的日誌設定,暫時提高至
info或排查所需的層級,搜尋目標網域、目標連接埠與出站標籤;確認完成後,請恢復日常日誌層級。 - 逐步擴大規則範圍:精確網域測試通過後,再改用
domain:或新增geosite:。每次只調整一個因素,方便判斷問題原因。
常見設定錯誤與修正方式
設定了 domain:example.com,為什麼其他網站也走代理?
先檢查是否還有裸字串、分類規則或代理兜底規則命中。domain:example.com 本身只涵蓋該網域及其子網域,不會比對 notexample.com。查看實際出站日誌後,再逐條縮小規則範圍。
設定了 geosite:cn,為什麼核心啟動時回報找不到分類?
確認目前核心使用的 geosite.dat 是否存在,以及檔案中是否包含 cn 分類。透過目前用戶端提供的資料更新入口更新後再試;請勿將其他規則格式的檔案直接改名替換。
正規表示式寫進 JSON 後出現跳脫錯誤,該改哪裡?
檢查反斜線:用來比對字面句點的正規表示式 \.,寫入 JSON 字串時應為 \\.。也請檢查英文雙引號及陣列逗號。若設定可載入但沒有命中,再檢查錨點與實際主機名稱。
已新增精確直連規則,為什麼仍然走代理?
將規則移到範圍較廣的代理規則之前,確認修改的是已啟用的規則集,再重新建立連線。若日誌只顯示目標 IP,請檢查應用程式是否自行解析,以及嗅探設定是否適用;核心拿不到網域時,精確網域規則就無法直接命中。
domain 和 ip 放在同一條規則中,任一條件符合就會生效嗎?
不會。不同條件欄位必須同時符合。若要表達「此網域或此網段都直連」,請拆成兩條規則,並為兩條選用相同的直連出站。這樣也更方便分別驗證網域與 IP 條件。