上次博文我们具体配置了一台DNS服务器并实现了主辅之间的区域传送,本次博文我们来看看DNS的一些高级配置。

在进行DNS的高级配置之前,必须要理解DNS的原理(参见http://sweetpotato.blog.51cto.com/533893/1596973)

并且对DNS的基础配置也要熟练(参见http://sweetpotato.blog.51cto.com/533893/1598225)

【本次博文的主要内容】

  • 子域授权
  • 转发域
  • acl
  • 视图(view)

【实验环境】

Linux运维实战之DNS的高级配置(转发器、视图等)_第1张图片

实验说明:

本次博文的实验只做正向解析;

VMware station 10

BIND服务器:两台CentOS 6.4虚拟机做主辅DNS

windows 7物理机做客户端

Domain Name:test.com.         192.168.80.0/24

主DNS:Master.test.com.         192.168.80.11

辅助DNS:Slave.test.com.         192.168.80.13

web主机:www.test.com.          192.168.80.11   192.168.1.201   192.168.80.14

ftp主机:ftp.test.com.  CNAME   www.test.com.

mx邮件服务器:mx.test.com.  192.168.80.11

######################################规划子域##################################################

子域:SubZone.test.com.

子域DNS:ns1.SubZone.test.com.    192.168.80.12

web主机:www.SubZone.test.com.    192.168.80.12

imap:CNAME   www


一、子域授权:

【DNS服务器的主辅配置】

按照上次博文的介绍,将主辅DNS的基本配置做好(参考http://sweetpotato.blog.51cto.com/533893/1598225)

主DNS配置好后,test.com区域文件如下所示:

Linux运维实战之DNS的高级配置(转发器、视图等)_第2张图片

辅助DNS上的区域文件是从主DNS复制过去的,如下所示:

image

Linux运维实战之DNS的高级配置(转发器、视图等)_第3张图片

所有资源记录都有了哈。下面我们来配置子域DNS,并在其父域DNS上完成授权。

【子域授权】

子域授权的基本理论在我的前两次博文中具体介绍过了,这里不再赘述(参见http://sweetpotato.blog.51cto.com/533893/1596973)。

子域授权创建步骤:

第一步、划分子域:

这里,我们划分的子域为SubZone.test.com. 在192.168.80.12主机上,配置子域的区域解析文件:

(1)修改主配置文件,在/etc/named.rfc1912.zones文件中添加如下条目:

image

(2)创建“SubZone.test.com.zone”区域解析文件,并修改属组和权限:

Linux运维实战之DNS的高级配置(转发器、视图等)_第4张图片

(3)检查主配置文件和区域文件的语法错误(语法检查没问题了别急着启动服务或重新载入区域文件,需要先到父域DNS上完成授权)

[root@Centos ~]# named-checkconf 
[root@Centos ~]# named-checkzone "SubZone.test.com" /var/named/SubZone.test.com.zone 
zone SubZone.test.com/IN: loaded serial 2015012001
OK

第二步、完成授权:

(1)在主DNS(192.168.80.11主机)上完成子域的授权,即在区域文件/var/named/test.com.zone中添加子域相应的NS记录和粘附A记录:

Linux运维实战之DNS的高级配置(转发器、视图等)_第5张图片

(2)检查区域文件语法错误并重新加载主DNS的区域文件:

[root@Centos named]# named-checkzone "test.com" test.com.zone 
zone test.com/IN: loaded serial 2015012001
OK
[root@Centos named]# rndc reload
server reload successful

(3)回到子域DNS,启动named服务或重新加载区域文件;

至此,子域授权的过程结束。

【验证子域授权】:

1、回到父域DNS,查看区域解析情况:

Linux运维实战之DNS的高级配置(转发器、视图等)_第6张图片

授权是自上而下的哈,父域能知道子域的存在。

Tis如果检查区域文件语法错误时出现了以下情况:

[root@Centos named]# named-checkzone "test.com" test.com.zone 
zone test.com/IN: SubZone.test.com/NS 'ns1.SubZone.test.com' extra GLUE A record (192.168.80.12)   #extra GLUE A表示额外的粘附A记录
zone test.com/IN: SubZone.test.com/NS 'ns1.SubZone.test.com' missing GLUE A record (192.99.166.230)
zone test.com/IN: loaded serial 2015012004
OK
随后,在父域DNS用dig命令查询子域SubZone.test.com的NS记录时,只给出了NS记录而没有对应的粘附A记录。这种情况是由于/etc/resolv.conf配置了多个DNS(且能够与公网通信),并且主机配置了多块网卡造成。将/etc/resolv.conf文件中的其它记录都注释掉,把DNS指向本机IP地址即解决问题(这是我遇见的情况,大家遇到的情况可能有所不同,欢迎多交流)。

2、在父域的辅助DNS(192.168.80.13主机)上,查看区域解析情况:

Linux运维实战之DNS的高级配置(转发器、视图等)_第7张图片

Linux运维实战之DNS的高级配置(转发器、视图等)_第8张图片

3、回到子域DNS,查看区域解析情况:

Linux运维实战之DNS的高级配置(转发器、视图等)_第9张图片

能够解析,而且是权威应答哈。思考一下,子域DNS能够解析父域吗?我你们来试一下哈!

Linux运维实战之DNS的高级配置(转发器、视图等)_第10张图片

结论:授权是自上而下的,上级(父域)知道下级(子域)的存在,而下级(子域)并不知道上级(父域)的存在(因此子域的解析从根开始层层往下迭代)

那如何才能让子域解析父域呢?通过转发!


二、DNS名称解析转发器:

1、问题的引入:什么是转发器?为什么需要转发器?

担当DNS名称解析的服务器被称为“DNS转发器”。转发器也是网络上的DNS服务器,用来将内部DNS名称的DNS查询转发给该网络外的DNS服务器。

如果不将特定DNS服务器指定为转发器,所有DNS服务器可使用其根提示在网络外发送查询。这样,许多内部可能非常重要的DNS信息都可暴露在公网上。除了安全和隐私问题,该解析方法可导致大量的外部通信,且通信费用昂贵,对于慢速Internet连接的网络或Internet服务成本很高的公司来说效率低下。而将DNS服务器指定为转发器时,转发器将负责处理外部通信,从而将DNS服务器有限地暴露给公网。转发器将建立外部DNS信息的巨大缓存,因为网络中的所有外部DNS查询都是通过它解析的。你在很短的时间内,转发器将使用该缓存数据解析大部分外部DNS查询,从而减少网络的Internet通信与DNS客户端的响应时间。

2、转发的原理:

转发是一种链式结构,如下图所示:

Linux运维实战之DNS的高级配置(转发器、视图等)_第11张图片

(1)当本地DNS服务器(也是转发器)收到查询时,它会尝试使用它主持和缓存的主要和辅助区域解析该查询;

(2)如果不能使用本地数据解析查询,此时它作为客户端,会将查询转发给外网DNS服务器;

(3)本地DNS(转发器)收到客户端的请求后会等待一段很短的时间,等待来自外网DNS的应答;

(4)对于外网DNS来说,它接收到的查询请求是递归查询,此时,它自己需要向外层层迭代找到最终答案返回给转发器(此时转发器作为DNS客户端)

(5)转发器将外网DNS返回的查询结果送到客户端(非权威答案),完成解析过程。

注:转发的前提——接收转发请求的服务器(这里是外网DNS)必须能够为请求者(这里是本地DNS,也是转发器)做递归查询;

3、转发的类型:

    (1)无条件转发:转发所有针对非本机负责解析的区域的请求; 
       

#在主配置文件/etc/named.conf的全局选项中添加如下内容:
options {    
    forwarders { ip; };    #指明转发器是谁
    forward only|first;    #only表示仅转发 ;first表示先进行转发,如果没查询到结果,那么它自己还会根据根提示向外迭代查询 
};

    (2)条件转发:仅转发对特定区域的请求(即转发域);

#在区域置文件/etc/named.rfc1912.zone中定义转发域:
zone "区域名称" IN {
    type forward;          #区域的类型为转发
    forwarders {  ip; };   #指明转发器是谁 
    forward only|first;    #only表示仅转发 ;first表示先进行转发,如果没查询到结果,那么它自己还会根据根提示向外迭代查询

};

【举例说明】

######################################规划转发器#################################################

上面的例子中,子域DNS(192.168.80.12主机)无法与外网通信,且无法解析父域;

辅助DNS服务器(192.168.80.13主机)能够与外网通信,现在将其作为子域DNS的转发器;

1、无条件转发:在子域DNS上设置转发,让子域能够解析父域且能够通过转发器解析公网的查询:

第一步、在子域DNS上配置转发。修改主配置文件/etc/named.conf,实现无条件转发即转发所有非本机负责解析的区域的请求:

Linux运维实战之DNS的高级配置(转发器、视图等)_第12张图片

第二步、重新加载配置文件,并清空DNS缓存:

[root@Centos ~]# rndc reconfig
[root@Centos ~]# rndc flush

第三步、用dig命令进行测试,看看通过转发子域是否能够解析父域:

Linux运维实战之DNS的高级配置(转发器、视图等)_第13张图片

第四步、用dig命令测试,看看通过转发能否解析外网的查询:

Linux运维实战之DNS的高级配置(转发器、视图等)_第14张图片

可以看出,通过无条件转发,可以解析针对非本地负责的区域的查询哈。

现在假设这样一个场景:

如果子域DNS能够与外网通信而转发器DNS服务器(192.168.80.13主机)不能与外网通信,并且子域DNS能够根据根提示做DNS查询,那么将转发选项设置为“first”,结果怎样呢?

(1)设置外网网关,让子域DNS服务器能够与外网通信:

Linux运维实战之DNS的高级配置(转发器、视图等)_第15张图片

Linux运维实战之DNS的高级配置(转发器、视图等)_第16张图片

(2)在转发器DNS服务器(192.168.80.13主机)上,设置网关,让其无法与外网通信:

Linux运维实战之DNS的高级配置(转发器、视图等)_第17张图片

(3)在子域DNS上修改主配置文件,把转发选项改为”first“:

Linux运维实战之DNS的高级配置(转发器、视图等)_第18张图片

(4)重新加载子域DNS的配置文件并清除DNS缓存:

image

(5)用dig命令测试,看是否还能够解析外网的区域:

Linux运维实战之DNS的高级配置(转发器、视图等)_第19张图片

能够解析哈,说明不能从转发器查询外网之后,它自己用根提示出去迭代查询到了结果。

2、条件转发:配置转发域,使得只对test.com域的查询能够通过转发器解析:

第一步、修改主配置文件/etc/named.conf,将上例中的无条件转发选项注释掉:

Linux运维实战之DNS的高级配置(转发器、视图等)_第20张图片

第二步、修改/etc/named.rfc1912.zone,配置转发域test.com:

image

第三步、在转发器DNS服务器上(192.168.80.13主机),设置“允许递归”:

image

第四步、在子域DNS上用dig命令进行测试,看是否可以解析转发域:

Linux运维实战之DNS的高级配置(转发器、视图等)_第21张图片

能够解析哈,那现在是否可以解析baidu.com呢?试试看哈。

Linux运维实战之DNS的高级配置(转发器、视图等)_第22张图片

不能解析哈。


三、DNS的ACL配置:

1、问题的引入:为什么需要ACL?

因为安全和DNS服务器性能,如果没有ACL,那么任何人都可以到我们的DNS服务器上做递归查询,这样是非常危险的。而且DNS的区域传送是多主复制,如果不设置ACL,那么任何主机都可以到我们的DNS上来做完全区域传送,这也是很危险的,而且会让我们的DNS服务器忙死。

2、BIND的ACL:

(1)BIND中常用4个常用的控制指令:

allow-transfer  { ip;|none;};   //允许做区域传送的指令
allow-query   { ip;|none;};    //允许做查询的指令
allow-recursion { ip;|none;};  //允许做递归查询的ip列表,一般来说只允许给本地客户端做递归查询
allow-update { ip;|none; };     //用于DDNS(动态DNS:与DHCP联动),比较危险,一般不允许更新数据文件
以上4段可以放到全局配置中对全局配置生效,也可放在某个区域中,只针对于某个区域生效;而allow-recursion参数要加入到全局配置中,其他两项一般是放到区域配置中。

(2)BIND的ACL

如果allow-transfer 和 allow-query 放到区域配置中一般后期修改ip地址会非常的麻烦,所以可以定义acl访问规则:

#对于配置文件的格式以及参数调整,具体可以查看man手册 ,命令:man named.conf

定义acl的格式如下:

acl    名称              定义acl规则
acl   string   { address_match_element; ...};

可以看到如上所示信息,定义格式非常简单:使用bind访问控制列表,明确定义一组客户端或者一组主机并使用一个名称来定义它们;

其中,定义的参数有四种,分别是:any、none、local、localnet

acl只有先定义才可以使用,因此acl定义必须在acl调用的最上方即放在配置文件的最上方。

【配置ACL】

在子域DNS上配置ACL,只允许本机地址127.0.0.1查询:

(1)先定义acl:

Linux运维实战之DNS的高级配置(转发器、视图等)_第23张图片

(2)acl定义后需要应用在区域文件中(编辑区域配置文件/etc/named.rfc1912.zone):

Linux运维实战之DNS的高级配置(转发器、视图等)_第24张图片

(3)重新载入配置文件;

(4)验证结果(在子域DNS服务器上用dig命令测试):

首先用本机的IP地址192.168.80.12来解析:

Linux运维实战之DNS的高级配置(转发器、视图等)_第25张图片

拒绝查询哈!

然后用127.0.0.1来解析:

Linux运维实战之DNS的高级配置(转发器、视图等)_第26张图片

能够解析哈,说明ACL起作用了。


四、通过VIEW实现智能DNS:

1、BIND VIEW是什么:

BIND的view是基于人的脑裂(brain split)原理,灵活控制哪些客户机能看到哪个view视图的访问控制列表,view功能可以实现不同网段发出同样的请求却得到不同的DNS解析结果,可以有效的分流网络流量,提高访问控制能力。

2、VIEW语句的介绍:

通过view语句可以完成DNS的智能解析功能,其语法如下: 

view "view_name"  {  
        match-clients { address_match_list };  
        match-destinations { address_match_list };  
        match-recursive-only yes|no; 
        view_option;...  
        zone_statement;...  
    };  
#其实说白了,view视图是根据match_clients提供的查询报文的IP地址进行过滤,一般用于让一个站点的DNS数据分为内外不同的结果

3、配置VIEW,实现智能DNS解析:

######################################规划VIEW##################################################

实验拓扑还是采用子域授权的那一个,每个虚拟机上都配置了两块网卡(参见拓扑图),将来自192.168.80.0/24网段的IP作为内网的主机,192.168.1.0/24网段的IP和所有其它IP作为外网的主机,用win7物理机与虚拟机通信时,访问192.168.80.0/24网段采用的是NAT地址转换,会将物理机的IP地址192.168.1.3转换为192.168.80.254来访问。使用acl来定义控制列表。

【配置VIEW】

(1)在主DNS(192.168.80.11主机)上,编辑主配置文件/etc/named.conf,配置acl和view:

options {
    directory     "/var/named";
};

acl internal {                             //定义acl列表,来自192.168.80.0/24网段的客户端均为内网用户
    192.168.80.0/24;    
};

acl external {                             //定义acl列表,来自192.168.1.0/24网段的客户端均为外网用户
    192.168.1.0/24;
};

view "internal" {                          //内网视图,定义了内网主机查询所使用的区域解析库文件
    match-clients { internal; };
    recursion yes;
    zone "test.com" IN {
        type master;
        file "internal.test.com.zone";
    };
};

view "external" {                          //外网视图,定义了外网主机查询所使用的区域解析库文件
    match-clients { external; };
    recursion yes;
    zone "test.com" IN {
        type master;
        file "external.test.com.zone";
    };
};

(2)使用named-checkconf来检测主配置文件是否有存在语法错误:

[root@Centos ~]# named-checkconf 
[root@Centos ~]#

(3)分别创建内外网用户访问test.com域服务器所使用的正向解析区域文件:

内网(internal)的zone文件/var/named/internal.test.com.zone :

Linux运维实战之DNS的高级配置(转发器、视图等)_第27张图片

外网(external)的zone文件/var/named/external.test.com.zone :

Linux运维实战之DNS的高级配置(转发器、视图等)_第28张图片

(4)将internal和external所使用的解析区域数据文件的属组及权限分别改为named和640:

[root@Centos ~]# chmod 640 /var/named/internal.test.com.zone /var/named/external.test.com.zone 
[root@Centos ~]# chown :named  /var/named/internal.test.com.zone /var/named/external.test.com.zone
[root@Centos ~]# ll /var/named/*.zone
-rw-r-----. 1 root named 272 Jan 23 13:01 /var/named/external.test.com.zone
-rw-r-----. 1 root named 276 Jan 23 00:29 /var/named/internal.test.com.zone

(5)使用named-checkzone分别检测internal和external所使用的区域数据文件是否存在语法错误;

(6)重新加载配置文件和区域文件,并打开查询日志:

[root@Centos ~]# rndc reload
server reload successful
[root@Centos ~]# rndc querylog
[root@Centos ~]# rndc status
version: 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1
CPUs found: 2
worker threads: 2
number of zones: 34
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is ON                 #查询日志已经打开
recursive clients: 0/0/1000
tcp clients: 0/100
server is up and running

(7)分别在192.168.80.0/24和192.168.1.0/24网段上进行测试,并查看结果:

说明:我的win7物理机的IP是192.168.1.3,DNS服务器上配置了两块网卡,IP地址分别为192.168.80.11和192.168.1.58

Linux运维实战之DNS的高级配置(转发器、视图等)_第29张图片

查询日志的情况如下:

image

访问的是内网视图,物理机的IP(192.168.1.3)被转换成了192.168.80.254;

Linux运维实战之DNS的高级配置(转发器、视图等)_第30张图片

查询日志情况如下:

image

由此,通过VIEW实现了智能DNS哈。


【小结】

本次博文主要知识点:

1、DNS的子域授权:

  • 子域的概念:在域内划分出小域即为子域。
  • 授权也称为委派,子域授权的步骤:

(1)划分子域

(2)完成授权

  • 授权是自上而下的过程,父域知道子域的存在并知道子域的主DNS服务器地址(父域的名称解析库中有子域的NS记录和主机A记录),而子域并不知道父域的存在,因此子域需要从根域开始查找。
  • 如果想让子域解析父域,最简单的办法就是设置转发。

2、DNS的转发:

转发的前提——接收转发请求的服务器必须能够为请求者做递归查询;

(1)无条件转发: 转发所有针对非本机负责解析的区域的请求;
#在主配置文件/etc/named.conf的全局选项中添加如下内容:
options {    
    forwarders { ip; };    #指明转发器是谁
    forward only|first;    #only表示仅转发 ;first表示先进行转发,如果没查询到结果,那么它自己还会根据根提示向外迭代查询 
};

(2)条件转发:仅转发对特定区域的请求(即转发域);
#在区域置文件/etc/named.rfc1912.zone中定义转发域:
zone "区域名称" IN {
    type forward;          #区域的类型为转发
    forwarders {  ip; };   #指明转发器是谁 
    forward only|first;    #only表示仅转发 ;first表示先进行转发,如果没查询到结果,那么它自己还会根据根提示向外迭代查询

};

3、BIND的ACL:

(1)BIND中常用4个常用的控制指令:

allow-transfer  { ip;|none;};   //允许做区域传送的指令
allow-query   { ip;|none;};    //允许做查询的指令
allow-recursion { ip;|none;};  //允许做递归查询的ip列表,一般来说只允许给本地客户端做递归查询
allow-update { ip;|none; };     //用于DDNS(动态DNS:与DHCP联动),比较危险,一般不允许更新数据文件

(2)BIND的ACL定义:

acl    名称              定义acl规则
acl   string   { address_match_element; ...};

其中,定义的参数有四种,分别是:any、none、local、localnet

acl只有先定义才可以使用,因此acl定义必须在acl调用的最上方即放在配置文件的最上方。

4、通过视图(view)实现智能DNS:

通过view语句可以完成DNS的智能解析功能,其语法如下:

view "view_name"  {  
        match-clients { address_match_list };  
        match-destinations { address_match_list };  
        match-recursive-only yes|no; 
        view_option;...  
        zone_statement;...  
    };  

本次博文的内容就这么多哈,下次我们给出一个综合案例来总结下DNS的知识;欢迎各位大大拍砖~~