ChrAlpha's Blog

Thumbnail-%E4%B8%8D%E5%BF%85%E4%BA%8C%E9%80%89%E4%B8%80%EF%BC%81AdGuard%20%E5%8E%BB%E9%99%A4%E5%B9%BF%E5%91%8A%E4%B8%8E%20Clash%20%E7%BD%91%E7%BB%9C%E4%BB%A3%E7%90%86%E5%85%B1%E5%AD%98

不必二选一!AdGuard 去除广告与 Clash 网络代理共存

2020-08-02·笔记本

曾几何时,你终于再也无法忍受恼人的广告,开始摸索各路招式与之抗衡。确实,市面上已经有许多开源免费去广告方案可供选择,但是它们总是有这样那样的局限性。如果说桌面端只靠浏览器插件就能应付 90% 的场景,那么真正的分水岭其实是在移动端。

身处特殊地带的我,已经习惯 7x24 处于代理环境下。仅靠劫持本地 DNS 端口来拦截广告有点鸡肋,而为此允许其占用系统代理显得更舍本逐末。撇开特含去广告插件的浏览器,应用内广告怎么处理?毕竟移动端不像桌面端,很多时候还是需要应用来完成一些工作。虽说像 Surge/QuantimultX 这些代理工具已经通过中间人攻击实现更深层次的去广告,但这都只是 iOS 的独享 Moment。

能在更多平台上更全面地去广告、并与原来的网络代理行为不冲突的工具本已经少之又少,而 AdGuard 或许正是这些精品中的不二之选。

不只是厌烦广告

广告的存在必然是有它的合理性的。它能帮助生产者在别种渠道获取回报,以便支持他继续免费提供作品,或将价格降至更可接受的范围。但某些投放广告的方式实在不恰当,为了将利益最大化,不惜牺牲原有的体验,这总是很令用户反感的。不仅严重影响用户体验,还容易给用户留下负面印象,打击宣传效果。但是指望所有广告投放者严格规范自己行为、以符合标准的形式投放广告是不切实际的。毕竟在巨大的利益前,人都可以不当人。

借助各种广告拦截工具,很大程度上就是为了拦截这些侵入式的、扰人的广告。这不仅能够保障用户体验,还能节省带宽和性能开销。

但不止于此,AdGuard 还能胜任保护隐私的使命。也许你只是在搜索引擎中搜索了一份讲义,之后打开购物 App 全在给你推这方面的教材。对于比较在意个人隐私的人而言,这是不能容忍的。我希望尽可能少的隐私被他人掌握。

在拦截广告的同时,AdGuard 还可以对一些跟踪器进行拦截。当我们浏览网页时,不仅发送了请求,还传递了许多额外的信息。如访问时的 IP 地址、正在使用的浏览器和系统信息、语言首选项、前一个访问的网站,甚至读取 Cookie 得知更多有关的信息。广告联盟等通过这些信息确定「你」是你、建立关于你的模型,以便进行更个性化的推送。

为杜绝此类现象,AdGuard 不仅拦截跟踪器,还拦截某些不安全的接口、拦截网站之间的联系、伪造浏览器信息等。这些是单靠插件和规则很难做到的,也是我选择应用的一个原因。

AdGuard 是怎么做好这件事的

相较于传统去广告插件,AdGuard 在他们的 KnowledgeBase 知识库 中也提到,AdGuard 主要通过以下三种方式实现去广告:

  • Request blocking:即按照规则阻止(Block)某些连接以达到去广告的目的。网页载入时,某些元素会请求(Request)其他资源。AdGuard 会根据规则检查请求,若命中广告或跟踪器等规则时便予以拦截,阻止其载入。
  • Page code filtering:在网页载入前,AdGuard 会先根据规则过滤一遍网页源码并去除其中包含广告等的代码。相比 Request blocking 让某些元素请求不到,Page code filtering 直接剥除部分代码,让广告根本不去请求。
  • CSS Injection and Javascript:有些广告是通过 JavaScript 动态插入网页的,无需请求外部资源。这样一来前两条便不起作用了,需要额外的操作。AdGuard 通过调整 CSS 和 JavaScript 针对这类广告更彻底的清除。

第一条很常见,而后两条由于浏览器插件限制,只能在客户端实现。在比如 HTTPS 过滤这些会在之后详细配置时再谈。

好好配置 AdGuard

