本文適合已能連線至節點、準備調整分流規則的使用者。先釐清網域清單與 IP 位址清單的差異,再設定中國大陸網站直連、區域網路直連及預設代理。範例會說明 IPIfNonMatch 的解析條件、第一個出站作為預設出口的作用,以及如何透過用戶端記錄確認實際使用的出口,避免只憑「網頁能開啟」就認定分流設定正確。
一、geosite 與 geoip 分別比對什麼
geosite 是網域分類資料,geoip 則是 IP 位址範圍資料。兩者都不是自動辨識網站歸屬的服務,也不會即時查詢網站營運者。路由結果取決於本機資料檔、請求交給核心時所帶的目標資訊,以及規則順序。
| 寫法 | 比對目標 | 適用範圍 |
|---|---|---|
geosite:cn | 資料集 cn 分類中的網域 | 核心必須取得網域;並非所有使用中文的網站 |
geoip:cn | 資料集中的中國大陸 IP 網段 | 依據目標 IP,無法直接判斷網站隸屬哪家公司 |
geoip:private | 私有、保留等特殊用途位址集合 | 常用於區域網路直連;實際範圍依使用的資料檔而定 |
domain:example.com | 指定網域及其子網域 | 用來手動新增單一網站,不受分類標籤限制 |
full:example.com | 精確網域 | 不會同時比對 www.example.com |
網站可能使用跨區域 CDN。同一個網域在不同網路環境中,可能解析出不同位址,因此「網域符合 cn」和「解析出的位址符合 cn」是兩種不同判斷。若瀏覽器先自行解析,再將 IP 交給代理,網域規則可能就沒有機會直接比對;嗅探可在部分協定中補上網域資訊,但無法保證還原所有請求的網域。
二、可合併的 routing 範例與預設出口
以下是完整的 routing 物件片段,並非可直接連線節點的完整設定。合併至現有的 V2Ray 或 Xray 設定前,務必確認出站標籤:本文以 direct 指向使用 freedom 協定的直連出站,proxy 則指向已測試可用的代理出站。標籤只是名稱,不會自動建立出口。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:localhost",
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
此片段要求現有設定的 outbounds 第一項是代理出站。在本文這類一般路由設定中,沒有規則符合時,流量會使用第一個出站;出口不會由 proxy 這個標籤名稱自動決定。若第一項實際上是直連,未符合規則的境外網站也會直連。不要只為了符合順序,就複製一個缺少伺服器資訊的代理出站。
- 目標符合 cn 網域分類:第一條網域規則符合,選擇
direct。 - 目標是
192.168.1.1這類私有位址:符合 IP 規則,選擇direct。 - 目標網域未符合規則:若沒有其他規則符合,IPIfNonMatch 會嘗試解析網域,並重新比對 IP 規則。
- 解析出的位址仍未符合直連範圍:使用第一個出站,也就是事先確認過的代理出站。
此處「境外網站走代理」的準確意思是:未被上述直連規則涵蓋的流量,預設走代理。這並非即時且完整的國家或地區歸屬判斷。若要指定某個網域固定使用特定出口,應新增明確的網域規則,而不是期待 IP 位址的地理歸屬永遠符合需求。
結論:先確認預設出口,再調整分類
儲存規則前,先檢查產生的設定中 outbounds[0] 實際使用的協定與標籤。確認預設出口正確後,再用一條網域例外規則測試順序;否則即使分類清單調得再細,未符合規則的流量仍可能被送往錯誤出口。
三、domainStrategy 的選擇與預設出口陷阱
routing.domainStrategy 用來控制路由階段是否解析網域,以便比對 IP 規則。它不等同於 DNS 伺服器選擇,也不等同於出站連線時的位址選擇策略。若相同名稱的設定出現在不同層級,請先確認它所屬的物件。
IPIfNonMatch
建議設定先依現有目標資訊比對規則;若沒有規則符合,再嘗試解析網域並重新比對。本文範例採用此策略,並以第一個出站作為預設出口,不另外加入全匹配的末尾規則。
適用情境:優先使用網域分類,並需要以中國大陸 IP 補充直連規則。
AsIs
路由階段不會額外解析網域以取得 IP。已有目標 IP 的請求仍可符合 IP 規則,但僅以網域傳入的請求不會因此取得 geoip 分類結果。連線階段仍可能需要解析網域。
適用情境:以網域規則為主,並希望減少路由階段額外 DNS 查詢的設定。
IPOnDemand
比對過程中若需要判斷 IP 規則,就可能觸發網域解析。IP 規則放得越前面,越可能提早進行查詢;但不能簡單地認定每個請求都一定會先解析。
適用情境:明確需要在規則流程較前段判斷 IP,且可接受相關查詢成本的設定。
常見錯誤是在 IPIfNonMatch 設定的末尾,再加入 network: "tcp,udp" 代理規則。此規則可能在第一輪就直接符合請求,導致「沒有規則符合」的條件不再成立。結果是,不在 geosite:cn 分類中的網域可能直接走代理,無法再透過解析結果符合 geoip:cn。
路由解析也會帶來隱私與連線成本。哪些網域會送往哪台 DNS 伺服器,必須搭配完整的 dns 設定、查詢流量路徑,以及瀏覽器本身的解析方式一起判斷。單獨變更 domainStrategy,無法保證 DNS 查詢會經由代理,也無法單獨解決 DNS 污染問題。
四、規則順序:例外優先,分類其次
每次比對規則時都會由上而下檢查,由第一條符合的規則決定出口。若同一個規則物件包含 domain 與 ip 等多個條件,這些條件必須同時符合;同一個 domain 陣列中的多個項目則符合其中一項即可。若要設定「網域符合或 IP 符合就直連」,應像本文一樣拆成兩條規則。
例如,某個網站雖然列在 cn 分類中,但業務測試要求固定走代理,可以將以下物件插入 rules 陣列最前面。此處的 example.com 是用來說明語法的保留網域,實際使用時請填入要測試的網域。
{
"type": "field",
"domain": [
"domain:example.com"
],
"outboundTag": "proxy"
}
- 手動例外放前面:只涵蓋確實需要變更出口的網域,方便還原設定。
- 網域分類接在後面:讓已知網站依明確的網域策略處理。
- IP 分類補充:處理直接以 IP 存取的請求,以及策略允許解析後再判斷的請求。
- 最後確認預設出口:本文使用第一個出站作為兜底,不再新增全匹配規則。
「私有 IP 必須最先比對」也不適用於所有情境。若希望網域例外優先於其解析出的位址,就必須維持相應的規則順序;若要求所有私有位址一律直連,還需考量網域例外、DNS 回應結果與解析策略之間的關係。企業內部網路尤其應先確認位址規劃,不要直接將公用網路範例套用至現有策略。
五、在用戶端套用並確認實際設定
v2rayN 是桌面用戶端;v2rayNG 使用 Xray 核心,v2flyNG 使用 v2fly 核心。用戶端介面負責產生或載入設定,實際執行規則的是所選核心。完整自訂設定與一般節點模式的設定入口和套用範圍不同,不要同時修改兩處設定,再猜測哪一處生效。
-
備份目前設定
記下目前啟用的節點、路由方案與本機監聽連接埠,並儲存現有的自訂設定。先確認路由尚未修改時節點可正常連線,再開始調整分流。
-
開啟路由設定
v2rayN 常見入口為「設定」→「路由設定」;v2rayNG 常見入口為側邊選單→「路由設定」。選單名稱可能因版本而異,請以目前介面為準。先檢查現有規則,不要直接刪除整套方案。
-
選擇設定方式
使用介面規則編輯器時,分別填入網域、IP 與目標出口,並確認排序。只有在使用完整自訂設定時,才合併本文的 routing 物件;不要將整個 JSON 物件貼進只接受網域清單的輸入欄位。
-
確認實際標籤
檢查產生或載入的設定,確認 direct、proxy 都存在,並查看第一個出站。介面上的「直連」「代理」選項可能對應到其他標籤,請以實際設定中的名稱為準。
-
重新啟動並查看記錄
儲存並啟用對應的路由方案後,先停止連線再重新啟動。查看執行記錄是否出現規則解析、資源檔或出站標籤錯誤。只儲存編輯視窗,不代表執行中的核心已重新載入設定。
若要比較核心行為,應分別記錄使用的核心及版本,而不只是用戶端版本。v2rayNG 與 v2flyNG 使用不同核心,不能視為同一核心的兩種介面;自訂設定中的擴充欄位與資源載入方式也必須分別確認。基礎欄位的詳細說明請參閱本站的JSON 手冊。
六、透過請求與記錄驗證分流結果
測試時必須先確認請求確實進入核心,再確認使用了預期出口。瀏覽器擴充功能、系統代理略過清單與終端機環境變數都可能改變流量入口。以下假設本機已啟用 127.0.0.1:10808 SOCKS 監聽;10808 是測試連接埠,並非所有安裝環境的預設值,執行前請換成目前使用的監聽連接埠。
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://www.baidu.com/
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
socks5h 會讓 curl 將網域交由代理端處理,適合用來觀察網域規則;但這不代表 DNS 查詢一定會經過遠端代理。第一個請求用來觀察 cn 網域分類,第二個則用來觀察未符合直連條件時的預設出口。HTTP 回應成功只能證明連線已完成,實際出口仍應以存取記錄中的目標位址與出站標籤為準。
| 測試項目 | 預期結果 | 異常時優先檢查 |
|---|---|---|
| 資料中屬於 cn 分類的網域 | 記錄顯示選擇直連出口 | geosite 資料、是否傳入網域、前置規則 |
| 網路中實際存在的區域網路位址 | 記錄顯示選擇直連出口 | private 資料、IP 規則、內網連線狀態 |
| 不在直連範圍內的網域 | 記錄顯示選擇代理出口 | 第一個出站、額外規則、解析結果 |
| 手動指定走代理的例外網域 | 優先符合例外規則 | 例外規則位置、domain 與 full 的差異 |
測試區域網路位址時,請使用自己網路中確實存在的裝置,例如管理位址為 192.168.1.1 的路由器;此位址僅供示範。若裝置沒有提供網頁服務,連線失敗不代表路由規則有誤。記錄可以顯示選擇了哪個出站;目標服務是否有回應,則是下一層的檢查。
加入 geoip:cn 後,為什麼部分中國大陸網站仍走代理?
先確認請求是以網域還是 IP 傳入,再檢查 domainStrategy。若使用 AsIs,網域不會為了 IP 規則而額外解析;若使用 IPIfNonMatch,請檢查末尾是否有全匹配規則提早接收請求。最後確認實際解析出的位址是否包含在所用的 cn 資料中。
為什麼中國大陸網域會連到境外位址?
網域分類不保證伺服器位於同一地區。若 geosite:cn 已符合並選擇直連,後續的 geoip 規則就不會再改變出口。若要依 IP 決定出口,請明確調整策略與順序,並重新測試 CDN 的解析結果。
規則已儲存,為什麼記錄仍顯示舊出口?
確認啟用的是剛才編輯的路由方案,接著停止並重新啟動核心。完整自訂設定可能不會使用一般節點模式中的路由編輯結果;請檢查本次實際載入的設定,不要只看編輯視窗。
所有請求都直連,應該先檢查哪裡?
先檢查 outbounds 第一項是否為直連,以及前面是否有全匹配規則。接著使用上述指定 SOCKS 連接埠的 curl 指令,確認流量確實進入核心。若沒有對應的存取記錄,請先排查流量入口,不要急著擴增規則清單。