1.DNS系统简介

DNS系统是个多级别的、分布的数据库系统。它保存互连网主机名和IP地址的对应关系,也保存IP地址和主机名的对应关系,邮件路由信息,和其他一些互连网程式用到的信息。
DNS中客户程序查找的信息叫解析库(resolver library),他发送一个查询到一个或多个服务器并等待回应,BIND 9包含了域名服务和解析库。DNS中的数据是按树型结构存储的,或者说是按树型管理的。树的每个节点,称为一个域,由一个库文件标示。表示节点的域名相互串联直到根域(root node)。他从右到左写成字符串,中间用“点”(.)分隔。一个域名只需要在他的父域中名字唯一就可以了。

为了管理方便,名址空间被分隔成一些区,这些区叫做区域(zones)。每一个从一个节点开始,并且延伸至一个叶子节点,或延伸到另一个区域的开始。每一个区域的数据都存在DNS中,他通过DNS协议应答本区域的DNS查询。相关的域名数据存储在资源记录中(resource records (RRs))。正确的操作域名服务器,很重要的一点是理解区域(zones)和域(domain)的区别。

区域( zone)是DNS树中一个节点的代表。一个区域(zone)包含一个域树(domain tree)相邻近的部分,对他来说,一个域名服务器拥有他完整的信息,并拥有管理权。他包含从某一节点以下任何的域名,除了那些连接到其他区的部分(那些部分可能由其他更低级的服务器管理)。一个节点会被一个或多个父区域的NS 记录(NS records )标注,他会被从根区域开始逐层匹配。

一个区域(zone)能够精确的映射一个域(domain),也能够只包含一个域的部分,其他部分由另一个域名服务器解释。DNS中每一个名字都是个域,即使他是个终点(terminal),没有子域(subdomains)。每一个子域都是个域,除了根域外任何的域也都是子域。这些术语的意义都不但是字面能够理解的,建议阅读RFCs 1033,1034 and 1035来完整理解这些难点和细节。

2.bind软件简介

最新的Bind源代码软件包可以在官方网站http://www.bind.com/下载。另外http://www.isc.org/index.pl/sw/bind/也是一个不错的地方。帮助文档你可以在http://www.isc.org/index.pl/sw/bind/找到,此站点的帮助文档很详细且比较全面。另外http://www.isc.org/index.pl/sw/bind/也回答了bind的常见问题。http://www.bind.com/bind.html 里有很多bind配置的配置文件示例。

centos7自带的是bind 9.9.4的包,我们可以直接通过yum工具来安装它。安装软件的时候装两个包,一个bind,一个bind-chroot。有chroot环境之后,可以将所有bind 程序和配置都在/var/named/chroot目录下。

[root@servera ~]# yum -y install bind bind-chroot

3.bind9的view视图
从Bind 9开始,bind支持视图功能。什么是视图呢?就是以某种特殊的方式根据用户来源的不同而返回不同的查询结果。这个技术在CDN中应用相当多,也是解决目前区域间带宽小和延迟大问题的一种方法。

view的配置写法如下:
view “名称” {  # 名称可以自拟,但必须唯一
match-clients { ip/netmask; }; # 通过match-clients字段来区分不同区域
zone "domain" IN {  # 当有了view字段之后,所有的zone定义字段必须出现在view字段当中
type master;
file "domain.zone";
};
};

举例:
由于中国网络目前分为两个区域—南电信北联通,2个网络上的用户,访问互相网络上的主机效率很低,所以现在一般的服务提供商都提供2个网络的相同服务,就如www.abc.com这个网站,为了提高电信和网通2个网络上的客户体验,使用户体验最快速的访问速度。决定为电信和网通分别架设2台服务器,其中一台接入电信专线,一台接入网通专线。但是要让用户透明的访问此网站,不需要让用户进行人工的网站选择。我们可以采用DNS服务器中的view功能,让不同的IP指向在不同网络上的主机。比如,让浏览www.abc.com这个网站上的网通用户浏览架设在网通线路上的主机。

实验环境如下:
解析的主机名称:www.abc.com
电信客户端ip:172.25.0.11   希望其解析到结果为192.168.11.1
网通客户端ip:172.25.0.12   希望其解析到结果为22.21.1.1
其余剩下其他运营商的客户端解析的结果皆为1.1.1.1
配置如下:
1)定义view字段

