本文適合已能透過節點連線,並準備調整分流規則的 v2rayN 使用者。內容以 Xray 核心的路由欄位為準,說明網域與 IP 的填寫位置、直連/代理/封鎖規則的排序範例,以及如何透過設定、記錄與單次請求確認規則是否生效。
1. 先確認路由入口與實際使用的核心
v2rayN 是用來設定與管理的用戶端,實際比對連線的是正在執行的核心。本文的 routing.rules、domainStrategy 與 outboundTag 均依照 Xray 設定語意說明。若使用不同的設定格式,別只因選單名稱相似,就直接貼上同一份 JSON。
在桌面版先開啟「設定」→「路由設定」,選取要修改的路由設定,再進入規則清單編輯。不同版本的編輯入口可能在雙擊項目或右鍵選單中;請確認目前頁面有網域、IP、連接埠及出站等欄位。儲存後,還要在主畫面的「路由」選單選取並啟用這份設定,不能只新增而未切換。
- 記下目前設定:記錄目前的路由名稱、使用中的節點與核心類型,並保留一份可正常運作的原始設定。
- 複製設定:在副本中調整規則,避免直接覆寫平常使用的設定。
- 確認出站:核對直連、代理與封鎖各自對應的實際標籤;下文以
direct、proxy、block為例。 - 套用變更:儲存並啟用路由,留意核心記錄是否出現啟動失敗或設定解析錯誤。
2. 比對順序:首個符合條件的規則決定出站
一般欄位的路由規則會由上而下依序檢查,遇到第一條符合條件的規則,就採用該規則指定的出站。並沒有「精確網域會自動優先於網域集合」這種機制:即使下方有 full:,只要上方的寬泛規則已符合,下方就不會再有重新選擇的機會。
同一欄位中的多個值通常是「或」的關係,不同條件欄位之間則是「且」。例如網域清單有兩個項目,符合其中一個即可;若同一條規則也填了連接埠 443,就必須同時符合網域與目標連接埠條件。在同一條規則中填入 domain 和 ip,也不代表「網域或 IP 任一符合即可」。
這些是協定連接埠與位址範圍,不是測速結果。路由中的 port 指的是目標連接埠,不是本機代理的監聽連接埠。瀏覽器連到本機代理後造訪 HTTPS 網站時,規則通常要判斷遠端的 443,而不是瀏覽器連接本機代理所用的連接埠。
結論:例外規則要放在寬泛集合之前
若要讓特定網域單獨走代理,請將該網域的精確代理規則移到可能涵蓋它的直連集合之前,再測試新連線;只修改前綴卻不調整位置,無法解決規則已被上方項目攔截的問題。
3. domain、full、regexp、geosite 的寫法
這些前綴用於網域欄位。填寫時不包含 https://、路徑、查詢參數或連接埠。瀏覽器網址 https://api.example.com/account 對應的網域是 api.example.com;路由網域規則不會依網頁路徑分流。
| 寫法 | 比對方式 | 適用範圍 |
|---|---|---|
domain:example.com | 比對 example.com 及其子網域 | 適合整個網站;不會比對 notexample.com |
full:api.example.com | 只比對這個完整網域 | 不會涵蓋其他子網域 |
regexp:^api[0-9]+\.example\.com$ | 使用正規表示式比對 api1、api20 等網域 | 留意起始與結尾錨點、跳脫字元及核心支援的正規表示式語法 |
geosite:cn | 引用網域資料檔中的 cn 集合 | 集合內容取決於實際載入的資料檔 |
example.com | 未加前綴時,會以一般字串包含比對 | 比網域後綴比對涵蓋範圍更廣,不適合當作精確比對 |
domain: 適合讓某項服務及其子網域使用相同出站;full: 適合為單一介面設定例外。未加前綴的字串可能連 example.com.other.test 這類網域也比對到,因此一般設定建議優先使用邊界明確的前綴。
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:example.net",
"regexp:^api[0-9]+\\.example\\.org$"
],
"outboundTag": "proxy"
}
這裡的三個網域條件是「或」的關係。程式碼採用 JSON 格式,因此正規表示式中的一個反斜線必須寫成兩個;若直接在 v2rayN 的網域文字框輸入規則,通常寫成 regexp:^api[0-9]+\.example\.org$ 即可,不需要額外進行 JSON 字串跳脫。正規表示式語法以核心支援範圍為準,不能直接照搬瀏覽器支援的所有語法特性。
- geosite 是網域集合:
geosite:cn不是即時判斷「伺服器位於中國大陸」,也不等於所有以.cn結尾的網域。 - 集合名稱取決於資料檔:網路範例中的分類不一定存在於本機資料中。若出現找不到清單的錯誤,請核對資料來源與實際的分類名稱。
- 更新資料會影響比對範圍:即使規則文字不變,更新網域資料後,比對結果也可能改變。排查異常時,也請記錄資料更新時間。
4. ip 欄位、CIDR 與 geoip 的差異
ip 是規則欄位名稱,不需要加在位址前面。圖形介面的 IP 欄位可填入單一位址、CIDR 網段或 geoip: 集合。例如填寫 192.168.0.0/16,而不是 ip:192.168.0.0/16。IPv6 位址也應填在 IP 欄位中。
{
"type": "field",
"ip": [
"10.0.0.0/8",
"172.16.0.0/12",
"192.168.0.0/16",
"fc00::/7"
],
"outboundTag": "direct"
}
這段規則涵蓋常見的私有位址範圍,但並未列出所有本機、鏈路本地及保留位址。若使用 geoip:private,請確認本機 IP 資料檔有提供這個集合,並了解其涵蓋範圍。存取區域網路服務時,也要確認請求確實進入代理核心;若連線被系統代理略過,就不會留下這條路由的比對記錄。
| IP 項目 | 代表意義 | 排查重點 |
|---|---|---|
192.168.1.10 | 單一 IPv4 位址 | 裝置位址變更後,需要調整規則 |
192.168.0.0/16 | 比對該 IPv4 網段 | 網段範圍越大,受影響的目標越多 |
geoip:cn | 依資料檔中的 IP 集合比對 | 不是判斷網域歸屬或服務營運者 |
geoip:private | 引用 private 位址集合 | 確認實際使用的資料檔包含這個集合 |
同一個網站可能使用多個 CDN 位址,DNS 回傳結果也可能隨網路而改變。以單次解析取得的單一 IP 為整個網站設定分流,通常不如網域規則穩定。只有在應用程式直接存取 IP、目標是固定的內網裝置或明確網段時,才建議優先使用 IP 項目。
5. 網域解析策略會決定何時比對 IP 規則
當請求帶有網域時,核心是否先解析出 IP,再用 IP 項目參與路由判斷,取決於 routing.domainStrategy 等設定。這與「最後由哪台 DNS 解析連線」以及「是否啟用流量嗅探」是不同層面的問題,不能只開啟一個選項就以為全部都已處理。
| 策略值 | 路由階段的行為 | 使用時注意事項 |
|---|---|---|
AsIs | 不會為了路由比對而主動將網域解析成 IP | 原本以 IP 為目標的請求仍可比對 IP 規則 |
IPIfNonMatch | 網域未符合規則時,嘗試解析後再比對一次 | 寬泛的網域兜底規則會讓請求提早結束比對 |
IPOnDemand | 比對過程遇到需要判斷 IP 的條件時才進行解析 | 前面的 IP 規則可能先於後面的網域規則符合 |
例如將「所有 TCP、UDP 流量都走代理」放在清單末尾時,採用 IPIfNonMatch 的情況下,網域請求即使沒有符合明確的網域項目,也可能先符合這條網路兜底規則;一旦已有規則符合,就不能期待系統接著自動解析,再交由 geoip:cn 處理。這也是「設定了中國大陸 IP 直連,卻看起來沒作用」的常見原因。
- 以網域規則為主:先列出明確的網域例外與集合,避免不必要的解析參與判斷。
- 依賴 IP 分類:確認目前的解析策略、DNS 是否可用,以及前面是否已有規則符合。
- 應用程式只提供 IP:網域規則可能缺少比對依據;能否透過嗅探補上網域,取決於協定與設定,無法保證涵蓋所有連線。
6. 直連、代理與封鎖規則排列範例
常見的排列方式是「明確例外在前、寬泛集合在後、最後才放兜底規則」。但封鎖規則與例外規則哪個優先,必須依實際需求決定:若某個網域必須封鎖,就把封鎖規則放在可能放行它的規則上方;若要放行封鎖集合中的某個網站,就把精確的放行規則移到該集合之前。
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"domain": ["full:blocked.example.org"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["full:api.example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": ["10.0.0.0/8", "192.168.0.0/16"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
範例中的網域僅用來說明語法,不是可用節點或實際測試服務。設定中必須已定義對應的出站標籤:direct 對應直連出站,block 對應封鎖出站,proxy 對應實際的代理出站。標籤只是引用名稱,單純填入 proxy 字串並不會自動建立節點。
- 明確封鎖:先處理必須拒絕的特定目標。
- 網域例外:為特定介面或網站指定出站,避免被後面的集合規則涵蓋。
- 私有 IP:處理以 IP 存取的內網目標;此範例使用 AsIs,不會主動解析網域來比對這一行。
- 集合直連:依實際的 geosite 資料比對其餘網域。
- 最後代理:讓尚未符合規則的 TCP、UDP 流量走代理。
若沒有任何規則符合,Xray 通常會使用設定中的第一個出站。不要把這項隱含行為當成「預設一定走代理」:用戶端產生的設定可能有不同的出站順序。明確設定兜底規則較容易理解,但也要一併考量上一節提到的解析策略影響。
7. 規則未生效時的驗證步驟與常見問題
先區分三種狀況:請求未進入核心、進入核心後符合錯誤規則,或已選到正確出站但連線失敗。第一種請檢查系統代理與應用程式設定;第二種請檢查規則順序與比對欄位;第三種則檢查節點、DNS 與目標連線狀態。路由設定正確,不代表代理節點一定可用。
- 一次只改一條:選一個實際使用的網域,新增一條
full:規則,並放在可能涵蓋它的規則之前。 - 建立新連線:儲存並啟用路由後,關閉原有頁面或應用程式連線,再重新發出請求。既有的長連線不會因為編輯規則而自動重新選路。
- 查看記錄:在 v2rayN 的記錄區核對目標、錯誤與出站標籤。必要時可暫時提高記錄等級;一般存取記錄不一定會標示符合的規則行號。
- 確認產生的設定:確認目前核心實際載入的設定包含新項目,且標籤拼法與 outbounds 一致。不要長期直接修改用戶端會重新產生的暫存設定。
- 還原設定:確認原因後,移除暫時測試規則並還原記錄等級,避免留下不必要的存取細節。
設定了 domain:example.com,為什麼介面還是走直連?
先檢查上方是否已有直連規則符合,再確認介面的實際網域是否屬於 example.com。可暫時將該介面的 full: 代理規則移到相關直連規則之前,儲存後重新建立連線;同時確認目前啟用的路由就是剛才編輯的設定。
儲存 geosite:cn 後核心啟動失敗,問題出在哪裡?
查看核心記錄中的具體錯誤。若提示資料檔或清單不存在,請檢查實際使用的 geosite 資料檔與集合名稱;若是 JSON 解析錯誤,則檢查逗號、引號與正規表示式跳脫。先移除新增項目以恢復連線,再逐項修正。
網域和 IP 都填了,為什麼符合的連線反而變少?
同一條規則中的不同條件欄位必須同時符合。若原本的需求是「網域符合,或 IP 屬於某個網段」,就拆成兩條規則並指定相同的出站;不要把兩種條件填在同一列,當成可擇一符合的選項。
改成代理後網頁還是打不開,是路由沒有生效嗎?
先查看存取記錄是否已選擇代理出站。若已選擇,接著檢查目前節點的連線錯誤、網域解析與目標服務狀態;若記錄中沒有這次請求,請確認應用程式是否遵循系統代理。不要只憑網頁能否開啟,推斷規則是否符合。
保留排查記錄時,只需記下規則順序、目標類型、出站標籤與錯誤訊息。分享截圖或設定前,請遮蔽訂閱網址、節點憑證及不必要的瀏覽網域。能明確重現一次比對結果,比一次新增大量規則更容易找出問題。