適合已經能正常連線節點、想把中國大陸網站切成直連的使用者。讀完可以自己排出一份順序正確的規則清單:攔截排在最前,內網與中國大陸網域直連居中,其餘流量由代理兜底;同時知道每條規則在什麼條件下會失效,失效後該回查哪個環節。
分流判斷的兩個維度:網域與 IP
路由規則的基本結構是「條件 + 出站」。條件主要有網域、IP、連接埠、網路類型四類,出站只有三種:代理、直連、攔截。中國大陸與境外分流的常見做法是用兩類條件各寫一套:網域命中 geosite:cn 走直連,IP 命中 geoip:cn 走直連,其餘流量交給代理。
判斷發生在核心內部,順序是固定的。目標位址先以它本來的形態參與比對:應用程式交給核心的是網域,就先比對網域規則;網域規則全都沒命中,核心才依網域策略決定要不要解析成 IP,再拿 IP 去比對 IP 規則。
這個順序解釋了一個高頻現象:只寫了 geoip:cn、沒有寫 geosite:cn 的設定,在網域策略為 AsIs 時幾乎不起作用——核心沒有解析網域,也就沒有 IP 可比對,請求會全部落到底部的預設出站。
反過來說,只寫網域規則也有邊界:應用程式自己先做了 DNS 解析、把 IP 形態的位址交給核心時,網域規則同樣沒有作用對象。分流準確的前提,是讓網域以網域的形態進入核心。
比對順序:由上到下,首條命中即生效
規則清單是有序陣列,不是集合。核心從第一條開始逐條比對,命中第一條就結束比對,後面的規則不再參與。順序本身就是邏輯:攔截排在直連之前,直連排在兜底之前。
v2rayN 的「設定」→「路由設定」維護的就是這個陣列,出站下拉選單裡的「代理」「直連」「攔截」分別對應核心設定裡的 proxy、direct、block 三個出站標籤。每一列只描述一組條件,先後次序靠上下移動調整。
一份能涵蓋大多數情境的順序如下。最後一列不是規則,而是所有規則都沒命中時核心使用的預設出站。
| 順序 | 條件 | 出站 | 作用 |
|---|---|---|---|
| 1 | geosite:category-ads-all | 攔截 | 廣告與統計網域直接拒絕 |
| 2 | geosite:private | 直連 | 內網網域不走代理 |
| 3 | geoip:private | 直連 | 192.168.0.0/16 等位址段直連 |
| 4 | geosite:cn | 直連 | 中國大陸網站依網域判定 |
| 5 | geoip: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 裡實作的步驟如下。
- 打開 v2rayN 主介面,進入「設定」→「路由設定」;7.x 版本在「設定」→「參數設定」→「路由」分頁裡維護同一份清單。
- 依序逐條新增規則:條件欄位依序填
geosite:category-ads-all、geosite:private、geoip:private、geosite:cn、geoip:cn,出站分別選「攔截」或「直連」,備註寫清用途。 - 把「網域策略」設為 IPIfNonMatch。除非需要依 IP 精確判定,不要選 IPOnDemand——它會讓每條連線多做一次解析。
- 儲存後重新啟動核心,讓新設定寫入 config.json 並生效。
- 用 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 都出現在預期的位置,規則才算定型。