DNS(域名系统)是如何工作的?

1,142 阅读13分钟

前言

您是否想知道当您在浏览器中键入任何网站的URL时幕后会发生什么?每当我们键入网站地址(例如www.google.com)时,浏览器都会在几毫秒内为我们加载一个页面。浏览器执行多项操作,如网站 ip 地址查找、加密、响应解析等。最后我们有一个漂亮的网页可以与之交互。

如果您使用的是 淘宝、微信 或 支付宝 等移动应用程序,您甚至不必输入网址。该应用程序本身会处理所有事情并处理每个用户请求。

任何客户端设备在访问网站之前执行的第一步是 DNS 查找。DNS 是域名服务器,其工作是将网站名称转换为 IP 地址。它是最重要的组件,DNS 级别的中断会导致任何网站瘫痪。

在本文中,我们将深入探讨 DNS 的内部结构以及为什么需要它。我们将了解处理 DNS 查询所涉及的不同组件。此外,我们将了解这个过程中涉及的优化和漏洞。

欢迎关注个人公众号【JAVA旭阳】交流学习

为什么要有域名服务器?

互联网上的每个网站都驻留在服务器上。您可以将每个网站视为在互联网上数百万台计算机中的一台上运行的应用程序。当您键入www.google.com等网站名称时,您的浏览器如何知道要联系哪台计算机?计算机只处理 1 和 0,对网站名称一无所知。

计算机只能理解 1 和 0

托管网站的每台计算机都由 IP 地址唯一标识。与我们拥有家庭住址的方式类似,每个网站也驻留在具有 IP 地址的计算机上。就像一座建筑可以有多间公寓一样,一台计算机可以托管多个网站。

对于连接到 Web 服务器的任何设备,它必须知道托管它的计算机的 IP 地址。有两种类型的 IP 地址 IPV4 和 IPV6。IPV4 地址的格式为 10.45.0.9810.32.64.322405:200:1602::312c:8220 是 IPV6 地址。我们很难记住 IP 地址。此外,网站可以从一台计算机移动到另一台计算机。在这种情况下,网站的 IP 地址会发生变化。

我们无法记住人们的电话号码,所以我们将它们存储在日记或我们的电话联系人中。同样的原则被扩展并应用于网站。DNS 就像所有网站的 IP 地址的主管。当在浏览器中输入新的 url 时,浏览器会联系 DNS 来解析 IP 地址,然后启动与网站的通信。

DNS 有什么作用?

DNS 是一组实体,负责存储互联网上每个网站的 IP 地址。任何实体都可以在任何网站上执行查找并获取其 IP 地址。让我们打开一个新的浏览器选项卡并启动开发人员工具。我访问了网站www.facebook.com,这些是网络中时间部分的详细信息:

加载网站所花费的时间

正如所观察到的,有一段 DNS 查找需要12.25 毫秒才能完成,加载网站的总时间为419.41 毫秒。

现在,让我们看看这个服务器的 IP 地址。标头部分将显示本网站的 IP 地址。DNS 查找返回网站的 IPV6,我们的浏览器向同一服务器发送请求。

远程地址是网站的IP地址

有一个名为 as 的命令行实用程序nslookup可帮助您查找任何网站的 IP 地址。让我们尝试nslookup在网站上执行一个www.google.com

www.google.com上的 nslookup 结果

上图显示了nslookup的结果,如果您在浏览器中使用上述 IP 地址,您将被重定向到 google

如下图所示,我在浏览器的 url 栏中输入了 IP 地址,它把我重定向到了www.google.com

http 重定向到 www.google.com

DNS 的重要性

DNS 设计得非常好,它向最终用户隐藏了很多复杂性。如果 DNS 停止工作,您将无法访问任何网站。

微软经历了一次中断,因为它的 DNS 服务器被查询淹没并且没有响应。它影响了大多数微软产品,如 XboxOneNoteOneDriveDynamics 365 等。

2021 年 10 月,Facebook (Meta) 出现故障,导致 InstagramFacebookWhatsApp 近 6 小时无法使用。Facebook 在停电期间损失了近 1.6 亿美元。这解释了 DNS 在互联网上扮演的重要角色。

DNS 查找如何工作?

到目前为止,我们已经了解 DNS 的作用就像是世界上所有有效网站的目录。您可能认为一台计算机足以保存所有这些信息。但 DNS 并非如此。现在让我们了解 DNS 的内部工作原理。

