目录

  • 什么是DNS
  • DNS的解析方式
  • DNS的完全转发和部分转发
  • DNS解析的ACL与视图的设置

什么是DNS?

DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。大白话翻译过来就是用来解析域名,获取域名对应的ip地址,或者知道了ip地址,来获取所对应的域名的服务。


DNS的解析方式

DNS查询分类

1)按查询方式:

  • 递归查询。 当DNS服务器接收到查询请求时,不论成功或失败,都会做出对应的响应。(发生在DNS客户端与DNS服务器之间)。并且会再进行迭代查询,这是有/etc/named.conf中的递归功能开启了,如下图所示。

  • 迭代查询。 DNS服务器根据自己的高速缓存或区域的数据,以最佳结果响应。如果DNS服务器无法解析,它可能返回一个指针。指针指向下级域名的DNS服务器,继续该过程,直到找到拥有所查询名字的DNS服务器,或知道出错、超时为止。(发生在DNS服务器之间) 以上图为例,我们要解析“www.lishuyang.com”这个域名,那么迭代查询便开始从根服务器开始查询,但是根服务器只能解析到com,然后根服务器反馈给客户端com的IP地址,客户端再去请求com服务器,同样的,com服务器解析到了lishuyang.com,并将该服务器的ip返回到客户端,照此一直往下查询,最终得到我们的目的域名的ip。

2)按内容分类

  • 正向查询: 由域名查找IP地址。

  • 反向查询: 有IP地址查找域名。


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;};
 };

DNS解析ACL与视图设置

ACL定义:把一个或多个主机归并为一个集合,并通过一个统一的名称调用

acl acl_name{
 ip;
 ip;
 net/prelen;
} ;

实例:

acl mynet{机
 172.25.0.0/46;
};
bind 由四个内置的acl
none:    没有一个主机
any:     任意主机
local:   本机
localnet:本机的IP同掩码运算后得到的网络地址
    注意:    acl,先定义后使用,一般定义在配置文件中的option前面

访问控制的指令:

allow-query {};                  #允许查询的主机 (白名单)
allow-transfer {};               #允许区域传送的主机 (白名单)
allow-recursion {};              #允许递归的主机(通常全局option)
allow-upadte {};                 #允许更新区域数据库中内容

(二)视图( view)

  • 一旦启用view,所有zone都只能定义在view中

  • 仅有必要在匹配到允许递归请求(本地dns)的客户端所在view中定义根区域

  • 客户端请求到达时,是自上而下匹配每个view所服务的客户端列表

  • 一个bind服务器可以定义多个view,每个view中可定义一个或多个zone

  • 每个view用来匹配一组客户端请求

  • 多个view可能对同一个区域进行解析,但使用不同的区域解析文件

实例

view VIEW_NAME {
    match-clients { };          #指定不同主机(客户端),看到不同视图           match-destinations { };     #指定不同IP,看到不同视图
    match-recursive-only { };   #用来针对递归和非递归,查询不同的视图
};