在测试环境中,有时会因为输入一个不存在的域名而需等待10s的时间,如胡乱一串字符,abc.fdsd.
这是因当DNS在自身权威记录中搜索不到记录时,会到根DNS去解析,而正因为在测试环境不能与外网连接,导致需要一直等待,直到10s后解析失败。
那是否可以做到,当查询不存在的域名时,直接返回失败,而不发起到根DNS查询这一步呢?答案是肯定的。
bind的forward功能可以做到。
以下为bind9管理员手册arm(administrator reference manual)对于forward功能的描述
forward
此选项只有当forwarders列表中有内容的时候才有意义。当值是First,默认情况下,使服务器 先查询设置的forwarders,如果他没有得到回答,服务器就会自己寻找答案。如果设定的是 only,服务器就只会把请求转发到其他服务器上去。
根据实际测试,可以做出以下总结:
1. 如果是forward first, DNS首先会在本地资源文件查找,如果找不到,就会到forwarders的服务器 里面去找,再找不到,就会自己到根服务器去找,如果联系不到根,就会一直长尝试,持续10s。
2. 如果是forward only, DNS首先会在本地资源文件查找,如果找不到,就会到forwarders的服务器 里面去找,再找不到,就直接不找了。
所以,如果要解决本文开始提到的问题,就必须设定forward only,最终两台DNS的配置如下:
DNS1:负责解析权威记录,设置forward only参数,并设置forwarders为DNS2
forward only;
forwarders {DNS2};
DNS2:本地没有权威记录,且设置本身为非递归查询服务器,recursion为no
recursion no;
额外的情况
以baidu.com为例子,如果DNS1上有baidu.com这个zone,而此时,china.baidu.com需要做NS记录指到ns1.baidu.com(DNS3)上做解析,此时会产生一个问题。
NS记录与forward究竟哪一个优先呢?答案是forward优先,DNS会认为NS记录并不属于本地权威记录,会优先到forwarders去寻找,因此要消除此效果还需在zone的定义时加上一个参数
zone baidu.com {
forwarders {};
.........
};
forwarders为空会令此zone不走转发,接着才会到指定的NS记录上解析。
网友评论