如果单个服务器存储所有网站的映射会怎样?每秒都有数万亿个客户端发送的请求。单个服务器无法处理这么多请求。它将成为瓶颈和单点故障。因此,该系统由分布在全球各地的不同组件组成。

DNS 系统由多个组件组成。以下是涉及的不同组件:

  • DNS 解析器 (DNS resolver
  • 根服务器(Root Server
  • TLD(顶级域)服务器(TLD (Top-level Domain) Server
  • 权威名称服务器(Authoritative Name Server

让我们了解请求处理流程并深入了解每个组件。

DNS 解析器

当您第一次在浏览器中输入 url 时,浏览器并不知道该网站的 IP 地址。浏览器首先联系 DNS 解析器。解析器由 Internet 服务提供商 (ISP) 管理。

浏览器向 DNS 解析器发送请求

解析器检查它是否具有与该网站对应的 IP 地址。如果是,则将相同的内容返回给客户端(浏览器)。如果解析器找不到 IP 地址,则会向 DNS 根服务器发送请求。

根服务器

在了解根服务器之前,让我们做一个快速实验。您可以访问任何已知网站并在末尾附加一个点 (.)。例如:如果网站是www.gmail.com,那么它将是www.gmail.com.

现在,在浏览器的地址栏中输入此网站(附有点, 您的浏览器会将您带到该网站并视为没有附加点。如果您将点替换为任何其他字符,例如+, [,]等,请求将失败。

浏览器无法打开我的博客,最后有 ]

网站的 URL 由多个部分组成,以.. DNS 系统以层次结构的形式组织。(.点) 出现在顶部,顶级域如com, org, edu,gov等作为其子域。每个顶级域都引用实际的网站,例如www.wikepedia.org, www.google.com等。每个网站都可以定义自己的域。

下图解释了层次结构

DNS层次结构

根服务器出现在顶部,负责识别顶级域 (TLD) 服务器。因此,如果您发送 的 DNS 查找查询www.wikepedia.org,则本例中的顶级域为.org。因此,根服务器现在将向顶级域服务器发送查询以解析 IP 地址。

处理 DNS 查询的根服务器

有 13 个不同的根 DNS IP 地址。root DNS 服务器由马里兰大学、VeriSign、NASA 等不同组织管理。在幕后,有近 1000 个不同的根服务器以确保高可用性和冗余, 服务器遍布全球。由于IPV4地址的原始限制,他们只为root DNS服务器分配了13个不同的IP。

顶级域服务器

顶级域服务器管理和存储对每个网站的实际名称服务器的引用。一旦根服务器识别出顶级域服务器,它就会发送一个 DNS 查询。

顶级域现在查找 url 的下一部分。url 在每个服务器上以从右到左的方式遍历。因此,如果该网站是www.google.com,那么顶级域服务器将尝试找到存储google.com, 存储网站与其 IP 地址的实际映射的服务器称为权威名称服务器。

一旦获得权威名称服务器的 IP 地址,TLD 就会将请求委托给它。

TLD 服务器解析名称服务器

现在,您可能会问 TLD 服务器如何知道权威名称服务器。这发生在域注册期间。有一些实体称为域注册商,他们将此信息发布到每个 TLD 服务器并使网站可用。

权威名称服务器

最后,请求到达权威名称服务器。然后名称服务器检查网站名称与其 IP 地址之间的映射是否存在。

名称服务器返回网站 IP 地址

如果是,则将其传递回客户端。然后,客户端使用 IP 地址并向托管该网站的服务器发送请求。

访问网站的浏览器

如果该网站不存在,则不会返回任何地址。客户将无法访问该网站。如果无法获取网站的 IP 地址,浏览器会显示以下错误。

输入www.invalidwebsite.com

www.invalidwebsite.com上的 nslookup

同样,nslookup也返回类似的结果,无法获取给定网站的 IP 地址。

DNS 查询的类型

有两种类型的 DNS 查询——递归和迭代。

递归 DNS 查询

我们在上一节中看到了这种类型的查询。第一个请求转到 DNS 解析器。如果 DNS 解析器找不到映射,它会将请求发送到根服务器。此外,根服务器将查询发送到 TLD 服务器。这一直持续到请求到达最终的权威名称服务器为止。

下图说明了递归 DNS 查询的工作原理。

递归 DNS 查询

响应从权威名称服务器传播,直到它到达客户端。因此,每个组件负责将请求转发给后续组件。递归 DNS 查询比迭代查询更快。

迭代 DNS 查询

在这种类型中,DNS 解析器首先向根服务器发送请求。然后根服务器回复 TLD 服务器的信息。解析器然后查询 TLD 服务器。此外,TLD 服务器会将权威名称服务器返回给解析器。最后,解析器将联系权威名称服务器。

下图说明了迭代 DNS 查询的工作原理。

迭代 DNS 查询

在迭代 DNS 查询中,DNS 解析器主动参与向每个 DNS 组件发送请求。与递归查询不同,DNS 组件之间没有交互。每个组件只是将下一个组件的地址发送给解析器。由于多次来回通信,这些类型的查询需要更长的时间。

优化 DNS 查找查询

我们在其中一个插图中看到 DNS 查找时间为 12.25 毫秒。这因每个网站而异,取决于互联网流量和地区。由于http是无状态的,浏览器每次访问一个新页面都要向服务器发送一个http请求。

浏览器是否对您在网站上访问的每个页面执行 DNS 查找?试想一下,如果它在每次访问网站资源时都执行 DNS 查找会发生什么。

缺点是在访问任何页面时会有 10-20 毫秒的额外延迟。此外,DNS 服务器会被请求淹没。此外,它还会增加处理不断增加的负载的成本。

为了克服这个问题,缓存被广泛用于 DNS 查找工作流程。缓存在多个地方被利用。执行成功查找后,浏览器会缓存 IP 地址并设置 TTL(例如 24 小时)。添加了由客户端设备的操作系统维护的类似条目。

构成 DNS 系统的组件也会缓存查询结果。如果未过期,每个组件都会返回缓存的条目。如果服务器在其缓存中找不到条目,它将向下一个服务器发送请求(递归 DNS 查询)。

缓存 DNS 记录

添加缓存可加快 DNS 查找过程。当一个网站第一次上线时,只有第一个用户会观察到访问它的延迟。对于其他用户,根服务器将返回缓存的结果,从而缩短页面加载时间。

什么是 DNS 缓存中毒?

我们现在将了解 DNS 查找过程中涉及的漏洞有哪些。DNS 缓存加速所有查找查询。但是,现有设计存在一些缺点。

假设我是一名黑客并启动了一个恶意网站。该网站将映射到某个 IP 地址,例如:116.243.41.130。让 IP 地址www.google.com118.45.54.23。如果用户访问 google,那么所有的 DNS 组件都会缓存 IP 地址118.45.54.23。如果我更改 DNS 解析器的缓存并将 IP 地址修改www.google.com116.243.41.130(恶意的)怎么办?

DNS正常工作

新用户在其浏览器中输入 google 将被定向到恶意网站。对于新用户,浏览器和操作系统缓存查找将失败。请求将到达 DNS 解析器,解析器将返回更新后的 DNS 条目。现在,让我们了解黑客如何更改此条目。

DNS 缓存中毒

DNS 组件遵循特定的通信协议。他们使用 UDP 协议发送请求和处理响应。UDP 不是面向连接的,也没有像 TCP 那样的握手。

A设备之间的 UDP 通信B如下图所示。

两个设备之间的UDP通信

我们可以引入一个新的实体C(恶意实体),它将欺骗 IP 地址和端口B并将数据包传送到A。设备A会假定数据包来自B。DNS 缓存中毒使用相同的概念。恶意用户伪造权威域名服务器的 IP 地址并将数据包发送到 DNS 解析器。

解析器中添加了不正确的映射,用户可能会被重定向到恶意网站。由于通信在几毫秒内发生,因此攻击的机会较少。此外,欺骗很困难,因为它们Source Port可能会有所不同。攻击者必须暴力破解所有端口并发送不同的响应数据包。

总结

DNS 就像互联网上所有网站的目录。它是由多个服务器组成的全球分布式系统。DNS 解析器可以使用递归或迭代查询来执行 DNS 查找。

DNS 系统使用缓存来优化查找调用。缓存在整个堆栈的多个位置完成。网站地址可能被欺骗,DNS 缓存可能被投毒。在缓存中毒的情况下,用户可能会被重定向到恶意网站。

欢迎关注个人公众号【JAVA旭阳】交流学习