NetGuard 中文文档 下载 App

Hosts 广告拦截常见故障排查

Hosts 拦截完全不生效

如果做完九步后打开测试页面广告还正常加载,按以下顺序排查:

排查一:版本确认

进入 NetGuard 设置 → 查看版本信息。如果是 Play Store 版,直接卸载重装 GitHub 版或 F-Droid 版。Play 版没有 Hosts 拦截功能。

排查二:三个核心开关

确认以下三个开关全部在开状态:

排查三:Android Always-On VPN 子选项

如果之前配置过 Always-On VPN(Android N+),进入:设置 → 网络和互联网 → VPN → NetGuard 齿轮 → Always-On VPN

检查有没有开启「阻断未使用 VPN 的连接」(Block connections without VPN)——如果开启,必须关闭。这个选项会导致 DNS 请求也被拦截,应用完全无法联网(详见 常见问题:Always-On VPN 阻断流量)。

排查四:运营商 DNS 限制

有些运营商只允许通过自己的 DNS 服务器做 DNS 查询(返回错误或拒绝通过非运营商 DNS 的请求)。如果你设置了自定义 DNS 后出现全应用无法联网的情况,可能就是这个问题。

解决:清空自定义 DNS,回到系统默认 DNS(让运营商 DNS 接管),但在 NetGuard 里保持 Hosts 拦截开启。运营商 DNS 只是做 DNS 解析,不影响 NetGuard 在 IP 层面的拦截。

排查五:子网路由

某些设备 / Android 版本的网络设置有路由 bug,会导致 Hosts 拦截不生效。尝试:

主菜单 → 设置 → 网络选项 → Subnet routing(子网路由)→ 关闭(如果已开启)。

排查六:清除 DNS 缓存

Hosts 文件更新后,之前缓存的 DNS 记录还在生效。清除方法:

  1. Chrome 地址栏输入 chrome://net-internals/#dns → Clear host cache
  2. 强制停止所有浏览器和有内置 DNS 缓存的应用
  3. 等待 10 分钟以上让系统 DNS 缓存自然过期

排查七:重启设备

某些 Android 版本的 VPN 实现有启动顺序 bug——VPN 启动在某些系统网络组件之前,导致 Hosts 规则没正确加载。最简单的解决办法就是重启设备。

部分广告能绕过 Hosts 拦截

Hosts 拦截不是万能的,以下情况广告会漏过:

漏过一:加密 DNS(最常见)

应用或浏览器启用了 DoT / DoH,DNS 请求被加密,NetGuard 看不到域名内容 → 无法拦截。解决:在每个使用 DoT / DoH 的浏览器或应用里手动关闭(见 DNS 配置页面的详细说明)。

漏过二:内置数据压缩代理

以下浏览器有内置数据压缩功能,会把 HTTP 请求通过运营商自己的服务器转发:

这些浏览器里请求先到压缩代理服务器(运营商 IP),代理再去请求目标网站——NetGuard 看到的是浏览器 → 运营商 IP 的连接,看不到后面的真实广告域名 → 无法做域名匹配拦截。

漏过三:YouTube 广告

YouTube 的广告不是域名级别的——它和视频内容走的是同一个 CDN 服务器(googlevideo.com 等),NetGuard 无法区分视频流和广告流。如果在 Hosts 文件里把 googlevideo.com 也拦截了,所有 YouTube 视频都会无法播放。

漏过四:应用内广告走 Play Services

很多 Android 应用不在自己进程里加载广告——它们把广告 SDK 嵌入后,广告请求实际由 Google Play Services(com.google.android.gms)发起。这种情况下 Hosts 拦截仍然有效(因为仍然是域名级别拦截),但需要开启「管理系统应用」(Manage system apps)——否则 Hosts 规则不会应用到系统组件。

漏过五:应用缓存了广告资源

某些应用把广告资源缓存在本地,即使 Hosts 拦截了网络请求,已经下载好的广告可能仍然会在本次会话中显示。解决:

  1. 在应用设置里清除缓存
  2. 强制停止应用后重新打开

Hosts 拦截导致应用完全无法联网

如果启用 Hosts 拦截后,不仅广告消失了,连应用本身也打不开或无法联网,排查:

  1. 自定义 DNS 填错了:如果只填了一台 DNS 地址,或填了不可达的 DNS,应用就无法解析任何域名。清空自定义 DNS 回到系统默认,看是否恢复正常
  2. 路由器 DNS 劫持:某些路由器有 DNS 劫持功能,会强制把 DNS 请求重定向到特定服务器。这种情况下即使 NetGuard 里填了 Cloudflare 1.1.1.1 也没用,因为 DNS 请求在到达 NetGuard 之前就被劫持了。解决:在路由器管理页面里检查并关闭 DNS 劫持
  3. Subnet routing bug:某些 Android 版本有路由 bug,开启子网路由后会导致 Hosts 拦截同时把正常流量也拦掉。解决:在网络设置里关闭子网路由
  4. Always-On VPN 子选项误开:Android 8+ 的「阻断未使用 VPN 的连接」会同时阻断 DNS,导致所有应用无法联网。关闭此选项

Hosts 文件数量验证

导入 Hosts 文件后,可以下拉 NetGuard 通知(部分 Android 版本支持双指下拉),通知里会显示已导入的 Hosts 条目数量。确认数量是否合理(StevenBlack 默认版约 5 万条)。

排查后的快速恢复

无论什么情况导致 Hosts 拦截出问题,最快的恢复方法:

  1. 主菜单 → 设置 → 高级选项 → Block domain names → 关闭
  2. 刷新问题应用 → 看是否恢复正常
  3. 如果恢复了 → 问题就在 Hosts 拦截的配置里,继续排查
  4. 如果没恢复 → 问题在流量过滤或 VPN 层面,与 Hosts 无关