DNS是什么？它是如何工作的

DNS 是什么？

DNS，全称 Domain Name System，即域名系统。

DNS 的作用

DNS 的作用就是将域名转换为 IP 地址

DNS 的意义

DNS 的作用就是将域名转换为 IP 地址，使得人们不用记忆复杂的数字，转而记忆有意义的域名。

DNS 如何工作？

我们可以简单地把 DNS 的工作流程看做：一个图书管理员在一个很大的图书馆里找一本图书。

涉及网页加载的 4 个服务器

DNS 递归解析器（DNS Recursive Resolver）

角色：图书管理员

DNS 递归解析器是一种服务器 / 计算机，通过 Web 浏览器等应用程序接收客户端计算机的查询。解析器一般负责发出其他请求以满足客户端 DNS 的查询。

根域名服务器（Root nameserver）

角色：指向不同书架的索引

根域名服务器是将主机名转换成 IP 地址的第一步

TLD 名称服务器（Top Level Domain Server）

角色：图书馆中一个特定的书架

服务器上托管了主机名的最后一部分（例如：example.com 中，TLD 服务器为”com”）

权威性域名服务器（authoritative nameserver）

角色：书架上的字典

权威域名服务器是域名服务器查询中的最后一站。如果权威性域名服务器能够访问请求的记录，则其会将已请求主机名的 IP 地址返回到发出初始请求的 DNS 解析器（图书管理员）。

DNS 查找的步骤

DNS 查询过程

用户在 Web 浏览器中键入 “example.com”，查询传输到 Internet 中，并被 DNS 递归解析器接收。

接着，解析器查询 DNS 根域名服务器（.）。

根服务器使用存储其域信息的顶级域（TLD）DNS 服务器（例如 .com 或 .net）的地址响应该解析器。在搜索 example.com 时，我们的请求指向 .com TLD。

解析器向 .com TLD 发出请求。

TLD 服务器随后使用该域的域名服务器 example.com 的 IP 地址进行响应。

递归解析器将查询发送到域的域名服务器。

域名服务器把example.com 的 IP 地址返回解析器。

然后 DNS 解析器使用最初请求的域的 IP 地址响应 Web 浏览器。（此时浏览器才算拿到 IP）

浏览器向该 IP 地址发出 HTTP请求。

位于该 IP 的服务器返回将在浏览器中呈现的网页。

DNS 查询有哪些类型？

递归查询

在递归查询中，客户端要求 DNS 服务器（一般为 DNS 递归解析器）将使用所请求的资源记录响应客户端，或者如果解析器无法找到该记录，则返回错误消息。

迭代查询

DNS 客户端将允许 DNS 服务器返回其能够给出的最佳应答。如果所查询的 DNS 服务器与查询名称不匹配，则服务器将返回对较低级别域名空间具有权威性的 DNS 服务器的引用。然后，DNS 客户端将对引用地址进行查询。此过程继续使用查询链中的其他 DNS 服务器，直至发生错误或超时为止。

非递归查询

当 DNS 解析器客户端查询 DNS 服务器以获取其有权访问的记录时通常会进行此查询，因为其对该记录具有权威性，或者该记录存在于其缓存内。DNS 服务器通常会缓存 DNS 记录，以防止更多带宽消耗和上游服务器上的负载。

什么是 DNS 缓存，缓存存在哪里，作用是什么，缓存如何工作？

缓存的目的就是将数据临时存放在某个位置，从而在之后的响应中，能够把存放在某个位置的数据直接返回。DNS 的高速缓存将数据存储在更靠近请求客户端的位置，以便尽早地解析 DNS 查询，并且能够避免 DNS 查找链中进一步的额外查询，从而加快速度，缩短加载时间。

DNS 数据可以缓存到不同的位置，每个位置的存储数据的有效期由 TTL（生存时间）决定。

浏览器 DNS 缓存

现代 Web 浏览器设计为默认将 DNS 记录缓存一段时间。目的很明显；越靠近 Web 浏览器进行 DNS 缓存，为检查缓存并向 IP 地址发出正确请求而必须采取的处理步骤就越少。发出对 DNS 记录的请求时，浏览器缓存是针对所请求的记录而检查的第一个位置。

操作系统 DNS 缓存

