本文適合已能匯入節點,並希望進一步控制直連、代理與攔截範圍的使用者。重點涵蓋網域與 IP 條件的實際比對方式、geosite 與 geoip 資料集的用途、規則衝突時的處理順序,以及可依現有出站標籤調整的 routing 設定。
先了解 routing 的比對流程
V2Ray 路由不會改變 VMess、VLESS 等節點協定本身,而是處理請求進入核心後應交給哪個 outbound,也就是決定某個連線要走代理、直連、攔截出站或其他已定義的出口。路由結果取決於請求目標、規則順序與出站標籤;節點能連線不代表分流規則一定正確。
一次請求通常先由本機 SOCKS、HTTP 或透明代理入口接收,再進入 routing.rules。核心會從陣列中的第一條規則開始檢查,遇到第一條符合條件的規則便停止繼續比對,並使用該規則的 outboundTag 或 balancerTag。後面的規則即使寫得更具體,也不會覆蓋已命中的前置規則。
同一條規則中的多個欄位通常必須「同時符合」。例如一條規則同時設定 network: "tcp" 與 port: "443",只會比對 TCP 443 連線;欄位內的陣列則是「符合任一項即可」,例如 domain 陣列包含三個網域條件,命中其中一個便符合該欄位。
- 規則之間:依陣列順序由上而下檢查,先命中者生效。
- 不同欄位:domain、network、port 等條件必須同時符合。
- 同一欄位陣列:陣列中的多個值通常以符合任一項處理。
- 最終出站:outboundTag 必須與 outbounds 中現有的 tag 完全一致。
domain、full、regexp 與 geosite 的寫法
domain 欄位接收字串陣列,但陣列中的字串可以採用不同的比對語法;普通字串用於網域子字串比對;domain: 用於比對指定網域及其子網域;full: 只比對完整網域;regexp: 使用正規表示式;geosite: 則引用外部網域分類資料。日常分流優先使用 domain、full 與 geosite,只有現有語法無法表達目標範圍時才考慮 regexp。
精確與後綴比對
- 完整網域
- full:api.example.com
- 網域及子網域
- domain:example.com
- 普通字串
- example
- 正規表示式
- regexp:^.+\.example\.com$
已知固定主機名稱時優先使用 full;要涵蓋整個網站及其子網域時使用 domain。
分類資料比對
- 中國大陸常見網域
- geosite:cn
- 廣告分類
- geosite:category-ads-all
- 非中國大陸分類
- geosite:geolocation-!cn
- 資料來源
- 核心載入的資料檔案
能否使用某個分類名稱,取決於目前核心實際載入的資料檔案及其版本。
domain:example.com 可以涵蓋 example.com 及 www.example.com,適合套用整站策略;full:example.com 不會自動涵蓋子網域,適合只處理單一固定主機名稱。普通字串的範圍更廣,可能意外比對到網域中含有相同字元的其他網站,因此不建議將過短的單字作為規則。
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:static.example.com",
"geosite:cn"
],
"outboundTag": "direct"
}
geosite 不是即時連線查詢服務,而是核心讀取的本機網域分類資料。更新用戶端或核心後,分類內容可能會隨資料檔案變更。如果日誌顯示找不到某個 geosite 分類,應先確認分類名稱是否存在,再檢查用戶端使用的是 V2Ray 還是 Xray 核心,不要靠反覆調整規則順序來掩蓋資料缺失問題。
ip、CIDR 與 geoip 的比對條件
ip 欄位會針對連線目標的 IP 位址進行判斷,可以填寫單一位址、CIDR 網段或 geoip: 分類。常見寫法包括 127.0.0.0/8、192.168.0.0/16、geoip:private 與 geoip:cn。CIDR 後綴代表網路前綴長度,寫錯一位就可能擴大或縮小比對範圍。
如果應用程式直接請求 IP,核心可以立即使用 ip 規則判斷;如果應用程式請求的是網域,是否為路由比對執行解析,取決於 routing.domainStrategy。AsIs 主要保留原始網域進行判斷;IPIfNonMatch 會在網域規則沒有結果時嘗試解析,並繼續進行 IP 比對;IPOnDemand 則可能在比對過程需要 IP 條件時觸發解析。
| 寫法 | 比對範圍 | 典型用途 |
|---|---|---|
127.0.0.0/8 |
本機迴路位址範圍 | 避免本機服務進入遠端代理 |
192.168.0.0/16 |
常見區域網路位址範圍 | 存取路由器、儲存裝置與內網服務 |
geoip:private |
資料檔案定義的私有位址 | 集中處理多個私有網段 |
geoip:cn |
資料檔案歸類的中國大陸位址 | 作為網域分流以外的補充條件 |
結論:網域規則負責主要分流,IP 規則負責補充
先用 full、domain 與 geosite 清楚表達業務範圍,再用 geoip:private、geoip:cn 或明確的 CIDR 處理直接存取 IP 的連線。如此可減少不必要的 DNS 解析,也更容易從日誌判斷請求為何命中某個出站。
使用 IPIfNonMatch 時也要注意解析路徑:路由判斷得到的 IP 與實際遠端連線使用的解析結果應盡量一致。若內建 DNS、系統 DNS 與遠端解析採用不同結果,同一網域可能在不同時間落入不同的位址分類。遇到分流偶爾變動的問題時,應同時檢查 dns 設定、domainStrategy 以及核心日誌中的目標位址。
規則優先順序與常見衝突
V2Ray 不會自動判斷哪條規則「更具體」。陣列位置越前,優先順序越高,因此規則整理應遵循「例外在前、範圍在後、兜底最後」。例如某個網域需要代理,但同時屬於 geosite:cn,就必須先寫該網域的代理規則,再寫 geosite 的直連規則。
- 先放必須攔截或必須單獨處理的精確規則,例如
full:網域。 - 接著放區域網路與私有位址的直連規則,避免本機裝置請求進入代理。
- 然後放業務網域群組、geosite 分類與指定網段規則。
- 最後放涵蓋範圍較大的代理或直連兜底規則。
- 修改後使用核心日誌,逐一驗證網域、IP、TCP 與 UDP 請求。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:service.example.com"
],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
上面的第一條規則是 geosite 直連範圍中的例外,因此放在最前面;第二條先保護區域網路存取;第三、第四條分別處理中國大陸網域與位址;最後一條將剩餘的 TCP、UDP 請求交給 proxy。實際使用前必須確認 outbounds 中確實存在 proxy 與 direct 兩個標籤,否則核心會因引用不存在的出站而啟動失敗。
在 v2rayN 中設定與驗證路由
v2rayN 的選單名稱可能會隨版本調整,常見入口是「設定」→「路由設定」。建立自訂規則集後,應先確認目前已選取該規則集,再儲存設定並重新啟動目前的核心。若使用完整自訂設定檔,則要檢查用戶端是否會在切換節點或更新訂閱時重新產生設定,避免手動修改遭到覆蓋。
| 檢查項目 | 具體操作 | 預期結果 |
|---|---|---|
| 本機入口 | 在「設定」→「參數設定」核對 SOCKS 10808、HTTP 10809 | 瀏覽器或測試程式連線至實際啟用的連接埠 |
| 出站標籤 | 檢查規則中的 proxy、direct 是否對應現有的 outbound tag | 核心啟動日誌未出現未知出站標籤 |
| 規則順序 | 分別測試精確網域、geosite 網域、直接 IP 與區域網路位址 | 四類請求命中預期出站 |
| UDP 請求 | 確認兜底規則包含 udp,並核對節點及入口相關設定 | DNS 或其他 UDP 流量未被遺漏 |
驗證時不要只看網頁能否開啟。應開啟核心日誌,準備至少六個目標:一個精確代理網域、一個 geosite 直連網域、一個中國大陸 IP、一個區域網路 IP、一個應被攔截的網域,以及一個未被前述規則涵蓋的網域。逐一請求後記錄命中的 outboundTag;能比對規則序號時也應一併記錄。
結論:每次只調整一組條件
先固定 domainStrategy 與出站標籤,再移動一條規則或修改一個比對項目。一次同時變更 DNS、geosite 分類與規則順序,會讓日誌結果無法對應單一原因,反而增加排查時間。
- 修改規則後儲存設定,並重新啟動目前的核心,而不是只關閉設定視窗。
- 切換節點後再次檢查日誌,確認用戶端沒有恢復預設路由。
- 訂閱更新只負責節點資料時,不要假設它會保留所有自訂欄位。
- 規則數量增加後,依用途分組記錄,避免出現兩條意義相反的寬泛規則。
常見問題與排查順序
路由問題通常表現為某個網站走錯出口、區域網路裝置無法存取、規則儲存後沒有變化,或核心直接啟動失敗。排查時應先確認設定是否確實載入,再檢查標籤與順序,最後才處理 DNS 解析與分類資料。依照這個順序,可以先排除設定未生效等基礎問題。
寫了 domain 規則,為什麼還是命中前面的 geosite?
將精確 domain 或 full 規則移到 geosite 規則之前,儲存後重新啟動核心。規則不會依精確程度自動排序,先命中的 geosite 已經結束本次比對。
存取 IP 能分流,存取網域卻沒有走 geoip?
檢查 routing.domainStrategy。使用 AsIs 時,網域請求不會為了所有 IP 規則統一執行解析;需要在網域規則未命中後再嘗試 IP 判斷時,可評估使用 IPIfNonMatch。
加入 geosite 後核心啟動報錯怎麼辦?
先刪除剛加入的分類並恢復啟動,再核對分類名稱與目前核心載入的資料檔案。分類不存在或資料檔案無法讀取時,調整規則順序無法解決錯誤。
區域網路位址為什麼被送進代理?
在寬泛代理規則之前加入 geoip:private,或明確加入 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。接著測試路由器與內網服務位址是否命中 direct。
規則看起來正確,儲存後仍然沒有變化?
確認目前啟用的是剛編輯的路由設定,然後重新啟動核心並查看產生的設定。若切換節點後規則消失,應檢查用戶端是否重新產生了 routing 區段。
一套易於維護的分流設定不需要堆積大量重複規則。先保留精確例外、私有位址、主要 geosite 或 geoip 分類,以及最終兜底,再依日誌補充確實必要的項目。新增規則時註明用途、目標出站與驗證結果,之後更新資料檔案或更換核心時,就能快速判斷哪些規則仍然必要。
- 先確認是否載入:查看核心啟動日誌與產生後的 routing 設定。
- 再檢查標籤:核對 outboundTag 的拼寫、大小寫及對應出站。
- 接著檢查順序:將精確例外放在寬泛分類之前。
- 最後檢查解析:結合 domainStrategy、DNS 設定與實際目標 IP 進行判斷。