子网路由(Subnet routing):解决热点共享和部分 Android bug
子网路由是什么
子网路由(Subnet routing)是 NetGuard 网络选项里的一个高级开关,决定 VPN 隧道内的流量如何分配 IP 地址和路由。默认关闭,在以下两种场景需要手动开启:
- 使用 Android 热点 / 网络共享(Tethering)
- Hosts 广告拦截不生效(部分 Android 版本需要开启此选项才能让 Hosts 拦截正常工作)
为什么 Tethering 需要子网路由
当你在 Android 上开启 Wi-Fi 热点或 USB 共享时,连接到你的设备的外部设备(笔记本、其他手机)的流量也会流经 Android 的 VPN 服务。但默认情况下:
- NetGuard 只处理本机应用的出站流量
- 外部设备的流量可能被错误地路由到 VPN 隧道而无法正确转发
开启子网路由后,NetGuard 为每个子网分配独立的路由规则,让外部设备的流量也能正确转发出去。
设置步骤
主菜单 → 设置 → 网络选项 → Subnet routing → ✅ 勾选。
在 Wi-Fi 热点已开启时,可能会看到多个子网条目(每个外部设备一个)。
场景一:Wi-Fi 热点共享不工作
症状
- 打开热点后,连接的设备无法上网
- 或者外部设备能连上热点但打不开任何网页
- 关掉 NetGuard 防火墙后热点恢复正常
解决
- 打开 NetGuard 主菜单 → 设置 → 网络选项
- ✅ 勾选 Subnet routing
- 同时检查:是否开启了「允许端口转发」(如果外部设备需要通过热点访问 Android 上的某个服务)
- 关闭再重新打开 Android 热点
场景二:Hosts 拦截不生效
在某些 Android 版本(包括部分 LineageOS / GrapheneOS 构建、某些国产 ROM)上,默认关闭子网路由时会出现:
- Hosts 文件导入成功但广告照常显示
- 流量日志里看不到被拦截的域名请求
这是因为 Android VPN 实现的一个路由 bug——Hosts 拦截的规则没有被正确应用到默认路由上。
解决
- 主菜单 → 设置 → 网络选项
- ✅ 勾选 Subnet routing
- 如果开启后仍然不行,尝试在高级选项里:
- 关闭再重新打开「Filter traffic」
- 关闭再重新打开「Block domain names」
- 如果还不行 → 重启设备
场景三:热点 + Hosts 拦截组合
你想让连接到你 Android 热点的设备也享受 Hosts 广告拦截效果?这是可行的:
- ✅ 开启子网路由
- ✅ Hosts 拦截已正确配置并生效
- 连接到热点的设备发出的 DNS 请求会经过 Android 的 VPN 隧道
- NetGuard 的 Hosts 规则会拦截这些请求——相当于整个热点范围内都有广告拦截
这个用法比在每个设备上单独装 NetGuard 方便得多,但要注意:
- 热点开着的时候 NetGuard 防火墙开销会更大
- 外部设备的流量也要过一遍 Android 的 VPN 隧道,电池消耗更高
注意事项
电池消耗
子网路由开启后,所有流量(包括外部设备的)都需要 NetGuard 额外处理,电池消耗会增加。如果不需要热点共享或 Hosts 拦截,可以关闭子网路由省电。
与 Always-On VPN 的关系
如果设备配置了 Always-On VPN,子网路由的行为会受到影响。GrapheneOS 的默认 Always-On VPN 设置会强制阻断所有流量,此时需要额外关闭「阻断未使用 VPN 的连接」。
与端口转发的关系
端口转发(下一页)功能依赖子网路由——因为端口转发涉及到跨子网的流量重定向。如果用 GitHub 版的端口转发功能,必须同时开启子网路由。
关闭子网路由的时机
- 不用热点共享
- Hosts 拦截正常工作
- 想省电
简单说:遇到了问题再开,平时不需要主动打开。