Private DNS 冲突 —— Android 9+ 的 DoH/DoT 怎么和 AdAway 共存
冲突是什么
从 Android 9 (Pie) 开始,系统默认启用 Private DNS,即 DNS over TLS(DoT)或 DNS over HTTPS(DoH)。工作原理:
- APP 发 DNS 查询
- Android 把 DNS 请求加密后直接发给 Private DNS 服务器(可能是 Google、Cloudflare、你运营商指定的)
- 这个过程完全绕过了系统的 hosts 文件——hosts 拦截等于不存在
- 同时绕过了 AdAway VPN 模式的拦截——因为请求没走系统 DNS 解析流程
结果:你以为 AdAway 在拦广告,实际 Private DNS 把所有 DNS 请求加密后送出去了,广告正常加载。
怎么判断你中招了
症状:
- 开了 AdAway 但浏览器里广告还在(根设备上)
- VPN 模式开启状态下某些 APP 广告不拦截
- DNS 日志里什么都抓不到
最快验证:
- 系统设置 → 网络和互联网 → 高级 → 私人 DNS
- 如果显示"自动"或"指定的私人 DNS 主机名" → 开着
- 改成"关"
- 回浏览器打开之前广告一直有的页面,看广告还在不在
关掉 Private DNS 后广告消失 → 确认是这个问题。
解决方案
方案一:关掉 Private DNS(最稳,推荐)
- 系统设置 → 网络和互联网 → 高级 → 私人 DNS
- 选 "关"(不要"自动")
- 确认
简单粗暴,hosts 文件立刻恢复拦截作用。代价是 DNS 查询不再加密——但 hosts 拦截 + VPN 模式本来就在处理 DNS 请求,Private DNS 只是多加了一层加密,对大多数家庭用户来说区别不大。
方案二:指定 AdAway 兼容的 Private DNS
某些自定义 Private DNS 服务器支持不加密某些请求——或者说,AdAway v6 引入的 DOH 支持可以和某些 Private DNS 共存。但这种情况很依赖 ROM 和 Private DNS 服务器,不稳定,不推荐新手尝试。
方案三:用 VPN 模式 + Private DNS 共存(AdAway v6)
v6 版本尝试解决这个问题:AdAway VPN 模式下,它会在虚拟网卡层拦截所有 DNS 请求(包括加密的 DoT/DoH),然后用 AdAway 自己的 DOH 客户端转发。但这个实现还不够成熟,某些机型上有 bug。
目前结论:关 Private DNS 是最稳的方案。
什么时候 Private DNS 一定要开
如果你在:
- 公共 WiFi 环境(咖啡馆、机场)——加密 DNS 保护隐私很重要
- 公司网络(公司 DNS 可能有监控)
- 某些国家/地区(ISP 可能会劫持 DNS 注入广告)
这时候可以:
- 在家用 WiFi 时关 Private DNS(AdAway 生效)
- 出门切公共 WiFi 时开 Private DNS(配合 VPN 模式,v6 尝试共存)
但这个切换需要手动,目前 AdAway 没有自动根据网络切换 Private DNS 状态的功能。
系统不同版本的差异
| Android 版本 | Private DNS 行为 | AdAway 建议 |
|---|---|---|
| 8.0 (Oreo) 及以下 | 没有 Private DNS | 不需要任何处理 |
| 9 (Pie) | 默认自动 | 关 Private DNS |
| 10 | 默认自动 | 关 Private DNS |
| 11~14 | 默认自动,更激进 | 关 Private DNS + v6 VPN 模式可能共存 |
"自动"意味着 Android 会尝试和网络协商加密 DNS——如果路由器/运营商支持就启用,不支持就不用。但大多数现代路由器都支持,所以实际效果是"几乎总是开着"。
MIUI / One UI / EMUI 等定制 ROM
国产 ROM 通常也继承了 Private DNS 功能,位置可能略有不同:
- 小米 MIUI:设置 → 连接与共享 → 私人 DNS
- 三星 One UI:设置 → 连接 → 更多连接设置 → 私人 DNS
- 华为 EMUI:设置 → 无线和网络 → 更多连接 → 私密 DNS
不同 ROM 可能叫"私人 DNS""私密 DNS""加密 DNS"——都是同一个东西。
总结
Android 9+ 上 AdAway 生效的前提是:Private DNS 必须关。
关掉后 AdAway 恢复系统级拦截。如果你在公共网络需要 Private DNS 保护,可以考虑用 AdGuard 这类同时支持加密 DNS 过滤的工具作为 AdAway 的补充。