适合已经能连上节点、但不确定域名解析发生在哪一侧的用户。读完能分清设计内的直连解析与意外泄漏,会用访问日志和 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,对照物理网卡上还有没有明文查询。
核对代理名单
打开「分应用代理」确认发起解析的应用在名单里;安卓端再检查系统「私人 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 安卓端:路由模式、嗅探与分应用代理
v2rayNG 用 Xray 内核,连接后由系统 VpnService 接管流量,应用连接先进入内核再分流。安卓端的泄漏点集中在三处:分应用代理名单、域名嗅探开关、系统私人 DNS。下面以 v2rayNG 为准,v2flyNG 的设置项命名相近,可以对照查找。
- 路由模式:「设置」→「路由模式」,选「绕过大陆」时国内域名走本地解析,这是设计行为;要让所有域名都交给节点侧解析,切到「全局」。
- 域名解析策略:「设置」→「域名解析策略」,保持 AsIs,域名原样发到节点;需要按 IP 分流时再选 IPIfNonMatch。
- 域名嗅探:「设置」里打开「域名嗅探」,勾上 HTTP 与 TLS,让内核从握手里还原域名,避免直连规则按 IP 误放行。
- 分应用代理:「设置」→「分应用代理」,确认发起解析的应用在名单里;被排除的应用连 DNS 都不会进内核。
- 私人 DNS:安卓「设置」→「网络和互联网」→「私人 DNS」,设为「自动」或填了主机名时解析走 DoT,是否被接管取决于路由规则。
还有一个容易漏的点:部分浏览器和 App 自带安全 DNS,查询目标是解析商的 HTTPS 地址而不是 53 端口,日志里搜「:53」根本搜不到。处理办法是把解析商域名写进代理规则,或者在浏览器设置里关掉安全 DNS,让解析回到内核的 dns 段。
结论:安卓端先查名单,再查嗅探
分应用代理漏配会让整个应用连同它的 DNS 一起绕开内核,影响面比嗅探开关大得多;排查顺序建议是名单、嗅探、私人 DNS,最后才是配置里的 dns 段。
常见追问
关闭嗅探后路由还是按 IP 走,有什么实际影响?
域名先在本地解析成 IP,连接按 IP 建立,直连与代理规则只能按 IP 判断;国内 CDN 域名容易被误送进代理,解析请求也留在了本地网络。打开嗅探能同时解决这两个问题。
「绕过大陆」模式下国内域名用本地 DNS,算泄漏吗?
不算。这是设计内的直连解析,查询对象是你自己选的本地解析器。要让国内域名也走节点侧解析,把路由模式切到「全局」,并接受由此带来的解析延迟变化。
检测结果里显示的解析器不是我填的 DNS,怎么回事?
先看浏览器是否开了安全 DNS,再看系统是否设了私人 DNS;这两处都会在应用层把解析交给别的解析器,客户端配置管不到。逐个关掉再复测。
订阅更新一直超时,和 DNS 有关吗?
有关。订阅域名的解析默认可能走直连,直连解析被污染或超时时更新就会失败。在订阅设置里勾选「通过代理更新订阅」,让请求和解析都从节点侧走。
填了加密 DNS 地址却没生效?
先确认内核版本支持该写法,再检查 dns 段的 tag 是否被路由规则引用,改完配置要重启内核。日志里 DNS 查询的出站标签变了,才算生效。
把 DNS 当成一条普通流量来管,思路就清楚了:看它在哪个出站被处理,给它独立的标签和规则,再决定哪些域名保留本地解析。v2rayNG 与 v2rayN 的图形选项覆盖了绝大多数场景,剩下的精度交给配置里的 dns 与 routing 两段。