本文適合已能正常使用 v2rayN、v2rayNG 或 v2flyNG,並希望進一步控制哪些請求直連、代理或攔截的使用者。重點說明 domain、ip、geosite 的比對範圍、由上而下的優先順序,以及多條件組合方式,並提供可直接核對結構的 Xray 路由範例。
先了解路由規則處理的對象
V2Ray 與 Xray 的路由模組不負責建立節點連線,而是處理連線進入核心後應交給哪個出站。常見的出站標籤為 proxy、direct 與 block,分別代表代理、直連與攔截。標籤名稱不是協定關鍵字,而是設定中已定義的 outboundTag;若客戶端產生的標籤不同,規則也必須使用客戶端實際產生的名稱。
一次請求可能同時包含網域名稱、目的連接埠、來源入口與解析後的 IP。規則陣列會依序檢查,通常由第一條完整符合的規則決定出站。因此,「更具體的規則放前面、涵蓋範圍更大的規則放後面」是最重要的排序原則。若將涵蓋範圍很大的 geosite:cn 或 geoip:cn 放在前面,後面的單一網域代理規則可能永遠沒有機會生效。
同一欄位中的多個值是「符合任一項即可」,不同欄位之間則是「必須同時符合」。例如一條規則同時設定 domain 與 port,表示網域條件和連接埠條件都成立才會命中;domain 陣列中列出三個網域時,符合其中任一個即可。這項差異經常讓規則看似正確,實際上卻沒有涵蓋預期的請求。
| 比對對象 | 典型寫法 | 適用情境 | 關鍵限制 |
|---|---|---|---|
| 網域名稱 | domain:example.com |
網站、API 與下載網域分流 | 應用程式必須將網域名稱提供給核心,或允許核心進行解析 |
| IP | 192.0.2.0/24 |
固定網段、區域網路與解析結果分流 | 網域請求是否轉為 IP 比對,取決於 domainStrategy |
| geosite | geosite:category-ads-all |
依照維護好的網域分類進行批次比對 | 取決於客戶端目前使用的地理資料檔案與分類標籤 |
| geoip | geoip:private |
私有位址或國家、地區的 IP 網段 | 只比對目的 IP,不等同於 geosite 網域分類 |
domain 的五種常用寫法
domain: 是最適合日常維護的網域寫法。domain:example.com 會比對 example.com 及其子網域,例如 api.example.com,但不會將 notexample.com 視為相同的網域後綴。若希望涵蓋某個網站及其所有服務子網域,優先使用這種寫法。
full: 只進行完整網域名稱比對。full:api.example.com 可以命中該主機名稱,但不會命中 www.example.com 或 v2.api.example.com。適合將某個 API 單獨交給代理,同一主網域下的其他服務則繼續遵循通用規則。
不帶前綴的純字串屬於子字串比對。例如 example 可能命中網域名稱中任何包含該文字的位置,涵蓋範圍通常比預期更大。regexp: 支援正規表示式,彈性最高,但規則數量多時不易除錯,也更容易因邊界撰寫不嚴謹而誤比對。若能用 domain: 或 full: 表達,就沒有必要一開始便使用正規表示式。
domain 後綴比對
推薦同時涵蓋主網域與所有下層子網域,語意清楚,適合大多數網站規則。
適合:整站代理、整站直連
full 完整比對
只處理一個確定的主機名稱,不延伸到同一主網域下的其他服務。
適合:單一 API、單一下載網域
regexp 正規表示式比對
可以描述複雜的命名規律,但必須自行處理句點轉義以及開頭與結尾的邊界。
適合:大量具規律性的子網域
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:static.example.net",
"regexp:^img-[0-9]+\\.example\\.org$"
],
"outboundTag": "proxy"
}
上例中的三個 domain 項目是「或」的關係。請求只要命中其中一個,就會繼續確認該規則的其他欄位;由於範例沒有額外欄位,因此可直接進入 proxy 出站。正規表示式中的句點必須轉義,而 JSON 字串本身還要保留反斜線,因此會在設定文字中看到 \\.。
ip、CIDR 與 domainStrategy 的連動
IP 規則可以寫入單一位址,也可以寫入 CIDR 網段。IPv4 單一位址可寫成 192.0.2.10,網段可寫成 192.0.2.0/24;IPv6 則可寫成 2001:db8::/32。CIDR 後面的數字代表網路前綴長度,/24 涵蓋 256 個 IPv4 位址,不能將它理解為連接埠或位址數量。
geoip:private 常用於讓私有位址直連,可涵蓋典型的區域網路位址範圍。實際設定還應保留對迴送位址與本機服務的處理,避免存取路由器管理頁面、NAS 或執行於 127.0.0.1 的程式時被送往遠端代理。v2rayN 常見的本機 SOCKS 監聽連接埠為 10808,HTTP 連接埠可能由同一個混合入口或相鄰連接埠提供,實際值應以「設定」→「參數設定」中的本機監聽設定為準。
- AsIs:優先依照請求攜帶的網域名稱進行比對,不會為了嘗試 IP 規則而主動解析網域。
- IPIfNonMatch:先檢查網域規則;網域規則沒有結果時,再解析目的網域並嘗試 IP 規則。
- IPOnDemand:檢查到可能需要目的 IP 的規則時即可觸發解析,適合明確依賴 IP 分流的設定,但也會更早引入 DNS 結果。
- 直接 IP 請求:應用程式本身連線至 IP 時,不需要將網域轉換為位址,IP 與 geoip 規則可以直接參與比對。
{
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:private",
"127.0.0.0/8",
"192.0.2.0/24"
],
"outboundTag": "direct"
}
]
}
結論:網域例外優先於 IP 大分類
如果某個網域必須使用代理,而它可能解析至會被直連規則涵蓋的位址範圍,應將該網域的代理規則放在對應的 IP 直連規則之前,並透過日誌確認請求最初攜帶的是網域還是 IP。
geosite 分類怎麼使用
geosite 是依網域集合整理的資料分類,不是即時查詢服務。geosite:cn 代表資料檔案中歸入相應分類的網域,geosite:category-ads-all 通常用於廣告網域集合。分類內容會隨客戶端附帶的資料版本變動,因此 geosite 適合負責大範圍的基礎分流;自訂的關鍵網域例外仍應單獨寫在前面。
geosite 與 geoip 不能互相替代。某個網域屬於某個 geosite 分類,不代表它目前解析出的 IP 一定屬於同名的 geoip 分類;使用內容傳遞網路時,同一網域也可能在不同網路環境中取得不同位址。先用 geosite 處理網域語意,再用 geoip 為未命中的連線提供後備處理,通常比只查看 IP 更容易維護。
攔截分類尤其要注意順序。假設某個業務 API 被收錄在廣告分類中,但該 API 又是頁面正常載入所必需,通用攔截規則就會連同它一起擋下。解決方式不是刪除所有廣告分類,而是在攔截規則之前加入一條 full: 或 domain: 例外,並將其指向 direct 或 proxy。
[
{
"type": "field",
"domain": [
"full:required-api.example.com"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
}
]
比對優先順序與規則編輯步驟
規則優先順序不是由 domain、ip 或 geosite 的類型自動決定,主要取決於規則在陣列中的位置。核心會從第一條開始檢查,命中後便不再讓後續規則覆寫結果。因此,單一網域例外應排在分類規則前,分類規則應排在最終後備規則前,攔截規則也不能無條件壓在業務例外之上。
v2rayN 7.x 的介面文字可能隨小版本調整,但檢查順序可以維持一致:先確認目前使用的核心,再開啟路由設定,最後核對啟用中的路由方案與規則順序。修改後應重新啟動核心或重新載入設定,不能只儲存視窗內容卻繼續使用舊的執行設定。
確認核心
開啟「設定」→「參數設定」→「Core 類型」,確認目前設定使用 Xray 或 v2fly 對應的核心;協定與路由欄位必須受到所選核心支援。
開啟路由設定
進入「設定」→「路由設定」,選擇目前啟用的路由設定。若介面中有多個方案,先確認主介面實際選取的方案名稱。
新增例外
先新增必須使用代理或必須直連的
full:、domain:規則,再新增 geosite、geoip 等涵蓋範圍較大的分類規則。核對出站
檢查規則目標是代理、直連還是攔截。編輯原始設定時,還要確認
outboundTag與現有出站標籤逐字一致。重新載入並驗證
儲存後重新啟動核心,分別測試一個命中例外的網域、一個命中分類的網域,以及一個區域網路位址,並查看核心日誌中的實際路由結果。
結論:依涵蓋範圍由小到大排序
完整網域名稱、網域後綴、geosite 分類、geoip 網段與最終後備規則依序展開,可以減少大範圍規則過早截走請求的問題;真正的業務例外始終要放在所屬大分類之前。
直連、代理與攔截三向規則範例
以下是一組用於理解結構的完整路由片段。它會先讓指定的 API 走代理,再攔截廣告分類,接著讓區域網路與指定網域直連,最後讓未被前述規則處理的連線走代理。使用前需要確認設定中已存在名為 proxy、direct、block 的三個出站。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:api.example.com",
"domain:services.example.net"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:category-ads-all"
],
"outboundTag": "block"
},
{
"type": "field",
"domain": [
"domain:printer.example.lan",
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"127.0.0.0/8"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
最後一條規則只限定 network,涵蓋 TCP 與 UDP,因此負責後備處理。它必須位於陣列末尾;如果放在第一條,幾乎所有常見連線都會立即進入代理,後面的直連與攔截規則便不會被檢查。若只希望代理 TCP,不要將 UDP 一併寫入後備規則,否則 DNS 或即時通訊流量也可能改變出站。
連接埠條件同樣可以與網域組合。例如 domain 指定 domain:example.com,port 指定 443,只有存取該網域的 443 連接埠時才會命中。存取同一網域的 80 連接埠則會繼續檢查後續規則。連接埠範圍可依核心支援的格式書寫,但日常設定應盡量限制在明確的業務連接埠,避免涵蓋難以解釋的寬廣範圍。
- 測試代理例外:存取明確寫入第一條規則的網域,確認日誌顯示
proxy。 - 測試攔截規則:選擇確定屬於目前 geosite 分類的網域,確認連線已送入
block。 - 測試區域網路直連:存取路由器或區域網路服務位址,確認命中
geoip:private或明確的 CIDR。 - 測試最終後備規則:選擇不屬於任何前置分類的目標,確認最後一條規則負責決定出站。
規則未生效時逐項排查
排查的核心是確認「核心實際收到什麼目標」以及「哪一條規則先命中」。瀏覽器以網域存取網站時,核心可能收到網域名稱,也可能只看到由上游應用程式解析後的 IP;透明入口、系統代理與應用程式內建代理所產生的資訊並不完全相同。不要只根據瀏覽器網址列判斷核心一定取得了網域名稱。
其次要檢查客戶端是否重新產生並載入設定。v2rayN 修改路由方案後,如果目前選取的不是剛編輯的方案,儲存內容就不會影響實際流量。v2rayNG 或 v2flyNG 使用訂閱設定時,也要區分訂閱更新與本機路由修改,避免更新訂閱後覆蓋先前的調整。
明明單獨寫了網域,為什麼還是直連?
將該網域規則移到 geosite:cn 與 geoip:cn 之前,並確認它的 outboundTag 指向代理。接著重新啟動核心,透過日誌檢查是否先命中了位置更前的直連規則。
一加入 geosite 標籤就啟動失敗?
查看核心錯誤日誌中的具體標籤名稱,確認目前的資料檔案包含該分類。先使用常見分類進行最小化測試,不要同時加入多個來源不明的標籤;標籤不存在時,應改用明確的 domain: 規則。
網域規則能命中,IP 規則卻不命中?
檢查 domainStrategy。需要在網域規則未命中後繼續解析並嘗試 IP 規則時,可使用 IPIfNonMatch;修改後也要同時確認 DNS 是否能回傳預期位址。
區域網路管理頁面被送進代理了?
在最終代理後備規則之前加入 geoip:private 與所需區域網路 CIDR 的直連規則。若存取時使用自訂的區域網路網域名稱,再補充對應的 full: 或 domain: 直連項目。
儲存規則後結果完全沒有變化?
確認主介面啟用的是剛編輯的路由方案,然後重新啟動核心。接著檢查「設定」→「參數設定」→「Core 類型」,避免將只適用於另一個核心或另一組資料集的設定,誤當成目前的執行設定。
維護規則時,建議一次只調整一個目標:先處理明確網域的出站,再擴展至 geosite 分類,最後處理 IP 與 geoip 後備規則。每次修改都保留一個代理、一個直連與一個攔截測試目標。即使訂閱、核心或地理資料更新,也能快速定位變化發生在哪一層。