TL;DR:一句话说清楚——VPN 开着的时候,DNS 通常由 VPN 隧道内部处理,你系统级的私人 DNS 很可能被绕过或失效。
最省心的方案:要么关了系统私人 DNS、信任 VPN 自带的加密 DNS;要么把私人 DNS 设成你 VPN 服务商的 hostname。不要两套同时开着互相打架。
本文讲清楚冲突的底层机制、各平台的优先级规则,以及什么时候该关私人 DNS。
为什么私人 DNS 和 VPN 会冲突?
要理解冲突,先得搞懂 DNS 在 VPN 场景下是怎么工作的。
普通情况下的 DNS
你没开 VPN 时,所有 App 要打开一个网址,都得先问 DNS 服务器:"这个域名对应哪个 IP?"如果你开了私人 DNS,这个问答过程是加密的(DoT/DoH),别人看不到你查了什么域名。
开了 VPN 之后的 DNS
VPN 一连接,你的所有网络流量都会被塞进一条加密隧道,发到 VPN 服务器再出去。这时候,DNS 查询也跟着进隧道了——由 VPN 服务器那边的 DNS 来处理,而不是你本地配的那台。
这就带来一个问题:你系统里设的私人 DNS hostname,可能根本没机会被用到,因为 DNS 请求已经被 VPN 截走了。
安卓上的优先级:私人 DNS vs VPN DNS
安卓的情况比较特殊,也是冲突最多的平台。
官方行为:私人 DNS 可能覆盖 VPN DNS
根据安卓系统的设计,当你配置了"私人 DNS 提供程序主机名"(严格模式),系统会把它当作全局的 DNS 设置。这时候即使 VPN 连接上了,有些版本的安卓仍然会强制走私人 DNS 的 DoT 通道,而不是 VPN 内部的 DNS。
这会导致什么问题?
- VPN 本来想让你用它的 DNS(可能是为了解决某些地区的访问问题,或者防 DNS 泄漏)
- 但安卓私人 DNS 把请求截走了,发给了另一台服务器
- 结果:VPN 的"防泄漏"功能失效,甚至某些需要 VPN DNS 才能访问的网站打不开
如果你还不太清楚 DoT 和 DoH 两种加密协议的区别,可以先看这篇 DoH/DoT/DoQ 三种加密协议对比,理解底层机制后再处理冲突会更清晰。
实际表现
- VPN 显示已连接,但某些网站/ App 还是打不开
- dnsleaktest 显示的 DNS 服务器是你系统私人 DNS 那台,而不是 VPN 服务商的
- 关掉私人 DNS 后,VPN 突然一切正常
共存方案:三种正确的姿势
方案一:关闭系统私人 DNS,信任 VPN 的 DNS(推荐)
这是最简单、最不容易出问题的方案。
思路:VPN 客户端自己通常都内置了加密 DNS 功能(DoH 或 DoT),你只要关掉系统级的私人 DNS,把 DNS 的控制权完全交给 VPN 就行。
操作步骤(安卓):
- 设置 → 网络和互联网 → 私人 DNS
- 改成 "关闭" 或 "自动"
- 打开你的 VPN 客户端,确认里面的"DNS 加密"或"防泄漏"选项是开着的
- 连接 VPN
- 访问 dnsleaktest.com 测试,应该显示 VPN 服务商的 DNS
优点:不会冲突,VPN 怎么设计就怎么跑
缺点:VPN 断了的时候,你就没有加密 DNS 了(这时候临时开回私人 DNS 就行)
方案二:把私人 DNS 设成 VPN 服务商的 hostname
如果你既想用安卓系统的私人 DNS,又不想和 VPN 打架,那就把私人 DNS 的 hostname 设成你 VPN 服务商提供的 DoT 地址。
思路:这样不管 VPN 开没开,你用的都是同一台 DNS 服务器,就不存在"两套 DNS 打架"的问题了。
操作步骤:
- 查你的 VPN 服务商有没有提供 DoT hostname(很多主流 VPN 都有)
- 设置 → 网络和互联网 → 私人 DNS → 填这个 hostname
- 连接 VPN
- 测试
优点:VPN 开和不开,DNS 都是同一台,一致性好
缺点:不是所有 VPN 都提供 DoT hostname
方案三:VPN 客户端内置 DoH,系统保持自动
有些 VPN 客户端(比如 Cloudflare WARP、NextDNS 自己的 App)是以本地 VPN 模式运行的——它们在你手机上建一个虚拟 VPN 接口,所有 DNS 请求走这个虚拟接口,由 App 自己处理加密。
这种情况下:
- 系统私人 DNS 设成"自动"或"关闭"
- DNS 加密完全由 VPN App 负责
- 不会有冲突,因为只有一套 DNS 在工作
iOS 上的情况:描述文件 DoT 和 VPN 的关系
iOS 的私人 DNS 是通过安装配置描述文件来实现的(DoT/DoH)。和安卓不同,iOS 的描述文件 DNS 和 VPN 的优先级关系是这样的:
- VPN 连接时,VPN 的 DNS 优先——iOS 会把 DNS 路由到 VPN 隧道内
- VPN 断开时,描述文件 DoT 生效——走你装的那台 DNS 服务器
- 两者不会同时生效,而是按 VPN 开关状态切换
这其实是比较合理的设计,不会出现安卓那种"两套 DNS 抢着管"的冲突。
iOS 注意事项
- 如果你装了 DoT 描述文件,又用着 VPN,不用担心冲突——iOS 自动处理优先级
- 但如果 VPN 不内置加密 DNS,VPN 连接期间你的 DNS 可能是明文的(走 VPN 服务器那边的明文 DNS)
- 想全程加密 DNS,要么选一个内置加密 DNS 的 VPN,要么不用 VPN 时靠描述文件 DoT
Windows 上的情况:VPN 和系统 DoH
Windows 11 的 DoH 是系统级的。当你连接 VPN 时:
- 如果 VPN 客户端是"全隧道模式"(所有流量都走 VPN),DNS 通常由 VPN 接管
- Windows 的系统 DoH 设置可能被绕过,因为 DNS 请求已经进 VPN 隧道了
- 如果 VPN 是"分流模式"(只有部分流量走 VPN),那系统 DoH 可能还在生效
Windows 排查方法
- 连接 VPN 后,打开命令提示符,运行
nslookup www.baidu.com - 看显示的 DNS 服务器地址是你配的 DoH 那台,还是 VPN 那边的
- 如果是 VPN 的,说明系统 DoH 被覆盖了——这是正常行为,不是 bug
什么时候该关私人 DNS?决策建议
不是所有人都需要同时开私人 DNS 和 VPN。根据你的使用场景,对号入座:
| 场景 | 建议 |
|---|---|
| 你用的 VPN 自带加密 DNS 和防泄漏功能 | 关了系统私人 DNS,交给 VPN 管 |
| 你不用 VPN,只想加密 DNS | 开着私人 DNS,正常用 |
| 你偶尔用 VPN,平时不用 | VPN 开着时临时关私人 DNS,VPN 关了再开回来 |
| 你用的 VPN 不加密 DNS(明文 DNS) | 保留私人 DNS,但要测试会不会冲突 |
| 你遇到 VPN 连不上网站、DNS 解析失败 | 先关私人 DNS 试试,大概率是冲突导致的 |
FAQ
Q:开着 VPN 又开着私人 DNS,会更安全吗?
A:不一定。两套 DNS 同时工作反而可能出问题——比如 DNS 泄漏(一部分请求走 VPN、一部分走系统私人 DNS),或者 VPN 的分流规则失效。安全不是"开的越多越好",而是"一套配置干净利落"。
Q:我怎么知道现在到底用的是哪台 DNS?
A:最可靠的方法是访问 dnsleaktest.com,点 Extended Test,看列出的 DNS 服务器归属。不管你开了多少套 DNS,实际用哪台,这个网站会告诉你。
Q:安卓上私人 DNS 设成"自动"是什么意思?
A:"自动"是机会模式——安卓会尝试用当前网络提供的 DNS 做 DoT 加密,如果对方支持就加密,不支持就明文。它不会强制要求某一台服务器,所以和 VPN 冲突也少。如果你想要全局加密,才需要选"指定 hostname"。
Q:VPN 断开后,私人 DNS 会自动恢复吗?
A:会的。私人 DNS 是系统级设置,一直开着;VPN 只是连接期间临时接管 DNS。VPN 一断开,系统自动切回私人 DNS 的 DoT 通道。你不用手动改来改去——前提是两者不冲突。
参考来源
- Android Developers: Android 10 enterprise changes — Private DNS — 支撑安卓 Private DNS API、严格模式行为等官方机制。
- GrapheneOS Discussion: Private DNS and VPN precedence — 支撑"Private DNS takes precedence over VPN-provided DNS"这一优先级事实的社区共识。
- Apple Support: Apple Platform Deployment — DNS settings declarative configuration — 支撑 iOS/macOS 描述文件 DNS 配置、DoT/DoH 协议说明。
- Microsoft Learn: Secure DNS Client over HTTPS (DoH) — 支撑 Windows 11 DoH 配置方式、加密/仅加密等模式说明。