適合已匯入訂閱,想為特定網站或網段設定個別分流的使用者。先釐清網域條件與 IP 條件,再確認規則順序及 DNS 解析時機。看完即可設定範圍明確的例外規則,並透過記錄判斷規則為何命中或未命中。
路由比對優先順序:先命中的規則生效
V2Ray 與 Xray 的一般路由規則會依照 routing.rules 陣列由上而下檢查。只要某條規則符合條件,就會使用該規則指定的出站,不會繼續尋找「更精確」的下一條規則。因此,精確網域若排在大範圍分類之後,不會自動覆蓋分類規則;例外規則必須主動移到前面。
同一條規則中,domain 陣列裡的多個項目通常是「或」的關係,符合任一項即可。不同條件欄位通常則是「且」的關係:同時設定 domain 和 port,代表網域與目標連接埠都必須符合。將網域和 IP 填在同一條規則中,不代表符合任一條件就會生效。
以下是「僅讓指定主機的 443 連接埠走代理」的核心規則。這裡的 proxy 是出站標籤,不是內建關鍵字;完整設定中必須有同名出站。它也不是節點顯示名稱,未確認前不要直接換成訂閱中的節點名稱。
{
"type": "field",
"domain": ["full:portal.example.com"],
"port": "443",
"outboundTag": "proxy"
}
domain、full、regexp:網域寫法與比對範圍
domain 是規則中的欄位名稱,domain: 則是欄位值使用的一種比對前綴,兩者屬於不同層級。完整欄位寫法如下:"domain": ["domain:example.com"]。不要把 full 或 regexp 當成與 domain 同層的規則欄位。
| 項目寫法 | 實際意義 | 範圍提醒 |
|---|---|---|
full:example.com | 完整比對此主機名稱 | 不包含 www.example.com |
domain:example.com | 比對根網域及其子網域 | 包含 a.example.com,不包含 notexample.com |
regexp:^api[0-9]+\.example\.com$ | 使用正規表示式比對 | 此處顯示比對表示式;寫入 JSON 時,反斜線還需要再跳脫一次 |
example.com | 沒有前綴的字串會以子字串方式比對 | 比對範圍可能比預期更廣,不適合用於精確例外 |
geosite:cn | 引用網域資料庫中的分類 | 分類內容取決於目前載入的資料檔 |
要為單一網站設定例外,建議使用 full:;若要讓根網域及所有子網域走相同出口,則使用 domain:。只有主機名稱確實符合固定模式時,才使用正規表示式。網域項目不要填入 https://、路徑或查詢參數:路由判斷的是目標主機,而非瀏覽器網址列中的完整 URL。
{
"type": "field",
"domain": [
"full:portal.example.com",
"domain:static.example.net",
"regexp:^api[0-9]+\\.example\\.com$"
],
"outboundTag": "proxy"
}
這個陣列中的三個項目是替代條件。存取 api12.example.com 時可由正規表示式比對;存取 img.static.example.net 時則可由網域後綴比對。JSON 中的 \\. 經過解析後才會成為正規表示式中的 \.,少跳脫一層可能導致設定無法載入。
ip、geoip、geosite:網段與分類資料分開設定
ip 陣列用於設定目標 IP 條件,可填入單一位址、CIDR 網段及 geoip: 分類。geosite: 屬於網域條件,應填在 domain 陣列中。對調這兩種分類前綴,無法達成預期的網域與位址分流。
{
"type": "field",
"ip": [
"192.168.10.0/24",
"10.0.0.8/32",
"geoip:private"
],
"outboundTag": "direct"
}
- 單一裝置:
10.0.0.8/32只會比對這個 IPv4 位址;單一 IPv6 位址可使用/128。 - 整個網段:
192.168.10.0/24涵蓋這段 IPv4 位址,適用於明確指定的區域網路目標。 - 位址分類:
geoip:cn依賴位址資料庫,分類結果不一定與特定網站的業務歸屬一致。 - 網域分類:
geosite:cn依賴網域資料庫;資料庫未收錄的新網域,不會因為網站使用中文就自動符合。
網站可能同時使用多個內容傳遞網路,同一網域在不同網路環境下也可能解析到不同地區的 IP。網域分類與位址分類導向不同出口,不一定代表規則失效。請先確認需求是「這個網站一律走代理」,還是「這些位址範圍走直連」,再決定使用哪種條件。
domainStrategy:何時為路由解析網域
routing.domainStrategy 決定路由階段如何處理網域與 IP 規則之間的關係;它不是 DNS 伺服器位址,也不等同於建立出站連線時的位址選擇策略。以下三種值適用於 V2Ray/Xray 常見路由設定;實際行為仍應以目前執行的核心版本為準。
AsIs
建議對以網域形式送入的目標,不會為了路由比對主動解析 IP。以 IP 形式送入的目標仍可比對 IP 規則。適合先確認網域例外與規則順序,減少排查變因。
適用情境:優先使用網域規則、初次測試自訂分流
IPIfNonMatch
網域未符合現有規則時,才會嘗試解析出 IP,並用於比對後續規則。若前面已有範圍較廣的規則符合請求,就不會只因後面有 geoip 項目而必然觸發解析。
適用情境:主要流量由網域規則處理,IP 分類作為補充
IPOnDemand
比對過程中遇到需要目標 IP 的規則時,會嘗試解析網域。若 IP 規則排在前面,可能較早觸發 DNS 查詢,也可能先於後方的網域例外決定出口。
適用情境:明確需要優先比對位址條件
結論:先調整規則順序,再更改解析策略
先使用 AsIs 測試精確網域例外;確實需要 geoip 為網域請求補充判斷時,再測試 IPIfNonMatch,並一併記錄前後兩次記錄中的目標位址與出站標籤。
如果應用程式先自行解析網域,再以純 IP 將請求交給代理,核心未必還能取得原始網域。部分協定可透過流量嗅探補充網域資訊,但並非所有連線都適用;啟用後也要分清楚「僅供路由判斷」與「改寫目標」的設定效果。不要把啟用嗅探視為網域規則必定生效的保證。
完整路由片段:精確例外排在分類前
以下只展示可嵌入完整設定的 routing 區段,並非可獨立啟動的設定檔。範例假設已設定 direct 與 proxy 兩個出站標籤。順序依序為區域網路位址、精確網域例外、網域分類、IP 分類,最後才是 TCP/UDP 備援規則。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["full:portal.example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
這個範例有個容易忽略的細節:最後的 network 規則會符合一般 TCP/UDP 請求。在 IPIfNonMatch 設定下,若網域請求已符合這條規則,就不會因前面的 IP 分類未命中而進入「完全沒有符合項目後才解析」的流程。因此,此處的 geoip:cn 主要處理已帶有目標 IP 的請求,不能將它解讀為對所有剩餘網域執行位址分類。
- 若要保留這條明確的備援規則:接受網域請求主要依網域規則分流,IP 請求主要依 IP 規則分流。
- 若希望網域未符合時才進行 IP 分類:可移除過早符合所有連線的規則,並確認預設出站;一般預設行為會使用第一個出站。
- 若希望遇到 IP 條件時就解析:可評估使用
IPOnDemand,但必須重新測試前置 IP 規則與精確網域例外的先後關係。
應在完整設定中明確確認預設出站,不能只根據用戶端介面上「目前選取的節點」推斷。v2rayN 會產生執行設定,手動修改暫存產生檔案可能在切換節點或重新啟動後被覆蓋。長期使用的規則應儲存在用戶端的路由設定中。
v2rayN 自訂路由:逐條規則測試
v2rayN 是桌面用戶端,實際流量由所選核心處理。以下步驟以包含「設定」→「路由設定」選項的桌面介面為準;不同版本的按鈕位置與欄位翻譯可能有所不同。編輯前請記下目前使用的路由設定名稱,並保留原有規則,避免將訂閱節點問題與路由問題混為一談。
-
開啟路由設定
前往「設定」→「路由設定」,記下目前使用的路由設定。先匯出或複製現有規則,再新增例外。
-
填入網域條件
在規則編輯視窗的網域條件欄位填入
full:portal.example.com。圖形介面的欄位通常只接受規則項目,不要貼上整份 routing JSON。 -
選擇目標出站
依照需求選擇代理或直連。若編輯的是核心 JSON,請確認
outboundTag與outbounds中的標籤完全一致。 -
上移並啟用
將例外移到網域分類與廣泛備援規則之前,儲存後在主介面的路由選擇處啟用這份設定;不要只儲存卻仍使用原本的設定。
-
重新建立測試連線
關閉原本的測試頁面與舊連線,再送出新請求。查看核心記錄中的目標主機、目標連接埠及出站標籤,每次只修改一項條件。
測試時可先將實際測試主機設為 full: 例外,確認命中後再擴大為 domain: 或分類。瀏覽器重複使用連線時,舊連線可能繼續走原本的出口;單純重新整理頁面不一定會建立新連線。使用命令列工具測試時,也請明確指定用戶端介面顯示的本機代理連接埠,不要假設每台電腦使用相同連接埠。
路由規則未生效:依現象找出原因
網域寫對了,為什麼還是走直連?
先將精確規則移到分類規則之前,再確認目前啟用的是修改後的路由設定。若記錄中只有 IP,請進一步檢查應用程式是否已預先解析,以及核心能否取得網域資訊。
為什麼 geosite 設定儲存後,核心無法啟動?
查看記錄是否顯示找不到網域資料檔或無法載入分類。確認 geosite.dat 的資源路徑與分類名稱,先用一條 full 網域規則測試基本設定,再恢復分類項目。
網站主頁走代理,圖片卻沒有?
在瀏覽器的網路面板查看圖片請求實際使用的主機名稱。圖片可能來自另一個根網域,主站的 domain 項目不會涵蓋它;確認用途後,為資源網域另行新增規則。
443 連接埠已符合規則,為什麼下載還是失敗?
連接埠條件只決定分流,不保證目標可連線。先確認記錄中的出站標籤是否正確,再分別檢查節點連線、DNS 解析結果與 UDP 支援;443 連接埠可能承載 TCP 或 UDP 流量。
重新啟動用戶端後,自訂規則怎麼不見了?
確認修改是否只寫入暫時產生的核心設定。請返回「設定」→「路由設定」儲存規則並啟用對應設定;若使用獨立的自訂設定,則需維護實際載入的來源檔案。
最後確認三件事:連線是否進入核心、核心看到的是網域還是 IP、第一條命中的規則指向哪個出站。先釐清這三點,通常比同時更換 DNS、切換核心及重新建立訂閱更容易找出原因。其他欄位說明請參閱協定與核心參考;不熟悉的術語可查閱術語手冊。