VPN 防火墙工作原理:NetGuard 如何在无 Root 下拦截流量
为什么无 Root 防火墙必须用 VPN
Android 系统不开放 iptables 接口给普通应用,唯一能让应用拦截并路由所有网络流量的官方渠道就是 VpnService。Google 在 Android 5.0+ 引入这个接口,本意是让 VPN 客户端建立加密隧道;NetGuard 把它用作流量拦截管道——不加密、不隧道,只做本地路由和过滤。
拦截流程
- 用户在 NetGuard 内点击防火墙开关
- Android 弹出 VPN 授权对话框,用户确认后系统建立一个本地 VPN 隧道
- 系统将所有应用的出站流量(TCP / UDP / ICMP)重定向到这个本地隧道
- NetGuard 在隧道出口根据规则判断:允许 → 转发到真实目标;禁止 → 丢弃(sinkhole)
- 允许的流量到达 NetGuard 后直接被转发出去,不经过任何外部服务器
应用 → 本地 VPN 隧道 → NetGuard 规则引擎 → 互联网(允许)/ 丢弃(禁止)
两种模式的差异
NetGuard 根据是否启用「流量过滤」(Filter traffic)设置,内部有两种工作模式:
- 过滤关闭:被禁止的流量进入本地 VPN 隧道后被丢弃(sinkhole),只拦截,不转发任何数据。允许的流量不经过 NetGuard,直接走系统默认路由。电池消耗最低。
- 过滤开启:所有流量(允许和禁止)都进入本地 VPN 隧道。禁止的丢弃,允许的由 NetGuard 转发出去。好处是可以启用地址级精细拦截(Pro 功能)、端口转发等进阶能力;代价是所有数据都要过一遍 NetGuard 进程,电池消耗略高。
重要限制
Android 的 VPN 机制有几个固有限制,NetGuard 无法绕开:
- 一次只能启用一个 VPN 服务——无法与其他 VPN 应用共存(见 VPN 冲突)
- 不处理入站连接——Android 只允许 VPN 处理出站流量,运行在 Android 上的服务器应用(如 HTTP 服务器、个人云)入站流量不受 NetGuard 管理
- 开机早期不保护——防火墙在 Android 启动完成后才由
RECEIVE_BOOT_COMPLETED广播拉起,启动阶段的网络请求无法被拦截 - 三星等部分旧机型的 VPN 实现有 bug——可能出现启动后无法自动恢复、需要手动重启的情况
不是真正的 VPN
要强调一点:NetGuard 不加密流量,也不隐藏你的 IP 地址。它和真正的 VPN(如 WireGuard、OpenVPN)的唯一共同点是都用了 VpnService 接口。它的角色是防火墙,不是代理或隐私隧道。
如果需要同时使用真实 VPN,NetGuard 提供了 SOCKS5 代理出口(见 SOCKS5 代理)作为组合方案。