dns服务bind使用

正向,反向,主从,子域,转发器,安全控制。数据库



介绍
vim

wKioL1aQw2CSnCboAAEUzDzo8vA983.jpg


top level domain(tld) 顶级域windows

域的组织络式,咱们也看到箭头是单向的,这也是域名解析的方式,在本地DNS服务器没法解析的状况下,本地DNS服务器会直接去找根域,再找顶级域,找到组织域再找到主机名。注册域名通常就是注册的组织域,如今也有那种net.co,这种不知道是怎么个状况。
centos


递归 迭代缓存


wKioL1aQzWfgTaJEAAB7WQENmwk287.jpg

如今咱们先来看看左下角这个用户是如何解析到redhat.com下面的主机的。server是对应的dns服务器。
安全

wKioL1aQ2q-iaSlWAACpc7SFsBs296.jpg


用户向本地的DNS服务器,发送解析请求。本地的DNS服务器出去饶了一大圈最终返回给用户结果。服务器

这种隐藏背后的操做,直接为用户返回结果就是对用户支持递归网络


可是对于DNS服务器来讲,它本身没有请求的答案,因此就直接去找根,而根告诉DNS服务器去找com.,服务器收到之后就再去找com.,com又告诉咱们的DNS服务器再去找redhat.com,服务器再去找redhat.com,redhat.com这个DNS服务器上面有这个答案,因此直接返回给咱们本地的DNS服务器。本地的DNS服务器再返回给用户最终答案。session

上面DNS服务器一次又一次的重复去找同一个答案,这种过程就是迭代
dom


若是是redhat下面的主机想要解析google下面主机的主机名。redhat的DNS服务器没有答案也是会直接去找根,不会去找上级COM的,即便看起来这样更近。

由于要达到这样的效果太难了,本地的DNS服务器须要有每一个负责com域服务器的IP地址,其它的同级域固然也要有了,并且那些服务器发生变化也还要同步更新。因此,结果就是咱们的DNS服务器上面只有全球13个根的服务器地址。


正向解析与反向解析

名称 --> IP:正向解析
IP --> 名称:反向解析

两者的名称空间,非为同一个空间,即非为同一棵树;所以,也不是同一个解析库;

反向的树有点这个姿式。

wKioL1aQ8FeAm9JCAABe5O9JLlI711.jpg

地址就是从上到下的IP地址块。不过这个在公网上没有物理存在的解析树,只是在公司组织内部有时候会使用。

正向解析是 倒置的域名树。

反向解析是 倒置的IP树。

很明显它们一点也不同。因此在作DNS服务的时候要明白这是两个彻底不一样的东西,spacer.gif没有交集。


DNS服务器类型
        主DNS服务器
        辅助DNS服务器
        缓存名称服务器

只要是DNS服务器默认状况下都会把不是本身管辖的区域的解析记录,缓存下来。
而这种主要是用来给客户端作递归的DNS服务器就是缓存名称服务器。


一次完整的查询请求通过的流程:
Client --> hosts文件 --> DNS Local Cache --> DNS  Server (recursion) -->
本身负责解析的域:直接查询数据库并返回答案;
不是本身负责解析的域:Server Cache --> iteration(迭代)
    
解析答案
    确定答案:
    否认答案:不存在查询的键,所以,不存在与其查询键对应的值;
    
    权威答案:由直接负责的DNS服务器返回的答案;
    非权威答案:


主-辅DNS服务器
    主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操做都可进行;
    从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操做;
        “复制”操做的实施方式:
            序列号:serial, 也便是数据库的版本号;主服务器数据库内容发生变化时,其版本号递增;
            刷新时间间隔:refresh, 从服务器每多久到主服务器检查序列号更新情况;
            重试时间间隔:retry, 从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;
            过时时长:expire,从服务器始终联系不到主服务器时,多久以后放弃从主服务器同步数据;而且本身也中止提供服务;
            否认答案的缓存时长:
            
        主服务器能够”通知“从服务器随时更新数据;
        
区域传送:区域数据文件
        全量传送:axfr, 传送整个数据库;通常刚创建完成DNS的时候。

        增量传送:ixfr, 仅传送变化的数据;


区域数据库文件

    资源记录:Resource Record, 简称rr;
    记录类型:A, AAAA, PTR, SOA, NS, CNAME, MX

    资源记录类型,用于资源的功能。

    SOA: Start Of Authority,  起始受权   区域管理者,一个区域解析库有且只能有一个SOA记录,并且必须放在第一条;
    NS: Name Server  域名服务记录;一个区域解析库能够有多个NS记录;其中一个为主的;

    MX: Mail eXchange: 邮件交换器, 优先级:0-99,数字越小优先级越高;
    A:  Address    : (FQDN-->IP)  地址记录,FQDN --> IPv4;
    PTR: PoiTeR, IP --> FQDN   反向地址记录,IP --> FQDN
    AAAA: Address    FQDN --> IPv6   地址记录,FQDN --> IPv6
    CNAME: Canonical Name,   别名记录

    资源记录的定义格式:

    语法:    name      [TTL]     IN    RR_TYPE         value