虽说 AdGuard 是付费应用,但也可不只是给钱办事就完事了。想要 AdGuard 发挥全部威力还需要好好配置一番。这里将以桌面端为例,介绍部分 AdGuard 功能,并给出我使用 AdGuard 保证上网体验和保护隐私的一个实践,希望能对你有所帮助。

AdGuard 团队仍在积极开发,AdGuard 软件/插件也在快速迭代。本文所提及的内容有一定时效性,最终以 AdGuard KnowledgeBase 为准。

选取合适的拦截规则

AdGuard Ad filters

绝大多情况下,拦截规则都是广告拦截工具的核心。拦截规则在 AdGuard 被称为广告拦截器,不仅有广告拦截,还能屏蔽跟踪器、社交媒体插件、恼人的弹窗等。不过要注意,虽然通过规则阻止部分元素加载理论上能够加快页面加载,但如果设置了过多的规则,每次都要进行大量比对,反而可能会适得其反。这里按需选取即可。

AdGuard 默认开启的拦截器不多,这里我开启了:

  • 广告拦截
    • AdGuard 基础过滤器
    • EasyList
  • 隐私
    • AdGuard 防护跟踪保护过滤器
    • EasyPrivacy
  • 社交插件
    • AdGuard 社交媒体过滤器
    • Fanboy’s Social Blocking List(包含于 Fanboy’s Annoyances)
  • 扰人的
    • AdGuard 扰人广告过滤器
    • Fanboy’s Annoyances
  • 特定语言
    • AdGuard 中文过滤器
    • EasyList China

当然,即便如此还是可能会有「漏网之鱼」,可以借助「拓展 > AdGuard Extra」手动处理某些元素。

隐形模式充分保护隐私

过滤器已能拦截部分跟踪器,而隐形模式才是专门涉及保护隐私的「大招」。尽管过滤器能拦截大部分网页跟踪器,但正如前面提到过的,「请求网页」这个行为本身就已经泄露很多信息了。隐形模式一步步帮你保护这些个人敏感信息。

常规

先是 4 个常规选项,能够初步阻止一些跟踪:

AdGuard-隐形模式-常规-1

隐藏您的搜索记录会隐藏你使用搜索引擎连入某网站的查询记录,从而使网站难以得知你的管用搜索引擎。

发送「请勿跟踪」请求,AdGuard 在请求网页时一并发送一个请勿跟踪的请求。部分浏览器里也有此项功能,不过即便请求了不要跟踪,最终还是取决于网站的意愿。

移除 HTTP 请求中的 X-Client-Data 数据头,使用 Chrome 浏览器请求任何和 Google 有关的网页时(包括 Double Click 和 Google Analyse),Chrome 浏览器都会把浏览器信息等一同传递给 Google。移除 HTTP 请求中的 X-Client-Data 数据头正是为了拦截这一项的数据。

剥离 URL 中的跟踪参数将会剥离 URL 里的跟踪参数,可以适当避免跨站跟踪情况的发生。同时允许手动配置跟踪参数实现自定义屏蔽。

跟踪方式

紧接着,在跟踪方式里可以限制常见网页跟踪你的方法:

AdGuard-隐形模式-跟踪方式-1

自销毁第三方 Cookie,Cookie 通常用于存储用户登陆信息等。而第三方 Cookie 指并非当前页面生成的 Cookie。即便生成 Cookie 的网站行为干净得体,但是这条 Cookie 被其他网站获取到也可能被滥用。相较于拦截第三方 Cookie,自销毁第三方 Cookie 不会导致第三方登陆失效(第三方登陆大多通过 Cookie 或授权头授权原网站)。我在此处将第三方 Cookie 超时时间上调至 4 小时。

自销毁第一方 Cookie,与前者很像,但是启用后同一网站超时后都需要重新登陆。带来许多不必要的繁琐,所以这里我将其保持关闭。

禁止缓存第三方请求,某些网站可能会在加载页面时加上电子标签(e-tags)。只要缓存未被清除,下次请求时这些标记就有可能一并发给服务端,从而泄露之后访问了哪些网站。

拦截第三方授权头,授权头主要用于登陆授权等,但是也能用于跟踪。且若使用 HTTP 未加密协议发送授权头还有可能导致密钥等重要信息的泄露。但拦截后可能导致某些应用、插件的工作。

浏览器 API

这一项只影响浏览器,不影响其他应用。在此可以禁止某些有安全隐患的浏览器 API。

AdGuard-隐形模式-浏览器API-1

