天天看点

dns服务bind使用

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

介绍:

dns服务bind使用

top level domain(tld) 顶级域

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

递归 迭代:

dns服务bind使用
现在我们先来看看左下角这个用户是如何解析到redhat.com下面的主机的。server是对应的dns服务器。
dns服务bind使用

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

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

但是对于DNS服务器来说,它自己没有请求的答案,所以就直接去找根,而根告诉DNS服务器去找com.,服务器收到以后就再去找com.,com又告诉我们的DNS服务器再去找redhat.com,服务器再去找redhat.com,redhat.com这个DNS服务器上面有这个答案,所以直接返回给我们本地的DNS服务器。本地的DNS服务器再返回给用户最终答案。

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

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

因为要达到这样的效果太难了,本地的DNS服务器需要有每个负责com域服务器的IP地址,其它的同级域当然也要有了,而且那些服务器发生变化也还要同步更新。所以,结果就是我们的DNS服务器上面只有全球13个根的服务器地址。

正向解析与反向解析:

名称 --> IP:正向解析

IP --> 名称:反向解析

二者的名称空间,非为同一个空间,即非为同一棵树;因此,也不是同一个解析库;

反向的树有点这个姿势。

dns服务bind使用

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

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

反向解析是 倒置的IP树。

很明显它们一点也不一样。所以在做DNS服务的时候要明白这是两个完全不同的东西,没有交集。

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 就是 [email protected].     因为文件中@有特殊意义。

        SOA 必须是区域数据库文件的第一条记录。

        刷新时间单位  秒。  也可以用 M 分  H 小时,  D  天

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

NS : 代表DNS服务器,一个区域可以有多个。

        name 区域名称, 可以用@表示。

        value   dns服务器的FQDN.

        @    600    IN    NS    dns.star.com.    

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

A  : 如果有多个相同主机名的A记录,就会轮询着给客户端地址。

        name: FQDN

        value: IP

MX: 代表这个区域里的smtp服务器,一个区域可以有多个 指定优先级。

        用来标识区域里的邮件服务器的。要不然这也不知道发给谁啊 [email protected]   

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

我们先来启动下看看。

dns服务bind使用
[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上也有。

配置一个正向解析区域:

1、定义区域

     在主配置文件中或主配置文件辅助配置文件中实现;

    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      

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

2、 建立区域数据文件(主要记录为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      
dns服务bind使用

检查一下区域数据文件:

[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的常用使用。

[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.      
dns服务bind使用

我这里的第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版本可能低于从的,从的不能低于主的。因为从的要兼容于主的。主的版本高会有新的功能,而从的没有。从的去同步数据,可能就会出现问题。对于系统的版本没有太大的要求,是软件层面的同步。

从服务器设置:

[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记录。注意修改序列号。

dns服务bind使用

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

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

dns服务bind使用

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
.....#下面的没有变化      
dns服务bind使用

主服务器这边可以了,子服务器是完全独立的一台服务器,可以说它不知道有父服务器的存在。

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

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

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

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:

dns服务bind使用

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

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

172.16.40.10主配置文件:

   recursion no;      

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

dns服务bind使用

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

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

dns服务bind使用

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

转发器:

现在我们可以从父服务器找到子服务器了,但是从子服务器是找不到父服务器的。

默认情况下,在DNS上面没有的区域是会直接找根的。

服务器都是由我们所控制,也没必要再让子服务器去找根,再找com,再找到star.com了。

dns服务bind使用

找到外网去了,这种域名肯定有人注册啊。所以我们要让子服务器找父服务器去。

还有一种情况,我们只有二台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:

dns服务bind使用

这种区域转发,只能转发单独的区域。 全局的域可以转发本地不存在的所有区域,来解决我们上面的第2种情况。

dns服务bind使用

加这两项就可以了。

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

安全控制:

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。那么默认应该是会不给递归才对,而且上课也说是默认不给递归。但刚才测试的却是给递归,不知道喽。

定义几个控制项:

dns服务bind使用

上面定义的只有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

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

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

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

区域可以说是物理存在的,在我们这里它是文件,提供了各种解析记录。

dns服务bind使用

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

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