大家好,今天小编来为大家解答递归服务器这个问题,DNS解析原理很多人还不知道,现在让我们一起来看看吧!

一、dns中递归查询与迭代查询的区别

1.递归查询:

一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机;

2.迭代查询(反复查询):

一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求;

举例:比如学生问老师一个问题,王老师告诉他答案这之间的叫递归查询。这期间也许王老师也不会,这时王老师问张老师,这之间的查询叫迭代查询!

二、递归查询与迭代查询有什么不同

1、工作方式上的区别

递归查询是域名服务器将代替提出请求的客户机(下级DNS服务器)进行域名查询,若域名服务器不能回答,则域名服务器会在域各树中的各分支的上下进行递归查询,最终将返回查询结果给客户机。

迭代查询是能够使其他服务器返回一个最佳的查询点提示或主机,若此最佳的查询点中包含需要查询的主机,则返回主机信息,若此时服务器不能够查询到主机,则是按照提示的指引依次查询。

2、使用上的区别

一般由DNS工作站提出的查询请求便属于递归查询。一般发生在客户端与服务器间,也有特殊情况是dns服务器与dns服务器之间。

根域名服务器总应该使用迭代查询,而不应该使用递归查询。一般的,每次指引都会更靠近根服务器(向上),查寻到根域名服务器后,则会再次根据提示向下查找。

3、查询状态上的区别

递归查询,在域名服务器查询期间,客户机将完全处于等待状态。

迭代查询是直到服务器给出的提示中包含所需要查询的主机为止。

参考资料来源:百度百科-递归查询

参考资料来源:百度百科-迭代查询

三、CoreDNS篇6-递归服务器

本文主要用于介绍CoreDNS实现递归服务器的几种方式以及在生产环境中遇到的一些问题和解决方案。

在开始之前我们需要知道一些关于CoreDNS的基本知识:CoreDNS本身是没有能力作为一个递归查询的DNS服务器(Recursive DNS),但是它有着众多的插件,可以通过插件来实现对域名的递归查询和缓存等功能从而加速客户端的DNS查询*能。这里主要实现的插件有内部插件(Plugins) forward或外部插件(External Plugins) unbound。

我们先来了解一下不依靠外部程序实现递归查询功能的unbound插件, unbound是一个非常优秀的DNS软件,专注于递归查询和缓存,但对于权威DNS服务器这方面的功能稍显不足,因此理论上将unbound和CoreDNS结合就可以很好的弥补两者的不足。

unbound插件的编译安装稍显麻烦,此前的文章中有详细介绍操作步骤和注意事项,需要特别注意的是编译安装了 unbound插件的CoreDNS会从原来的静态二进制文件,变成了需要动态加载依赖库。因此如果需要提前编译然后大范围使用,最好保证编译环境的系统和最终的使用环境系统一致或全兼容。

unbound插件已经很长一段时间没有更新维护了,尽管它有 Maintained by CoreDNS的标注,因此如果使用较新版本的go编译之后,在启动的时候会有*。

另外就是在运行的过程中会出现panic异常,一开始怀疑是和负载有关,后面测试发现当请求量极低(个位数qps)的时候也会出现此类异常。

经过多次测试之后,我们发现针对unbound插件出现 panic的情况和请求的频率无关,而是和请求的内容有关。简单来说就是:当请求的域名本身就不存在解析的时候,就会触发panic异常;当然还可以再进一步:当CoreDNS服务端本身无法和根域名服务器建立连接转发查询的时候,也会出现panic异常。

forward插件主要的作用就是把DNS请求转发给上游的upstream服务器。 forward插件本身并不支持任何的DNS解析功能,但是可以将相应的请求转发到递归服务器上,再结合 cache插件做缓存,从而实现递归查询解析缓存的功能。

forward对应的upstream机器可以根据自己的需求选择现有的公共DNS,如国内常见的114、谷歌的8888等免费DNS,或者选择自己使用unbound、bind9之类的DNS服务器单独搭建一个专门用来做递归查询的DNS服务。

当查询的域名解析记录不存在或者是网络问题不可达的时候,可能会触发upstream的超时时间限制,导致报错 i/o timeout,可以考虑使用 error插件的 consolidate指令对这类*进行统一处理并修改*等级

四、DNS解析原理***递归***VS***迭代