拦截 WebRTC,WebRTC 是一种实时通讯协议,但它可能绕过代理泄露真实 IP 地址。禁用后可能影响 Google Voice (特别是网页版)的正常使用。

拦截推送 API拦截定位 API,这两个 API 分别用于管理浏览器推送和定位。由于我很少使用桌面端的地图以及完全不需要浏览器推送,所以完全禁用这两项。

拦截 Flash拦截 Java,随着前端技术更迭,现在几乎所有网站都移除了 Flash/Java 的依赖。此外 Flash/Java 还有许多严重安全隐患,在 2020 年确实不该让浏览器继续支持它们。

杂项

这部分选项必须包含在请求中,不能被禁止,但可以伪造。

AdGuard-隐形模式-杂项-1

隐藏您的第三方 Referrer可以隐藏你是从哪里跳转过去的。我使用的第三方 Referrer 是 https://www.bing.com

隐藏您的 User-Agent,User-Agent 同样是包含在网页请求头中的,User-Agent 将暴露你所使用的浏览器信息、操作系统等。建议开启此项以使用默认替代信息。

隐藏您的 IP,由于我平时一直开启代理,而这项似乎并无太大作用,于是我将其关闭了。


此外,还有拓展、高级设置中某些项值得留意。例如 AdGuard Extra、使用重定向驱动模式都是我额外开启的。

移动端兼容代理与 HTTPS 过滤

移动端配置项与桌面端大同小异,不再赘述。要注意的是为了更深层次地去广告,绝大多数去广告工具都需要借助系统代理。而如果你本身就有使用网络代理需求,那就比较麻烦了。AdGuard 专门针对此支持了转发至本地代理,这也是 AdGuard 最抓住我需求的一点。

兼容 Clash 网络代理

网络代理工具选择的是 Clash For Android,它很好地支持了开启本地代理的同时不占用系统代理、向内部暴露并监听 DNS 端口。

如果你所使用的代理服务商不支持 Clash 订阅或者 Clash 配置中不含 DNS 配置,你可能需要借助公共 API 整理 Clash 配置文件。

利用 API 整理 Clash 配置文件

基于 subconverter 项目,你可以在许多公共 API 上方便的整理 Clash 配置文件。特别的,你可以使用 subconverter 作者 TindyX 提供的 公共 API 直接将订阅转换为带 AdGuard DNS 的 Clash 配置文件。

请确保 Clash 配置文件至少包含类似以下内容:

port: 7890
socks-port: 7891

dns:
 enable: true
 ipv6: false
 listen: 127.0.0.1:5450
 enhanced-mode: redir-host
 default-nameserver:
    - 119.29.29.29
    - 119.28.28.28
    - 1.0.0.1
    - 208.67.222.222
    - 1.2.4.8
  nameserver:
    - https://dns.alidns.com/dns-query
    - https://1.1.1.1/dns-query
    - tls://dns.adguard.com:853

其中,默认 DNS 监听端口(dns.listen)为 5450、默认 HTTP 代理端口(port)为 7890、默认 SOCKS5 代理端口(socks-port)为 7891。这些参数之后配置时会需要用到。

AdGuard 配置 Clash 转发规则

首先,在「AdGuard > 侧边栏 > 应用管理」中对 Clash For Android 关闭通过 AdGuard 路由应用流量。

AdGuard-关闭处理CFA-1-mod

紧接着,将 Clash 配置导入 Clash For Android 后,在「设置 > 网络」中关闭「自动路由系统流量」以关闭 Clash For Android 的 VPN 模式。随后开启 Clash For Android 代理功能。

CFA-关闭VPN-1-mod

再到「AdGuard > 侧边栏 > 设置 > DNS > 选择 DNS 服务器」最下方「添加自定义 DNS 服务器」。名称任取、地址填写 127.0.0.1:5450(取决于之前配置的 dns.listen 参数)。

AdGuard-DNS-2-mod

返回到「设置」,继续点击「网络 > 代理」,在下方「+ 添加代理」。名称任取、方式选 HTTPSOCKS5)、地址填写 127.0.0.1、端口填写 78907891)。配置完毕后点击「保存并选择」并开启上方代理开关。

AdGuard-Proxy-1-mod

再回到「网络」,继续点击「过滤方式」,选择「本地 VPN」。之后回到主界面,开启主开关,便能在不影响原有代理的前提下享受 AdGuard 为你隐私保驾护航。

安装证书过滤 HTTPS