操作系统级 DNS 解析器是 DNS 查询离开您计算机前的第二站，也是本地最后一站。操作系统内旨在处理此查询的过程通常称为 “存根解析器” 或 DNS 客户端。当存根解析器获取来自某个应用程序的请求时，首先检查自己的缓存，看是否有这条记录。如果没有，则将本地网络外部的 DNS 查询（设置了递归标记）发送到 Internet 服务提供商（ISP）内部的 DNS 递归解析器。

当 ISP 内的递归解析器收到 DNS 查询时，其还将查看所请求的主机到 IP 地址转换是否已经存储在 ISP 的本地持久性层中。

Hosts File

本地的 hosts 文件

高速缓存如何工作

DNS 解析器会将对 IP 地址查询的响应保存一定的时间。这样，解析器可以更快地响应未来的查询，并且无需与典型 DNS 解析过程中涉及的许多服务器进行通信。只要与该 IP 地址关联的指定生存时间 (TTL) 允许，DNS 解析器就会将响应保存在其高速缓存中。

无缓存：

有缓存：

什么是 DNS A 记录

Address Record. Indicates the IP of the domain.

“A” 代表”Address“地址，这是最基础的 DNS 记录类型，它表示给定域的 IP 地址。比如拉取 [cloudflare.com](http://cloudflare.com)的 DNS 记录，A 记录返回的 IP 地址为：104.17.210.9

”AAAA” 代表 IPv6 地址

什么时候使用 DNS A 记录

A 记录最常见的用途是 IP 地址查找，将域名与 IPv4 地址进行匹配

什么是 MX 记录

Mail Exchanger. Helps route the emails to the relevant server.

DNS “邮件交换”(MX) 记录将电子邮件定向到邮件服务器。MX 记录指示如何根据简单邮件传输协议（SMTP，所有电子邮件的标准协议）路由电子邮件。与 CNAME 记录类似，MX 记录必须始终指向另一个域。

邮件传输代理 (MTA) 软件负责查询 MX 记录。当用户发送电子邮件时，MTA 会发送一个 DNS 查询，以确定电子邮件收件人的邮件服务器。MTA 与这些邮件服务器建立 SMTP 连接，从优先级高的域开始（在上面的第一个示例中，即为 mailhost1）。

什么是 NS 记录

Name server Record. Indicates the authoriative servers.

NS 代表 “域名服务器”，域名服务器记录指示哪个 DNS服务器对该域具有权威性（即，哪个服务器包含实际 DNS 记录）。基本上，NS 记录告诉互联网可从哪里找到域的 IP 地址。一个域通常会有多个 NS 记录，这些记录可指示该域的主要和辅助域名服务器。倘若没有正确配置的 NS 记录，用户将无法加载网站或应用程序。

什么是 CNAME 记录

Canonical name. Points a domain or subdomain to another domain.

当域名或子域名是另一个域名的别名时，使用 “规范名称”(CNAME) 记录代替 A 记录。所有 CNAME 记录必须指向一个域，而不是一个 IP 地址。想象一个寻宝游戏，每条线索指向另一条线索，最后一条线索指向宝藏。具有 CNAME 记录的域就像一条线索，可以将您指向另一个线索（具有 CNAME 记录的另一个域）或宝藏（具有 A 记录的域）

例如，假设 blog.example.com 的 CNAME 记录的值为 “example.com”（没有 “blog”）。这意味着当 DNS服务器点击 blog.example.com 的 DNS 记录时，它实际上会触发另一个对 example.com 的 DNS 查找，并通过其 A 记录返回 example.com 的 IP 地址。在这种情况下，我们会说 example.com 是 blog.example.com 的规范名称（或真实名称）。

一个常见的误解是 CNAME 记录必须始终解析为其指向的域所在的网站，但事实并非如此。CNAME 记录仅将客户端指向与根域相同的 IP 地址。** 客户端访问该 IP 地址后，Web 服务器仍将相应地处理 URL。** 例如，blog.example.com 可能有一个 CNAME 指向 example.com，从而将客户端定向到 example.com 的 IP 地址。但是，当客户端实际连接到该 IP 地址时，Web 服务器将查看 URL，发现它是 blog.example.com，并且提供博客页面而不是主页。（同一个 IP，Web 服务器根据路由来显示内容）

什么是域名

域名是一个文本字符串，映射到一个数字 IP 地址，可用于从客户端软件访问网站。用简单的语言来说，域名是用户在浏览器窗口中键入以访问特定网站的文本。例如，Google 的域名是 “google.com”。

域名有哪些组成部分

域名通常分为两个或三个部分，各个部分用一个点分隔。从右到左阅读时，域名中的标识符从最广泛到最具体。域名中最后一个点右边的部分是顶级域 (TLD)。其中包括 “.com”、“.net” 和 “.org” 等 “通用” TLD，以及 “.uk” 和 “.jp” 等特定国家 / 地区的 TLD。

TLD 的左侧是第二级域（2LD），如果 2LD 的左侧有任何内容，则称为第三级域（3LD）。我们来看个例子：

对于 Google 的美国域名，“google.com”：

“.com” 是 TLD（最广泛）

“google” 是 2LD （最具体）

域名和 URL 有什么区别

统一资源定位符（URL）有时也称为网址，包含站点的域名以及其他信息，如传输协议和路径等。例如，在https://cloudflare.com/learning/ 中，“cloudflare.com” 是域名，而 “https” 是协议，“/learning/” 是指向网站上特定页面的路径。

涉及 DNS 的攻击有哪些

DNS 欺骗 / 缓存中毒

这是将伪造的 DNS 数据引入 DNS 解析器缓存中的攻击，其将导致解析器返回域的错误 IP 地址
。流量可能会被转移到恶意计算机或攻击者想要的其他任何位置，而不是前往正确网站；

打个比方，毕业班的学生做了一个恶作剧，毕业班学生调换他们校园内的所有教室号，使得那些不知道校园布局的新生第二天迷路并出现在错误的教室中。现在想象一下，不匹配的教室号（记录）到校园指示牌（目录）中，学生不断前往错误的教室，直到有人最终注意到并更正了目录为止。

因为 DNS 解析器通常无法验证其缓存中的数据，因此错误 DNS 信息会保留在缓存中，直到生存时间（TTL）到期或手动将其移除为止。许多漏洞可能使 DNS 中毒，但主要问题是 DNS 是为远远更小的 Internet 构建的，并且基于信任原则（非常类似于 BGP）。一种更安全的 DNS 协议称为 DNSSEC，其旨在解决其中的一些问题，但尚未得到广泛采用。

DNS 隧道

这种攻击使用其他协议通过 DNS 查询和响应建立隧道。攻击者可以使用 SSH、TCP或 HTTP在大多数防火墙未察觉的情况下将恶意软件或被盗信息传递到 DNS 查询中。

DNS 劫持

在 DNS 劫持中，攻击者将查询重定向到其他域名服务器。这可通过恶意软件或未经授权的 DNS 服务器修改来实现。尽管其结果与 DNS 欺骗的结果相似，但这是一种截然不同的攻击，因为其目标是域名服务器上网站的 DNS 记录，而不是解析器的高速缓存。

如何使 DNS 缓存中毒

攻击者可通过假冒 DNS 域名服务器，向 DNS 解析器发出请求，然后在 DNS 解析器查询域名服务器时伪造答复，使 DNS 缓存中毒。这之所以可能，是因为 DNS 服务器使用 UDP 而非 TCP，并且当前没有对 DNS 信息的验证。

为什么攻击者很容易伪造请求和答复？

DNS 请求和相应均使用的是 UDP 协议而不是 TCP 协议，因此 UDP 很容易伪造 – 攻击者可通过 UDP 发送消息，并通过伪造标头数据来假装这是来自合法服务器的响应。

如果 DNS 解析器收到伪造的响应，它会不加鉴别地接受并缓存这些数据，因为无法验证这些信息是否正确且来自合法来源（UDP 是单向的）。

中毒的 DNS 缓存

TTL 的作用

TTL 的设置会影响更新。举个例子：当 TTL 设置为 30 秒，第二次 DNS 查询请求过期的时候，缓存过期，会得到最新的版本。如果 TTL 设置为 300000 秒，即使更改了 DNS 解析记录，也无法马上得到修改相应，必须等待 DNS 缓存过期。

如何让一个多台设备 / 多个服务共享一个域名（负载均衡）

创建两条 DNS 解析，相同的域名分别指向不同的 IP。

当我们访问这个域名的时候，触发 DNS 查询请求，这时候 DNS 解析器（Resolver）找到两条符合的记录。它将决定以哪种顺序返回它们，可能是以下几种方式的一种

以收到它们的相同顺序返回记录

每次收到请求都改变顺序

随机挑选一个顺序

别的一些什么

参考

什么是 DNS_DNS 如何工作

DNS in One Picture (roadmap.sh)

what-is-dns-poisoning-and-dns-spoofing

What is a Domain Name? - Learn web development | MDN (mozilla.org)