NetGuard 中文文档 下载 App

NetGuard DNS 设置:Hosts 拦截必需的域名解析层

为什么 DNS 设置影响 Hosts 拦截

Hosts 拦截的工作原理是:NetGuard 在应用发出 DNS 查询时,检查目标域名是否在 Hosts 文件里。如果在,返回一个无效的 IP(将流量"扔"到本地 sinkhole)。

但这个机制有一个前提:NetGuard 必须能看到应用发出的 DNS 查询。

如果应用使用了加密 DNS(DoT / DoH),DNS 请求被 TLS 加密后 NetGuard 看不到内容——它只看到一个加密的 TLS 包,不知道里面是什么域名,自然无法做域名匹配拦截。

NetGuard 默认 DNS 行为

NetGuard 在没有自定义配置 DNS 服务器时:

为什么 NetGuard 默认放行 DNS?因为NetGuard 是按真实域名做拦截——它需要先让 DNS 查询完成,拿到"域名 → IP"的映射,才能知道要拦截哪个 IP。这一步必须先有 DNS 响应。

如果你不信任系统默认 DNS(Google 或运营商 DNS),可以在 NetGuard 里设置自定义 DNS 服务器。

设置自定义 DNS

主菜单 → 设置 → 高级选项 → 找到 DNS 配置区域 → 输入两台 DNS 服务器地址。

重要:必须填两台

NetGuard 要求填两个 DNS 服务器地址。如果只填一个,它会与系统默认 DNS 一起使用(等于没替换)。只有两个都填了,NetGuard 才会用这两个完全替换系统默认 DNS。

推荐的隐私友好 DNS:

DNS 服务主 DNS备用 DNS说明
Cloudflare1.1.1.11.0.0.1速度最快的隐私 DNS
Quad99.9.9.9149.112.112.112安全 DNS(过滤恶意域名)
OpenDNS208.67.222.222208.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

  1. 设置 → 隐私和安全 → 使用安全 DNS(Use secure DNS)
  2. → 选「关闭」

Firefox

  1. 设置 → 常规 → 滚动到底部网络设置
  2. → 设置 → 启用 DNS over HTTPS(Enable DNS over HTTPS)
  3. → 关闭

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 拦截仍然不生效,可以尝试:

  1. 先测试 NetGuard 默认 DNS(清空自定义 DNS,回到系统默认)看是否生效
  2. 如果默认 DNS 生效但自定义 DNS 不生效,说明你选的 DNS 服务商有问题
  3. 试试 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,看是否有红色禁止条目出现。如果日志里全是绿色允许,说明某个环节还没通。