本文適合已能匯入節點、啟用系統代理,並希望在 v2rayN 或 Xray 設定中精準控制連線出口的使用者。重點涵蓋網域與 IP 規則語法、規則陣列的掃描順序、同一規則內的組合邏輯、domainStrategy 的影響,以及如何從日誌與產生的設定定位分流問題。
路由處理鏈與首個命中原則
V2Ray 與 Xray 的路由模組不負責建立節點連線,而是在請求進入核心後,根據目標網域、目標 IP、連接埠、網路類型與入站標籤等資訊選擇出站。最終選擇結果通常由 outboundTag 指向已定義的出站,例如 proxy、direct 或 block。
規則存放在 routing.rules 陣列中,核心會從第一條開始依序往下檢查。某條規則符合所有條件後,掃描會立即停止,後續規則不再參與本次請求。因此,「越具體的規則越前面、越寬泛的規則越後面」是穩定設定的基礎。
同一條規則中的不同欄位通常是「且」的關係。例如一條規則同時寫入 domain 和 port,目標必須同時符合網域與連接埠條件。單一欄位中的多個項目通常是「或」的關係,例如 domain 陣列列出三個網域,符合其中任一個即可滿足該欄位。
| 位置關係 | 判斷方式 | 實際結果 |
|---|---|---|
| 不同規則之間 | 由上而下掃描 | 第一條完整命中的規則生效 |
| 同一規則的不同欄位 | 必須同時符合 | domain 與 port 都符合才會生效 |
| 同一欄位的多個值 | 符合任一項即可 | 陣列中的項目按「或」處理 |
| 沒有規則命中 | 使用預設出站 | 通常會套用設定中的第一個可用出站 |
domain:精確網域、子網域與關鍵字比對
domain 欄位用來處理目標主機名稱。常用前綴包括 full:、domain:、keyword:、regexp: 與 geosite:。前綴會決定比對範圍,選擇不當可能造成規則涵蓋過廣,或完全無法命中。
full:example.com 只會比對完整主機名稱 example.com,不會將 www.example.com 視為同一個目標。domain:example.com 則會比對該網域及其子網域,適合讓同一網站體系使用相同出口。
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:static.example.net",
"keyword:media",
"regexp:^cdn-[0-9]+\\.example\\.org$"
],
"outboundTag": "proxy"
}
- full: 適合登入介面、更新介面等明確主機名稱,比對範圍最小。
- domain: 適合主網域及所有下級子網域,是日常規則中較常用的形式。
- keyword: 只要目標網域包含指定字串就可能命中,過短的關鍵字容易誤傷無關網域。
- regexp: 適合結構固定但編號會變動的網域;運算式越複雜,維護成本越高。
- geosite: 引用預先整理的網域分類集合,適合依服務類別或區域批次分流。
精確介面規則
- 欄位
- domain
- 寫法
- full:api.example.com
- 範圍
- 單一完整主機名稱
- 出站
- proxy
用於涵蓋範圍明確、不能連帶子網域的連線。
整站直連規則
- 欄位
- domain
- 寫法
- domain:example.cn
- 範圍
- 主網域與子網域
- 出站
- direct
適合目標網站的所有服務都使用相同出口的情境。
如果精確網域需要作為分類規則的例外,應將精確規則放在前面。例如先將 full:download.example.com 指向直連,再將 domain:example.com 指向代理。順序顛倒後,下載網域會先被整站規則接收。
ip 與 geoip:位址區段比對與網域解析條件
ip 欄位可以填寫單一位址、CIDR 位址區段及 geoip: 分類。單一 IPv4 位址可以寫成 198.51.100.20,網段則可寫成 198.51.100.0/24。IPv6 位址區段同樣使用 CIDR 表示,例如 2001:db8:1200::/48。
geoip:private 常用於比對區域網路、回送位址與其他非公網位址。將這類位址放在直連規則前方,可以避免本地路由器管理頁面、區域網路檔案服務或本機介面被送往遠端代理。
{
"type": "field",
"ip": [
"geoip:private",
"192.0.2.0/24",
"2001:db8:1200::/48"
],
"outboundTag": "direct"
}
IP 規則能否處理最初以網域形式發起的請求,還取決於 domainStrategy。目標只有網域而沒有目標 IP 時,核心必須決定是否解析該網域,再將解析結果交給 ip 規則比對。
| domainStrategy | 解析行為 | 適用判斷 |
|---|---|---|
| AsIs | 網域按原樣參與路由,不主動為 IP 規則解析 | 主要依靠 domain 與 geosite 分流 |
| IPIfNonMatch | 網域規則未命中後,再解析 IP 並繼續檢查 | 網域規則優先,IP 分類作為補充 |
| IPOnDemand | 遇到需要目標 IP 的規則時按需解析 | 前方已有重要 IP 規則的設定 |
結論:先確定解析策略,再評估 IP 規則
目標以網域進入且設定使用 AsIs 時,後置 geoip 規則未命中不代表位址資料庫失效。先檢查 domainStrategy,再查看日誌中的目標形式,可以避免反覆修改 CIDR 與規則順序。
geosite 與 geoip 的界線
geosite 是網域集合,geoip 是 IP 位址集合。兩者處理的是不同階段的資訊分類問題,不能互相取代。網站採用動態位址、共用雲端服務或頻繁調整解析結果時,網域集合通常比固定 IP 網段更適合表達服務歸屬。
一條 geosite:cn 規則會依據目標網域是否存在於對應分類中進行判斷;一條 geoip:cn 規則則依據目標 IP 是否落在對應位址集合中進行判斷。網域與伺服器所在地並不一定一致,因此兩條規則可能對同一連線得出不同的分類結果。
geosite 網域集合
- 輸入
- 目標網域
- 範例
- geosite:cn
- 依賴
- 網域資料檔
- 常見用途
- 依服務歸屬分流
目標位址變動時,網域規則仍能維持穩定的表達方式。
geoip 位址集合
- 輸入
- 目標 IP
- 範例
- geoip:private
- 依賴
- 位址資料檔
- 常見用途
- 區域網路與區域位址分流
網域請求是否進入位址判斷由 domainStrategy 控制。
資料檔需要與核心版本及設定能力相符。出現「failed to load geosite」或無法識別分類名稱時,應先確認資料檔位於核心實際讀取的目錄,再確認分類名稱存在。單純調整規則順序無法修復缺少的資料檔。
outboundTag 與完整規則組合
outboundTag 的值必須與 outbounds 陣列中某個出站的 tag 完全一致,連大小寫差異也會被視為不同名稱。規則寫成 "outboundTag": "direct" 時,設定中必須存在標籤為 direct 的出站。
典型順序可以分成四層:私有位址直連、精確例外、分類分流、兜底處理。阻斷規則若涉及特定網域或連接埠,應放在可能涵蓋它的寬泛代理規則之前。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"domainMatcher": "hybrid",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["full:updates.example.com"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
}
]
}
}
- 第一條處理區域網路與本機位址,避免內部服務進入代理鏈路。
- 第二條定義明確例外,讓指定的更新網域始終採用直連。
- 第三條依網域集合處理已分類網站,不必等待 IP 分類。
- 第四條在網域規則未涵蓋時,以解析後的位址集合補充判斷。
- 未命中的請求會繼續使用設定的預設路徑,實際出口由完整出站結構決定。
結論:先固定出站標籤,再擴充路由條件
先用三個清楚的標籤建立 proxy、direct、block 出站,再逐條增加規則。標籤穩定後,日誌中的路由結果更容易對應到實際連線,不必同時排查條件與出站定義。
如果設定使用負載平衡器,規則可能透過 balancerTag 指向平衡器,而不是直接指定單一出站。一般自訂分流優先使用 outboundTag,只有確實設定選擇器與平衡器時才引入 balancerTag,避免增加不必要的排查層級。
v2rayN 中的設定路徑與驗證步驟
在 v2rayN 7.x 中,可以先進入「設定」→「路由設定」查看目前的路由設定與預設規則。不同小版本的按鈕位置可能有所調整,但驗證目標相同:確認目前啟用的路由設定、規則排列順序與最終產生的核心設定一致。
修改後不要只看瀏覽器能否開啟網頁。瀏覽器快取、DNS 快取以及既有連線重複使用都可能掩蓋結果。應重新啟動核心,使用新的目標連線,並將日誌層級暫時調整為 info 或 debug,再觀察路由紀錄。
- 在「設定」→「路由設定」確認目前選取的規則集,記錄預期命中的規則位置。
- 檢查規則中的
outboundTag,並與產生設定中的outbounds[].tag逐字比對。 - 在「設定」→「參數設定」確認本機監聽與日誌相關選項,常見 SOCKS 連接埠為 10808,HTTP 連接埠為 10809。
- 儲存設定並重新啟動核心,關閉原有瀏覽器連線或改用新的測試網域。
- 查看日誌中的目標網域、目標位址與出站標籤,判斷請求在哪一條規則停止掃描。
- 一次只移動或修改一條規則,重新測試後再處理下一處,避免多個變更互相干擾。
檢查清單
1. 目標是網域還是 IP
2. domainStrategy 是否觸發解析
3. 精確規則是否位於分類規則之前
4. outboundTag 是否存在且大小寫一致
5. geosite 與 geoip 資料是否成功載入
6. 測試連線是否為修改後的新連線
規則未生效的常見排查問答
路由問題通常不只是單一語法錯誤,而是目標形式、解析策略、排序與出站標籤共同作用的結果。先確認日誌中實際出現的目標,再對照規則條件,比直接擴大比對範圍更可靠。
寫了 geoip:cn,網域仍然走代理?
先檢查 domainStrategy。使用 AsIs 時,網域請求不會僅為後置 IP 規則而主動解析。可根據設定目標改為 IPIfNonMatch,重新建立連線後查看日誌。
為什麼精確網域規則沒有覆蓋 geosite?
檢查精確規則是否排在 geosite 規則前面,並確認使用的是 full:主機名稱。如果前面的寬泛規則已經命中,後面的精確規則就不會繼續執行。
同一規則同時寫入 domain 和 ip 會怎樣?
兩類條件必須同時符合。若目標網域符合 domain,但解析位址不在 ip 集合中,整條規則仍不會命中。需要表達「網域或 IP 任一命中」時,應拆成兩條規則。
outboundTag 拼寫正確,連線仍然失敗?
繼續檢查對應出站是否能獨立建立連線,以及標籤大小寫、節點參數與傳輸設定是否有效。路由命中只完成出口選擇,不代表該出站一定能成功建立連線。
修改規則後結果沒有變化?
儲存後重新啟動核心,關閉既有長連線,並清除測試應用程式的連線重複使用狀態。接著使用未造訪過的測試主機名稱發起新請求,再從最新日誌確認出站標籤。
最終設定應讓規則目的清楚易讀:一條規則處理一個明確意圖,標籤名稱反映出口用途,例外規則緊鄰其涵蓋對象。規則數量增加後,清楚的排序與最小條件比堆疊關鍵字更容易長期維護。