DNS:内容拦截的规模
本文章根据 AdGuard CTO Andrey Meshkov 在 Ad Blocker Dev Summit 2021(2021 年广告拦截科技盛会 )上的讲座撰写。所以大家可以观看视频或阅读这篇文章以了解内容拦截的规模。
从电视机和手机到智能灯泡和智能车,今天世界万物都可以连接到互联网上。鉴于广告及广告跟踪器在互联网上随处可见,看起来基于浏览器的广告拦截程序并不够用。它们只开了一扇通过“纯净互联网”的小窗户,只能避免恼人的横幅和弹出广告。但是,如果用户想要将这扇小窗户改成一扇门,那么该怎么办呢?
系紧安全带并准备好一起来一场穿越 DNS 过滤的过去、现在及将来的时间旅行吧。为什么?因为 DNS 是我们的答案!
DNS 层面拦截的是什么
DNS 是指“域名系统”。它的目标是将网站名称转换成浏览器能识别的 IP 地址。也就是说,DNS 可以说成是互联网“地址列表”。因此,每次用户访问网站,浏览器都能给特定服务器(DNS 服务器)发送 DNS 请求以判断网站的 IP 地址。一般 DNS 解析器会直接返回被请求网域的 IP 地址。
用户的设备总使用某一个 DNS 服务器以获得 APP 想要访问的域名的 IP 地址
有些 DNS 服务器提供 DNS 层面的拦截。一般,拦截是通过 DNS 沉洞技术(DNS Sinkholing)进行的。DNS Sinkholing 技术是指分配给受屏蔽网域的不可路由的地址。当用户设备发送“不好”的请求,包括广告或跟踪器,DNS 服务器给被屏蔽的网域回应 0.0.0.0 IP 地址。因此 APP 就无法连接该地址,而我们获得所需要的结果就是避免连接。
一个使用 DNS 服务器阻止网域访问的例子
另一个办法是,返回 NXDOMAIN (这意味着网域不存在)或 REFUSED(这意味着服务器拒绝处理某一个请求)。大家可能搞不清它们俩的区别,但是有些旧设备可能会误解 REFUSED 并试图使用备用 DNS 服务器。
DNS 的前身 —— HOSTS 文件
惊人的是,DNS 层面拦截是广告拦截的最古老的方法。怎么可能?
回到互联网还很“年轻”,叫做阿帕网的时代,有一种被设计的命名系统,该系统将电脑的 IP 地址与独特的基于 ASCII 的标识符匹配。当时只有几台电脑连接到阿帕网的时候,美国国防部网络信息中心支持所谓的 HOSTS.TXT 的文件。这是每一台电脑地址及其主机名的主要列表。系统管理员会定期地下载 hosts.txt。当时,如果你知道阿帕网电脑的名字,你就可以在 HOSTS 文件上查看它的 IP 地址。
这就是阿帕网 HOSTS.TXT 文件的样子
但是很快人们就发现,由于主机数量不断增加导致 NIC(网络信息中心)电脑的装载量过高。每个人都想要把它们的电脑连入阿帕网,但它们都要等待 NIC 更新 HOSTS.TXT 的文件。因此 1987 年尾保罗·莫卡派乔斯(Paul Mockapetris)发明了 DNS 域名系统。
虽然他发明了网域系统,但是 HOSTS 文件也继续存在。之后,互联网广告首次出现时,用户们发现了 HOSTS.TXT 文件可作为阻止列表来避免广告载入(该手法很像 DNS 沉洞)。
一意识到这一点,有些用户就开始创建历史上第一份阻止列表,并将它们分享给其他人。我们有些值得一看的创建于 20 年前,但依旧持续被人改进的阻止列表的例子。比如,Peter Lowe、Steven Black 或 Dan Pollock 的列表。
Peter Lowe 阻止列表片段
当用于火狐浏览器的 Adblock 首个版本出现时,有些用户就不明白其任务。用户都对使用 HOSTS 文件的效果很满意。
2003年论坛上的一部分
不过,HOSTS 文件有一些很难解决的问题。
- 发放更新版本。没有有效的方式给用户定时提供更新的 HOSTS 文件。用户需要具特殊软件来做这个,或用户需要耐心地手动定期去更新它。
- HOSTS 文件非常大。由于用户无法使用通配符并需要列入每一个网域,HOSTS 文件通常容易变得非常大。HOSTS 文件语法根本不应该被这样使用。下面是最长的阻止列表(Energized Unified)之一的图像。大家可看到,它包含超过 70 万个网域。它的大小是 21 兆字节左右。如何天天给数百万的用户分享 21 Mb 的文件可不是一个简单的问题。
Energized Unified 的阻止列表
后来,拦截广告的公共 DNS 服务器出现作为使用 HOSTS 文件的替换方式。只要让一个设备的配置使用该服务器,即可不再处理 HOSTS 文件的更新。第一个公共 DNS 服务器之一发明于 2016 年,叫做 Alternate DNS,只有一个人处理它。2016 年晚些时候,我们也发布了 AdGuard DNS。
DNS 拦截器的新开端
直到最近,DNS 作为行业标准几乎一直被雪藏。近年来只对其进行了小修小补。但是最近这个新标准呈现了爆发性增长。主要是因为 DNS 加密的兴起,包括 DNS-over-TLS、DNS-over-HTTPS、DNS-over-QUIC。它们一举成为了主流,并对内容拦截产生了重大影响!
DNS 加密火爆前普通用户可选的方式太复杂了:
- 使用 HOSTS 文件并想方设法定时更新文件。
- 使用普通 DNS 服务器并接受其所存在的限制,比如无法在手机的移动网络上使用。或是,在桌面端配置每个网络适配器,并了解较低级设置的要求。
- 使用 VPN(或本地 VPN)的软件。
DNS 加密普及以后,有些技术障碍直接消失了。现在配置 DNS 服务器比较简单,并且它可以用于任何网络。当然用户依然需要了解设备设置,但是并没有像以前那么复杂。DNS 加密在 Android 9+(DoT、即将有 DoH)、iOS 14+ 和 macOS 15+(DoT, DoH)、 Windows 11(有所限制)都有本地支持。这一切都对 DNS 拦截方式的普及起到了巨大的推动作用。
除此之外,DNS 加密的发明允许公共 DNS 服务器给用户提供自定义选项,换句话说,每一个用户都有机会可以选择要屏蔽或不屏蔽的内容。以前使用基于 DNS 服务器域名的自定义规则只可以通过“连接”用户 IP 地址进行。
使用 DNS 拦截内容:利与弊
使用 DNS 来拦截内容有优点也有缺点。让我们下述列出一些利弊:
优点
- 不需要安装额外的软件
- 不取决于浏览器或操作系统
- 对性能没有影响
- 启用公共 DNS 服务器允许用户查看完整的互联网。如用户有阻止列表,上述会很有帮助。用户可以取消不使用的规则并及时了解新的威胁。DNS 没有盲点,因为它观察的是所有设备,而不仅仅是浏览器。
- 在处理一些问题时集中式解决方案更有优势。
比如说,让我们看一下 CNAME 伪装。这是一些跟踪器为躲避拦截器而采用的策略。通过 CNAME DNS 记录,它们隐藏实际的第三方域名,将其伪装成第一方域名。使用 AdGuard DNS 我们能够找到所有伪装的网域,并发布它们的列表,如此,连无法访问 DNS 的内容拦截器也能够拦截这些域名。
另一个例子是,使用代理来伪装跟踪器。基本上,可以用 CloudFlare 或 CloudFront 来配置无服务器的代理,而它会隐藏原始第三方网域。一般来说,DNS 不能帮用户解决这个问题,但它可以成为检测此类代理的一个良好起点。
缺点
- 无法处理第一方广告。比如,用户不能屏蔽 YouTube 视频广告,因为它们与合法视频托管在同一个域名上。
- 无修饰过滤。使用 DNS 拦截用户没有大部分广告,但是有破损的框架和广告占位符的不美观网页。
- 破损的可能性更高。比如,有些应用程序或网站由于谷歌分析(Google Analytics)被拦截而受到破坏,且你无可奈何,十分被动。
- 更容易绕过。应用程序可以很容易选择另一个 DNS 服务器。
可以改善的项目
DNS 过滤有些很容易修复或至少减轻的缺点。
拒绝访问错误(Access Denied Error Page)
目前,如果有网域在 DNS 层面被拦截,给用户会显示错误页面。对用户来说苦不堪言。比如,用户可能想要暂时解除封锁,但却根本没有办法做到。
好消息是,有 RFC 文档(一系列以编号排定)。"DNS Access Denied Error Page" 将允许给用户显示美观的错误页面,而不是将丑陋的解决方案(如要求用户安装 HTTPS 协议)扔给用户。
检测加密 DNS 的工作原理
现在要在每一台设备上配置 DNS。那么将 DNS 设置在路由器上不是更便捷吗?有些新路由器已经支持本地 DNS 加密。但是,很多老旧路由器依然只支持普通 DNS 服务器。有一个叫 Adaptive DNS Discovery 的工作组,正在致力于改善这种情况。
值得注意的 RFC 项目:
- "Discovery of Designated Resolvers" 通过特定 DNS 记录允许检测加密的 DNS 服务器。它的工作原理应该是,用户先配置普通 DNS 服务器,然后操作系统向它发送特定 DNS 请求,询问是否有可用的加密 DNS 请求。
- 另一个值得注意的 RFC 项目是用于加密 DNS 服务器的新 DHCP 选项。该选项将要允许路由器将加密 DNS 设置传导至连接到该路由器的计算机。
APP 的检测
还有个东西可以被改善。我们需要学会检测哪一款应用程序发送哪一个 DNS 请求。没有可以帮助我们的 RFC,但是我们可以试图自己建立一种 “DNS 指纹”。至少为火爆的应用程序准备。
如我们知道哪一款 APP 发送 DNS 请求,我们就可以更灵活地控制拦截流程。
- 比如,我们想要拦截 Facebook 跟踪,但是全面拦截它会导致整个 Facebook 应用程序的错误,因此我们想要只在不属于 Facebook 的应用程序里做到这一点。
- 另一个现实问题是,拦截 AppsFlyer(手机分析系统)导致一些流行应用程序受到破坏。我们倾向于选择性地允许 AppsFlyer 运行 —— 只针对受影响的应用程序,否则就将其拦截。
建立这种 "DNS 指纹"需要分析每一款流行应用程序的网络行为,我们正在努力寻找一个解决方案以实现这一目标。
AdGuard DNS 是什么
如你想要使用”更好的互联网“,那么 DNS 与 VPN 和广告拦截程序一定是你的左膀右臂。我们请大家仔细阅读 AdGuard DNS。
那么 AdGuard DNS 到底是什么?这是市面上最精于保护隐私的 DNS 服务之一。它支持可靠的加密协议,包括 DNS-over-HTTPS、DNS-over-TLS 和 DNS-over-QUIC。它可以识别向广告、跟踪器、成人网站(选择性)的请求并用空白回应。AdGuard 有自己的基于托管广告、跟踪器、诈骗网站域名的基础列表,且我们会经常更新此列表。此外,用户可以在阻止列表添加自己的自定义规则。
为了让大家更全面了解 AdGuard DNS 是什么,我将再提到一些要点:
- 它在14个位置设置了多个服务器。
- 这些服务器都通过 BGP(边界路由协议)"宣布"相同的 IP 地址。
- 它目前的负载是每秒约三十万个 DNS 请求。
- AdGuard DNS 用 Golang 语言写的。
- 75% 上下的 DNS 流量是加密的。这就是内容拦截的 DNS 服务器与其他服务器的区别。如果用户看一下 CloudFlare 或 Quad9 的统计数据,可以发现,加密的 DNS 流量只占所有请求的很小一部分。但对于 AdGuard DNS 来说,情况完全不同。大部分流量都是加密的。
DNS 过滤规则语法
AdGuard DNS 阻止列表用特殊 DNS 过滤语法组成。我们不喜欢 HOSTS 文件类型的阻止列表限制,因此在 AdGuard DNS 我们使用的是普及率更高的广告拦截的语法。
DNS 过滤规则的例子。完整的语法规则可以在 Github 上找到
让我们展示一些区别。左边的是 AdGuard DNS 过滤的统计数据(我们默认使用的)。它相对较短,但实际上阻止了大约 90 万个域名。右边的则另一个阻止列表 —— Energized Ultimate。它包含 50 万个网域的 HOSTS 文件,即可以拦截 50 个万网域。
根据 AdGuard DNS 数据的统计数据
AdGuard DNS 服务器节点
每一个 AdGuard DNS 服务器节点都包括几个部分。在客户端界面我们有用 Golang 语言写的 DNS 转发器。它实施全部逻辑,包括 DNS 过滤、缓存等等。
在服务的硬件和软件方面,我们有一个非绑定的服务器实例。它提供 DNS 递归。每个服务器节点的负载在每秒 5000 至 40000 个响应之间。这取决于节点的位置(有些位置比其他位置更受用户欢迎)。
DNS 过滤引擎
DNS 过滤引擎是开源的,因此所有人都可以在 Github 上查看。一共有两个,第一个是 urlfilter 。这是我们在 AdGuard DNS 和 AdGuard Home 上使用的 Golang 库。第一个引擎提供相对较高的性能和较低的内存占用率。第二个是 AdGuard DnsLibs。这是我们在客户端应用程序使用的 C++ 库。除了 DNS 过滤之外,引擎也允许 DNS 加密。
如你想要用 AdGuard DNS 保护自己免受广告和跟踪器侵扰,按照此说明进行操作即可。
放眼未来
基于浏览器的内容拦截器在普通用户中更受欢迎。但对于过滤列表制造者来说,它们却不是主流。由志愿者创建并持续改善的 HOSTS 文件和域名列表远远多于浏览器拦截器的过滤列表。这表明,DNS 层面的拦截有很大的前景。
根据 filterlists.com 的统计数据
总而言之,DNS 内容拦截的前途是什么?首先,DNS 内容拦截将会继续高速增长。Windows 11 带来 DNS 加密的支持,新路由器也支持 DNS 加密,让用户可以更简单地设置并使用 DNS 拦截。
绕过 DNS 内容拦截的比率也要增加,但仍将是微不足道的。绕过它需要“多方合作”,但若想将这件事真的做成,DNS 内容拦截应该像浏览器拦截器一样流行起来才能促成“多方合作”。就目前来看,虽然 DNS 内容拦截增长率很高,但达到那么高的普及率可能还需要修炼很久。
DNS 不会代替基于浏览器的拦截程序的原因很明显,其质量还没有这么好。尽管如此,DNS 拦截会继续存在,并在互联网上用户的隐私和安全方面占据其应有的位置。