AdGuard 支持在页面载入前过滤部分代码,但是 HTTPS 加密让 AdGuard 正常情况下无法在载入前得到具体内容,也就无从过滤了。AdGuard 通过安装证书解密流量(Surge/QuantimultX 也使用类似的思路过滤),但是 Target API 24(Android 7.0)以上的 App 不再认可用户证书

对于已经刷入 Magisk 的用户,可以借助 Move Certificates 将证书转为系统证书,从而让 AdGuard HTTPS 过滤对所有 App 生效

Magisk-Mode-1-mod

这应该是全篇唯一一个需要 root 的行为了

辄望 AdGuard 具体实现

AdGuard 总是对几乎所有应用生效,这会一定的浪费性能。对于一些系统 App(电话、信息等)和一定不会有广告的 App,可以考虑关闭 AdGuard 过滤。

上述操作主要针对非 Root 设备打造。毕竟在我看来,去广告实乃大众所需的技能,但 Root 不是,为此专门 Root 便显得略无必要了。

而以上借助的是 AdGuard 的「VPN Mode」,以 AdGuard 作为系统代理接管所有流量并处理——过滤、转发给本地 http 代理等。

AdGuard VPN Mode

不过有点需要注意,子标题下第一段提到了「一定不会有广告的 App,可以考虑关闭 AdGuard 过滤」对吧?但是如果本来要走代理的流量,因为不用去广告把「AdGuard protection」完全关闭,于是乎 AdGuard 就完全不管这部分流量,自然也不转发给本地 http 代理了。偏偏有些 App 需要代理但是出于安全因素 AdGuard 不认为应该过滤(点名一个 Google Play,AdGuard FAQ 中对此也有解释),这些 App 应当打开「AdGuard protection」再关闭「Ad blocking」。如果对你而言代理是上网非常重要一环的话,最佳实践还是全选打开「AdGuard protection」再个别关闭「Ad Blocking」。

apps select best pratice

其实 AdGuard 的知识库里本来就提到 AdGuard 与其他 VPN 共存的解决方案,但只有「Automatic mode」自动劫持流量并处理,并且这种方案刚需 Root。所以正文内容没有介绍,这里稍微提一下。

unalted image

官方知识库只提这个必然有他的理由,其实这种方案才是操作最简单的——只需要在「设置 - 网络 - 过滤方式」中选择「本地 HTTP 代理」并开启「自动」即可。

unalted image

由于先经过系统代理,所以不需要过滤的 App 是否开启「AdGuard protection」倒是无所谓,反正还是会经过代理。此外,「VPN Mode」中 Clash 接收的流量均为 AdGuard 转发过来的,所以以包名为判断过滤规则可能会失效,而「HTTP Mode」当然是无影响的。

AdGuard 官方知识库中介绍的另一种「Manual mode」只在 Wi-Fi 下支持且不同 Wi-Fi 单独配置,实用性极低。更何况 Clash 再转发给本地 http 代理的操作我还没玩明白本文介绍的方案权当对 AdGuard 官方知识库中非 Root 实现的补充吧。

仔细思考下,AdGuard 作为一款付费去广告工具,其付费的合理性何在?为何不直接将一定费用支付给作者使其放弃投放广告,而偏偏选择支付给去广告工具,让作者得不到合理(也许有些是不合理)的收入。而且,去广告工具功能很快就会饱和,框架也会慢慢稳定下来,真正让去广告工具保持生命力的,或许是那一条一条的规则。

但不能就此否认 AdGuard 的贡献。即便它不是最老牌,即便它还有不足。

在我看来,去广告只是 AdGuard 中的一环,而且不是最重要的一环。「Guard」——守卫,对自己隐私的重视与不妥协,才似乎是它希望传递的主旋律。当相当一部分用户对自己隐私的无所谓,认为区区市井小民没必要为隐私下功夫,这是否在一定程度上促成某些不恰当的行为呢?

也许 AdGuard 并非最早实现这些特性的,但它怎么都是完成得非常出色的。它是第一个让我愿意和网络代理工具一起 7x24 后台常驻的、第一个让我在其他应用中也能保持清净、第一个让我实打实减轻对自己的隐私泄露焦虑的工具。就凭此,已经足够让我掏腰包了。


参考链接

不必二选一!AdGuard 去除广告与 Clash 网络代理共存
本文作者
ChrAlpha
发布日期
2020-08-02
更新日期
2020-08-07
转载或引用本文时请遵守 CC BY-NC-SA 4.0 许可协议,注明出处、不得用于商业用途!