路由規則設定實戰:中國大陸與境外分流情境的規則寫法與比對順序

中國大陸與境外分流的準確度取決於兩件事:規則排列的順序,以及網域進入核心時的形態。本文依 v2rayN 的路由設定介面與核心設定欄位,把這兩件事拆到可以逐條核對的程度。

本文速覽

適合已經能正常連線節點、想把中國大陸網站切成直連的使用者。讀完可以自己排出一份順序正確的規則清單:攔截排在最前,內網與中國大陸網域直連居中,其餘流量由代理兜底;同時知道每條規則在什麼條件下會失效,失效後該回查哪個環節。

分流判斷的兩個維度:網域與 IP

路由規則的基本結構是「條件 + 出站」。條件主要有網域、IP、連接埠、網路類型四類,出站只有三種:代理、直連、攔截。中國大陸與境外分流的常見做法是用兩類條件各寫一套:網域命中 geosite:cn 走直連,IP 命中 geoip:cn 走直連,其餘流量交給代理。

判斷發生在核心內部,順序是固定的。目標位址先以它本來的形態參與比對:應用程式交給核心的是網域,就先比對網域規則;網域規則全都沒命中,核心才依網域策略決定要不要解析成 IP,再拿 IP 去比對 IP 規則。

應用程式發起連線核心接管流量網域策略前置處理逐條比對規則命中直連出站命中代理出站

這個順序解釋了一個高頻現象:只寫了 geoip:cn、沒有寫 geosite:cn 的設定,在網域策略為 AsIs 時幾乎不起作用——核心沒有解析網域,也就沒有 IP 可比對,請求會全部落到底部的預設出站。

反過來說,只寫網域規則也有邊界:應用程式自己先做了 DNS 解析、把 IP 形態的位址交給核心時,網域規則同樣沒有作用對象。分流準確的前提,是讓網域以網域的形態進入核心。

比對順序:由上到下,首條命中即生效

規則清單是有序陣列,不是集合。核心從第一條開始逐條比對,命中第一條就結束比對,後面的規則不再參與。順序本身就是邏輯:攔截排在直連之前,直連排在兜底之前。

v2rayN 的「設定」→「路由設定」維護的就是這個陣列,出站下拉選單裡的「代理」「直連」「攔截」分別對應核心設定裡的 proxy、direct、block 三個出站標籤。每一列只描述一組條件,先後次序靠上下移動調整。

10808
SOCKS 入站連接埠
10809
HTTP 入站連接埠
3 類
出站:代理 / 直連 / 攔截
geoip:cn
內建中國大陸 IP 規則集

一份能涵蓋大多數情境的順序如下。最後一列不是規則,而是所有規則都沒命中時核心使用的預設出站。

順序條件出站作用
1geosite:category-ads-all攔截廣告與統計網域直接拒絕
2geosite:private直連內網網域不走代理
3geoip:private直連192.168.0.0/16 等位址段直連
4geosite:cn直連中國大陸網站依網域判定
5geoip:cn直連未被網域規則涵蓋的中國大陸 IP 兜底
6無規則命中代理預設出站,其餘流量走節點

順序放錯的代價很具體。把 IP 規則放在網域規則之前,在 IPOnDemand 策略下每條連線都會先解析一次網域,既增加首包延遲,也可能因為 CDN 解析結果落在境外而誤判;把攔截規則放到最後,廣告網域會先被前面的直連或代理規則吃掉,攔截永遠不會被讀到。

網域規則的四種寫法

網域條件支援四種前綴,粒度由寬到窄。前綴寫錯是分流不準最常見的原因。

寫法比對範圍範例
裸字串 / domain:該網域及其所有子網域domain:qq.com 命中 www.qq.com
full:完全相同的網域full:www.example.cn 不命中 a.www.example.cn
keyword:網域中包含該字串keyword:doubleclick 命中任意含該字串的網域
regexp:正規表示式regexp:.*\.google\.com$ 命中其子網域

除了前綴寫法,也可以直接引用 geosite 集合:geosite:cn 涵蓋常見中國大陸網域,geosite:geolocation-cn 是更寬的一檔,geosite:private 是內網網域,geosite:category-ads-all 是廣告與統計網域集合。集合資料隨規則檔打包發布,新出現的網域會有滯後,這也是「規則寫了還是漏」的常見來源。

一條規則可以同時寫多個條件,用逗號分隔,任意一個命中即算符合。

"domain": [
  "domain:qq.com",
  "full:www.example.cn",
  "keyword:doubleclick",
  "regexp:.*\\.google\\.com$",
  "geosite:cn"
]

需要提醒的是,keyword: 與 regexp: 屬於 Xray 核心的擴充寫法,在 v2ray 核心下不生效。v2rayN 可以在「設定」→「參數設定」裡切換核心,v2rayNG 固定使用 Xray 核心,v2flyNG 使用 v2fly 核心;跨核心遷移規則前,先確認這兩類寫法是否被支援。

IP 規則與 geoip:cn 的適用邊界

