本文適合已匯入節點、準備調整分流的桌面版使用者。先分清網域規則與 IP 規則,再將具體例外排在通用規則前方,最後透過記錄檔確認出口。範例採用 Xray/V2Fly 的路由欄位語意;v2rayN 圖形介面會產生設定,不能將完整的核心 JSON 直接貼進單一網域輸入欄。
一、先確認路由規則的比對順序
系統代理決定應用程式是否將要求交給 v2rayN;路由規則則決定核心收到要求後選擇哪個出口。兩者是不同的設定。若應用程式略過系統代理直接連網,修改網域規則不會影響它;使用 TUN 接管流量時,也要確認流量確實進入核心。
Xray/V2Fly 的一般路由規則會依陣列順序逐一檢查,第一條符合條件的規則就會決定出口。並非「越精確就越優先」,也不會自動讓 full: 排在 domain: 前面。若第一條規則已將 domain:example.com 送往代理,後面針對 full:files.example.com 設定的直連例外就不會生效。
| 排列位置 | 規則用途 | 範例出口 |
|---|---|---|
| 最前面 | 明確指定的網域例外或封鎖目標 | direct / block |
| 中間 | 業務網域、區域網路 IP、地區集合 | proxy / direct |
| 最後 | 其餘 TCP、UDP 要求的預設處理 | proxy 或視需求直連 |
同一條規則中,domain 陣列裡的多個項目通常採「或」的關係;ip 陣列裡的多個項目也通常如此。不同條件欄位之間則採「且」的關係。例如在同一條規則中設定網域、目標連接埠與網路類型,代表三個條件都符合才會命中,而非符合任一條件即可。
二、domain、full、regexp 的寫法
網域規則填寫主機名稱,不要包含通訊協定、路徑或查詢參數。連線至 https://api.example.com:443/v1/status 時,網域條件應填 api.example.com。連接埠 443 是另一項條件;路徑 /v1/status 不在這類路由規則的比對範圍內。
| 寫法 | 比對方式 | 常見誤解 |
|---|---|---|
domain:example.com | 比對根網域及其子網域 | 會比對 api.example.com,不會比對 notexample.com |
full:api.example.com | 只比對這個完整主機名稱 | 不會比對 v2.api.example.com |
regexp:^api[0-9]+\.example\.com$ | 使用正規表示式比對 | 句點必須跳脫;錨點可限制比對整個網域 |
example | 未加類型前綴時,會以一般字串包含關係比對 | 比後綴網域比對範圍更廣,可能發生誤判 |
domain: 不是萬用字元語法。若要涵蓋整個網域及其子網域,使用 domain:example.com 即可,不要寫成 domain:*.example.com。若只想讓單一主機使用特定出口,請選 full:;只有在需要比對有規律的編號主機時,才考慮使用正規表示式。
{
"type": "field",
"domain": [
"full:files.example.com",
"regexp:^api[0-9]+\\.example\\.com$"
],
"outboundTag": "direct"
}
上方內容是核心 JSON 片段,因此反斜線要寫成 \\。在 v2rayN 一般的網域文字欄位中,通常只需輸入一個反斜線:regexp:^api[0-9]+\.example\.com$。直接將 JSON 的跳脫寫法貼進一般文字欄位,可能會改變正規表示式的意義。請先確認輸入位置是 JSON 編輯器還是規則欄位。
重點:先用 full,再擴大比對範圍
新增業務例外時,先用一個 full: 主機確認出口。確定比對正確後,再改為 domain:;只有確實需要模式比對時,才使用 regexp:,如此更容易找出分流錯誤。
三、ip、CIDR 與 geoip 的適用範圍
IP 條件填在 ip 欄位,常見寫法包括單一位址、CIDR 網段或 geoip: 集合。這裡比對的是目標 IP。不要誤把來源裝置的區域網路位址填成目標規則;依來源分流屬於其他條件,不能用目標 IP 欄位取代。
{
"type": "field",
"ip": [
"192.168.50.0/24",
"203.0.113.10/32",
"2001:db8::10/128",
"geoip:private"
],
"outboundTag": "direct"
}
192.168.50.0/24 涵蓋這個 IPv4 子網路。203.0.113.10 與 2001:db8::10 是文件範例位址,無法用來連線至節點。實際設定時,請改成需要分流的目標網段。區域網路直連規則建議先明確指定網段,再視需求補上 geoip:private。
geoip:cn 會依據載入的 IP 資料集合判斷;geoip:private 則用於該資料集合定義的私有或本機位址範圍。集合內容會隨資料檔變動,不宜將特定集合規則視為永久準確的地區判斷。尤其是 CDN、跨區服務與新分配的網段,可能需要另外新增例外。
- 目標是網域時,IP 規則能否參與比對,取決於核心是否取得目標位址,以及路由解析策略。
- 目標已是 IP 時,不必為了符合 IP 規則再進行網域解析。
- 同一項服務可能同時使用 IPv4 與 IPv6;只新增 IPv4 規則,無法涵蓋該服務的 IPv6 連線。
- 將所有私有目標設為直連前,請先確認所在網路的存取需求;直連不代表略過本機防火牆。
四、geosite 資料集合與 DNS 策略
geosite:cn 是網域集合,geoip:cn 是 IP 集合,兩者不能互換。前者不代表「解析結果一定位於中國大陸」,後者也不代表「這個網域屬於中國大陸的服務」。以網域集合分類服務,再用 IP 集合補充分類位址,才能減少判斷混淆。
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
}
在傳統 Xray/V2Fly 設定中引用這些集合時,核心必須能找到對應的資料檔,常見檔名為 geosite.dat 和 geoip.dat。集合名稱以實際載入的資料內容為準。不能只憑文章中的名稱,就假設本機一定有某個分類;資料缺漏或標籤不存在,都可能導致設定載入失敗。
| domainStrategy | 路由解析行為 | 排查重點 |
|---|---|---|
AsIs | 路由階段不會主動解析網域來比對 IP 規則 | 網域要求未符合 IP 集合,不一定是規則語法錯誤 |
IPIfNonMatch | 網域階段沒有規則命中時,嘗試解析後再次比對 | 過早命中的通用規則可能會阻止這次補充比對 |
IPOnDemand | 比對過程需要目標 IP 時,嘗試解析網域 | 檢查 DNS 是否可用,以及解析結果是否符合預期 |
特別要留意 IPIfNonMatch 與預設規則的關係:如果第一輪比對網域時,最後的 network: tcp,udp 已命中代理出口,就不會因為前面的 geoip:cn 未命中而自動重試。若要依據 IP 集合分流,必須一併規劃解析策略與預設出口,不能只新增一條 IP 規則。
五、代理、直連與封鎖的設定範例
以下片段會先封鎖明確指定的主機,再允許檔案主機直連,接著讓同一網域下的其他要求走代理。區域網路目標設為直連,其餘 TCP、UDP 要求則走代理。為了讓網域目標也能參與 IP 條件判斷,範例選用 IPOnDemand;使用前請確認核心 DNS 設定可正常運作。
{
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"domain": ["full:telemetry.example.com"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["full:files.example.com"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": ["192.168.50.0/24", "geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
這只是 routing 設定片段,並非完整的節點設定。proxy、direct、block 必須對應實際 outbounds 中的 tag。標籤只是名稱,本身不會建立出口:直連通常對應 freedom 出站,封鎖通常對應 blackhole 出站,代理出口則使用既有節點。
具體例外優先
建議將單一主機與明確網段排在通用分類前面,較容易確認設定影響範圍。新增例外時,只要檢查前面是否已有提早命中的規則。
適用情境:已有日常分流設定,只想補充少數業務例外
代理作為預設出口
未被直連或封鎖規則涵蓋的要求都交由代理處理。涵蓋範圍明確,但代理節點必須處理更多要求,應事先排除內網目標。
適用情境:多數外部服務需要代理,且能維護直連清單
直連作為預設出口
只有明確列出的服務會交由代理處理,其餘要求一律直連。新服務與遺漏的網域不會自動走代理,因此需要持續維護清單。
適用情境:代理目標少且固定,其餘連線以直連為主
沒有任何路由規則命中時,Xray/V2Fly 通常會使用出站清單中的第一個出口。不要將此預設行為視為「一定直連」。v2rayN 產生設定時可能會調整出站順序,因此請檢查實際設定,或依照目前的解析策略加入明確的預設規則。
六、在 v2rayN 中新增並驗證規則
操作前請先備份現有路由設定。以下以具有「設定」→「路由設定」選項的 v2rayN 桌面介面為例;跨平台版與傳統介面的按鈕位置可能不同。請編輯一套路由方案,再從主介面的路由選擇入口啟用。只儲存規則卻未選用該方案,是常見的「設定未生效」原因。
-
備份方案
前往「設定」→「路由設定」,先匯出或記下目前方案與規則順序。保留原有方案,測試時另建一套,避免一次改動影響所有日常分流。
-
開啟規則
在「路由設定」中選擇要修改的方案,開啟該方案的規則編輯視窗。新增規則時先選擇出口,再於網域欄位填入
full:files.example.com,不要貼上完整 JSON。 -
調整順序
將明確指定主機的例外移到
domain:example.com等廣泛規則之前。網域欄位與 IP 欄位請分別建立規則;多個項目依介面提示的分隔方式填寫,不要自行假設逗號一定會被拆開。 -
啟用方案
儲存後回到主介面的路由選擇入口,選取剛編輯的方案。確認核心已重新載入;若記錄檔出現設定錯誤,請先還原備份,不要繼續疊加新規則。
-
檢查出口
將範例網域換成自己有權測試的實際主機,建立新連線後查看核心記錄檔。若已開啟存取記錄,請核對目標與出站標籤;不要只憑網頁能開啟,就判定連線已直連。
路由通常會在建立連線時決定。瀏覽器已有的長連線可能繼續使用原出口,因此儲存規則後,請關閉測試網站的連線或重新啟動測試應用程式,再重新連線。不要只重新整理舊頁面一次,就判定規則失效。如果記錄檔中沒有這次要求,請先檢查系統代理、應用程式代理或 TUN 接管狀態,而非立即重寫正規表示式。
- 先確認語法:檢查前綴拼寫、正規表示式跳脫、集合名稱與出口標籤,並確認核心能正常啟動。
- 再確認目標:確認實際要求使用的主機名稱。網站主網域、登入網域與下載網域可能各不相同。
- 最後確認順序:從第一條開始往下找第一個可能命中的規則,尤其要檢查通用網域集合與預設規則。
七、自訂路由常見問題
設定了 full,為什麼還是走代理?
先到「設定」→「路由設定」確認目前啟用的方案,再將這條精確規則移到通用網域規則前面。關閉舊連線後重新測試,同時確認要求是否實際使用了其他下載或登入主機名稱。
geosite:cn 和 geoip:cn 都要設定嗎?
不必一律同時新增。若需要兩種判斷,請分成兩條規則:一條填入網域集合,另一條填入 IP 集合。接著確認路由解析策略,否則網域要求可能無法參與 IP 集合比對。
可以只讓某個 HTTPS 路徑直連嗎?
本文介紹的網域規則無法依加密要求中的 URL 路徑分流。可以依完整主機名稱分流,或在確有需要時為規則增加目標連接埠 443;但連接埠條件仍無法區分同一主機下的不同路徑。
為什麼加入 geosite 後核心無法啟動?
先查看啟動記錄是否指出資料檔缺漏或集合不存在。使用用戶端提供的路由資料更新功能維護資料,再確認目前核心使用的資料路徑。可暫時改用一條 full: 規則驗證設定,切勿任意替換集合名稱。
更新訂閱會改變自訂規則嗎?
節點訂閱與路由方案屬於不同設定,但切換節點、核心或路由預設方案後,產生的設定可能有所變動。更新後請檢查目前的路由方案與出口標籤;不要將節點訂閱連結貼進網域規則欄位。
排查分流問題時,請依序檢查「要求進入核心 → 目標資訊可用 → 首條命中規則 → 對應出口存在」。網域寫法用來描述目標,解析策略負責補充 IP 資訊,規則順序則決定優先級。每次只修改一個地方,並保留可還原的方案,比反覆切換整套預設設定更容易找出問題。