DNS查询过程及示例

1、简介

《dnsmasq简介及基于域名的流量管理》一文中简要描述了DNS解析的过程,如下图所示。

本文对查询DNS服务器的工作原理及过程作一个简要描述。

1.1 DNS服务器层级

DNS服务器一般分为三种:根DNS服务器,顶级DNS服务器,权威DNS服务器。

1.2 域名层级

域名的层级是一个树形结构,最顶层是根域名,一般使用 . 表示,例如域名 “www.sunxidong.com” 的写法其实省略了最后的“.”,全称域名(FQND)应该是 “www.sunxidong.com.”。
域名层级如下图所示:

我们一般在各个域名网站中购买和使用的都是次级域名、子域名和主机名了。

2、DNS查询(迭代查询)

以域名 www.sunxidong.com 为例进行描述。当访问域名 www.sunxidong.com 时:

  • (1)本地PC(或其它设备)DNS客户端向配置的DNS解析服务器(一般称为本地DNS服务器)发送查询 www.sunxidong.com 域名的请求;
  • (2)本地DNS服务器收到查询请求时,如果被查询的域名信息包含在其配置区域资源中(本地DNS服务器配置了zone,它知道自己应该掌管哪些域名),则返回解析结果,完成本次域名解析,该解析具有权威性;如果要查询的域名信息不由本地DNS服务器解析,但缓存了该域名的映射关系,则返回这个映射的IP,完成本次域名解析,但此解析不具权威性;如果这两种解析都失败,则直接向根DNS服务器进行查询(还有一种在本地DNS服务器设置了转发服务器的情况,后文介绍);
  • (3)DNS解析服务器首先会向就近的根 DNS 服务器 “.” 请求顶级域名DNS服务 com. 的地址。根DNS服务器会把com所在的DNS服务器域名及其对应的IP地址返回给本地DNS服务器;
  • (4)得到顶级域名DNS服务 com. 的地址之后,会向该顶级域名服务请求负责 sunxidong.com 域名解析的服务器地址。
  • (5)之后,本地DNS服务器就继续去负责 sunxidong.com 的DNS服务器查询对 www.sunxidong.com 这个域名的解析。sunxidong.com 域名对应的DNS服务器是该域名的授权DNS服务器,这个服务器正是在购买这个域名之后用于管理解析该域名的DNS服务器,会配置www.sunxidong.com 对应的IP解析记录(如国内常用的dnspod.cn或阿里的域名解析服务)。
  • (6)sunxidong.com 域名的DNS服务器会把 www.sunxidong.com 对应的 IP 解析记录 (如123.123.123.123)发送给本地DNS服务器。
  • (7)本地DNS服务器把来自授权DNS服务器的IP解析记录发送给本地PC(或其他上网设备),同时本地DNS服务器会在本地把该域名和IP的对应解析记录缓存下来,以便下一次能更快地返回相同解析请求的记录。

经过以上几个步骤,整个DNS解析的流程就完成了。

其中在第(2)步中,提到了本地DNS服务器的情况,其包含 2 种场景:

一种场景是forward only,也就是本地DNS服务器自己并不直接连接到网络,而是配置了一个上游DNS服务器。当本地DNS服务器没有解析到域名的IP地址时,不是去根服务器去查询,而是将域名解析的流量转发给了上游DNS服务器,由上游服务器去继续解析,完成上面步骤中的第(3)步之后的解析操作。当然,上游的DNS服务器也可以有自己的上游DNS服务器。如果上游DNS服务器解析失败,或无法连接网络,则使用该本地DNS服务器的PC(或其他设备也无法上网)。

另一种场景是forward first:本地DNS服务器优先指向上游DNS服务器进行域名解析查询;如果通过上游DNS服务器查询失败,如上游DNS服务器出现故障,则本地DNS服务器会使用其保存的根DNS服务器来进行域名解析,但这种情况下如果要解析的域名是配置在上游DNS服务器上的,仍有可能解析失败。

3、域名解析实例

www.sunxidong.com 为例,利用 Linux 系统下的 dig 命令,了解域名查询的过程,看这个域名的 IP 是如何一步步被解析出来的。

dig 命令首先会向预置的13组根域名服务器发出请求获取顶级域名的地址:

根域名服务器是DNS中最高级别的域名服务器,这些服务器负责返回顶级域名的权威域名服务器地址。根域名服务器的数量共13组,地址如上,是 “x.root-servers.net.”,x从a到m,每个根域名服务器中只存储了顶级域名服务器的IP地址,大小其实也只有2MB左右。
虽然域名服务器总共有13组,但每一组服务器都提供了镜像服务,全球目前有几千台根服务器在运行。

本例中,紧跟在顶级域名服务器之后,得到了以下NS记录,即 com. 定义域名服务器:

接下来就是从这些顶级域名服务器中去查询解析 sunxidong.com ,但就像前面说的,要在互联网中请求服务,最终要获取到这些服务器的IP地址,同理,本例中也必须获得这些顶级域名服务器的IP地址,才能获得次级域名 sunxidong.com 的DNS信息,因此可以在命令行的输出中,看到这些顶级域名服务器绑定的A记录与AAAA记录:

可以看到本例中的根域名服务器选择了 i.root-servers.net

接下来本地DNS服务器会从其中选择一个顶级域名服务器,获取 sunxidong.com 的权威服务器地址,返回的同样有这些权威服务器的IP地址:

可以看到本例中的顶级域名服务器选择了 a.gtld-servers.net
这里的权威服务器是域名所有者在域名的提供商那时配置的,当有客户端请求 sunxidong.com 域名对应的IP时,最终是从这些权威服务器中获取到:

本例中是从权威服务器 jim.ns.cloudflare.com 中获取到两个可用IP,浏览器或其他设备就可以通过该IP 向 www.sunxidong.com 所指向的服务器获取请求的内容了。

参考:
https://www.sunxidong.com/390.html
https://draveness.me/dns-coredns
https://www.zhihu.com/question/23042131
https://www.cnblogs.com/qingdaofu/p/7399670.html
https://www.cnblogs.com/kelamoyujuzhen/p/9526915.html

————————————————————

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《DNS查询过程及示例》

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注