DNS Delegate和Forwarder的区别
一. DNS的委派
所谓DNS委派就是一个DNS服务器将某些区域的解析委托给其他DNS服务器负责.
区域中的子域过多时,维护起来不方便,还用遇到域名查询的瓶颈,通过在区域中新建委派,可以将子域名委派到其它服务器维护。
子域文件在父域文件中; 委派有独立的区域文件。
DNS委派: DNS服务器把一个区域的子域委派给另外一台DNS服务器来管理,这样当客户端向DNS提交查询请求时,根域的DNS服务器会把这种请求转发给维护其子域的DNS服务器。
二. DNS的转发
转发DNS是一种特殊的递归。如果本地的缓存记录中没有相应域名结果时,其将查询请求转发给另外一台DNS服务器,由另外一台DNS服务器来完成查询请求。
当你设置了转发器后,所有非本域的和在缓存中无法找到的域名查询都将转发到设置的DNS转发器上,由这台DNS来完成解析工作并做缓存,因此这台转发器的缓存中记录了丰富的域名信息。因而对非本域的查询,很可能转发器就可以在缓存中找到答案,避免了再次向外部发送查询,减少了流量。只有当服务器是非授权的,并且缓存中没有相关记录时,才会进行转发。
1、完全转发:当DNS服务器收到查询请求的时候会先看看是不是查询本域的信息,本地缓存是否有数据,如果不能使用本地数据解析DNS会将查询请求发送给转发器,此时是以递归查询的方式发送给转发器的,而在标准的DNS解析中,DNS服务器将以迭代查询的形式发送给另一个DNS服务器。
所谓的 forwarder,就是当某一台 NS 主机遇到非本机负责的 zone ( slave zone 也属于本机负责的范围) 查询请求的时候,将不直接向 "." zone 查询,而把请求转交给指定的 forwarder (一台或多台) 主机代为查询。我们知道,当DNS服务器接到客户端主机的查询请求时,首先会检查这个查询是否属于本机管辖,否则将转向 "." zone 再逐级的查询下去,最后再把查询结果告诉客户端。在这个过程之中,DNS服务器还会将查询到的结果存放到缓存中。只要缓存中的 TTL 没过期,在下次遇到同样查询的时候,就可以直接将结果响应给客户端,而无需再重复上次的查询流程。如果DNS服务器上指定了forwarder,那这个DNS发现缓存中没有记录时,将不向 "." 查询,而是向 forwarder 送出同样的请求(转发),然后等待查询结果,即把逐级往下查询这个耗费精力的动作,交给 forwarder 负责。但无论这个结果是自己直接查询得来的,还是 forwarder 送回来的,DNS服务器都会保存一份数据在缓存中。这样,以后的相同查询就快多了,这对于DNS所服务的客户端而言查询效率会提高很多。
当forwarder没有返回答案时,奔DNS会自己去远端请求。但是如果配置了forward only; 则他仅仅处理转发,而不自己查询。
2、部分转发(只转发解析某个域的DNS):假设有两个域,a.com和b.com,a.com这个域是经过授权(向上级注册,也就是.com知道他的存在)的,而b.com这个域没有经过授权,此时如果a.com中的一台主机要访问www.b.com就会出现访问不了,但是如果a.com知道b.com这个域的DNS主机是谁,即便b.com没有经过授权,这时a.com的DNS可以设一个部分转发,将本域所有要求解析b.com域的请求全部都发给b.com这个域的DNS主机就可以了。
部分转发一般用于访问未经授权的DNS域。配置格式
zone “b.com” IN {
type forward;
forwarders {IP;};
}
注意:
1.转发服务器的查询模式必须允许递归查询,否则无法正确完成转发
2.转发服务器列表如果是多个DNS服务器,则会依次尝试,直到获得查询信息为止
3.配置区域委派时,如果使用转发服务器,有可能会产生区域引用的错误
#作为转发服务器,千万不要出现转发循环。
配置转发服务器技巧:
1).转发列表配置精简
对于配置有转发器的DNS服务器,可将查询发送至多个不同的位置,如果配置转发服务器配置过多,则会增加查询的时间,应根据需要使用转发器,例如:将本地无法解析的DNS信息转发至其他域名服务器。
2).避免链接转发器
如果配置了DNS服务器server1将查询请求转发给DNS服务器server2,则不要在为server2配置其他转发服务器。如果其他转发服务器进行了错误的配置,将查询转发给server1,那么可能导致错误。
3).减少转发器负荷
如果大量的DNS服务器使用这些转发器进行域名信息查询,则会增加转发器的工作量,降低解析的效率,所以建议使用一个以上的转发器实现负载。
4).避免转发器配置错误
DNS服务器会按照转发器配置文件设置的顺序来转发域名,如果国内的域名服务器,错误的将第一个转发器配置为美国的DNS服务器地址,则所有本地无法解析的查询均会发送至指定美国的DNS服务器,这会降低网络上名称解析的效率
三. Forwarder的设置
forwarder转发功能只需要在named.conf中配置即可:
# cat /etc/named/named.conf options { listen-on port 53 { any; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; recursion yes; forward first; forwarders { #即访问非kevin.cn域名时将解析转发到这几个DNS地址(分别为阿里的DNS、google的DNS)上进行解析。 223.5.5.5; #注意这里转发的是DNS地址,没有指定DNS转发域名。 223.6.6.6; 8.8.8.8; 8.8.4.4; }; }; zone "grace.cn" { #访问grace.cn域名时,将解析请求转到192.168.51.39(即grace.cn域名的DNS地址),注意这个不能写在上面的forwarder处,否则转发无效! type forward; #注意这里转发配置中制定了转发的域名,即forwad转发区(forward zone)设置,这是bind9之后的新特性。 forwarders { 192.168.51.39; }; };
forward first | only;
forward指令用于设置DNS转发的工作方式:
1)forward first设置优先使用forwarders DNS服务器做域名解析,如果查询不到再使用本地DNS服务器做域名解析。
2)forward only设置只使用forwarders DNS服务器做域名解析,如果查询不到则返回DNS客户端查询失败。
转发器的配置格式是: options { forwarders { 192.168.10.35; 192.168.10.36; }; };
这里需要注意的是:
转发器本身不用做任何设置,而是对需要转发器的其他DNS server做以上配置。还有,如果该DNS Server无法联系到转发器,那么BIND会自己尝试解析。
如果要禁止BIND在无法联系到转发器时不做任何操作,那么还可以使用forward only命令,这样BIND只能使用区的权威数据和缓存来响应查询了(在连接不到转发器的情况下)。
options {
forwarders { 192.168.10.35; 192.168.10.36; };
forward only;
};
在BIND8.2以后引入了一个新的特性:转发区(forward zone),它允许把DNS配置成只有查找特定域名的时候才使用转发器。( BIND 9从9.1.0才开始有转发区功能 )例如,你可以使你的服务器将所有对 kevin.cn 结尾的域名查询都转发给 kevin.cn 的两台名字服务器: zone "kevin.cn" { type forward; forwarders { 110.50.80.208; 110.50.80.209; }; }; 这样的功能有什么用呢? 假设kevin.cn和你的网络有一个私有的连接,而kevin.cn又没有连接上Internet ,那么你从Internet 是无法查到 kevin.cn 后缀的域名的,这时你就要使用转发区的功能了。 还有一种转发区设置和刚才的设置刚好相反,它允许设置什么样的查询将不被转发,当然这只适用于在options语句中指定了转发器的DNS 。配置如下: options { directory "/var/named"; forwarders { 192.168.10.35; 192.168.10.36; }; }; zone "kevin.cn" { type master; file "zone.kevin.cn"; forwarders {}; };