打個比方:你把信裝進了保險箱送出去,但寄之前先大聲問了一句「張三家住哪」,整條街都聽見了。DNS 洩露就是這個意思:你的流量已經走了代理或 VPN 隧道,但「域名解析」這一步沒進隧道,而是直接問了本地電信業者的 DNS (網際網路的電話簿:域名換地址) 伺服器。結果就是:網站內容他們看不見,但你開啟了哪些域名、什麼時候開啟的,電信業者和你所在的網路一清二楚。對機場和 VLESS 使用者來說,這是最常見也最容易漏掉的一種洩露。連線圖示一切正常,速度也正常,你不專門去測根本發現不了。
好訊息是它完全可以修好,而且大多數情況下只是客戶端裡的一兩個設定。
| 洩露的是什麼 | |
|---|---|
| 你開啟了哪些域名 | ✓ 會洩露 |
| 頁面內容 | ✗ |
| 你的聊天記錄 | ✗ |
| 你的真實 IP | ✗ |
DNS 洩露到底洩露了什麼
瀏覽器開啟一個網站之前,要先問一句「這個域名對應哪個 IP」。這句話就叫 DNS 查詢,預設發給你所在網路分配的伺服器,也就是電信業者、公司或者酒店的機器。這句問話本身通常不加密,內容就是域名本身。還是剛才那個比方,你在街上喊出了地址。
如果這個查詢沒有進隧道,那麼:
- 電信業者能記下你解析過的所有域名,等於給你列了一份瀏覽清單;
- 你所在網路的管理員(公司、學校、酒店)也能看到同一份清單;
- 網站那邊看到的是代理伺服器的 IP,可你的解析請求來自真實網路,兩邊一對就能把你對上號。
內容本身有 HTTPS 擋著,還是加密的。洩露的是「你去了哪裡」,不是「你看了什麼」。
| 洩露的是什麼 | 是否洩露 |
|---|---|
| 你開啟過哪些域名 | 洩露 |
| 訪問時間 | 洩露 |
| 頁面內容 | 不洩露 |
地址換了,網站清單沒換。
為什麼開了機場或節點還會洩露
先看根子上:原因幾乎都出在「哪些流量走代理」這個判斷上。常見的有五種。
- 分流規則把 DNS 放行了。 很多規則集預設「中國大陸域名直連」。可為了判斷一個域名是不是中國大陸的,客戶端得先用本地 DNS 查一次,就這一查,你就漏了。
- 系統 DNS 沒接管過來。 在「系統代理」模式下,客戶端只管得住瀏覽器的 HTTP/SOCKS 流量,系統自己發出的 DNS 查詢照樣直連。只有 TUN 模式(虛擬網路卡)才接得住全部流量。
- IPv6 走了另一條路。 你的隧道只處理 IPv4,可你的網路支援 IPv6,於是系統優先拿 IPv6 直接解析、直接連。這就不只是 DNS 的事了,整條連線都繞開了隧道。
- 瀏覽器自己的 DoH。 Chrome、Firefox 和 Edge 可以把 DNS 查詢加密後發給指定服務商(DNS over HTTPS)。這樣電信業者看不到,但查詢仍然帶著你的真實 IP 發出去,服務商知道你是誰。
- 客戶端崩潰或重連的那幾秒。 隧道一斷,系統立刻退回預設 DNS,中間那幾秒你是裸奔的。這就得靠 Kill Switch (隧道斷了,網也斷) 一類的功能兜底。
| 為什麼隧道開著還洩露 | 原因 |
|---|---|
| 系統解析器被手動指定 | 手動設定 |
| 安卓的「私人 DNS」開著 | 系統設定 |
| IPv6 解析器在隧道外 | 雙棧 |
| 分流規則把瀏覽器排除了 | 分流 |
| 客戶端沒有自帶解析 | 客戶端 |
DNS 洩露怎麼檢測:三種方法
方法一:線上檢測站。 用瀏覽器開啟 dnsleaktest.com 或 ipleak.net 這類頁面,點「擴充套件測試」。頁面會讓你的瀏覽器解析幾十個隨機域名,然後列出是哪些 DNS 伺服器來查的。如果列表裡出現了你所在電信業者的伺服器(名字裡常帶電信業者或城市名),那就是漏了;只出現代理節點所在國家的伺服器,才算正常。
方法二:本站工具。 先開啟我的 IP 是什麼,確認顯示的是節點 IP 而不是本地 IP;再開啟 IPv6 洩露檢測,如果檢測到本地 IPv6 地址,說明 IPv6 繞過了隧道,DNS 多半也跟著繞過了;最後跑一次 WebRTC 洩露檢測,瀏覽器可能透過 WebRTC 直接暴露真實 IP,這與 DNS 無關,但同樣要堵。
方法三:命令列。 在終端執行 nslookup example.com(Windows/macOS 都可以),第一行會顯示回答查詢的伺服器地址。如果顯示的是 192.168.x.x 或者電信業者網段,說明你的查詢還走本地;如果是代理客戶端的虛擬地址(比如 fake-ip 段的 198.18.x.x)或者節點側的地址,說明已經接管住了。
| 檢測結果 | 含義 |
|---|---|
| 只有隧道的解析器 | 乾淨 |
| 出現電信業者的解析器 | 在洩露 |
| 兩者都有 | 部分洩露 |
DNS 洩露怎麼解決:按客戶端來
Clash / Mihomo / Clash Verge。 在配置裡開啟 DNS 模組,把 enhanced-mode 設為 fake-ip,nameserver 填寫會經代理發出的加密 DNS(DoH 或 DoT 地址)。同時開啟 TUN 模式,讓系統層的查詢也被接管。規則集裡如果有「中國大陸直連」,確認它用的是 nameserver-policy 裡指定的直連解析器,只解析真正的中國大陸域名。
Xray / V2Ray 核心(v2rayN、v2rayNG、NekoBox)。 在 DNS 設定裡指定遠端解析器,並在路由規則裡把 DNS 出站指向代理(dns-out 走 proxy)。如果用的是 VLESS + Reality 節點,協議本身不處理 DNS,全靠這裡的配置;開啟「使用核心 DNS」或類似選項,而不是「系統 DNS」。
Shadowrocket / Streisand / V2Box(iOS)。 在「設定」裡找到 DNS 覆寫,填一個加密 DNS 地址;把路由模式設為「代理」或「配置」而非「直連」。iOS 客戶端預設以 TUN 方式工作,所以只要 DNS 覆寫生效,洩露一般就消失了。
系統層面。 Windows 在網路卡屬性裡關閉「Internet 協議版本 6」,或者確認客戶端啟用了 IPv6 轉發;macOS 在網路設定裡把 IPv6 設為「僅本地鏈路」。瀏覽器裡檢查「安全 DNS」選項:要麼關閉,讓客戶端統一接管;要麼確認瀏覽器的 DoH 請求也走了代理。
兜底。 開啟客戶端的 Kill Switch(有的叫「斷線保護」或「阻止非隧道流量」),隧道斷開時直接斷網,而不是退回本地 DNS。
VLESS + Reality 會不會洩露 DNS
VLESS 只是傳輸協議,Reality 只是偽裝層。它們決定「隧道長什麼樣」,不決定「哪些流量進隧道」。所以同一個 VLESS 節點,在 A 客戶端裡不洩露,在 B 客戶端裡洩露,是完全正常的現象,問題永遠在客戶端配置而不在節點。如果你用的是訂閱連結,機場的預設配置通常已經寫好了 DNS 部分,但自己改過規則或換過客戶端之後,重新測一次。機場、節點和客戶端之間的關係,可以看機場是什麼這篇。
檢測結果看不明白,就把看到的東西連同你的環境一起交給 AI。
幫我看懂洩露檢測的結果。
檢測顯示:出口地址(哪個)、國家(哪個)、
DNS 伺服器(把顯示的都列出來)、
WebRTC(某個地址 / 什麼都沒有)。
隧道:已連線。客戶端:(名稱)。瀏覽器:(哪個)。
告訴我哪些是洩露、哪些是正常表現,先修哪一個。
如果憑這些判斷不了,說明還要看什麼。
檢查清單
- 線上檢測站只顯示節點所在國家的 DNS 伺服器;
- 本站 IPv6 洩露檢測沒有發現本地 IPv6;
- WebRTC 洩露檢測顯示的是節點 IP;
- 客戶端處於 TUN 模式或等效的全域性接管模式;
- DNS 指向加密解析器,並且經代理發出;
- 瀏覽器的「安全 DNS」與客戶端不衝突;
- Kill Switch 已開啟。
七條全部透過,DNS 這一環就堵住了。改過配置、換過客戶端或更新過訂閱之後,重新跑一遍,五分鐘的事。
404 VPN 的客戶端目前提供 Android 和 macOS 版本,其餘平臺開發中(見下載頁);客戶端內建 DNS 洩露防護,DNS 查詢預設在 VLESS 或 WireGuard 隧道內解析,並帶有 Kill Switch,隧道斷開時不會退回本地 DNS。想了解連線是怎麼建立的,可以看工作原理;開始使用請到首頁。