为什么加密 DNS 被视为应用程序级协议而不是操作系统级协议?

为什么加密 DNS 被视为应用程序级协议而不是操作系统级协议?

最近我读了一些关于 DNS 是少数默认以明文运行的协议之一的文章,也有人讨论各种浏览器和应用程序如何整合加密 DNS。因此,作为用户,您基本上必须在每个应用程序(例如 Brave 浏览器)中执行特定操作才能使用加密 DNS。

问题:为什么需要由各个应用程序开发人员来支持加密 DNS?这看上去像是操作系统之类的东西。

就像我的情况一样,我的计算机默认使用 Cloudflare (1.1.1.1) 和 Google (8.8.8.8) 作为 DNS。我猜想当应用程序(浏览器或其他)想要解析主机名时,它会询问 OS API - 然后它会尝试针对 1.1.1.1 或 8.8.8.8 进行加密 DNS,如果失败,则会返回明文。换句话说,我一直认为 DNS 查找是特定于操作系统的杂务,而不是每个应用程序都必须实现的事情。如果确实如此,那么该设计决策背后的理由是什么?

答案1

为什么要由各个应用程序开发人员来支持加密 DNS?这似乎是一种操作系统的事情。

我认为这低估了灵活性和效率。

互联网上的一切都是分布式的,有很多活动部件。对于应用程序开发人员来说,为给定的标准或通信方法提供支持可能比依赖操作系统开发人员更容易。

例如,假设 Fancy Encryption v2 刚刚发布。哪个更容易?一个应用程序开发人员将其包含在自己的程序中,还是等待至少 3 个通用操作系统(Windows、Mac 和 Linux)将其慢慢纳入他们的产品中(假设他们甚至同意这是一个值得纳入的标准)?

这真的不是假设。从技术上讲,目前有两种常见的 DNS 加密方法:

这也排除了向后兼容性问题。目前并非所有 DNS 服务器都使用加密。那么应该使用哪种标准?如果您想选择一个(或都不选),但您的操作系统却做出不同的决定,会发生什么?将与第三方通信的能力锁定在操作系统中意味着,无论谁生产操作系统(默认情况下),对该通信都有更多的控制权。

我想,当一个应用程序(浏览器或其他应用程序)想要解析主机名时,它会询问操作系统 API——然后操作系统 API 会尝试针对 1.1.1.1 或 8.8.8.8 进行加密 DNS,如果失败,则会恢复为明文。

为什么要通过对同一站点进行多次查询来潜在地增加操作系统或 DNS 服务器的工作量?您联系的初始 DNS 解析器要么使用加密,要么不使用加密。这通常是提前知道的,因为计算机最初联系固定的 DNS 服务器池来解析查询。可以说,从通信效率的角度来看,使用这种“后备”方法似乎是一种浪费。

答案2

那么让我们回到基础。不是完全是石器时代,而是更晚一点。您执行了许多连接查询,但没有一个是安全的。公平地说,加密尚未作为标准应用。您执行查询了吗?嗯,是和否。“是”是因为您单击了一些按钮,“否”是因为应用程序执行了这些操作。我在说什么?Mosaic,它是 IE 的基础。

快进一点,我们进入了“下一个层次”:Netscape Navigator 中的选项卡式浏览。对于那些“晚生”的人来说,这是一个里程碑(不仅是微软反垄断案,还有 Firefox 和 Mozilla 基金会的诞生)。现在我们都已经了解了网络(我不是指社交网络)的风险,所以我们可以讨论从网页密码加密到 wifi 安全算法的任何事情。

但让我们从中间过渡一下。加密技术是在这段时间引入的,对吧?我们以某种形式在任何地方使用它,从本地网络到任何东西。当然,它不如 2000 年以后的先进,但仍然是一个开始。感觉不跟上时代?没问题,我们可以快进到 2000 年以后。

现在我们都知道,我们习惯使用的 SSL 加密方案并不安全。我们有各种类型的恶意软件,插入方案也变得更加复杂,从编译程序到访问二维码后下载的应用程序。

不过,我们还是不要偏离主题,把重点放在安全性上:我们得到了 SSL,我们转向了 TLS,那又怎么样?告诉我,你是如何访问连接的?你选择了 TLS 吗?从任何地方?还是浏览器配置为这样做?你甚至可能拥有启动(或监听连接)需要特定算法或方法的本地应用程序。你选择了它吗?也许,但那不是你,也不是应用程序,而是操作系统。

废话不多说了。让我们开始回答。虽然操作系统可以提供主干(即库、算法、设置、支持等),但每个应用程序使用什么作为连接是一个设计选择。你可能会说“如果当前的设置、算法、库和标准有问题,会发生什么?”。答案隐藏在这个答案无聊的介绍下。新操作系统的美妙之处在于它们是动态的和模块化的。即使操作系统在某个时候落后于技术也没关系。有人可以发明/开发一项技术,提供一个库,新应用程序就可以使用它。

这意味着每个加密不仅可以独立于操作系统版本(意味着您的操作系统是什么版本无关紧要),而且可以与操作系统无关(意味着它不代表它是什么操作系统)。最简单的方法(尽管一些顽固的开发人员会因为我如此随意地混淆这些术语而杀了我)是说一项技术(是的 - 包括可执行文件、库、脚本等)可以是跨平台的。

但是让我们从编码方面转到您想知道的内容:DNS。DNS 更多的是网络而不是编码。好吧,“是也不是”。所以,我告诉了您一些历史、设计方法和优势,但它们如何最终成为网络的最终产品?只需记住,网络有一种非常具体的处理方式:端口。虽然使用“HTTP”和“HTTPS”是明确的事情,但向网络解释这一点的最简单方法是使用端口。这又基于标准。

虽然我们可以回顾标准和应用程序的设计周期,但让我们总结一下,想象一下一种集中式的方式,例如操作系统。我们不一定非要谈论 DNS,而是任何其他请求。难道不是在信息到达目的地之前,只破解一个入口点并获得安全信息的访问权限,而不是采用一种易于管理的不断更新的方式更容易吗?(一个简单的例子:Vault 9 通过在加密开始前/结束后破解未加密的入口/出口点来破解 whatsapp 和电报加密的方法,TOR 也是如此,大多数黑客攻击都发生在 TOR 节点)

TLDR,操作系统不知道什么是 DNS,什么是 DNS 请求,什么是 HTTP 请求。它只是一个有效载荷。您需要专用的应用程序来做到这一点。虽然我们可以讨论像 1-1 和 8-8 这样的默认 DNS,但同样,我们知道 Google 和 Cloudflare。操作系统不知道。使用 hosts 文件劫持主机名很容易。操作系统有不同的工作,而不是将 Netflix 路由到您或告诉您魔兽世界服务器的 IP。操作系统的作用是,它可以为您提供获取所需信息所需的工具。如果没有,您可以使用外部库。简单地说,DNS(以及任何其他此类请求)的概念可以更容易地看作是拥有任何可以用作操作系统并完成其工作的简单控制台环境。一切都必须是透明的并且独立于操作系统。

相关内容