NetGuard DNS 设置:Hosts 拦截必需的域名解析层
为什么 DNS 设置影响 Hosts 拦截
Hosts 拦截的工作原理是:NetGuard 在应用发出 DNS 查询时,检查目标域名是否在 Hosts 文件里。如果在,返回一个无效的 IP(将流量"扔"到本地 sinkhole)。
但这个机制有一个前提:NetGuard 必须能看到应用发出的 DNS 查询。
如果应用使用了加密 DNS(DoT / DoH),DNS 请求被 TLS 加密后 NetGuard 看不到内容——它只看到一个加密的 TLS 包,不知道里面是什么域名,自然无法做域名匹配拦截。
NetGuard 默认 DNS 行为
NetGuard 在没有自定义配置 DNS 服务器时:
- 允许所有 DNS 请求(即使域名在 Hosts 文件里)
- DNS 请求仍然会返回解析结果,但如果解析结果的 IP 被 Hosts 标记为拦截,NetGuard 会在 IP 层拦截
为什么 NetGuard 默认放行 DNS?因为NetGuard 是按真实域名做拦截——它需要先让 DNS 查询完成,拿到"域名 → IP"的映射,才能知道要拦截哪个 IP。这一步必须先有 DNS 响应。
如果你不信任系统默认 DNS(Google 或运营商 DNS),可以在 NetGuard 里设置自定义 DNS 服务器。
设置自定义 DNS
主菜单 → 设置 → 高级选项 → 找到 DNS 配置区域 → 输入两台 DNS 服务器地址。
重要:必须填两台
NetGuard 要求填两个 DNS 服务器地址。如果只填一个,它会与系统默认 DNS 一起使用(等于没替换)。只有两个都填了,NetGuard 才会用这两个完全替换系统默认 DNS。
推荐的隐私友好 DNS:
| DNS 服务 | 主 DNS | 备用 DNS | 说明 |
|---|---|---|---|
| Cloudflare | 1.1.1.1 | 1.0.0.1 | 速度最快的隐私 DNS |
| Quad9 | 9.9.9.9 | 149.112.112.112 | 安全 DNS(过滤恶意域名) |
| OpenDNS | 208.67.222.222 | 208.67.220.220 | 老牌 DNS,支持域名过滤 |
| NextDNS | 自定义 | 自定义 | 高度可配置,有免费版 |
必须关闭的:Android 私人 DNS
Android 9+ 在系统设置里提供了「私人 DNS」功能。如果开启了私人 DNS,必须关闭,否则 Hosts 拦截完全不生效。
路径:Android 设置 → 网络和互联网 → 私人 DNS → 选择 「关闭」 或「自动」(不要选「指定的域名」)。
原因:私人 DNS 使用 DoT(DNS over TLS)加密通信,NetGuard 无法看到加密后的 DNS 请求内容,自然无法做域名匹配拦截。
必须关闭的:浏览器里的 DoT / DoH
浏览器各自独立的 DoT / DoH 设置不受 Android 私人 DNS 控制——即使系统层面关闭了,浏览器可能仍然单独启用。必须在每个浏览器里手动检查:
Chrome
- 设置 → 隐私和安全 → 使用安全 DNS(Use secure DNS)
- → 选「关闭」
Firefox
- 设置 → 常规 → 滚动到底部网络设置
- → 设置 → 启用 DNS over HTTPS(Enable DNS over HTTPS)
- → 关闭
Opera / Edge / Brave
类似路径,找到「安全 DNS」「DoH」「加密 DNS」等选项关闭。
加密 DNS 绕过的根本原因
| DNS 类型 | NetGuard 能否拦截 | 原因 |
|---|---|---|
| 传统 UDP 53 端口 DNS | ✅ 可以 | NetGuard 能看到明文 DNS 查询内容 |
| DoT(DNS over TLS,端口 853) | ❌ 不行 | TLS 加密后 NetGuard 看不到域名内容 |
| DoH(DNS over HTTPS,端口 443) | ❌ 不行 | HTTPS 加密后 NetGuard 看不到域名内容 |
DoT / DoH 流量在 NetGuard 眼里就是普通 TLS 连接——它只知道某个应用正在和某个 IP 的 853 或 443 端口通信,但不知道这个通信是 DNS 查询、视频流还是其他什么。
特殊情况:部分 DNS 服务商屏蔽 Hosts
某些运营商或 DNS 服务商可能有自己的域名黑名单机制。如果你在 NetGuard 设置里填了两台 DNS,但 Hosts 拦截仍然不生效,可以尝试:
- 先测试 NetGuard 默认 DNS(清空自定义 DNS,回到系统默认)看是否生效
- 如果默认 DNS 生效但自定义 DNS 不生效,说明你选的 DNS 服务商有问题
- 试试 Cloudflare(1.1.1.1 / 1.0.0.1),它通常不会干扰 Hosts 拦截
快速验证 Hosts 拦截
设置完 DNS 和 Hosts 文件后,打开 Chrome,在地址栏输入:
chrome://net-internals/#dns
点击「Clear host cache」。然后访问 netguard.me/test,看测试页面上的广告是否被拦截。
另一个方法是在全球流量日志里搜索 doubleclick 或 admob,看是否有红色禁止条目出现。如果日志里全是绿色允许,说明某个环节还没通。