你只有一句策略:这个应用可以访问工作服务,别的一概不行。接下来的问题看起来像是选产品,其实是选位置,因为每个可能的执行点只能看到手机流量的一部分。网关只能看到进入隧道的那部分。手机侧的过滤器只能看到它被允许观察的部分。把同一个请求在这两处各走一遍,答案就显而易见了。

从句子开始,而不是从产品开始

先展开需求,再选东西。这意味着软件包和它运行所在的配置文件,因为工作配置文件里的应用与个人配置文件里的同一个应用是不同用户。这意味着目的地:主机、端口和协议,而不是服务名。这意味着解析该名称的 DNS 路径,也意味着隧道不可用时的处理方式。

写下来,示例的策略有四条:工作应用可以访问工作服务;工作应用不能访问其他任何目标;其他应用不变;没有隧道时,工作应用被拒绝,而不是回退。每条都有负责人,而负责人并不都是同一个。

第 1 步:手机自己能执行什么

非 root 的 Android 防火墙就是一个 VpnService,即使背后没有远程隧道,它也在本地捕获流量。Android 每个用户配置文件只允许一个活动的 VPN 服务,所以第二个防火墙应用不会接在第一个后面。它替换掉第一个,第一个应用所过滤的接口随之消失。

这就是为什么在 VPN 客户端旁边装防火墙,很少能得到人们期待的组合。如果防火墙启动、VPN 断开,两者并没有合并,而是互换了位置。接口替换不是协作,症状就是每次打开另一个应用,隧道就不断掉线。

受支持的方案确实存在:你已经运行的 VPN 客户端内置的过滤、通过设备策略控制器或工作配置文件管理的平台控制,或者厂商有文档说明的架构。除此之外都是实验,每次应用更新后都必须重新验证。

第 2 步:网关能执行什么

流量在远端解密之后,网关可以把转发的数据包限制在已批准的地址、服务或经过认证的 VPN 身份上。对它出口的一切来说,这才是真正的执行,也是限制访问私有子网的合适位置。

它拿不到的是附着在每个普通 IP 数据包上的手机应用身份。共用同一个隧道地址的几个应用,在网关看来是同一个主体,除非设计给它们分配了独立地址或独立的认证身份。因此网关上的按用户规则,并不是手机上的按应用规则,无论管理控制台怎么命名。

第 3 步:列出永远不会到达的部分

被排除在 VPN 之外的应用访问附近的设备时,流量永远不会到达网关,出口防火墙无法拒绝一个它从未收到的数据包。故障期间意外走直连路径,以及本地接入网络上的入站暴露,同样如此。按定义,这些都是本地边界。

反过来也成立:允许连接的本地规则,并不授予通过网关私有网络 ACL 的访问权。同一个请求可能同时受两道边界约束,满足其中一道并不说明另一道。

第 4 步:给每条规则分配一条路径

在动手配置之前,先把决定放进一张表,因为空白单元格正是设计失败的地方。

PathWho can enforce itBlind spot
Work app to the work service, tunnel upGateway ACL on address and service, plus a local block on other pathsThe gateway cannot see which app sent the packet
Work app to other destinations, tunnel upLocal app-aware filter, or the gateway if those destinations are addressed thereThe local filter must be the active VpnService
Work app with no tunnelLocal deny, so the app cannot take a direct pathRequires the filter to survive the tunnel going away
Nearby LAN deviceLocal policy onlyThe gateway never sees it

可行的形态是两道边界、两个职责。本地感知应用的边界管理手机行为,包括直连回退;网关边界管理远程资源。网关一侧可以放行工作服务、拒绝其他所有私有子网,而手机侧策略自行决定应用本来可能走的直连路径。

第 5 步:保住传输,然后验证

无论最终采用哪套本地策略,都必须放行建立并维持 VPN 的传输。阻断该传输会让手机既没有隧道也没有策略,什么都执行不了,而且很难诊断,因为应用根本没有网络。

然后逐条验证原始句子,而不是整体印象:工作应用能到工作服务,同一个应用在另一个目的地被拒绝,非工作应用行为如常,隧道停止后工作应用不回退到直连。DNS 路径要单独检查,因为私有 DNS 或加密解析器可以绕过只检查地址的过滤器。

如果其中某一步在手机上无法满足,那就是架构问题,而不是防火墙设置。把策略拆分到你能控制的设备和你能控制的网关,通常才是诚实的答案,而Android VPN 连接文档正是确认平台允许和不允许单个服务做什么的地方。

相关文章