本文適合已能連線至節點,並準備調整 DNS 與路由規則的使用者。範例以 Xray 核心的傳統 JSON 設定為基礎,分別說明解析器選擇、解析結果篩選與連線出口,並提供可合併的設定片段及驗證步驟。V2Fly 支援哪些欄位,請依實際核心版本確認,不能只憑客戶端名稱判斷相容性。
先釐清解析與連線出口
DNS 分流決定「向哪個解析器查詢網域」,路由分流則決定「連線從哪個出口送出」。兩者彼此相關,但不是同一個開關。指定某網域使用國內解析器,不代表該網域一定直連;選擇代理出口,也不代表應用程式先前的 DNS 查詢已經透過代理。
這個流程對應本文採用的 routing.domainStrategy: "IPIfNonMatch":先嘗試比對網域規則,未命中時才為 IP 規則解析位址。如果已命中網域規則,路由階段可能完全不會查詢內建 DNS;後續是否解析,則取決於實際出站的處理方式。因此,不能只因為「沒看到 DNS 記錄」就判定設定未生效。
- 應用程式交給核心的是網域:可直接比對網域規則,核心也有機會使用內建解析功能。
- 應用程式交給核心的是 IP:原始網域可能已遺失,單靠
geosite無法還原。 - 應用程式自行使用加密 DNS:查詢可能繞過核心的
dns設定,須另外檢查應用程式設定。 - 只開啟系統代理:通常只會讓支援代理的應用程式使用代理入口,不會接管系統的所有 DNS 流量。
servers、domains 與 expectIPs
dns.servers 是解析器清單,可填入伺服器位址,也可使用附帶條件的物件。物件中的 domains 用來優先比對網域;expectIPs 則用來檢查伺服器回傳的位址是否符合預期。前者用來選擇查詢對象,後者用來篩選結果,兩者不能互相取代。
國內網域解析器
- address
223.5.5.5- domains
geosite:cn- expectIPs
geoip:cn- skipFallback
true
優先處理國內網域,並排除在其他網域的一般備援候選清單之外。
一般備援解析器
- address
https://1.1.1.1/dns-query- 傳輸方式
- HTTPS
- domains
- 不限
- 查詢 IP 類型
- 沿用全域
UseIPv4
處理未命中專用規則,或專用解析結果未通過篩選的查詢。
skipFallback: true 的意思是「此伺服器不參與一般備援」,而不是「命中此伺服器後禁止再使用備援」。如果國內網域的回應不符合 expectIPs,範例仍可能改用其他備援解析器。混淆這兩種語意,就容易誤判查詢實際送往何處。
geosite:cn 來自網域分類資料,geoip:cn 則來自 IP 分類資料。它們不是即時地理位置服務,也不會依網頁顯示語言判斷所在地。國內服務使用境外位址、跨區 CDN,或分類資料更新不及時時,嚴格的 IP 預期可能會篩掉有效結果。
- 單一網域可使用
full:example.com精確比對。 domain:example.com可比對該網域及其子網域。- 使用
geosite:cn和geoip:cn前,請確認目前執行的核心能讀取對應的資料檔。 expectIPs是分類篩選條件,不是驗證回應真實性的證明;不能只因回傳位址屬於某個地區,就認定結果正確。
合併 DNS 與路由設定片段
以下 JSON 並非完整的節點設定。範例假設現有的 outbounds 已包含 direct 和 proxy 兩個標籤,分別代表直連出站與已確認可用的代理出站。合併時請更新現有的 dns 和 routing,不要在同一個物件中重複宣告這些鍵。
{
"dns": {
"queryStrategy": "UseIPv4",
"servers": [
{
"address": "223.5.5.5",
"domains": [
"geosite:cn"
],
"expectIPs": [
"geoip:cn"
],
"skipFallback": true
},
"https://1.1.1.1/dns-query"
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"223.5.5.5/32"
],
"port": "53",
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"1.1.1.1/32"
],
"port": "443",
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
前兩條規則會指定解析器連線的出口:連往 223.5.5.5:53 的查詢走直連,連往 1.1.1.1:443 的連線走代理。一般的 https:// 格式 DoH 會使用核心的路由機制;不要直接換成帶有 +local 的格式,兩者的連線處理路徑不同。這些 IP 與埠號規則也會比對目的地相同的其他流量,不只辨識 DNS 內容。
請勿任意調換規則順序。解析器出口規則應放在前面,避免 DoH 位址被後續的 IP 分類規則意外分流;最後一條規則明確將剩餘的 TCP、UDP 流量送往 proxy,而非依賴出站清單的預設順序。若已有區域網路、封鎖或業務規則,請逐條整合;不能整段覆蓋後,就假設原有行為仍會保留。
判斷方式:先固定解析器出口,再比較回應
先確認 1.1.1.1:443 確實命中 proxy,再觀察網域的解析結果。只更改 DNS 位址而不檢查連線出口,無法確認遠端查詢是否依預期送出。
也要確認直連出站的解析策略
國內網域命中網域規則後,連線會進入 direct。如果該出站使用 Freedom 協定並保留預設解析策略,最終連線仍可能使用系統解析,而非本文設定的內建 DNS。若要讓直連出站明確使用內建解析,請檢查現有出站並調整其 settings.domainStrategy。
{
"tag": "direct",
"protocol": "freedom",
"settings": {
"domainStrategy": "UseIPv4"
}
}
這是 outbounds 陣列中的單一物件,請修改現有的 direct,不要再新增同名出站。此處的 UseIPv4 搭配前述 DNS 查詢策略,可做為方便排查問題的 IPv4 基準;這不表示必須停用 IPv6。
- 需要雙協定堆疊時:可評估將 DNS 查詢策略與 Freedom 解析策略調整為
UseIP,並檢查本機 IPv6 連線能力及相關路由。 - 代理出站收到網域時:目標網域可能由遠端解析;本機的 DNS 結果不一定是遠端實際採用的結果。
- 節點位址是網域時:還要處理代理伺服器本身的解析問題。不要讓節點網域唯一的解析路徑依賴尚未建立的代理連線。
在客戶端驗證實際設定
v2rayN 是桌面客戶端,v2rayNG 使用 Xray 核心,v2flyNG 使用 V2Fly 核心。客戶端介面會產生執行設定,因此「編輯欄位中有這個欄位」不代表「目前的核心正在使用它」。本文不綁定特定介面版本;驗證時一律以目前的節點、執行核心與最終產生的 JSON 為準。
- 保存基準設定:備份目前可用的設定,記錄節點、核心版本、系統代理狀態,以及是否啟用虛擬網卡。一次只調整 DNS 與相關路由,避免同時更換節點和傳輸參數。
- 檢查執行設定檔:確認最終 JSON 包含兩項
dns.servers、預期的出站標籤及完整的規則順序。若設定由介面產生,請在持久化的設定入口修改,不要只編輯下次啟動時會被覆寫的暫存檔。 - 啟用診斷記錄:暫時將
log.loglevel設為debug,重新啟動核心後再次發出請求。記錄內容會因版本而異,請特別留意解析器目標、命中的出站和錯誤訊息。 - 分開測試:選一個確認屬於
geosite:cn的網域,再選一個不在該集合中的網域。關閉重複連線,必要時重新啟動應用程式,避免重用連線而掩蓋新的 DNS 行為。 - 恢復日常記錄層級:測試完成後,將記錄層級調回
warning或原設定。分享記錄前,請先清除節點位址、訂閱連結和存取網域等資訊。
如果本機有對應的核心指令,可先在設定檔所在目錄檢查語法與載入狀況。以下兩個指令分別是 Xray 和 V2Fly 常見的命令列格式,請只執行符合實際核心的一個;設定測試通過不代表上游解析器已可連線。
xray run -test -config config.json
v2ray test -c config.json
不要用 nslookup example.com 223.5.5.5 的結果來證明核心 DNS 分流已生效。此指令會直接查詢指定伺服器,適合檢查這條查詢路徑是否可用,但不會經過本文的網域分類、備援與代理出口規則。系統 DNS 測試和核心請求測試應分開記錄。
DNS 污染防護的限制與常見問題
本文所說的「DNS 污染防護」,是透過加密遠端查詢、固定出口和篩選異常位址來減少錯誤結果,並非由單一欄位提供絕對保證。DoH 只能保護查詢傳輸至解析器的過程;解析器是否可信、應用程式是否另外發出查詢,以及系統是否使用快取,仍會影響最終連線。
國內網站也開始載入很久,該先改哪裡?
先暫時移除國內伺服器的 expectIPs,其他設定保持不變後重新測試。如果延遲恢復,請檢查該網域的實際回應是否符合 geoip:cn 分類;不要直接增加更多備援伺服器來掩蓋原因。
設定遠端 DNS 後,為什麼還是看到本機查詢?
先判斷查詢是來自瀏覽器、作業系統、節點網域解析,還是核心。檢查應用程式的安全 DNS、系統代理涵蓋範圍,以及 Freedom 的 domainStrategy。核心 DNS 設定不會自動阻止其他程序向外送出查詢。
設定一儲存就無法啟動,該如何排查?
先查看第一則錯誤是否指出 JSON 語法、未知欄位或分類資料載入問題。確認核心可以讀取 geosite.dat、geoip.dat,並核對 direct、proxy 是否確實是現有的出站標籤。
DoH 一直逾時,但代理節點可以連線?
確認 1.1.1.1:443 的請求確實命中代理出站,並檢查節點至解析器的連線狀況。確認系統時間及是否有憑證錯誤;不要藉由關閉憑證驗證來規避問題。必要時可另外更換一個可驗證的 DoH 端點進行比較。
修改完成後,為什麼網頁仍連到舊位址?
結束並重新開啟應用程式、重新啟動核心,再測試新的連線。瀏覽器、作業系統、核心和遠端解析器都可能使用快取;只重新整理頁面可能會沿用現有連線,不能據此判定新規則未生效。
保留容易排查的最小設定
- 先確認兩個解析器與兩個出站都正常,再逐步加入自訂網域分類。
- 遇到分流錯誤時,先找出第一條命中的規則,而非只確認規則清單中是否有目標規則。
- 若要讓特定網域一律直連,請同時檢查 DNS 比對、路由優先順序和直連出站的解析策略。
- 若要限制 DNS 對外流量,應另外規劃系統層級的接管方式與網路策略;不能把本文的設定片段當成完整的流量控管方案。
可維護的 DNS 分流設定,應能回答三個問題:網域為何選中這個解析器、解析器連線為何經過這個出站,以及最終目標為何採用直連或代理。先透過記錄和執行設定釐清這三點,再逐步新增規則,比不斷堆疊解析器位址更容易找出問題。