[root@servera ~]# vim /etc/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; };

        /* 
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable 
recursion. 
         - If your recursive DNS server has a public IP address, you MUST enable access 
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification 
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface 
        */
        recursion yes;

        dnssec-enable yes;
		dnssec-validation yes;
        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};
view "dxclient" {
        match-clients { 172.25.0.11; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "dx.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "wtclient" {
        match-clients { 172.25.0.12; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "wt.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "other" {
        match-clients { any;};
         zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "other.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";

};

include "/etc/named.root.key";

2)生成数据文件
[root@servera named]# cp -p named.localhost dx.abc.com.zone
[root@servera named]# cp -p dx.abc.com.zone wt.abc.com.zone
[root@servera named]# cp -p dx.abc.com.zone other.abc.com.zone
[root@servera named]# vim dx.abc.com.zone 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       192.168.11.1
                           
[root@servera named]# vim wt.abc.com.zone
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       22.21.1.1                   
[root@servera named]# vim other.abc.com.zone
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       172.25.0.10
www     A       1.1.1.1

3)重启服务
[root@servera named]# chgrp named abc.com.*
检测语法:
[root@servera named]# named-checkconf
[root@servera named]# named-checkzone  abc.com /var/named/dx.abc.com.zone
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# named-checkzone  abc.com /var/named/wt.abc.com.zone
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# named-checkzone  abc.com /var/named/other.abc.com.zonee
zone abc.com/IN: loaded serial 10
OK
[root@servera named]# service named start
[root@servera named]# chkconfig named on
4)测试
[root@serverb ~]# nslookup
> server 172.25.0.10
Default server: 172.25.0.10
Address: 172.25.0.10#53
> www.abc.com
Server: 172.25.0.10
Address: 172.25.0.10#53

Name: www.abc.com
Address: 192.168.11.1

[root@serverc ~]# nslookup
> server 172.25.0.10
Default server: 172.25.0.10
Address: 172.25.0.10#53
> www.abc.com
Server: 172.25.0.10
Address: 172.25.0.10#53

Name: www.abc.com
Address: 22.21.1.1

可以看到,解析www.abc.com的请求同时交给172.25.0.10这台服务器,然而不同的客户端解析到的结果不一致,这就是dns-view的作用。
如果请求不来自第一个视图规定的区域,那么请求就会向下选取其他视图比对,所以可以看出视图比对是自上而下的,如果请求的区域在上一个视图中,就不会向下一个视图请求,即使你在下一个视图中放入了这个区域。

4.ACL参数的配置
有些时候,我们可能匹配的IP地址范围比较广,由于matchclients可能需要定义非常多的网段,bind引入acl关键字定义变量替换,以使matchclients中仅出现最少的符号,而网段的增添可以在外部文件中进行。

可以通过以下方式去完成:
acl "foosubnet" { 192.168.1/24;192.168.2/24; };
举例:
目前电信的客户端为172.25.0.11和172.25.0.12这两台服务器
目前网通的客户端为172.25.0.13和172.25.0.14这两台服务器
通过acl的方式完成相应配置,就可以通过以下写法来实现。

1)在主配置文件里定义外部文件的读取配置参数
[root@servera named]# vim /etc/named.conf 
# 变更如下参数,其余参数不变
include "/etc/dx.cfg";
include "/etc/wt.cfg";
view "dxclient" {
        match-clients { "dx"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "dx.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};
view "wtclient" {
        match-clients { "wt"; };
        zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "wt.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";
};

view "other" {
        match-clients { any;};
         zone "." IN {
                type hint;
                file "named.ca";
        };
        zone "abc.com" IN {
                type master;
                file "other.abc.com.zone";
        };

include "/etc/named.rfc1912.zones";

};
2)生成外部文件
[root@servera named]# cd /var/named/chroot/
[root@servera chroot]# ls
dev  etc  run  usr  var
[root@servera chroot]# cd etc/
[root@servera etc]# ls
localtime  named.conf        named.rfc1912.zones  pki
named      named.iscdlv.key  named.root.key       rndc.key
[root@servera etc]# pwd
/var/named/chroot/etc
[root@servera etc]# vim dx.cfg
acl "dx" {
        172.25.0.11;
        172.25.0.12;
};

[root@servera etc]# vim wt.cfg
acl "wt" {
        172.25.0.13;
        172.25.0.14;
};
3)重启服务
[root@servera etc]# systemctl restart named-chroot
4)访问测试略