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组根域名服务器发出请求获取顶级域名的地址:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | $ dig -t A www.sunxidong.com +trace +additional ; <<>> DiG 9.11.10-RedHat-9.11.10-1.fc30 <<>> -t A www.sunxidong.com +trace +additional ;; global options: +cmd . 347888 IN NS i.root-servers.net. . 347888 IN NS l.root-servers.net. . 347888 IN NS c.root-servers.net. . 347888 IN NS f.root-servers.net. . 347888 IN NS h.root-servers.net. . 347888 IN NS b.root-servers.net. . 347888 IN NS j.root-servers.net. . 347888 IN NS d.root-servers.net. . 347888 IN NS e.root-servers.net. . 347888 IN NS a.root-servers.net. . 347888 IN NS m.root-servers.net. . 347888 IN NS g.root-servers.net. . 347888 IN NS k.root-servers.net. ;; Received 228 bytes from 192.168.11.1#53(192.168.11.1) in 20 ms |
根域名服务器是DNS中最高级别的域名服务器,这些服务器负责返回顶级域名的权威域名服务器地址。根域名服务器的数量共13组,地址如上,是 “x.root-servers.net.”,x从a到m,每个根域名服务器中只存储了顶级域名服务器的IP地址,大小其实也只有2MB左右。
虽然域名服务器总共有13组,但每一组服务器都提供了镜像服务,全球目前有几千台根服务器在运行。
本例中,紧跟在顶级域名服务器之后,得到了以下NS记录,即 com. 定义域名服务器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766 com. 86400 IN RRSIG DS 8 1 86400 20200324050000 20200311040000 33853 . BAnNMxAua2pJY6jkfBQvLLDF8GVu/lO50nQTldcFNHmMdO/o8HVY3Hm6 wcadpn0/IiuKK/7peUjbf7Umwfq1qNqr9qgEt8oUNib/v/DhteuuMLog 5Cd23wmtoqWNnSk0hTs6kAuUAD+2D2C6sS4tO4fSbwSbuSL0EeSt38aI mo74/JLONLsAbtDWniOefRYPVYQBo9FInE+Erj6GnIEkV2EubqfYPGzO LY9q+YSdXLrruA849B6m5neRCoYaVPFBaOHdYucLHH2j6FbUkJ4RniBz sidBTUFqUkUnJxW3YNa65Y+N1bSDHrHYnzzVA8CmyRg3tWvw8Q0T1qn/ AyDlCg== |
接下来就是从这些顶级域名服务器中去查询解析 sunxidong.com ,但就像前面说的,要在互联网中请求服务,最终要获取到这些服务器的IP地址,同理,本例中也必须获得这些顶级域名服务器的IP地址,才能获得次级域名 sunxidong.com 的DNS信息,因此可以在命令行的输出中,看到这些顶级域名服务器绑定的A记录与AAAA记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | m.gtld-servers.net. 172800 IN A 192.55.83.30 l.gtld-servers.net. 172800 IN A 192.41.162.30 k.gtld-servers.net. 172800 IN A 192.52.178.30 j.gtld-servers.net. 172800 IN A 192.48.79.30 i.gtld-servers.net. 172800 IN A 192.43.172.30 h.gtld-servers.net. 172800 IN A 192.54.112.30 g.gtld-servers.net. 172800 IN A 192.42.93.30 f.gtld-servers.net. 172800 IN A 192.35.51.30 e.gtld-servers.net. 172800 IN A 192.12.94.30 d.gtld-servers.net. 172800 IN A 192.31.80.30 c.gtld-servers.net. 172800 IN A 192.26.92.30 b.gtld-servers.net. 172800 IN A 192.33.14.30 a.gtld-servers.net. 172800 IN A 192.5.6.30 m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9::30 l.gtld-servers.net. 172800 IN AAAA 2001:500:d937::30 k.gtld-servers.net. 172800 IN AAAA 2001:503:d2d::30 j.gtld-servers.net. 172800 IN AAAA 2001:502:7094::30 i.gtld-servers.net. 172800 IN AAAA 2001:503:39c1::30 h.gtld-servers.net. 172800 IN AAAA 2001:502:8cc::30 g.gtld-servers.net. 172800 IN AAAA 2001:503:eea3::30 f.gtld-servers.net. 172800 IN AAAA 2001:503:d414::30 e.gtld-servers.net. 172800 IN AAAA 2001:502:1ca1::30 d.gtld-servers.net. 172800 IN AAAA 2001:500:856e::30 c.gtld-servers.net. 172800 IN AAAA 2001:503:83eb::30 b.gtld-servers.net. 172800 IN AAAA 2001:503:231d::2:30 a.gtld-servers.net. 172800 IN AAAA 2001:503:a83e::2:30 ;; Received 1208 bytes from 192.36.148.17#53(i.root-servers.net) in 58 ms |
可以看到本例中的根域名服务器选择了 i.root-servers.net。
接下来本地DNS服务器会从其中选择一个顶级域名服务器,获取 sunxidong.com 的权威服务器地址,返回的同样有这些权威服务器的IP地址:
1 2 3 4 5 6 7 8 9 10 11 | sunxidong.com. 172800 IN NS jim.ns.cloudflare.com. sunxidong.com. 172800 IN NS lady.ns.cloudflare.com. CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20200318044906 20200311033906 56311 com. rhRAv9iNEsdEGOSvivGKwyPjjkm3VTXAOTlfplQSvyUVMinySUVdkp3o iQfe+zn7L/Zwl+2A5+qF725nPPZW4+ad72AmGVN0iNPXIJi6/Y7Uj3CL 7R4SsdDMa7TvDupfp3GRsJ1CJhhJqQZcd8gtaMWGEt6LwSwIK1ysxHE4 3NqeqVolWcunzzOJDJuFTTYuxFBm17fwOF/6POCW0h39Ug== TI9ITB4NG7TNDF0Q5VN2I00AQ362IHE8.com. 86400 IN NSEC3 1 1 0 - TI9MBHJKNPUQSQGDEIH491H4175B1KF6 NS DS RRSIG TI9ITB4NG7TNDF0Q5VN2I00AQ362IHE8.com. 86400 IN RRSIG NSEC3 8 2 86400 20200316043704 20200309032704 56311 com. wfJCx/29Ai+1sKcM34wdlefe0M1816iMueYeh+LNYbioGwltUZmJ5+d5 NCezU3j/GHFvB9VW/7FeknQdQbsS0PCbIPqca821qHE7NxpLjKTjdztc 1u/wAP+OOITYIEvHUau1qvzkgQziX5NX9AG5LVxXVvx4ovIH4zV2HjOK hSkdf++Oqo214lSikWWmreDjcaMLVDM0fM/+V/mNJnfMsA== jim.ns.cloudflare.com. 172800 IN A 173.245.59.125 jim.ns.cloudflare.com. 172800 IN AAAA 2606:4700:58::adf5:3b7d lady.ns.cloudflare.com. 172800 IN A 173.245.58.127 lady.ns.cloudflare.com. 172800 IN AAAA 2606:4700:50::adf5:3a7f ;; Received 734 bytes from 192.5.6.30#53(a.gtld-servers.net) in 167 ms |
可以看到本例中的顶级域名服务器选择了 a.gtld-servers.net 。
这里的权威服务器是域名所有者在域名的提供商那时配置的,当有客户端请求 sunxidong.com 域名对应的IP时,最终是从这些权威服务器中获取到:
1 2 3 | www.sunxidong.com. 300 IN A 104.28.30.28 www.sunxidong.com. 300 IN A 104.28.31.28 ;; Received 78 bytes from 173.245.59.125#53(jim.ns.cloudflare.com) in 245 ms |
本例中是从权威服务器 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查询过程及示例》