DNS解析流程分为递归查询和迭代查询,递归查询是以本地名称服务器为中心查询,递归查询是默认方式,迭代查询是以DNS客户端,也就是客户机器为中心查询。其实DNS客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。

“递归解析”(或叫“递归查询”,其实意思是一样的)是最常见,也是默认的解析方式。在这种解析方式中,如果客户端配置的本地名称服务器,(又称Local DNS,可以是默认的运营商提供的Local DNS或者自己设置的DNS)不能解析的话,则后面的查询全由本地名称服务器代替DNS客户端进行查询,直到本地名称服务器从权威名称服务器得到了正确的解析结果,然后由本地名称服务器告诉DNS客户端查询的结果。

下图是windows下默认获取的运营商Local DNS或者自己设置的Local DNS

在这个查询过程中,一直是以本地名称服务器(Local DNS)为中心的,DNS客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态的,直到本地名称服务器发来了最终的查询结果。此时的本地名称服务器就相当于中介代理的作用。如果考虑了本地名称服务器的缓存技术(也就是在DNS服务器上对一定数量的以前查询记录保存一定时间,这样后面查询同样的域名信息时就可从缓存中调出来,以加速查询效率)的话,则递归解析的基本流程如下:

(1)客户端向本机配置的本地名称服务器(在此仅以首选DNS服务器为例进行介绍,所配置其它备用DNS服务器的解析流程完全一样)发出DNS域名查询请求。

(2)本地名称服务器收到请求后,先查询本地的缓存,如果有该域名的记录项,则本地名称服务器就把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则本地名称服务器再以DNS客户端的角色发送与前面一样的DNS域名查询请求发给根名称服务器。

(3)根名称服务器收到DNS请求后,把所查询得到的所请求的DNS域名中顶级域名所对应的顶级名称服务器返回给本地名称服务器。

(4)本地名称服务器根据根名称服务器所返回的顶级名称服务器,向对应的顶级名称服务器发送与前面一样的DNS域名查询请求。

(5)对应的顶级名称服务器在收到DNS查询请求后,也是先查询自己的缓存,如果有所请求的DNS域名的记录项,则相接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给DNS客户端,否则向本地名称服务器返回所请求的DNS域名中的二级域名所对应的二级名称服务器。

然后本地名称服务器继续按照前面介绍的方法一次次地向*、四级名称服务器查询,直到最终的对应域名所在区域的权威名称服务器返回到最终的记录给本地名称服务器。然后再由本地名称服务器返回给DNS客户,同时本地名称服务器会缓存本次查询得到的记录项。

DNS客户端和本地名称服务器是递归,而本地名称服务器和其他名称服务器之间是迭代。

DNS递归名称解析:在DNS递归名称解析中,当所配置的本地名称服务器解析不了时,后面的查询工作是由本地名称服务器替代DNS客户端进行的(以“本地名称服务器”为中心),只需要本地名称服务器向DNS客户端返回最终的查询结果即可。

DNS迭代名称解析:(或者叫“迭代查询”)的所有查询工作全部是DNS客户端自己进行(以“DNS客户端”自己为中心)。在条件之一满足时就会采用迭代名称解析方式:

通过图片看看他们的不同:

权威 DNS是特定域名记录(例如“example.”)在域名注册商处所设置的 DNS服务器,用于特定域名本身的管理(增加、删除、修改等)。

权威 DNS服务器只对自己所拥有的域名进行域名解析,对于不是自己的域名则拒绝访问。比如,向“example.”的权威 DNS服务器查询“test.”的域名肯定会查询失败。

递归服务器 DNS解析原理

递归 DNS(也称本地 DNS或者缓存 DNS)用于域名查询。递归 DNS会迭代权威服务器返回的应答,直至最终查询到的 IP,将其返回给客户端,并将请求结果缓存到本地。

对用户发出的域名解析请求,递归 DNS必须给出一个最终的 IP结果。完整的递归DNS查询流程需要 DNS服务器从根域名“.”服务器,顶级域名服务器(例如“.”),一级域名服务器(例如“example.”)等一级一级递归查询,直到最终找到权威服务器取得结果,并返回给客户。同时,递归服务器根据域名 TTL,缓存查询结果,便于相同域名重复查询。

递归 DNS服务器大多数在运营商端,负责网络接入终端的 DNS查询,即网络访问设备上配置的 DNS服务器 IP。

递归 DNS的访问过程如下图所示(递归 DNS在图中表示为 Local DNS):