你连上隧道应用,状态栏里的钥匙图标就切换给了它;一秒前还显示的广告拦截器消失了,或者它重新连接、隧道随之断开。这并非故障。Android 每个用户配置文件只允许一个活动 VPN 服务,而两个应用都要那个位置,所以后启动的会替换先启动的。两项功能本身不冲突,冲突的是打包方式。在手机本身上把这件事理清,就能既留住隧道,又拦住广告。

动手之前先看看那个位置

打开“设置”,进入“网络和互联网”,再进入 VPN,记下列表里有哪些条目、哪一条处于已连接状态。这个列表是按用户配置文件分开的:工作资料有自己的 VPN 位置和自己的应用,所以在工作资料里安装拦截器,并不会过滤你实际使用的个人应用。

切换时留意状态栏。钥匙图标属于当前生效的那个 VPN 服务;因此启动第二个应用后看到图标换了归属,就说明替换发生了,即使两个应用都还声称在运行。以这种方式工作的过滤应用并不会把你的流量送往远端服务器;它使用本地 VPN 接口检查或重定向数据包,占用的正是同一个位置。

决定过滤在哪一层运行

现实中有三种放置方式,它们的差别更多在覆盖范围而不是质量。浏览器扩展只在那一个浏览器里过滤页面,把 Android 的 VPN 位置留空。内置在 VPN 产品里的过滤,覆盖的是该产品文档所说明的流量和规则,而不同产品的能力差别很大,“广告拦截”这个标签并不能说明它用什么机制。做过滤的 DNS 解析器只覆盖真正走它的域名查询,别的都管不到。

Android 有一项值得了解的机制:按应用限定的范围。VPN 服务可以只对一组应用生效,这会改变隧道处理哪些应用。它并不会凭空造出第二个位置,所以隧道和过滤器仍然不能同时运行;它只是让你把过滤器挡在必须走隧道的应用之外。

按你想要的结果来选。如果抱怨的是网页里的广告,浏览器内的内容拦截器可以和任何隧道共存。如果还包括应用内广告,过滤器就必须坐在应用本来就在走的包路径或 DNS 路径上,通常意味着 VPN 产品本身,或者你掌控的解析器策略。

够用的话,先做浏览器过滤

Android 版 Firefox 通过自己的附加组件流程安装兼容扩展,Mozilla 的扩展指南介绍了安装方法和各扩展申请的权限。装之前先读一遍这些权限。内容拦截器需要看到并修改页面内容,这是实打实的能力,也正是它应当来自浏览器自带目录、而不是侧载安装包的原因。

优势是结构性的。因为它运行在浏览器内,所以不碰 VPN 位置,不改动设备解析器,也不和隧道争任何东西。局限同样是结构性的:其他应用都在它之外,包括那些展示你最想除掉的广告的应用。

DNS 过滤有几条边界值得知道

做过滤的解析器负责回答域名查询,因此它能让被拦截的主机名根本解析不出来。但它看不到页面内部:如果广告和文章来自同一个主机名,这次查询就是合法的,广告照样送达。它也只管走它的那些查询,自带加密解析器的应用完全可以无视系统设置。

在 Android 上,私人 DNS 设置正是这件事变尖锐的地方,因为公司隧道可能为内部域名装上私人解析器。为了拦广告而把它换成公共过滤解析器,会破坏那些内部名称,这比广告的后果更糟。改之前先看清设置,保留隧道需要的那部分。

验证,然后别去动隧道

动手验证你选的组合,而不是相信两个图标。连上隧道,确认 VPN 列表显示的是你预期的服务,然后打开一个有已知广告位的页面和一个你知道会放广告的应用,看哪一个输出干净。关掉过滤器再重复一遍,这样你才能确定差异来自过滤器,而不是缓存的页面。

如果组合不奏效,去掉其中一个,而不是两个来回切换。来回切换会让你一直猜哪个应用赢了那个位置,也把真正的约束藏起来,而不是与它共处。

有几种改动不属于这里:给设备 root、修改其他应用、用新信任的证书拦截 HTTPS。那些是性质不同的决定,各有各的风险,而普通的浏览器过滤不需要其中任何一项。如果某篇教程从那里讲起,它解决的是另一个问题。

相关文章