Always-On VPN 子选项「阻断未使用 VPN 的连接」导致全流量阻断
问题描述
在 Android 8 Oreo 及以上版本,NetGuard 可以配置为 Always-On VPN(设备自动启动 VPN、无需手动点击开关)。但有一个极其危险的子选项:
Block connections without VPN(阻断未使用 VPN 的连接)
如果开启了这个子选项,所有应用都会完全无法联网——不仅仅是被 NetGuard 禁止的应用,连完全允许的核心应用(包括 Play Store、浏览器)也打不开任何网页。
问题原理
Android 的 DNS 解析过程中,DNS 请求本身是一个 UDP 数据包。正常情况下这个数据包会被 VPN 服务拦截并转发。但如果开启了「阻断未使用 VPN 的连接」子选项,Android 会认为:
- 任何发出的请求如果不在 VPN 隧道内 → 直接丢弃
- 但 DNS 请求在 DNS 解析流程上先于 VPN 转发(因为 NetGuard 需要域名 → IP 映射才能做 Hosts 拦截)
- 于是 DNS 请求也被「阻断未使用 VPN 的连接」子选项判定为"不在 VPN 内" → 丢弃 → 无法解析任何域名 → 所有应用无法联网
这是 Android 的 bug 还是 feature?开发者认为这是 Android Always-On VPN 的设计缺陷。在大多数 VPN 应用上,这个子选项都能正常工作;但对 NetGuard 这种需要先让 DNS 通过、在 IP 层拦截的防火墙来说,它会把所有流量都干掉。
解决办法
无条件关闭「阻断未使用 VPN 的连接」,只保留主 Always-On VPN 开关。
设置路径:
- Android 设置 → 网络和互联网 → VPN
- 找到 NetGuard → 点击齿轮图标
- ✅ 开启 「始终保持 VPN 开启」(Always-On VPN)——正常
- ❌ 关闭「阻断未使用 VPN 的连接」——无论什么情况都不要开
GrapheneOS 默认开启了这个子选项
GrapheneOS(安全强化的 Android 变体)在安装 VPN 后默认就开启了 Always-On VPN 的两个选项(包括那个危险的子选项)。如果你用 GrapheneOS + NetGuard:
- 设置 → 网络和互联网 → VPN → NetGuard → 齿轮
- ❌ 关闭「阻断未使用 VPN 的连接」
- 保存后 NetGuard 防火墙恢复正常
GrapheneOS 的文档里也专门提到了这个问题。
其他可能导致全流量阻断的原因
如果关闭这个子选项后仍然全流量阻断,继续排查:
原因一:白名单模式 + 系统应用没放行
检查「设置 → 默认」里 Block Wi-Fi / Block mobile 是否都勾选了。如果都勾选了(白名单模式),而你没放行 Play Services / Download Manager / Connectivity Services 这三个核心系统组件,应用就无法联网。解决:在白名单模式下手动放行这三个组件。
原因二:运营商限制非官方 DNS
某些运营商只允许通过自己的 DNS 服务器做 DNS 查询。如果你在 NetGuard 里设置了两台自定义 DNS(如 Cloudflare 1.1.1.1),而运营商又强制拦截了非运营商 DNS 的请求,结果就是所有 DNS 查询都失败 → 全流量阻断。
解决:清空自定义 DNS(让运营商 DNS 接管),但在 NetGuard 里保持 Hosts 拦截开启。运营商 DNS 只是做解析,不影响 NetGuard 的 Hosts 拦截。
原因三:Subnet routing bug
某些 Android 版本(包括部分 LineageOS / GrapheneOS 构建)有路由 bug。尝试:
- 主菜单 → 设置 → 网络选项 → ❌ 关闭 Subnet routing(如果之前开启了)
- 或反过来:✅ 开启 Subnet routing(如果之前关闭了)
- 重启设备
开发者在 FAQ 里提到 LineageOS 部分构建需要在 NetGuard 里开启流量过滤才能绕过这个 bug。
原因四:自定义 DNS 填了不可达的服务器
如果你在 NetGuard 高级选项里填了两台 DNS 服务器,但其中至少一台不可达 → Android 无法解析任何域名 → 应用无法联网。
检查:在移动浏览器或 PC 上 ping 一下你填的 DNS 地址(如 Cloudflare 1.1.1.1),确认可达。不可达就换掉。
快速恢复流程
无论什么原因导致全流量阻断:
- 关掉 NetGuard 防火墙开关 → 确认设备恢复联网
- 打开 NetGuard → 逐项检查(Always-On VPN 设置、白名单 / 黑名单模式、自定义 DNS、子网路由)
- 找到最近修改的选项 → 还原或调整
- 重新打开防火墙 → 验证恢复