本文適合需要在 v2rayN 新增網域例外、調整直連與代理順序的使用者。先區分網域、IP 與資料集這三種比對對象,再透過一段 routing 設定說明首條命中、DNS 補充解析與預設出站之間的關係。範例採用 V2Ray 與 Xray 常見的經典 JSON 路由結構;用戶端介面中的規則,仍須轉換為目前核心可辨識的設定。
1. 路由規則的基本結構與比對對象
系統代理會將應用程式的連線送進入站,路由則在流量進入核心後選擇出站。如果瀏覽器未使用系統代理,即使規則設定正確,也可能完全略過這套判斷。因此,排查自訂規則前,應先確認應用程式確實透過用戶端連線,而不是直接檢查網站顯示的出口 IP。
經典設定會將規則存放在 routing.rules 陣列中。每條規則的 type 通常是 field,比對條件可以是 domain、ip、port 或 network,並由 outboundTag 指定結果。標籤是設定中的參照名稱,不是核心內建的固定動作。
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:example.net"
],
"port": "443",
"network": "tcp",
"outboundTag": "proxy"
}
這條規則要求目標網域符合陣列中的任一項,且目標連接埠為 443、傳輸網路為 TCP。網域陣列內的條件是「或」,不同條件欄位之間則是「且」。這條規則不會接管同一網域的 UDP 443 連線,也不會接管 TCP 80。以下三個數字是設定用途的範例,並非速度測試結果。
2. domain、full、regexp 與一般字串的寫法
domain 首先是規則中的欄位名稱;欄位陣列中的 domain: 則是比對方式前綴,兩者不可混為一談。陣列項目只填網域或對應的運算式,不要填網址通訊協定、路徑或查詢參數。若要區分同一網站的不同 URL 路徑,一般網域路由無法做到這種細分。
| 寫法 | 比對範圍 | 比對範例 |
|---|---|---|
full:example.com | 完整網域精確比對 | 符合 example.com,不符合 www.example.com |
domain:example.com | 指定網域及其子網域 | 符合 example.com 和 a.example.com,不符合 notexample.com |
example.com | 一般字串子字串比對 | 可能符合 notexample.com,比對範圍通常比預期更廣 |
regexp:^api[0-9]+\\.example\\.com$ | 正規表示式比對 | 符合 api1.example.com,不符合 api.example.com |
表格中的正規表示式以 JSON 字串形式呈現。正規表示式本身需用 \. 表示字面上的句點,而 JSON 還要跳脫反斜線,因此設定檔中要寫成 \\.。若是在用戶端的一般文字輸入框填寫運算式,通常輸入一層反斜線即可;不要將 JSON 跳脫格式直接複製到所有介面。
{
"type": "field",
"domain": [
"full:example.com",
"domain:example.net",
"regexp:^api[0-9]+\\.example\\.com$"
],
"outboundTag": "proxy"
}
結論:網域例外優先使用 full 或 domain
只處理單一主機名稱時使用 full:;處理整個網域及其子網域時使用 domain:。只有在主機名稱有明確的變化規律時才使用正規表示式,並加上首尾錨點,避免一併納入無關網域。
3. ip、geoip 與 geosite 的差異
ip 欄位用於比對目標位址,可填入單一 IP、CIDR 網段或 geoip: 資料集參照。geosite: 則填在 domain 陣列中,代表依網域集合比對。兩類集合的成員不同,不能保證「符合 geosite 就一定符合同名 geoip」。
{
"type": "field",
"ip": [
"192.168.0.0/16",
"10.0.0.0/8",
"geoip:private"
],
"outboundTag": "direct"
}
上例先示範 CIDR 的具體寫法,再示範私有位址集合;兩者範圍可能重疊,實際設定通常保留符合需求的一種即可。IPv6 單一位址可使用 /128。不要只涵蓋 IPv4 就認定已處理所有區域網路連線;在雙堆疊網路中,也要檢查 IPv6 目標位址。
geosite:cn:參照資料檔中名為 cn 的網域集合,不等於只比對以 .cn 結尾的網域。geoip:cn:依位址資料庫判斷目標 IP 的歸屬範圍,不代表網站內容語言,也不代表訪客所在地。geoip:private:參照私有位址等供本機用途的位址集合,實際涵蓋範圍以資料檔為準。- 資料依賴:經典資料集寫法通常需要核心可讀取
geosite.dat與geoip.dat。集合名稱必須確實存在,不要自行猜測分類名稱。
同一網域可能使用不同地區的 CDN 位址;DNS 回傳值改變後,IP 規則的結果也可能隨之變動。若希望特定服務固定使用指定出站,應優先新增明確的網域例外,而非長期綁定某次查詢取得的單一 CDN 位址。
4. 生效優先順序:依序比對,第一條命中即採用,不按精確度排序
每次掃描規則時,核心會依照 rules 陣列由上而下檢查,命中後就選擇該規則指定的出站。核心不會因為後面的 full: 更精確,就自動覆蓋前面的 geosite:;也不會依網段長度重新排序。所謂「例外優先」,是設定者主動將例外規則往前移。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["full:api.example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
}
]
}
}
此處將單一網域例外放在網域集合之前。若同一連線符合第二條,第三條便不會再參與比對。不過,第一條私有 IP 規則能否在初次掃描時比對,仍取決於目標是否已是 IP,以及目前的網域策略是否觸發解析;「排在最上面」不代表一定會先完成 DNS 查詢。
- 目標為
api.example.com,且入站保留網域時,第二條可直接選擇proxy。 - 其他網域若符合
geosite:cn,第三條會選擇direct,不必等到 IP 補充比對。 - 網域階段全部未命中時,
IPIfNonMatch才會嘗試解析,並讓取得的 IP 重新參與規則比對。 - 仍未命中時,經典設定會使用
outbounds陣列中的第一個出站;它不一定名為proxy。
5. domainStrategy 如何改變 DNS 與分流結果
routing.domainStrategy 控制路由比對時是否需要將目標網域解析為 IP。它不等於系統 DNS 設定,也不等於直連出站本身的同名策略。即使名稱相似,所在的設定層級不同,作用階段也不同。
AsIs
路由階段不會主動解析網域以補上 IP;若目標原本就是 IP,IP 規則仍可比對。連線最終是否需要解析,則由後續出站等環節決定。
適用情境:規則以網域為主,且希望路由決策不額外觸發 DNS 查詢。
IPIfNonMatch
建議先使用現有目標資訊進行比對;若沒有任何規則命中,再嘗試解析網域,讓 IP 規則參與後續判斷。需避免過早命中的全量預設規則。
適用情境:像本文一樣,網域例外優先,以 IP 歸屬作為補充分流條件。
IPOnDemand
比對過程中遇到需要 IP 資訊的規則時,會視需要觸發解析。若前面的 IP 規則命中,可能會在後面的網域例外選定出站之前先行生效。
適用情境:明確要求 IP 規則盡早參與,並能掌控 DNS 結果與規則順序。
例如,第一條是 geoip:private,第二條是某網域的代理例外。若該網域解析到私有位址,IPOnDemand 可能會讓第一條先命中;若使用 IPIfNonMatch,只要第二條已能命中,就不必等待補充解析。調整策略後,不應只確認網站能否開啟,也要檢查實際命中的出站。
- DNS 結果包含多個位址時,IP 比對應依核心處理解析結果的方式判斷,不能只根據命令列顯示的第一個位址推論。
- 應用程式直接提交 IP 時,網域規則通常缺少比對依據。部分通訊協定可透過嗅探還原目標網域,但無法保證涵蓋所有連線。
- 新增「封鎖所有 UDP 53」不等於封鎖所有 DNS;加密 DNS 可能使用其他連接埠與傳輸方式。
6. 在 v2rayN 新增並驗證自訂規則
以下以 v2rayN 7.x 桌面版常見介面為例;不同小版本的按鈕位置可能有所調整,規則欄位請以目前視窗為準。介面管理的規則與完整 JSON 設定不是相同的輸入格式,不要將整段 routing 物件貼進單一「網域」輸入框。
-
確認核心
開啟「設定」→「參數設定」,查看 Core 類型相關設定及目前設定使用的核心;啟動後再核對記錄中的核心名稱。本文語法適用於 V2Ray、Xray 經典路由設定;其他格式需要轉換。
-
開啟路由設定
前往「設定」→「路由設定」,先備份目前使用的方案,再編輯準備啟用的規則集。確認編輯的就是主畫面目前選用的路由,而不是尚未啟用的副本。
-
新增例外
在規則編輯視窗選擇目標出站,並在網域欄位填入
full:api.example.com或實際需要處理的網域。先不要加入連接埠與網路限制;確認生效後再逐步縮小範圍。 -
調整順序
將例外移到可能涵蓋它的網域集合規則之前,儲存並套用該路由方案。用戶端通常會重新載入相關設定;若記錄未顯示變更,可重新啟動服務後再測試。
-
檢查連線
關閉原有測試分頁並建立新連線,查看連線記錄中的目標與出站標籤。需要更詳細的記錄時,可在「設定」→「參數設定」中暫時提高記錄層級,完成後再恢復常用層級。
路由調整通常只對新連線生效;瀏覽器連線重用與長連線可能繼續使用原本的出站。只重新整理一次,不足以證明新規則未生效。也應同時測試主網域、子網域和直接 IP 三類目標,避免只測首頁,卻忽略頁面資源實際使用了其他網域。
| 測試項目 | 觀察內容 | 未符合預期時的檢查項目 |
|---|---|---|
| 精確網域 | 完整主機名稱是否選到指定標籤 | 前置規則、目前啟用的路由方案 |
| 子網域 | full 與 domain 的涵蓋範圍差異 | 是否誤用一般字串,或遺漏子網域 |
| 直接 IP | IP 規則是否獨立生效 | CIDR 寫法、IPv4 與 IPv6 位址類型 |
| 未命中目標 | 是否進入預期的預設出站 | 第一個出站、全量預設規則、解析策略 |
7. 自訂路由常見問題
把 full 規則放在最後,為什麼仍走直連?
比對更精確不代表優先順序更高。開啟「設定」→「路由設定」,將這條規則移到可能命中的 geosite 或一般網域規則之前,儲存後建立新連線,再查看出站標籤。
設定了 geoip:cn,網域連線卻沒有依地區分流?
先檢查 routing.domainStrategy。若為 AsIs,路由不會主動解析網域供 IP 規則使用;若為 IPIfNonMatch,則檢查前面是否已有網域規則命中,或末尾是否有提早結束比對的全量規則。
新增 geosite 後核心啟動失敗,該怎麼辦?
先移除新加的項目,讓連線恢復,再查看啟動記錄。重點確認核心能否讀取資料檔,以及設定的分類是否存在。不要隨意改動集合名稱反覆試錯;可先用單條 domain: 規則驗證路由流程。
網站首頁符合規則,登入和圖片卻沒有使用相同出口?
查看這些請求實際使用的主機名稱。登入介面、靜態資源與下載服務常使用不同網域;只設定主網域的 full: 不會涵蓋它們。同一個受控網域下可改用 domain:;獨立網域則分別新增,避免直接擴大為模糊關鍵字。
切換核心後,原有規則可以直接沿用嗎?
先確認目標核心接受的設定格式、資料集與出站標籤,再逐條驗證。V2Ray 與 Xray 共用部分經典欄位,但用戶端產生設定的方式與擴充能力可能不同;成功匯入只代表設定已被接受,不代表所有連線都會依照原本的路徑出站。