资源记录的格式
        name    [ttl]    IN    RRtype         Value
        name: 须要解析的名称
        ttl : 客户端缓存能够保留的时间。
        IN  : 关键字
        RRtype: 记录类型
        Value :所解析名称得值
   

SOA :
        name  只能是区域名称 能够用@来表示区域。
        value  区域名称(也能够用主dns的FQDN), 管理员邮箱 , 附加信息。  ; 分号表明注释。


         @    600    IN    SOA    ds.star.com.   dd.star.com.  (
                serial number  ;序列号,用来表示记录是否有变更,十位之内的十进制数字
                refresh time   ;刷新时间,多久到服务器检查一次数据。
                retry time     ;重试时间, 刷新失败后,再尝试时间。
                expire time    ;过时时间, 辅助DNS将中止工做。
                negative answer ttl ;否认答案的ttl,客户端缓存否认答案的时间。
            )

        上面中括号里的数据能够写在同一行。用空格分隔。
        dd.star.com 就是 dd@star.com.     由于文件中@有特殊意义。
        SOA 必须是区域数据库文件的第一条记录。
        刷新时间单位  秒。  也能够用 M 分  H 小时,  D  天

        SOA中定义的序列号只要是增加,主服务器就会触发通知机制,序列号减小不会触发。

NS : 表明DNS服务器,一个区域能够有多个。
        name 区域名称, 能够用@表示。
        value   dns服务器的FQDN.

        @    600    IN    NS    dns.star.com.    
        @    600    IN    NS    ns        不写全自动补上区域名称。

: 若是有多个相同主机名的A记录,就会轮询着给客户端地址。
        name: FQDN
        value: IP

MX: 表明这个区域里的smtp服务器,一个区域能够有多个 指定优先级。
        用来标识区域里的邮件服务器的。要否则这也不知道发给谁啊 tc@star.com   
        name:区域名称
        value: 包含优先级和FQDN.
        优先级: 0-99 ,数字越小,级别越高。此优先级不是轮询用是,是用来备份的。


        @    600    IN    MX    10    mail

         这个域的邮件服务器是mail,要有相对应的A记录。

CNAME:
        name : FQDN    别名
        value: FQDN    真实的名
        ftp    600    IN    CNAME    www

        ftp 的正式名称是www, www 的别名是ftp

PTR : IP-->FQDN,  反向查找,在正向区域物理文件中虽然也能够写PTR记录,但最好仍是把它们分开的好。   能够有多条记录。
        name: IP    反向IP地址。
        value: FQDN

        区域名称为: 网络地址反向.in-addr.arpa.

注意主机名的 .  和相对名称 、绝对名称。相对名称就是会自动会在主机名后加上区域名称的。绝对名称必定要以.点结尾。 要否则会再加上区域名称。

一个区域只能有一个主DNS服务器。

注意:
(1) TTL能够从全局继承;  $TTL 3600
(2) @表示当前区域的名称;
(3) 相邻的两条记录其name相同时,后面的name可省略;
(4) 对于正向区域来讲,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录;



环境

bind:BIND 9.9.4-RedHat-9.9.4-18.el7 (Extended Support Version)

系统:CentOS Linux release 7.1.1503 (Core)

各主机:

172.16.40.10
主DNS服务器
172.16.40.11
从DNS
172.16.40.12
子DNS
172.16.249.218
测试机


注意事项:时间同步。


安装

BIND:Berkeley Internet Name Domain 伯克利建立,现由ISC.ORG维护。

isc(www.isc.org)   dhcp软件也是由isc来维护。


直接yum安装便可,并且也省去了本身建立一些所必须的区域文件。

咱们这里就只安装bind包了,其它的如chroot功能包这里就不介绍了。

 [root@localhost ~]# yum install bind -y 
 Package bind.x86_64 32:9.9.4-18.el7 will be installed
[root@localhost ~]# rpm -ql bind
.....
/etc/named
/etc/named.conf
/etc/named.rfc1912.zones
/etc/named.root.key        #在CentOS6上面若是不能转发,能够把这个注释试试。
/etc/rndc.conf             #用于rndc与bind通讯
/etc/rndc.key              #用于rndc与bind通讯
/usr/sbin/named-checkconf  #用来检查bind的配置文件。
/usr/sbin/named-checkzone  #用来检查区域数据文件
/usr/sbin/rndc
/var/named/named.ca
/var/named/named.empty
/var/named/named.localhost
/var/named/named.loopback
/var/named/slaves

主配置文件:

/etc/named.conf
包含进来的其它文件:
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key


解析库文件:
/var/named/目录下;
通常名字为:ZONE_NAME.zone

rndc: Remote Name Domain Controller  远程名称域管理。953/tcp,默认监听于127.0.0.1地址,所以仅容许本地使用;为了安全着想通常也不用设置。

看到生成了几个named开头的文件,这些都是所必须的区域数据文件。


