本节书摘来自异步社区《DNS与BIND(第5版)》一书中的第10章,第10.10节,作者: 【美】Joseph Davies 更多章节内容可以访问云栖社区“异步社区”公众号查看。
10.10 非递归名称服务器
默认情况下,BIND解析器发送递归查询,而BIND名称服务器会做一些必要工作来进行应答。(如果忘了递归查询的工作原理,请参阅本书第2章。)在为递归查询寻找答案的过程中,名称服务器会为来自其他区域的非权威信息建立缓存。
在某些情况下,并不希望名称服务器额外地为递归查询寻找答案,或是建立数据缓存。root名称服务器就是个例子。root名称服务器非常繁忙,不能再浪费额外的时间,为递归查询寻找答案。相反,root名称服务器仅依据其拥有的权威数据作出应答。该应答可能包含着答案,但更有可能包含着到其他名称服务器的指引。由于root服务器不支持递归查询,所以它们不用为非权威数据建立缓存,否则它们的缓存将会非常巨大。1
要使BIND名称服务器工作在非递归模式,可以在配置文件中配置以下语句:
![83f0818835a5c18b12641287ddf5592ab8d552c0](https://yqfile.alicdn.com/83f0818835a5c18b12641287ddf5592ab8d552c0.png?x-oss-process=image/resize,w_1400/format,webp)
现在,服务器会把递归查询看作非递归查询来做出应答。
如果不想让名称服务器建立缓存,除了使用recursion no,还有一个配置选项需要搭配使用:
![89249ba898df1d14418c636186ba14032761f82a](https://yqfile.alicdn.com/89249ba898df1d14418c636186ba14032761f82a.png?x-oss-process=image/resize,w_1400/format,webp)
这样就使服务器在为应答建立附加数据段时,不会去抓取缺少的glue记录。BIND 9名称服务器并不会抓取glue记录,所以BIND 9不使用fetch-glue子语句。
如果选择让一个名称服务器工作在非递归模式,那么就不要在任何主机的resolv.conf文件中列出该名称服务器。虽然可以将名称服务器设置为非递归模式,但是解析器无法使用非递归名称服务器2。如果名称服务器需要继续为一个或多个解析器提供服务,可以使用allow-recursion子语句,在BIND 及其后续版本(包括BIND 9)上都支持该功能。allow-recursion使用地址匹配列表作为参数:凡是匹配该列表的查询者都可以发送递归查询,但是对待其他查询者就好像关闭了递归功能一样。
![1470f3b596c50365347a614826dd74be1ae4af47](https://yqfile.alicdn.com/1470f3b596c50365347a614826dd74be1ae4af47.png?x-oss-process=image/resize,w_1400/format,webp)
allow-recursion默认的设置是对所有IP地址都提供递归查询。
还有,不要让非递归名称服务器作为转发器。当名称服务器把另一个服务器作为转发器时,它会将递归查询转发给转发器。不过可以使用allow-recursion,仅允许经过授权的名称服务器使用转发器。
可以让非递归名称服务器作为区域数据的权威服务器(也就是说,可以告诉父名称服务器[parent nameserver],将对区域的查询指向该服务器)。能够这么做的原因是名称服务器之间相互发送的是非递归查询。