当前位置: 首页 > 科技观察

小菜雪网络DNS服务器工作原理

时间:2023-03-22 13:29:51 科技观察

通过上一节的学习,我们已经初步掌握了域名系统的基本原理。通过域名访问网络服务时,首先需要向DNS服务器查询该域名对应的IP地址。那么,是不是所有的域名都存储在一台服务器上呢?答案肯定是否定的。世界上现存的域名数量是一个天文数字,不是一两台服务器所能保存的。实际上,DNS服务器被分成了很多角色,形成了一个层次很深的分布式系统。这一节,我们就来看看它背后的故事。全球域名的最高管理机构是ICANN(InternetCorporationforAssignedNamesandNumbers),这是一个总部位于美国加利福尼亚州的组织。ICANN负责管理整个域名系统的运作,其主要工作是规划顶级域名(topleveldomain,简称TLD)。顶级域是一级域名,分为两类:通用顶级域,如.com、.net、.edu、.org等;国家顶级域名,如.cn、.hk、.jp、.我们等等;ICANN不直接管理这些顶级域,因为顶级域太多需要管理。目前全球有1000多个顶级域名,每个顶级域名下都有很多批发商和零售注册商,管理起来太麻烦。因此,ICANN为每个顶级域都有一个保管人,负责该域下的所有内容。这使ICANN的生活变得更加轻松,只需与托管人打交道。例如.cn域名由中国互联网络信息中心(CNNIC)托管,制定.cn域名的各项政策;而.com域名由VeriSign托管。这样一来,ICANN就掌握了根域名(rootdomain)的控制权:一方面决定了根域下有多少个子节点,即顶级域名;另一方面,确定了每个顶级域名的托管人;理论上,查询任何域名,都需要先查询ICANN的根域。因为只有根域可以知道:谁托管一个域以及它是哪些服务器。事实上,ICANN维护着每个顶级域和相应主机的映射表。比如查询域名www.fasionchan.com,我们需要先查询ICANN的映射表。它会告诉我.com域由VeriSign托管,所以我必须去VeriSign,VeriSign会告诉我向谁求助fasionchan.com查询。ICANN维护的根域名列表称为DNS根区(DNSrootzone)。ICANN官方网站提供了有关根区的信息,包括根区文件。根区域文件包含所有顶级域的托管信息,因此非常大,超过2MB。以顶级域名.com为例,从根区可以查询到13个域名服务器:com.172800INNSb.gtld-servers.net.com.172800INNSg.gtld-servers.net.com.172800INNSf.gtld-服务器.net。com.172800INNSe.gtld-servers.net.com.172800INNSc.gtld-servers.net.com.172800INNSj.gtld-servers.net.com.172800INNSk.gtld-servers.net.com.172800INNSa.gtld-servers.net.com.172800INNSi.gtld-servers.net.com.172800INNSm.gtld-servers.net.com.172800INNSd.gtld-servers.net.com.172800INNSh.gtld-servers.net.com.172800INNSl.gtld-servers.net.也就是说以.com结尾的域名可以查询到13台服务器中的任意一台,比如a.gtld-servers.net。我们注意到这13台服务器仍然以域名的形式提供。也就是说,我们首先要通过域名找到.com服务器的IP地址。但是,这不会造成循环查询吗?为此,DNS根区域还将提供这些服务器的IP地址,包括IPv4和IPv6版本:a.gtld-servers.net.172800INA192.5.6.30b.gtld-servers.net.172800INA192.33.14.30...m.gtld-servers.net.172800INA192.55.83.30a.gtld-servers.net.172800INAAAA2001:503:a83e::2:30b.gtld-servers.net。172800INAAAA2001:503:231d::2:30...m.gtld-servers.net.172800INAAAA2001:501:b1f9::30DNS根区域列表存储在哪里?答案是根域名服务器(rootnameserver)。早年,全球只有13个根域名服务器,编号从a.root-servers.net到m.root-servers.net。因为早期的DNS查找结果是在一个512字节的UDP数据报中传输的,它最多只能容纳13个服务器地址。可以在root-servers.org找到根域名服务器列表。这13台根域名服务器由12个独立机构独立运营。其中,A和J由VeriSign管理。每个运营机构都会部署很多节点来保证可用性。仅根服务器A就部署了16个节点,分布在全球各地。虽然每个根服务器都部署了多个节点,但它们的IP地址都是一样的。以根服务器A为例,其16个节点的IP地址均为198.41.0.4。这真太了不起了!这么多节点共用一个IP地址,不会有冲突吗?得益于Anycast路由技术,分散在不同地理位置的多台服务器可以使用相同的IP地址。当发送方向这个IP地址发送数据时,路由协议会??自动选择一个最近的节点。Anycast路由技术就不先列了,以后有机会再介绍。这意味着全球只有13个根域名服务器,对应的IP地址也只有13个,可以通过执行dig命令获取:root@netbox[~]?dig.NS;<<>>DiG9.16.1-Ubuntu<<>>@10.2.66.66.NS;(1serverfound);;globaloptions:+cmd;;Goanswer:;;->>HEADER<<-opcode:QUERY,status:NOERROR,id:42791;;标志:qrrdra;查询:1,答案:13,权限:0,附加:8;;OPTPSEUDOSECTION:;EDNS:版本:0,标志:;udp:4000;;问题部分:;.INNS;;答案部分:.1700INNSk。root-servers.net..1700INNSm.root-servers.net..1700INNSl.root-servers.net..1700INNSb.root-servers.net..1700INNSg.root-servers.net..1700INNSf.root-servers.net..1700INNSd.root-servers.net..1700INNSe.root-servers.net..1700INNSi.root-servers.net..1700INNSa.root-servers.net..1700INNSh.root-servers.net..1700INNSj.root-servers.net..1700INNSc.root-servers.net.;;附加部分:k.root-servers.net.3282INA193.0.14.129g.root-servers.net.2845INA192.112.36.4d.root-servers.net。118INA199.7.91.13e.root-servers.net.494INA192.203.230.10a.root-servers.net.1771INA198.41.0.4j.root-servers.net.3197INA192.58.128.30c.root-servers.net.1830INA192.33.4.12;;查询时间:14毫秒;;服务器:10.2.66.66#53(10.2.66.66);;WHEN:ThuApr0809:01:17CST2021;;MSGSIZERcvd:364迭代查询当我们查询一个域名时,我们必须从根服务器开始,逐层查询。这就是上图所示的所谓迭代查询(iterativequery)。当我们查询域名时,例如对于www.fasionchan.com:首先查询根域名服务器;根域名服务器只有13台,IP众所周知,很少更改;根域名服务器保存根域列表,包括顶级域名的托管服务商和相关服务器信息;根据根区列表,根域名服务器告诉我们.com顶级域名向谁查询;根据根服务器返回的结果,继续查询负责.com解析的服务器,一般称为顶级域名服务器;主域名fasionchan.com注册完成后,需要将负责域名解析的服务器注册到.com的顶级域名服务器上;.com的顶级域名服务器告诉我们谁应该根据这个信息查询域名fasionchan.com;根据顶级域名服务器返回的结果,继续查询负责fasionchan.com的解析服务器,一般称为权威域名服务器;fasionchan.com子域名信息一般都注册在权威服务器上;权威服务器取出www.fasionchan.com对应记录返回给我们,查询结束;如果某个子域名是由其他权威服务器注册的服务器负责,我们需要继续迭代,直到查询完成;无论查询什么域名,我们都需要先查看根域名服务器。这样的话,根服务器会不会压力太大呢?事实上,完全没有必要担心。由于存储在根服务器上的根域列表一般很少改变,客户端可以缓存起来以减轻对根服务器的查询压力。缓存服务器实际上,客户端一般不会自己进行迭代解析,而是通过本地的递归解析器。以网站www.fasionchan.com为例:客户端向本地递归解析器查询域名www.fasionchan.com;递归解析器向根域名服务器查询域名www.fasionchan.com;根域名服务器告诉递归解析器,应该找到.com的顶级域名服务器;递归解析器向顶级域名服务器查询域名www.fasionchan.com;顶级域名服务器告诉递归解析器它应该找到fasionchan.com的权威域名服务器;递归解析器查询权威域名服务器查询域名www.fasionchan.com;权威服务器将结果返回给递归解析器;递归解析器将结果返回给客户端;客户端获取域名对应的IP地址后,可以向Web服务器发起请求;Web服务器处理请求后,将结果返回给客户端;注意,递归解析器需要从根服务器开始,逐层查询。这个过程就是迭代解析。迭代解析最显着的特点是,如果服务器没有查询到要查询的域名的结果,它会告诉客户端去哪里查询,根服务器就是一个典型的例子。递归解析器是不同的。当它收到未知域名的查询请求时,会为客户端向其他DNS服务器发起请求,然后将结果返回给客户端。这个过程称为递归解析(recursivequery)。递归解析对客户端是完全透明的,客户端不需要关心递归解析器背后的其他DNS服务器。此外,递归解析器还将查询结果缓存在本地。再次查询域名时,可??以直接返回缓存结果,无需重新查询其他DNS服务器。因此,递归解析器通常称为DNS缓存服务器。那么,客户端主机如何配置DNS缓存服务器呢?以Linux系统为例,编辑/etc/resolv.conf配置文件即可:root@netbox[~]?cat/etc/resolv.conf#Thisfileisincludedonthemetadataisonameserver192.168.65.1关键字nameserver后面是DNS缓存服务器地址,可以写多行配置多个DNS缓存服务器,实现冗余。