注意:
(1) 一台DNS服务器可同时为多个区域提供解析;
(2) 必需要有根区域解析库文件: named.ca;
(3) 还应该有两个区域解析库文件:localhost和127.0.0.1的正反向解析库;
    正向:named.localhost
    反向:named.loopback

rpm安装的会本身带,就是上面的那几个named.*文件,若是是编译安装就要本身写了。


bind程序安装完成以后,默认便可作缓存名称服务器使用;若是没有专门负责解析的区域,直接便可启动服务;
CentOS 6: service  named  start
CentOS 7: systemctl  start  named.service



配置:

主配置文件:
        options {
            全局选项;
        };

        zone "ZONE name" {
            区域数据文件;
        };
        
        logging {
            定义日志系统;
        };

如:
        options {
            directory    "/var/named";
        };
        
        zone "." IN {
            type hint;
            file "named.ca";
        };

        zone "star.com." IN {
            type master;
            file "star.com.zone";
        };

type包括: 

           hint   根提示
           master 主区域
           slave  辅助区域
           forward 转发区域

注意每行后面的分号。   

options {
        listen-on port 53 { 127.0.0.1; };        #默认监听127,要改成监听的网卡
        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     { localhost; };    #容许查询的主机,白名单。能够注释,默认全部

recursion yes;                            #容许全部给全部主机递归。

        dnssec-enable yes;        #DNS的安全扩展认证机制,若是出现问题能够禁用试试。
        dnssec-validation yes;    #
        dnssec-lookaside auto;    #

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

zone "." IN {
        type hint;
        file "named.ca";
};

include "/etc/named.rfc1912.zones";        #包含的配置文件,里面有不少区域的定义。
include "/etc/named.root.key";            #在centos6上面若是不能转发,能够注释掉试试。

 
我这里的配置

/etc/named.conf  全局配置,其它部分没有改。

options {
        listen-on port 53 { 172.16.40.10; };
        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     { localhost; };

咱们先来启动下看看。

wKioL1aR1MjhA8V1AAL9lIhTyw0912.jpg

[root@localhost ~]# ss -unl
State       Recv-Q Send-Q                                     Local Address:Port                                       Peer Address:Port 
UNCONN      0      0                                           172.16.40.10:53                                                    *:*     
UNCONN      0      0                                                      *:123                                                   *:*     
UNCONN      0      0                                              127.0.0.1:323                                                   *:*     
UNCONN      0      0                                                    ::1:53                                                   :::*     
[root@localhost ~]# ss -tnl
State       Recv-Q Send-Q                                     Local Address:Port                                       Peer Address:Port 
LISTEN      0      10                                          172.16.40.10:53                                                    *:*

tcp/udp的53号端口。


172.16.249.218测试:

[root@localhost ~]# dig -t A www.baidu.com @172.16.40.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t A www.baidu.com @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50339
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 5

;; QUESTION SECTION:
;www.baidu.com.            IN    A

;; ANSWER SECTION:
www.baidu.com.        1200    IN    CNAME    www.a.shifen.com.
www.a.shifen.com.    300    IN    A    61.135.169.121
www.a.shifen.com.    300    IN    A    61.135.169.125

;; AUTHORITY SECTION:
a.shifen.com.        1198    IN    NS    ns4.a.shifen.com.
a.shifen.com.        1198    IN    NS    ns1.a.shifen.com.
a.shifen.com.        1198    IN    NS    ns2.a.shifen.com.
a.shifen.com.        1198    IN    NS    ns3.a.shifen.com.
a.shifen.com.        1198    IN    NS    ns5.a.shifen.com.

;; ADDITIONAL SECTION:
ns2.a.shifen.com.    1198    IN    A    180.149.133.241
ns3.a.shifen.com.    1198    IN    A    61.135.162.215
ns5.a.shifen.com.    1198    IN    A    119.75.222.17
ns1.a.shifen.com.    1198    IN    A    61.135.165.224
ns4.a.shifen.com.    1198    IN    A    115.239.210.176

;; Query time: 3253 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan  9 17:00:12 2016
;; MSG SIZE  rcvd: 260


工具介绍

dig命令:
    dig  [-t RR_TYPE]  name  [@SERVER]  [query options]
        用于测试dns系统,所以其不会查询hosts文件;

        查询选项:
            +[no]trace:跟踪解析过程;
            +[no]recurse:进行递归解析;
            
        反向解析测试
            dig  -x  IP
            
        模拟彻底区域传送:
            dig  -t  axfr  DOMAIN  [@server]
            
host命令:
    host  [-t  RR_TYPE]  name  SERVER_IP
    
nslookup命令:
    nslookup  [-options]  [name]  [server]
    
    交互式模式:
        nslookup>
            server  IP:以指定的IP为DNS服务器进行查询;
            set  q=RR_TYPE:要查询的资源记录类型;
            name:要查询的名称;


nslookup在windows上也有。


配置一个正向解析区域:

一、定义区域
     在主配置文件中或主配置文件辅助配置文件中实现;
    zone  "ZONE_NAME"  IN  {
        type  {master|slave|hint|forward};
        file  "ZONE_NAME.zone";
    };    
    
注意:区域名字ZONE_NAME即为域名;

我这里是在named.rfc1912.zones文件中添加的,也能够在named.conf文件中添加。

注意分号。

[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "star.com" IN {
        type master;
        file "star.com.zone";
};

文件的位置是相对于主配置文件中的directory而言的。

检测一下配置文件有没有错误:

[root@localhost named]# named-checkconf

没有消息就是最好的消息。


二、 创建区域数据文件(主要记录为A或AAAA记录),在/var/named目录下创建区域数据文件;

[root@localhost ~]# cd /var/named
[root@localhost named]# ls
data  dynamic  named.ca  named.empty  named.localhost  named.loopback  slaves
[root@localhost named]# vim star.com.zone

$TTL 3600
@       IN      SOA     ns      nsadmin.star.com.       (   
                2016011001
                30M 
                10M 
                1D  
                1H      )   
    
        IN      NS      ns  
ns      IN      A       172.16.40.10
www     IN      A       172.16.40.101
@       IN      MX  10  mail
mail    IN      A       172.16.40.102
pps     IN      CNAME   www 
pop3    IN      CNAME   mail

wKioL1aR9gnD4361AACvVly3B4w035.jpg

检查一下区域数据文件:

[root@localhost named]# named-checkzone star.com star.com.zone 
zone star.com/IN: loaded serial 2016011001
OK
[root@localhost named]#

提示加载了一个区域,而且序列号为2016011001,只要这个数字增加就会通知全部从服务器来拿数据。

咱们如今只有主服务器。

重读一下置配:

[root@localhost named]# rndc reload
server reload successful
[root@localhost named]

这里也能够用systemctl reload named来重载配置文件。

不过在数据文件不少的时候用这个可能会卡住的。在最后会介结下rndc的经常使用使用。


172.16.249.218测试:

[root@localhost ~]# dig -t MX star.com @172.16.40.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t MX star.com @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40815
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; QUESTION SECTION:
;star.com.            IN    MX

;; ANSWER SECTION:
star.com.        3600    IN    MX    10 mail.star.com.

;; AUTHORITY SECTION:
star.com.        3600    IN    NS    ns.star.com.

;; ADDITIONAL SECTION:
mail.star.com.        3600    IN    A    172.16.40.102
ns.star.com.        3600    IN    A    172.16.40.10

;; Query time: 12 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan  9 17:01:50 2016
;; MSG SIZE  rcvd: 96

[root@localhost ~]# dig -t axfr star.com @172.16.40.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr star.com @172.16.40.10
;; global options: +cmd
star.com.        3600    IN    SOA    ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
star.com.        3600    IN    MX    10 mail.star.com.
star.com.        3600    IN    NS    ns.star.com.
mail.star.com.        3600    IN    A    172.16.40.102
ns.star.com.        3600    IN    A    172.16.40.10
pop3.star.com.        3600    IN    CNAME    mail.star.com.
pps.star.com.        3600    IN    CNAME    www.star.com.
www.star.com.        3600    IN    A    172.16.40.101
star.com.        3600    IN    SOA    ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
;; Query time: 27 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan  9 17:05:19 2016
;; XFR size: 9 records (messages 1, bytes 233)

模拟区域传送,这里能够用来看看star.com区域里面有哪些条目,看来咱们刚才写的所有都生效了。


这里忽略了一个问题,看一下区域数据文件的权限:

[root@localhost named]# ll
total 20
drwxrwx---. 2 named named   22 Jan 10 11:44 data
drwxrwx---. 2 named named   58 Jan 10 14:44 dynamic
-rw-r-----. 1 root  named 2076 Jan 28  2013 named.ca
-rw-r-----. 1 root  named  152 Dec 15  2009 named.empty
-rw-r-----. 1 root  named  152 Jun 21  2007 named.localhost
-rw-r-----. 1 root  named  168 Dec 15  2009 named.loopback
drwxrwx---. 2 named named    6 Mar  6  2015 slaves
-rw-r--r--. 1 root  root   212 Jan 10 14:11 star.com.zone

如今的权限是其它人可读的。来修改下。

[root@localhost named]# chown :named star.com.zone 
[root@localhost named]# chmod o= star.com.zone
[root@localhost named]# ll star.com.zone
-rw-r-----. 1 root named 212 Jan 10 14:11 star.com.zone
[root@localhost named]#



配置一个反向解析区域:

咱们先在配置文件中添加区域:

[root@localhost named]# vim /etc/named.rfc1912.zones
zone "16.172.in-addr.arpa" IN {
        type master;
        file "172.16.zone";
};

上面的区域名称也能够写成40.16.172.in-addr.arpa。

我这里只是为了说明在数据文件中的地址的写法。

[root@localhost named]# named-checkconf

没有错误。

对区域添加对应的区域数据文件:

[root@localhost named]# vim 172.16.zone

$TTL 3600
@       IN      SOA     @       nsadmin.star.com. (
                2016011001
                30M 
                10M 
                1D  
                1H )
        IN      NS      ns.star.com.
10.40   IN      PTR     ns.star.com.
10.101  IN      PTR     www.star.com.
102.40  IN      PTR     mai.star.com.
102.40  IN      PTR     pop3.star.com.

wKioL1aSBhmRYq2TAADRd2GtV40321.jpg

我这里的第10行的name部分写错了,正常应该是101.40。就是反着写ip地址。作到下边才发现,我实验的主机改了下。这里就不改了。


检测一下:

[root@localhost named]# named-checkzone 16.172.in-addr.arpa 172.16.zone 
zone 16.172.in-addr.arpa/IN: loaded serial 2016011001
OK
[root@localhost named]# 
[root@localhost named]# rndc reload
server reload successful
[root@localhost named]#


172.16.249.128再来看看:

[root@localhost ~]# dig -x 172.16.40.10 @172.16.40.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -x 172.16.40.10 @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46366
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;10.40.16.172.in-addr.arpa.    IN    PTR

;; ANSWER SECTION:
10.40.16.172.in-addr.arpa. 3600    IN    PTR    ns.star.com.

;; AUTHORITY SECTION:
16.172.in-addr.arpa.    3600    IN    NS    ns.star.com.

;; ADDITIONAL SECTION:
ns.star.com.        3600    IN    A    172.16.40.10

;; Query time: 1 msec
;; SERVER: 172.16.40.10#53(172.16.40.10)
;; WHEN: Sat Jan  9 17:47:19 2016
;; MSG SIZE  rcvd: 98


[root@localhost ~]# dig -x 172.16.40.102 @172.16.40.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -x 172.16.40.102 @172.16.40.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23950
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;102.40.16.172.in-addr.arpa.    IN    PTR

;; ANSWER SECTION:
102.40.16.172.in-addr.arpa. 3600 IN    PTR    mai.star.com.
102.40.16.172.in-addr.arpa. 3600 IN    PTR    pop3.star.com.

;; AUTHORITY SECTION:
16.172.in-addr.arpa.    3600    IN    NS    ns.star.com.

;; ADDITIONAL SECTION:
ns.star.com.        3600    IN    A    172.16.40.10


主从配置

区域传送:主从复制:
主服务器是时刻敞开的,只有用权限来控制。若是没有权限控制,任何人均可以来复制。
因此: 从服务设置区域类型为slave,从服务器作的就是去主服务器复制这个数据。别的无论。
服务器就会给它数据。

而父服务器上设置的从服务器的NS和A记录只是为了在区域文件序列号增长之后通知从服务器来获取数据。

从服务器是用的随机端口向服务器的53号端口开启传送的。从服务器扮演的是客户端。


辅助DNS服务器从主DNS服务器或其它辅助DNS服务器处请求传输数据的过程。
辅助DNS服务器上面不用创建任务数据库文件,会从主DNS上面同步。
彻底区域传送: 传送区域的全部数据, AXFR ,   通常刚创建完成DNS的时候。
增量区域传送: 传送区域中改变的数据部分, IXFR.


主的bind版本可能低于从的,从的不能低于主的。由于从的要兼容于主的。主的版本高会有新的功能,而从的没有。从的去同步数据,可能就会出现问题。对于系统的版本没有太大的要求,是软件层面的同步。



从服务器设置:

172.16.40.11

安装:

[root@localhost ~]# yum install bind -y

主配置文件:

options {
        listen-on port 53 { 172.16.40.11; };
        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     { localhost; };

配置文件中添加区域:

[root@localhost ~]# vim /etc/named.rfc1912.zones
zone "star.com" IN {
        type slave;
        file "slaves/star.com.zone";
        masters { 172.16.40.10; };
};

说明:

这里的类型为 slave。 文件放在slaves目录下是由于这个目录的的权限是named用户可写的,bind的工做用户。masters 能够在大括号中写多个,以分号分隔。

[root@localhost named]# ll
total 16
drwxrwx---. 2 named named    6 Mar  6  2015 data
drwxrwx---. 2 named named    6 Mar  6  2015 dynamic
-rw-r-----. 1 root  named 2076 Jan 28  2013 named.ca
-rw-r-----. 1 root  named  152 Dec 15  2009 named.empty
-rw-r-----. 1 root  named  152 Jun 21  2007 named.localhost
-rw-r-----. 1 root  named  168 Dec 15  2009 named.loopback
drwxrwx---. 2 named named    6 Mar  6  2015 slaves

看最下面的一行,目录的属主组都是named。

从服务器不须要建立数据文件,它会去主服务器复制数据文件,而后再自动建立对应的数据文件。

咱们要作的就是为它指定要在哪里建立这个文件。 它的工做用户是named,必须对目录有写入的权限才能建立文件。


启动从服务器

[root@localhost named]# systemctl start named

172.16.40.10:主服务器

[root@localhost named]# tail -30 /var/log/messages
.....
Jan 10 16:10:15 localhost named[3224]: client 172.16.40.11#42701 (star.com): transfer of 'star.com/IN': AXFR started
Jan 10 16:10:15 localhost named[3224]: client 172.16.40.11#42701 (star.com): transfer of 'star.com/IN': AXFR ended

能够看到172.16.40.11以随机端口42701来请求star.com区域的数据。


172.16.40.11: 从服务器

[root@localhost named]# tail -20 /var/log/messages
Jan 10 16:10:15 localhost named[3257]: zone star.com/IN: transferred serial 2016011001
Jan 10 16:10:15 localhost named[3257]: transfer of 'star.com/IN' from 172.16.40.10#53: Transfer completed: 1 messages, 9 records, 233 bytes, 0.021 secs (11095 bytes/sec)
.....                    #从172.16.40.10:53传送过来9条记录,还有数据大小。
[root@localhost named]# ll slaves
total 4
-rw-r--r--. 1 named named 423 Jan 10 16:10 star.com.zone
[root@localhost named]#

数据文件确实有了,在centos7上面的这个bind版本 这个文件是以二进制格式存放的。咱们只能用dig命令来看看有没有数据了。

[root@localhost ~]# dig -t axfr star.com @172.16.40.11

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr star.com @172.16.40.11
;; global options: +cmd
star.com.        3600    IN    SOA    ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
star.com.        3600    IN    NS    ns.star.com.
star.com.        3600    IN    MX    10 mail.star.com.
mail.star.com.        3600    IN    A    172.16.40.102
ns.star.com.        3600    IN    A    172.16.40.10
pop3.star.com.        3600    IN    CNAME    mail.star.com.
pps.star.com.        3600    IN    CNAME    www.star.com.
www.star.com.        3600    IN    A    172.16.40.101
star.com.        3600    IN    SOA    ns.star.com. nsadmin.star.com. 2016011001 1800 600 86400 3600
;; Query time: 4 msec
;; SERVER: 172.16.40.11#53(172.16.40.11)
;; WHEN: Sat Jan  9 18:38:47 2016
;; XFR size: 9 records (messages 1, bytes 233)

别的测试就不贴了,太占篇幅了。

这个dig -t axfr就是用来测试区域传送的,也就是复制数据。由于如今尚未安全控制,因此在哪也可使用,到后面加上安全控制之后,能够用这个命令来测试某主机有没有复制的权限。


我这再把反向的也加上:

这里我把上面添加的也贴出来了。刚添加的是下面那个。

zone "star.com" IN {
        type slave;
        file "slaves/star.com.zone";
        masters { 172.16.40.10; };
};

zone "16.172.in-addr.arpa" IN {
        type slave;
        file "slaves/172.16.zone";
        masters { 172.16.40.10; };
};

看下日志:

[root@localhost named]# tail -20 /var/log/messages
.....
Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: Transfer started.
Jan 10 16:44:46 localhost named[3257]: transfer of '16.172.in-addr.arpa/IN' from 172.16.40.10#53: connected using 172.16.40.11#51642
Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: transferred serial 2016011001
Jan 10 16:44:46 localhost named[3257]: transfer of '16.172.in-addr.arpa/IN' from 172.16.40.10#53: Transfer completed: 1 messages, 7 records, 225 bytes, 0.006 secs (37500 bytes/sec)
Jan 10 16:44:46 localhost named[3257]: zone 16.172.in-addr.arpa/IN: sending notifies (serial 2016011001)
[root@localhost ~]# dig -t axfr 16.172.in-addr.arpa @172.16.40.11

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> -t axfr 16.172.in-addr.arpa @172.16.40.11
;; global options: +cmd
16.172.in-addr.arpa.    3600    IN    SOA    16.172.in-addr.arpa. nsadmin.star.com. 2016011001 1800 600 86400 3600
16.172.in-addr.arpa.    3600    IN    NS    ns.star.com.
10.40.16.172.in-addr.arpa. 3600    IN    PTR    ns.star.com.
101.40.16.172.in-addr.arpa. 3600 IN    PTR    www.star.com.
102.40.16.172.in-addr.arpa. 3600 IN    PTR    mai.star.com.
102.40.16.172.in-addr.arpa. 3600 IN    PTR    pop3.star.com.
16.172.in-addr.arpa.    3600    IN    SOA    16.172.in-addr.arpa. nsadmin.star.com. 2016011001 1800 600 86400 3600
;; Query time: 4 msec
;; SERVER: 172.16.40.11#53(172.16.40.11)
;; WHEN: Sat Jan  9 19:08:02 2016
;; XFR size: 7 records (messages 1, bytes 225)

好了,还有一个问题。如今这种状况下,从服务器只有到时间之后才会去主服务器获取数据。

若是想要让主服务器通知从服务器,就要在主服务器的区域数据文件中加上从服务器的NS记录。


忽然想到一点,在这里加上,若是咱们这是公网的域名,而且想要在公网上使用。就要把主从两台服务器都在com服务器上受权才能使用。否则com服务器不知道有这我的,请求也就到不了这里。


172.16.40.10: 加从服务器NS记录。注意修改序列号。

wKiom1aSHx-yTHWJAACHI3LMUHU460.jpg

star.com区域。两条记录: 一、从服务器ns记录,二、对应的A记录。 

ftp记录是我刚才测试的时候加上的。这里不用关注它。

wKioL1aSH1rT8wOLAABrJtK1-Ts216.jpg

16.172.in-addr.arpa加一条记录,从服务器的NS记录。

rndc reload 一下。主服务器会把此次修改通知给从服务器。  这就能够了。



子域配置

注意:子区域服务器要在运行状态,才能够检测经过区域数据文件。  namd-checkzone

           提示没有A记录。由于测试结果是由子域来返回的。
      
父域的区域数据文件中添加:有多个子域就要分别在文件中写上这些设置。
            1, 受权的子区域名称
            2, 子区域的名称服务器
            3, 子区域的名称服务器IP地址。

在相对应的区域数据文件中加上子区域的记录  如我这里要在star.com域中加上sst的子域:
            1, 子区域名称 sst
            2, 子区域的名称服务器 ns.sst.star.com.
            3, 子区域的名称服务器 IP 地址, 加上A记录。


看一下我这里的star.com.zone的内容。为了容易理解,NS记录部分用的是绝对名称。

$TTL 3600
@       IN      SOA     ns      nsadmin.star.com.       (   
                2016011006
                30M 
                10M 
                1D  
                1H      )   
    
star.com.               IN      NS      ns.star.com.
star.com.               IN      NS      ns1.star.com.
sst.star.com.           IN      NS      ns.sst.star.com.
ns.sst.star.com.        IN      A       172.16.40.12
.....#下面的没有变化

wKioL1aSLITBpDuhAADl6nlTIPM700.jpg

主服务器这边能够了,子服务器是彻底独立的一台服务器,能够说它不知道有父服务器的存在。

看咱们最上面的图就能够知道,是从上到下的,下边的不会向上走,只会找到根向下走。


而父服务器作的上面的两项只是标出子域,再来这种请求会去找子服务器。 而在父服务器不支持递归的状况下,会返回给客户端子域的地址。

序更号忘了改了,改一下,把配置通知给从服务器。


172.16.40.12:子服务器

主配置:

options {
        listen-on port 53 { 172.16.40.12; };
        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     { localhost; };

添加区域:

zone "sst.star.com" IN {
        type master;
        file "sst.star.com";
};

区域数据文件:

[root@localhost named]# vim sst.star.com

$TTL 3600
@       IN      SOA     ns.sst.star.com.  nsadmin.sst.star.com. (
                2016011001
                30M 
                10M 
                1D  
                1H )
    
        IN      NS      ns.sst.star.com.
ns      IN      A       172.16.40.12
www     IN      A       172.16.40.121
@       IN      MX  10  mail
mail    IN      A       172.16.40.120
pop     IN      CNAME   mail
ftp     IN      A       172.16.40.12

注意这里的区域名称是: sst.star.com.    相对名称会在名称以后自动加上这个。


检测一下:

[root@localhost named]# named-checkconf
[root@localhost named]# named-checkzone sst.star.com sst.star.com 
zone sst.star.com/IN: loaded serial 2016011001
OK
[root@localhost named]#


172.16.249.218:

wKioL1aSQcWi62HNAAD-MUP-XyY526.jpg

成功了,发往父服务器来查找子域的查询,父服务器递归去找子服务器。而后返回给咱们结果。

而若是,把父服务器的递归功能给关闭。再看一下会返回什么结果。

172.16.40.10主配置文件:

   recursion no;

把这一项给改为no。rndc reload 。我这里在172.16.249.218上再看看。

wKiom1aSQa7wfiXGAAEH-Vb9AyU720.jpg

如今这种状态就跟外网的根和顶级域在返回给本地DNS服务器的答案同样,只返回下级域的地址。


再来看下从服务器会不会找到子域:

wKioL1aSQ3nxGEY-AACg09Dty6g430.jpg

没问题,从服务器的主配置文件中,递归是打开的。


转发器

如今咱们能够从父服务器找到子服务器了,可是从子服务器是找不到父服务器的。

默认状况下,在DNS上面没有的区域是会直接找根的。
服务器都是由咱们所控制,也不必再让子服务器去找根,再找com,再找到star.com了。

wKioL1aSSG-xRguKAADcNQXOkpQ494.jpg

找到外网去了,这种域名确定有人注册啊。因此咱们要让子服务器找父服务器去。


还有一种状况,咱们只有二台DNS服务器能够上网,能够解析外网的域名。可是如今又加了几台DNS,由于各类缘由这几台DNS不能上网,那么如何才能解析外网的域名呢。可让那二台能够解析外网域名的服务器为咱们解析。


定义转发:
注意:被转发的服务器必须容许为当前服务作递归;

(1) 区域转发:仅转发对某特定区域的解析请求;
    zone  "ZONE_NAME"  IN {
        type  forward;
        forward  {first|only};
        forwarders  { SERVER_IP; };
    };
   

(2) 全局转发:没有在本地定义的区域,统统转发;

    options {
        ... ...
        forward only|first;

        forwarders  { SERVER_IP; };
        .. ...
    };


only 是只转发给目标主机,目标主机不能解析也不会再转发给根。

first 转发给目标主机,若是目标主机不能解析就再转发给根。

所转发的服务器, 要充许递归才行。 这样服务器才能为你递归找到结果并返回。

172.16.40.12: 子服务器。在/etc/named.rfc1912.zones文件中添加一个转发区域。

zone "star.com" IN {
        type forward;
        forward only;
        forwarders { 172.16.40.10;172.16.40.11; };
};

rndc reload 就能够了。如今直接再查询可能会出现两种地址,一个是转到父服务器获得的地址,还有是刚才查询结果的缓存。能够在40.12服务器上执行 rndc flush。 来清空缓存。

172.16.:249.218:

wKioL1aSTLnhpZY-AACK2dt-d7M967.jpg


这种区域转发,只能转发单独的区域。 全局的域能够转发本地不存在的全部区域,来解决咱们上面的第2种状况。

wKiom1aSTSbSCEiuAACIDdL80ug832.jpg

加这两项就能够了。

全局性的总配置优先级低于各个区域,因此总转发只会转发不存在的区域。


安全控制

acl:访问控制列表;把一个或多个地址归并一个命名的集合,随后经过此名称便可对此集合内的全部主机实现统一调用;

ACL必需要定义后才能使用, 一般放在named.conf文件中最上方(不要在options内)。值若是有空格要用括号引发来。

acl  acl_name  {
    ip;
    net/prelen;
};
    
示例:
    acl  mynet {
        172.16.0.0/16;
        127.0.0.0/8;
    };
    
bind有四个内置的acl
    none:没有一个主机;
    any:任意主机;
    local:本机;
    localnet:本机所在的IP所属的网络;
    
访问控制指令,有些能够在zone中单独使用。
allow-query  {};  容许查询的主机;白名单;不指定则默认容许全部。
allow-transfer {};  容许向哪些主机作区域传送;默认为向全部主机;应该配置仅容许从服务器;
allow-recursion {}; 容许哪此主机向当前DNS服务器发起递归查询请求;

                       定义递归白名单。测试只能在options中使用。要把recursion yes; 注释掉。

allow-update {}; DDNS,容许动态更新区域数据库文件中内容;容许动态更新区域数据库文件中内容。为了安全,最好是none。这个跟区域传送没有关系。


recursion yes; 给任何人递归。即然这里明确指定为yes。那么默认应该是会不给递归才对,并且上课也说是默认不给递归。但刚才测试的倒是给递归,不知道喽。


172.16.40.10:主服务器

定义几个控制项:

wKiom1aSVPOyA_H_AACLxJoLwd0456.jpg

上面定义的只有172.16.40.11也就是从服务器能够区域传送。

在172.16.249.218上面:

[root@localhost mnt]# dig -t axfr star.com @172.16.40.10

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.5 <<>> -t axfr star.com @172.16.40.10
;; global options: +cmd
; Transfer failed.
[root@localhost mnt]#

直接失败了。递归经测经也是生效的。用法也就这种方式。如今这里只是修改的主服务器,从服务器也要修改。


最后再补充一点:

泛域名解析
        *    IN    A    172.16.0.1

 *星号表明若是没有所要查询的记录,就以这个结果为准。不用放到最后。不过感受仍是放到最后为好。



域是一个逻辑的概念。而区域是域的两种解析方式(正向解析区域,反向解析区域),就是咱们上面所说的两种不一样的树。咱们平常所说的域名只是正向解析区域的,根固然也是了。

最高级的域(最外面的方框)包含这两种区域(里面的两个长方形),而子域(里面的实体长方形)又也这两个区域的里面,而后子域又有两个区域(黑色长方形),依此类推。

区域能够说是物理存在的,在咱们这里它是文件,提供了各类解析记录。

wKiom1aRtieyYtiWAAA6fP9B5h8650.jpg

这里挺乱的,并且我我的理解可能也是错的,因此暂时也不要管它了。只要知道咱们是由物理存在的区域数据文件来提供解析的。



rndc  子命令

status 统计数据
reload 重读配置文件和区域文件
reload ZONE 指定重读的区域
retransfer ZONE 手动区域彻底传送,不用管区域数据文件序列号是多少
notify ZONE 手动向外发送区域的同步通知
reconfig

重读配置文件并加载新增的区域。在有很是多的区域数据文件的时候很是有用。普通的重读配置文件,会从新加载全部区域,区域多了之后会卡死的。

stats 把服务器的统计数据写入statisics 文件中。
querylog 关闭或开启查询日志,每条查询都会记录日志,会产生大量I/O,正常状况下不要开启,调试的时候再开启。
stop 关闭named进程。
flush 清空服务器端的缓存。有时候颇有用。
flushname NAME 只清除指定的缓存。
trace [LEVEL] 开启调试模式,能够指定级别。屡次开启就是增长级别。详细记录日志信息。一样的会产生大量I/O操做。
debug 是有级别的, 调试级别。
notrace 等同于 trace 0


谢谢浏览。欢迎朋友们提出建议。

相关文章
相关标签/搜索