还是出于项目的需要,把Bind比较高级的功能做一个梳理,这其中包含:DNS递归迭代查询、DNS子域授权、DNS转发、DNS主从区域传输、DNS数据加密,每一个内容不仅记录了它的实现原理,也相应的配上了我一行一行代码的实践测试及结果。
所有的测试都是基于我原来的文章:Bind服务搭建及测试上的代码来进行的,所以下面的代码如果有不理解的,请去看看我之前写的文章。
DNS递归迭代查询
为什么要把DNS的查询称之为递归迭代查询:
递归是因为:
用户端向我的服务端发起一次查询请求,那么服务端如果有结果就返回,如果没有结果就像上一级服务器再发一次请求,直到找到用户需要的IP或者域名,这个过程可以称之为递归。
迭代是因为:
当服务端向上一级服务器法请求的时候,它并不是一次请求就结束了,先是根域,再是二级域名这样了,有多次的请求跟返回动作,这个过程可以称之为迭代。
我在Bind搭建及测试这篇博文里面,对它们的流程做了更详细的叙述,这里就不多写了。
参数
Bind既然有一个复杂的查询流程,那么与之相对应的就会有一系列的配置项来控制这个流程。下面讲的参数都是基于Bind的主配置文件named.conf。
- recursion : {yes|no} 是否允许递归请求
- allow-recursion : {addressmatchlist|any|none} 允许递归请求的范围
- recursion-clients : {number(填数字)} 客户端执行递归请求的数量
测试
named.conf配置文件的内容如下所示:
options {
directory "/var/named";
recursion yes;
};
zone "." {
type hint;
file "named.ca";
};
zone "liumapp.com" {
type master;
file "liumapp.com.zone";
};
zone "cnametest.com" {
type master;
file "cnametest.com.zone";
};
zone "32.29.115.in-addr.arpa" {
type master;
file "115.29.32.zone";
};
可以看到,我默认是把递归查询开启的
开启递归的情况
随便查询一个域名,比如“www.qqq.com”
可以发现,Bind为了找到www.qqq.com对应的IP地址,往上层域名服务器迭代了7次才找到最终结果。
关闭递归的情况
现在我们将配置文件的recursion改为no,重启Bind之后再查询一个新的域名,比如"www.qqqq.com"(www.qqq.com已经做了缓存)
可以看到,关闭递归后我们是查不到新域名的解析记录的。
DNS子域授权
在DNS迭代查询的情况下,经常会用到NS记录,同样的,在DNS子域授权下面,NS记录也会经常被用到。
子域授权:
比如我的一台服务器A负责liumapp.com的权威域名解析,它再授权服务器B对liumapp.com的子域名:child.liumapp.com进行解析,这就叫做子域授权。
DNS迭代查询利用的就是子域授权:通过根域,到二级域再依次往下迭代查询。
测试
我的父服务器IP为115.29.32.62,其解析的域名为www.liumapp.com,子服务器IP为106.14.212.41,其解析的域名为www.test.liumapp.com
首先在父服务器上,我们要对子服务器进行授权,具体配置liumapp.com.zone文件,添加如下内容:
test.liumapp.com. IN NS ns1.test
ns1.test IN A 106.14.212.41
大意就是给liumapp.com的子域名test.liumapp.com分配权限给ns1.test,然后指定ns1.test的IP为106.14.212.41
重启父服务器,然后进入子服务器的shell命令面板
首先我们对named.conf做一个备份,然后把它的内容修改为:
options {
directory "/var/n