在上一篇《DNS 系列(一):为什么更新了 DNS 记录不生效?》中,我们主要讲解了 DNS 和 DNS 传播,知道了网络通信主要通过 IP 地址来进行,而域名系统(DNS)则是保证用户在浏览器中输入域名之后,可以访问到对应的网站服务器。那这个过程到底是如何进行的呢?
DNS 记录是位于权威 DNS 服务器中的指令,提供域和主机名相关的详细信息,包括哪些 IP 地址与该域关联,以及如何处理对该域的请求。
当我们在浏览器中输入网站地址时,浏览器首先要会在计算机内部缓存中查找属于该域名的 IP 地址,如果没有再到网络提供商的数据库或其他 DNS 服务器中查找。
DNS 记录由一系列 DNS 语法编写的文本文件组成。每个 DNS 记录都有一个单独的行。记录通常遵循以下格式:
<name> <ttl> <class> <type> <rdlength> <radata>
< name >:指域,即用户在浏览器中输入的名称
< ttl >:TTL 代表“生存时间”,表示记录可以临时存储在缓存中的时间(以秒为单位)
< class >:理论上,DNS 记录有不同的类别。然而实际中,记录常是 Internet(即 IN),
< type >:不同的记录类型
< rdlength >:指定后续数据字段的大小(可选值)
< rdata >:解析出的域名信息(例如 IP 地址)
我们可以使用 Dig 命令查询 DNS 记录信息,例如:www.example.com
www.example.com. 69288 IN A 93.184.216.34
这代表着该条记录可以在缓存中存储 69288 秒,它涉及 Internet 上的 DNS 记录(IN),并指向了 A 类记录,同时域名被解析为 IP 地址(93.184.216.34)。
上面我们提到了 DNS 记录有不同的类型,这其实是指记录中的信息类型,比较常见的有以下几种:
Internet 上大部分 DNS 解析都是通过 A 类记录进行的,并指向一个 IPv4 地址。通过这个记录,用户在浏览器中输入域名后,客户端向相应的 IP 地址发送 HTTP 请求。由于 IPv4 地址的大小始终为 4 个字节,因此 rdlength 的值始终为 4。
AAAA 记录,也称为“quad A”,功能与 A 记录相同。但是,它指向的是 IPv6 地址。因为 IPv6 的长度为 128 位(16 字节),所以这里也预定义了 rdlength 为 16。
SOA 记录包含区域文件或 DNS 服务器的区域信息。因为 DNS 区域传输是将 DNS 记录数据从一个主名称服务器发送到一个辅名称服务器的过程,而 SOA 记录会首先被传输,所以每个 DNS 区域都需要一个 SOA 记录。
CNAME 记录(规范名称记录)是将记录值指向一个别名域,而不是 IP 地址。对于这种类型,rdata 字段会填充一个域名,该域名可以继续指向下一个域名或 IP 地址。
MX 记录是指邮件交换或 SMTP 电子邮件服务器,MX 记录可以存在多个,通过指定优先级来确定使用顺序。
PTR 记录(指针)是允许反向查找的 DNS 记录。与“A”记录恰好相反,它可以通过 IP 地址来查找对应的域名。
NS(域名服务器)记录会明确特定区域的管辖权。一个域通常会有多个 NS 记录,这些记录可指示该域的主要和辅助域名服务器。正确配置的 NS 记录能告诉互联网可从哪里找到域的 IP 地址,从而完成加载网站或应用程序。
TXT 记录包含了供用户或机器可读信息的文本。一个域可以有许多 TXT 记录。
通过 SRV 记录,服务器可以为一些特定的服务提供主机和端口信息,例如即时通讯等。一些互联网协议需要使用 SRV 记录才能运作。
除了这些常见的 DNS 记录,还有很多不常用的记录类型,例如:APL、CAA、DNAME 等等。了解了 DNS 记录,下一步就来详细看看 DNS 是如何请求到这些记录的。
每当我们在浏览器的搜索栏中输入网址时,都会先向本地名称服务器(Local DNS)发出请求。Local DNS 是一个检查记录是否在本地缓存中的组件,它的查询是递归/迭代查询。
客户端和 Local DNS 是递归查询,这是最常见的一种查询方式。具体来说就是如果 Local DNS 不能响应请求,它会代替客户端向其他根域名服务器继续发出查询请求,即替客户端继续查询,而不是让客户端自己进行下一步查询。
而 Local DNS 和其他名称服务器之间是迭代查询。具体表现为如果 Local DNS 请求的 DNS 服务器无法回答查询,那么它会返回下一个 DNS 服务器的地址作为应答。然后 Local DNS 再向下一个 DNS 服务器发送一个新请求,继续查找直至查到记录。
所以 Local DNS 的查询总体过程是首先将之前获取过的 IP 地址记录到缓存中,并根据请求将结果传递给客户端。如果所需的记录不在 Local DNS 缓存中,则请求将转发到对应网络服务商的 DNS 服务器。如果当前 DNS 服务器无法应答本次查询,它会将请求转发到不同的 DNS 服务器。
需要注意的是递归查询通常会比迭代查询更快。因为递归 DNS 服务器会缓存它执行的每个查询结果,并将结果保存一个 TTL 时间。当递归解析器接收到其缓存中已有的 IP 地址查询时,它可以快速将结果提供给客户端,而无需与其他 DNS 服务器进行通信。但是,在开放的 DNS 服务器上允许递归查询会产生安全漏洞,这种配置容易遭到 DNS 放大攻击和 DNS 缓存中毒。
了解了 DNS 的记录,下次大家再遇到网站无法访问的错误信息时,就可以优先排查是不是 DNS 出现了问题。如果你是网站管理者,可以查看 DNS 记录是否配置错误,或者 DNS 服务器是否无法响应。如果你是网站访问者,可以尝试切换网络或者更换本地 DNS 来解决。