本文適合已能透過節點連線,並準備調整分流設定的使用者。先釐清網域規則與 IP 規則的差異,再以路由設定建立「明確例外優先、中國大陸直連、其餘走代理」的基礎架構,最後搭配 DNS、用戶端產生的設定檔及連線記錄,找出分流錯誤。範例採用 V2Fly 與 Xray 常見的 JSON 路由結構,並非可直接取代整份用戶端設定的檔案。
1. 先確認連線是否進入核心
路由規則只會處理已進入核心的連線。v2rayN 是桌面用戶端;v2rayNG 是使用 Xray 核心的 Android 用戶端;v2flyNG 則使用 V2Fly 核心。圖形介面負責管理設定,實際比對由目前執行的核心處理。VMess、VLESS 是代理協定,切換協定不會自動修正規則順序錯誤。
系統代理通常只會影響遵循系統代理設定的應用程式;若應用程式自行直接連線,核心記錄中就不會出現該連線。Android VPN 模式也可能設定特定應用程式略過 VPN。排查時,第一步不是增加 geosite 分類,而是確認目標應用程式的連線確實進入預期的入口。
10808 僅是本文採用的測試值,不代表各版本的預設設定。請先確認用戶端目前的入口設定,包括監聽位址、連接埠,以及是否啟用 SOCKS。連接埠指的是本機入口,443 通常則是遠端網站使用的連接埠,兩者不可混淆。DNS 也可能透過加密連線傳輸,因此不能把所有 DNS 查詢都視為 UDP 53。
2. domain、ip 與資料集各自比對什麼
domain 和 ip 是路由規則欄位;geosite: 和 geoip: 則是在相應欄位中引用資料集的寫法。前者不是即時查詢網域所屬國家,後者也不代表判斷網站業務的歸屬。比對依據是隨用戶端或核心部署的資料檔,結果會受資料來源及更新日期影響。
| 規則寫法 | 比對對象 | 適用範圍 |
|---|---|---|
full:example.com | 完整網域 | 只比對該網域,不包含子網域 |
domain:example.com | 網域及子網域 | 包含 example.com 與 www.example.com |
geosite:cn | 資料集中的網域分類 | 不保證涵蓋所有中國大陸的服務網域 |
192.168.0.0/16 | IPv4 位址範圍 | 必須有可供比對的目標 IP |
geoip:cn | 資料集中的位址範圍 | 無法據此確定使用者的實際位置 |
網域範圍明確時,優先使用 full: 或 domain:。不加前綴的一般字串通常會以子字串方式比對,容易連名稱相似但無關的網域也一併命中。分類名稱必須存在於實際安裝的資料檔中;從其他地方複製分類名稱,不代表本機資料檔一定有提供。
判斷原則:特定服務用網域,位址範圍用 IP
需要指定某個網站使用特定出口時,先設定明確的網域規則;需要存取本機網段時,再設定位址範圍規則。不要用 CDN 的單一解析位址代替整個服務網域。
3. 規則依序比對,不會自動優先採用較精確的規則
常見的 field 規則會由上往下檢查,第一條符合條件的規則便會決定出口。核心不會因為後面的規則更精確,就自動取代前面的寬泛規則。因此,手動設定的例外應放在分類規則之前,分類規則則應放在預設處理之前。
- 先設定明確例外:例如某個測試網域必須走代理,即使它也符合直連分類。
- 接著設定本機與分類規則:例如私有位址、中國大陸網域及中國大陸位址範圍。
- 最後設定預設出口:沒有規則符合時,使用設定中指定的預設路徑。
同一條規則中,domain 陣列裡的多個項目是「符合任一項即可」;但在同一條規則中加入不同條件欄位,通常表示所有條件都必須符合。例如 domain 加上 port,代表網域與連接埠都必須符合,而不是網域或連接埠符合其中一項即可。若要分別依據網域分類和位址分類直連,應拆成兩條規則。
4. 中國大陸直連、其他連線走代理的路由範例
以下僅示範 routing 物件。假設現有設定中已建立標籤為 direct 的直連出口,以及標籤為 proxy 的代理出口,並將 proxy 放在 outbounds 陣列第一個項目,作為未命中規則時的預設出口。標籤是用來引用的,不能只因介面顯示「直連」,就假設內部標籤也叫 direct。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["full:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
}
]
}
}
example.com 是保留的示範網域,用於說明例外規則的優先順序,並非建議採用的服務網域。此設定表示:指定網域固定走代理;可識別的私有目標位址直連;符合中國大陸網域或位址分類時直連;其餘請求則使用第一個代理出口。這只是其中一種策略,並非所有網路環境都適用。
- 資料檔:需要可正常使用且包含相應分類的 geosite、geoip 資料檔。若讀取失敗,應先排除啟動錯誤。
- 本機存取:
geoip:private是資料集中的特殊位址分類;允許此類流量直連前,請先確認符合自己的本機網路隔離需求。 - 預設出口:若用戶端產生的設定中,第一個出口不是 proxy,請透過用戶端的預設出口設定調整。不要直接照抄範例後,就假定其餘連線一定會走代理。
- 匯入格式:路由編輯器可能只接受 rules 陣列;完整的自訂設定則還需要入口、出口等其他內容。請先確認匯入格式。
5. domainStrategy 與 DNS 的關係
AsIs 不會為路由額外解析網域;若入口提供的是網域,IP 規則通常無法單靠它完成比對。IPIfNonMatch 會在網域未符合規則時嘗試解析,再利用 IP 進行比對。IPOnDemand 則可能在比對過程遇到需要 IP 的規則時觸發解析。解析時機不同,也會影響前面的 IP 規則能否參與判斷。
| 策略 | 路由解析時機 | 設定注意事項 |
|---|---|---|
AsIs | 不為路由額外解析 | 主要依靠網域規則或已有的目標 IP |
IPIfNonMatch | 網域未符合規則後才嘗試解析 | 前面的寬泛網域規則可能讓 IP 規則失去比對機會 |
IPOnDemand | 比對需要 IP 的條件時 | 留意前面的 IP 規則及解析結果所造成的影響 |
在上述範例中,只有未符合網域規則的請求,才有機會透過解析結果符合 geoip:cn。如果在 rules 最後加入一條涵蓋所有網域的代理規則,網域階段就已成功符合,IPIfNonMatch 不會再因為「尚未符合規則」而進行 IP 回退。若要保留這條回退路徑,應使用預設出口作為兜底,不要隨手新增一條全網域匹配規則。
路由解析策略與最終出口如何解析目標,是兩項不同的設定。即使路由採用 AsIs,直連出口仍可能需要解析網域。DNS 回傳不同地區的 CDN 位址、只回傳 IPv4,或同時回傳 IPv6,都可能改變位址分類結果。應分別記錄網域、解析結果及出口標籤,不要只看網頁是否能開啟。
操作方式:先保留網域規則,再測試 IP 回退
先用明確的網域規則確認出口標籤正確,再移除臨時規則測試 IP 回退。每次只變更一項條件,才能分辨問題來自網域分類缺漏、DNS 結果變動,或規則順序錯誤。
6. 以固定測試流程找出規則衝突
在 v2rayN 中,先進入「設定」→「路由設定」,確認目前啟用的規則集。不同版本的選單名稱可能不同,請以實際介面為準。v2rayNG 與 v2flyNG 則應分別檢查各自的路由設定及目前執行的設定;不要直接套用其他用戶端的選項名稱。跨核心複製設定時,也要確認欄位與資料檔格式相容。
- 記錄目前設定:記下核心名稱、路由模式、規則順序及本機監聽連接埠。先確認代理節點本身能正常連線。
- 確認入口:桌面端可使用以下指令,明確透過本機 SOCKS 入口連線,並讓代理端解析網域。連接埠請改成實際設定值。
- 查看出口:在用戶端提供的連線記錄或存取記錄中,搜尋測試網域、目標 IP 及出口標籤。記錄格式會因核心版本而異。
- 單獨測試規則:暫時將測試網域的 full 規則移到第一條,分別指定 direct 和 proxy。若出口隨之改變,表示路由入口與標籤大致正常。
- 恢復分類規則:移除臨時規則,分別測試一個中國大陸服務網域、另一個網域及一個本機位址,確認分類與預設行為。
curl --socks5-hostname 127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
這裡的 10 秒是連線階段的逾時時間,20 秒則是整個指令的時間上限,並非效能測試結果。--socks5-hostname 與先在本機解析再傳送 IP 的測試路徑不同,適合用來驗證網域規則。HTTP 請求成功只表示這條路徑可用,不能據此推論 UDP、所有應用程式或 TUN 接管也已正確設定。
7. geosite、geoip 分流常見問題
加入 geosite:cn 後,為什麼某個中國大陸網站仍走代理?
先確認連線實際使用的網域;網頁可能另外載入其他資源網域。接著確認分類資料是否包含該網域,以及目前模式是否啟用了這組規則。可先將該網域設為 full 規則並移到最上方測試;確認要長期直連後,再改用範圍合適的 domain 規則。
geoip:cn 為什麼一直沒有命中?
先確認入口提供的是網域還是 IP。若使用 AsIs 且入口只有網域,IP 條件就缺少比對依據;若使用 IPIfNonMatch,則檢查前面是否已有網域規則或全匹配規則提前結束比對。之後再確認實際解析出的位址是否屬於對應的位址集。
更新訂閱後,自訂分流設定也會跟著變嗎?
訂閱通常只會更新節點清單,路由規則與地理資料多半由其他功能管理,但實際行為仍取決於用戶端及訂閱格式。更新後請檢查目前節點、啟用中的路由集與產生的設定;若要保留手動規則,請先匯出備份,不要只保存訂閱網址。
啟用流量嗅探,就能讓所有 IP 連線依網域分流嗎?
不能這麼假設。嗅探只能從受支援且可識別的流量資訊中擷取網域,效果取決於協定與核心設定。優先讓應用程式透過支援傳遞網域的代理入口連線;若確實需要嗅探,再確認目前版本是否支援目標範圍及「僅供路由使用」等選項。
穩定的分流設定不在於規則數量,而在於每條規則都有明確範圍,且能透過記錄說明比對結果。先維持少量例外、分類規則與預設出口,再依實際發生的分流錯誤逐項修正,比一次匯入大量重疊規則更容易追查。想了解用戶端與核心的分工,可接著參閱協定參考與概念速查。