geoip:cn 判斷的是 IP 歸屬,不是網域歸屬。中國大陸網域解析到境外 CDN 的 IP 時會被判成非中國大陸,境外網域解析到中國大陸節點時會被判成中國大陸。所以 IP 規則適合做兜底,不適合當主要判據。

內網位址必須明確直連。geoip:private 涵蓋 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、127.0.0.0/8 等位址段;只寫 geoip:cn 的話,存取路由器管理頁、NAS 或區域網路印表機會被送進代理,表現是節點連得通但內網服務打不開。

網域策略決定了解析時機

AsIs 不解析網域,IP 規則形同虛設;IPIfNonMatch 只在網域原則全部未命中時解析一次,並帶著解析結果從第一條規則重新比對;IPOnDemand 只要遇到 IP 規則就立即解析。v2rayN 的預設範本使用 IPIfNonMatch,沒有依 IP 精確判定的需求,不要改成 IPOnDemand。

還有一個容易忽略的細節:IPIfNonMatch 的第二輪比對會帶著 IP 從第一條重新開始。放在清單前面的 IP 規則會在第二輪「攔胡」原本該被網域規則命中的請求。排查時如果發現日誌裡的出站與預期不符,先確認這次命中發生在第幾輪。

結論:網域規則決定精度,IP 規則決定兜底

把 geosite:private、geosite:cn 放在 geoip:cn 之前,再用 geoip:private 兜住內網,中國大陸與境外分流的誤差就只剩 CDN 與 DNS 兩項;這兩項靠調整順序解決不了,要靠 DNS 設定收斂。

可直接套用的規則骨架與實作步驟

把前面的結論拼起來,就是一份順序完整的骨架:廣告與統計網域攔截、內網直連、中國大陸網域直連、中國大陸 IP 直連,其餘流量走代理。可以直接抄進 v2rayN 的路由設定,也可以作為自訂規則集匯入。

"routing": {
  "domainStrategy": "IPIfNonMatch",
  "rules": [
    { "type": "field", "domain": ["geosite:category-ads-all"], "outboundTag": "block" },
    { "type": "field", "domain": ["geosite:private"], "outboundTag": "direct" },
    { "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" },
    { "type": "field", "domain": ["geosite:cn"], "outboundTag": "direct" },
    { "type": "field", "ip": ["geoip:cn"], "outboundTag": "direct" }
  ]
}

直連組

網域
geosite:cn, geosite:private
IP
geoip:cn, geoip:private
出站
direct
位置
攔截規則之後

網域條件在前、IP 條件在後,中國大陸網站優先依網域判定。

代理組

網域
geosite:geolocation-!cn
出站
proxy
位置
規則清單末尾
兜底
未命中時的預設出站

這條可以省略,靠預設出站兜底;明確寫出來方便日後加例外。

在 v2rayN 裡實作的步驟如下。

  1. 打開 v2rayN 主介面,進入「設定」→「路由設定」;7.x 版本在「設定」→「參數設定」→「路由」分頁裡維護同一份清單。
  2. 依序逐條新增規則:條件欄位依序填 geosite:category-ads-all、geosite:private、geoip:private、geosite:cn、geoip:cn,出站分別選「攔截」或「直連」,備註寫清用途。
  3. 把「網域策略」設為 IPIfNonMatch。除非需要依 IP 精確判定,不要選 IPOnDemand——它會讓每條連線多做一次解析。
  4. 儲存後重新啟動核心,讓新設定寫入 config.json 並生效。
  5. 用 SOCKS 連接埠 10808(HTTP 連接埠 10809)分別存取一個中國大陸網站和一個境外網站,在「日誌」分頁確認兩條請求的出站標籤分別是 direct 與 proxy。

驗證環節不要只看網頁能不能打開。中國大陸網站透過代理同樣能打開,判斷依據是日誌裡的出站標籤:顯示 direct 的是直連,顯示 proxy 的是代理。中國大陸網站顯示 proxy,說明規則沒有命中,依網域策略、規則順序、DNS 的次序回查。

常見問題與排查順序

下面四個問題涵蓋了大多數分流異常,排查順序固定為:先看網域策略,再看規則順序,最後看 DNS。

中國大陸網站還是走了代理,網頁能開但明顯變慢

先確認網域策略。AsIs 下核心不解析網域,geoip:cn 這類 IP 規則不會生效;改成 IPIfNonMatch,重新啟動核心後再看日誌裡的出站標籤。

加了 geosite:cn,新網域還是漏

geosite 集合是打包資料,新增網域有滯後。把漏掉的網域用 domain: 前綴補一條直連規則,插在兜底之前,再測一次。

區域網路裝置的管理頁打不開

補一條 geoip:private 直連規則並放到清單最前。只寫 geoip:cn 涵蓋不到 192.168.0.0/16 這類位址段,請求會被送進節點。

規則儲存後沒有任何變化

v2rayN 在儲存路由設定後才會重新產生核心設定,需要重新啟動核心才生效;順便確認日誌裡讀到的規則條數與介面顯示的一致。

改完規則不要只看單次結果。中國大陸網站與境外網站各測兩三個,再打開日誌掃一眼出站標籤,確認 direct 與 proxy 都出現在預期的位置,規則才算定型。

下載 v2rayN