適合已經能連上節點、但不確定網域解析發生在哪一側的使用者。讀完能分清設計內的直連解析與意外洩漏,會用存取日誌和 53 埠過濾定位查詢去向,並依 dns 出站標籤、路由規則、網域嗅探、分應用程式代理逐項收緊設定。
判定標準:解析請求去了哪裡
DNS 洩漏的準確定義不是「解析沒走代理」,而是「解析交給你並不打算使用的解析器,而且發生在代理隧道之外」。在 V2Ray 的運作方式裡,網域可以原樣送給遠端節點,由節點端完成查詢;也可以由客戶端先解析成 IP,再依 IP 建立連線。兩種都正常,差別在於前者不會暴露查詢對象,後者會把查詢內容與查詢來源留在本機網路。
判定只看一件事:這筆 53 埠的查詢,最終由哪個出站處理。存取日誌裡出站標籤是代理,解析就發生在節點端;標籤是 direct,解析就發生在本機。第二種不等於故障——「繞過中國大陸」模式下中國大陸網域用本機 DNS 解析,回應快、結果也準。
真正要處理的是第三類情況:網域本應交給遠端解析,卻因為嗅探關閉、分應用程式代理漏設、應用程式自帶加密 DNS 等原因,把查詢送進了本機解析器。這類洩漏不會報錯,只會安靜發生,所以要用日誌和封包擷取把它找出來。
以上是正常路徑。任何一環被繞過——應用程式不進核心、規則把查詢判給直連、核心不做嗅探——查詢就會提前落到本機解析器上,後續連線再走代理也補不回來。
四類典型場景與日誌原文
以下四條是排錯時最常看到的日誌與錯誤訊息,大致涵蓋「查詢走錯方向」的常見情況。對照自己的日誌查看,就能直接定位到是哪一層出了問題。
日誌:accepted udp:223.5.5.5:53 [socks-in -> direct]
原因與解法:223.5.5.5 屬於中國大陸的 IP,在「繞過中國大陸」類規則裡會命中直連,查詢因此留在本機。中國大陸網域走這條路是正常設計;若希望所有查詢都從節點端發出,請在 dns 段加上獨立標籤,再用路由規則把它指向代理出站。
現象:日誌裡搜不到任何 :53 記錄
原因與解法:查詢根本沒進核心——分應用程式代理把該應用程式排除了,或瀏覽器自帶安全 DNS 走了 HTTPS 位址。先核對代理名單,再關掉瀏覽器的安全 DNS,重現一次看日誌有沒有記錄。
錯誤:failed to find an available destination
原因與解法:出站位址解析不到可用結果,常見於把 DNS 查詢本身送進了一個不可用的出站。先暫時切回本機解析確認節點可用,再檢查路由規則裡 dns_inbound 標籤的指向與節點位址拼寫。
錯誤:context deadline exceeded
原因與解法:查詢在逾時時間內沒有回應,通常是 UDP 53 被上游丟棄,或查詢被送進了不通的出站。把解析位址換成 https 開頭的加密 DNS 再重現一次,就能區分是鏈路問題還是規則問題。
這四條裡,涉及直連出站的那條要先確認是不是刻意為之;涉及錯誤訊息的兩條則要檢查規則與解析位址是否可用。把「設計內直連解析」和「意外洩漏」分開看,才不會被日誌裡的 direct 標籤誤導。
檢測入口:三個可重現的步驟
檢測不依賴任何線上工具,客戶端自己的日誌加上一次 53 埠過濾,就能把解析走向看清楚。步驟在 v2rayN 與 v2rayNG 上都適用,桌面端多做一步封包擷取比對。
開啟存取日誌
v2rayN 進入「設定」→「參數設定」→「基礎設定」,把「日誌等級」調到 info 後重新啟動核心;v2rayNG 則在主畫面右上角選單裡開啟「日誌」頁面。
重現一次解析
用系統內建瀏覽器開啟一個普通網站,不要用已開啟安全 DNS 的瀏覽器,否則查詢目標會變成 HTTPS 位址,依 53 埠過濾就看不到。
過濾 53 埠
在日誌裡搜尋「:53」,逐筆查看出站標籤;桌面端同時用 Wireshark 過濾 udp.port == 53,比對實體網卡上還有沒有明文查詢。
核對代理名單
開啟「分應用程式代理」確認發起解析的應用程式在名單裡;Android 端再檢查系統「私人 DNS」的設定值,以及瀏覽器安全 DNS 是否開啟。
幾項證據要能互相印證:日誌裡查詢走代理出站、實體網卡上擷取不到明文 53 查詢、應用程式名單沒有漏設。只滿足其中一項時,先解決不滿足的那項再重測。把解析位址換成加密 DNS 後重跑一遍,如果日誌裡的出站標籤和封包擷取結果同時改變,就代表改動確實生效了。
v2rayN 端:DNS 出站與路由規則
v2rayN 的圖形選項能涵蓋大部分情境,但要把 DNS 查詢精確釘在代理出站上,得在設定檔裡給 dns 段加上標籤。較新的 Xray 核心(1.8 起)支援在 dns 段寫 tag,這個標籤會作為入站標籤參與路由比對;同時把加密解析位址放在 servers 前面,需要本機解析時也會以加密形式發出。
{
"dns": {
"tag": "dns_inbound",
"queryStrategy": "UseIPv4",
"servers": [
{ "address": "https://1.1.1.1/dns-query", "domains": ["geosite:geolocation-!cn"] },
{ "address": "223.5.5.5", "domains": ["geosite:cn"] }
]
},
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{ "type": "field", "inboundTag": ["dns_inbound"], "outboundTag": "proxy" },
{ "type": "field", "domain": ["geosite:cn"], "outboundTag": "direct" }
]
}
}
這段設定做兩件事:海外網域走加密 DNS 解析,中國大陸網域走本機解析;DNS 查詢本身帶 dns_inbound 標籤,被第一條規則送進代理出站。順序不能顛倒——dns_inbound 規則要排在網域規則前面,否則查詢會先被 geosite:cn 之類的規則攔走,標籤就白加了。
| 設定項 | 位置 | 建議值 | 作用 |
|---|---|---|---|
| 路由模式 | 「設定」→「參數設定」→「路由設定」 | 繞過中國大陸 | 中國大陸網域直連,其餘走代理 |
| 網域解析策略 | 「設定」→「參數設定」→「路由設定」 | IPIfNonMatch | 網域優先交給遠端,比對不到再依 IP 判斷 |
| 網域嗅探 | 「設定」→「參數設定」→「路由設定」 | 開啟,類型選 HTTP 與 TLS | 從握手還原網域,避免依 IP 誤判 |
| DNS 伺服器 | 「設定」→「參數設定」→「DNS 設定」 | 加密解析位址優先 | 需要本機解析時,查詢以加密形式發出 |
| 出站網域策略 | 設定檔裡 outbound 的 sockopt.domainStrategy | AsIs | 網域原樣送給節點,解析在節點端完成 |
結論:先給 DNS 一條獨立的路由
加密 DNS 只解決查詢內容被看到的問題,不解決查詢走哪個出站。正確順序是先加 dns 標籤、用路由規則把 dns_inbound 指向代理出站,再把解析位址換成加密形式;順序顛倒的話,加密查詢照樣可能從直連出站送出去。
v2rayNG Android 端:路由模式、嗅探與分應用程式代理
v2rayNG 採用 Xray 核心,連線後由系統 VpnService 接管流量,應用程式連線先進入核心再分流。Android 端的洩漏點集中在三處:分應用程式代理名單、網域嗅探開關、系統私人 DNS。以下以 v2rayNG 為準,v2flyNG 的設定項命名相近,可以對照查找。
- 路由模式:「設定」→「路由模式」,選「繞過中國大陸」時中國大陸網域走本機解析,這是設計行為;要讓所有網域都交給節點端解析,請切到「全域」。
- 網域解析策略:「設定」→「網域解析策略」,保持 AsIs,網域原樣送到節點;需要依 IP 分流時再選 IPIfNonMatch。
- 網域嗅探:在「設定」裡開啟「網域嗅探」,勾選 HTTP 與 TLS,讓核心從握手還原網域,避免直連規則依 IP 誤放行。
- 分應用程式代理:「設定」→「分應用程式代理」,確認發起解析的應用程式在名單裡;被排除的應用程式連 DNS 都不會進核心。
- 私人 DNS:Android「設定」→「網路與網際網路」→「私人 DNS」,設為「自動」或填入主機名稱時解析走 DoT,是否被接管取決於路由規則。
還有一個容易漏掉的點:部分瀏覽器和 App 自帶安全 DNS,查詢目標是解析服務商的 HTTPS 位址而不是 53 埠,在日誌裡搜「:53」根本搜不到。處理方式是把解析服務商的網域寫進代理規則,或者在瀏覽器設定裡關掉安全 DNS,讓解析回到核心的 dns 段。
結論:Android 端先查名單,再查嗅探
分應用程式代理漏設會讓整個應用程式連同它的 DNS 一起繞開核心,影響範圍比嗅探開關大得多;排查順序建議是名單、嗅探、私人 DNS,最後才是設定檔裡的 dns 段。
常見追問
關閉嗅探後路由還是依 IP 走,有什麼實際影響?
網域先在本機解析成 IP,連線依 IP 建立,直連與代理規則只能依 IP 判斷;中國大陸 CDN 網域容易被誤送進代理,解析請求也留在了本機網路。開啟嗅探能同時解決這兩個問題。
「繞過中國大陸」模式下中國大陸網域用本機 DNS,算洩漏嗎?
不算。這是設計內的直連解析,查詢對象是你自己選的本機解析器。要讓中國大陸網域也走節點端解析,請把路由模式切到「全域」,並接受由此帶來的解析延遲變化。
檢測結果裡顯示的解析器不是我填的 DNS,是怎麼回事?
先看瀏覽器是否開啟了安全 DNS,再看系統是否設了私人 DNS;這兩處都會在應用層把解析交給別的解析器,客戶端設定管不到。逐一關掉再重測。
訂閱更新一直逾時,和 DNS 有關嗎?
有關。訂閱網域的解析預設可能走直連,直連解析被污染或逾時時更新就會失敗。在訂閱設定裡勾選「透過代理更新訂閱」,讓請求和解析都從節點端走。
填了加密 DNS 位址卻沒生效?
先確認核心版本支援這種寫法,再檢查 dns 段的 tag 是否被路由規則引用,改完設定要重新啟動核心。日誌裡 DNS 查詢的出站標籤變了,才算生效。
把 DNS 當成一條普通流量來管,思路就清楚了:看它在哪個出站被處理,給它獨立的標籤和規則,再決定哪些網域保留本機解析。v2rayNG 與 v2rayN 的圖形選項涵蓋了絕大多數情境,剩下的精度交給設定檔裡的 dns 與 routing 兩段。