添加从DNS服务器

配置从DNS服务器,先要使主从DNS服务器在时间上同步,这个可以参考时间服务器的搭建。主DNS服务器用“DNS服务器的搭建”里面配置的DNS服务器吧!从DNS服务器的作用是可以帮助主DNS服务器减少负载,从DNS服务器上的解析库文件来自于主DNS服务器,当主DNS服务器出现故障后,从DNS服务器在超时时间内没有联系上主DNS服务器,则也会停止提供解析服务。

从DNS的配置比较简单,只需要在配置文件中添加相应的区域即可,而不需要区域解析库文件(同步主DNS服务器而来),另外需要在主DNS服务器的区域解析库文件中添加相应的NS记录,使得在主DNS服务器的解析库文件发生改变时能够通知到每一个DNS服务器。


步骤:

1、主从时间同步

2、配置从服务器,在配置文件中添加对应的区域

3、在主DNS服务器的区域解析库文件中添加NS记录

注意:在安装过程中,从DNS服务器的bind版本要高于主DNS服务器的或者两者相同。

在主从同步中,有一个概念:区域传送,简单地讲区域传送就是主DNS服务器将解析库文件传送给从DNS服务器


区域传送分两种:

    1)AXFR:完全区域传送

    2)IXFR:增量区域传送

从DNS服务器在刚启动时,需要进行一次完全区域传送,之后每一次主DNS服务器的解析库文件发生变化,只需要进行增量区域传送。DNS查询是通过UDP协议完成的,主从服务器之间的传送是通过TCP协议完成的。


下面看一下如何配置:

配置从服务器,在配置文件(/etc/named.rfc1912.zones)中添加对应的区域

zone "xiaoxiao.com" IN {
        type slave;                      #指定服务器类型为从服务器
        file "slaves/xiaoxiao.com.zone"; #同步过来的解析库文件的放置位置
        masters { 192.168.0.165; };      #指明主DNS服务器
};

zone "0.168.192.zone" IN {
        type slave;
        file "slave/0.168.192.zone";
        masters { 192.168.0.165; };
};
#在主DNS服务器的配置文件中定义的zone中可以加上allow-transfer { ip,ip/mask.....; };限定
#只有指定的从DNS服务器或者某个网段允许区域传送,起到安全的作用。
#还有其他的几个访问控制,总结一下
#allow-query {};        #是否允许查询,将白名单写在{}中
#allow-update {};       #是否允许更新
#allow-recursion {};    #是否允许递归查询     
#recursion yes;         #允许所有的递归查询
#递归查询是指,若请求解析的域名在当前DNS服务器上的解析库文件中存在,则予以响应,若不存
#在,则直接提交给根域名服务器或转发给其他的服务器(如果recursion设为yes的话),设置为
#no,直接给以否定应答。

这里有一点要注意一下:同步过来的解析库文件需要放置在/var/named/目录下的slave目录中,运行named程序的是named这个系统用户,它对/var/named/这个目录没有写权限(如下图),所以无法在该目录下创建文件,slave目录是专门为从DNS服务器准备的,用来存放同步至本地的区域解析库文件。

[root@baby-CentOS-1 named]# ll -d /var/named/
drwxr-x---. 5 root named 4096 Jun 12 12:15 /var/named/
[root@baby-CentOS-1 named]# ll -d /var/named/slaves/
drwxrwx---. 2 named named 4096 Jun 10 17:43 /var/named/slaves/


在主DNS服务器的区域解析库文件中添加NS记录(我的是/var/named/xiaoxiao.com.zone):

@                       IN      NS      ns.xiaoxiao.com.
@                       IN      NS      2ns.xiaoxiao.com.
ns.xiaoxiao.com.        IN      A       192.168.0.165         #主DNS服务器
2ns.xiaoxiao.com.       IN      A       192.168.0.206        #从DNS服务器

有几台从服务器,就需要在这儿添加几条,当然不要忘了下面对应的A记录!!!然后检查配置,重启服务!!!

[root@baby-CentOS named]# service named configtest
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
zone xiaoxiao.com/IN: loaded serial 10011
zone 0.168.192.in-addr.arpa/IN: loaded serial 10000
zone xiaoxiao.com/IN: loaded serial 10004
[root@baby-CentOS named]# service named restart
Stopping named: .                                          [  OK  ]
Starting named:                                            [  OK  ]

启动从服务器named进程:

[root@baby-CentOS-1 slaves]# service named start
Starting named:                                            [  OK  ]
[root@baby-CentOS-1 slaves]# tail /var/log/messages
Jun 13 10:17:44 baby-CentOS-1 named[14882]: transfer of 'xiaoxiao.com/IN/iplocal' from 192.168.0.165#53: Transfer completed: 1 messages, 14 records, 421 bytes, 0.002 secs (210500 bytes/sec)
Jun 13 10:17:44 baby-CentOS-1 named[14882]: zone xiaoxiao.com/IN/iplocal: sending notifies (serial 10011)                                                                
Jun 13 10:17:45 baby-CentOS-1 named[14882]: client 192.168.0.206#48039: view ipother: received notify for zone 'xiaoxiao.com'
Jun 13 10:17:45 baby-CentOS-1 named[14882]: zone xiaoxiao.com/IN/ipother: refused notify from non-master: 192.168.0.206#48039
Jun 13 10:17:45 baby-CentOS-1 named[14882]: zone 0.168.192.zone/IN/iplocal: refresh: non-authoritative answer from master 192.168.0.165#53 (source 0.0.0.0#0)
Jun 13 10:17:45 baby-CentOS-1 named[14882]: zone xiaoxiao.com/IN/ipother: Transfer started.
Jun 13 10:17:45 baby-CentOS-1 named[14882]: transfer of 'xiaoxiao.com/IN/ipother' from 192.168.0.165#53: connected using 192.168.0.206#35425
Jun 13 10:17:45 baby-CentOS-1 named[14882]: zone xiaoxiao.com/IN/ipother: transferred serial 10004: TSIG 'ipother-key'
Jun 13 10:17:45 baby-CentOS-1 named[14882]: transfer of 'xiaoxiao.com/IN/ipother' from 192.168.0.165#53: Transfer completed: 1 messages, 14 records, 419 bytes, 0.002 secs (209500 bytes/sec)  #区域传送完成
Jun 13 10:17:45 baby-CentOS-1 named[14882]: zone xiaoxiao.com/IN/ipother: sending notifies (serial 10004)

再来看看slaves目录:

[root@baby-CentOS-1 slaves]# ll
total 4
-rw-r--r-- 1 named named 603 Jun 13 10:17 xiaoxiao.com.zone      #对应的区域文件已存在

查看53号端口:

[root@baby-CentOS-1 slaves]# ss -tunl | grep 53
udp    UNCONN     0      0              192.168.0.206:53                    *:*        
udp    UNCONN     0      0              127.0.0.1:53                    *:*     
tcp     LISTEN        0      3               192.168.0.206:53                    *:*        
tcp     LISTEN        0      3               127.0.0.1:53                    *:*     
tcp     LISTEN        0      128             ::1:953                  :::*     
tcp     LISTEN        0      128             127.0.0.1:953                   *:*

测试查询(从DNS服务器的ip为192.168.0.206):

[root@baby-CentOS-1 slaves]# dig -t A www.xiaoxiao.com @192.168.0.206

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> -t A www.xiaoxiao.com @192.168.0.206
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10711
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

#flags中的aa表示权威应答,由当前服务器解析,才会有aa

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

;; ANSWER SECTION:
www.xiaoxiao.com.	1800	IN	A	192.168.0.5

;; AUTHORITY SECTION:
xiaoxiao.com.		1800	IN	NS	2ns.xiaoxiao.com.
xiaoxiao.com.		1800	IN	NS	ns.xiaoxiao.com.

;; ADDITIONAL SECTION:
ns.xiaoxiao.com.	1800	IN	A	192.168.0.165
2ns.xiaoxiao.com.	1800	IN	A	192.168.0.206

;; Query time: 0 msec
;; SERVER: 192.168.0.206#53(192.168.0.206)
;; WHEN: Sat Jun 13 10:30:09 2015
;; MSG SIZE  rcvd: 117

已经可以正常工作!!!


DNS子授权和转发器的配置

当公司很大时,每个部分都需要建立独立的域名服务器,公司的域名下需要分配子域,例如我这儿分配的子域是ops.xiaoxiao.com,子域需要正常工作需要在父域那儿添加胶水记录:

ops                   IN      NS      ns.ops               #这里是简写,ops后面会自动添加当前区域名称
ns.ops                IN      A       192.168.0.209


胶水记录包括了子域的域名,负责解析的DNS服务器和对应的IP地址,若子域中有多台主从DNS服务器,那么每一台DNS服务器都得在对应的父域中有一条胶水记录,公司注册一个域名也一样,需要在.com域中添加相应的胶水记录。当父域把子域能够解析的请求交给子域时,若在父域那儿有子域的多台DNS服务器记录,则会有一个轮询的功能,如下这种情况,当前DNS服务器可能会把第一个请求交给ns.ops这台服务器解析,然后把下一次请求交给ns2.ops去处理,起到一个负载均衡的作用。

ops                   IN      NS      ns.ops
ops                   IN      NS      ns2.ops
ns.ops                IN      A        192.168.0.209
ns2.ops               IN      A        192.168.0.210

添加后记录之后,接下来就是子域DNS服务器的配置(下面是我的/etc/named.rfc1912.zones 中的部分内容):

zone "ops.xiaoxiao.com" IN {
        type master;
        file "ops.xiaoxiao.com.zone";
        allow-update { none; };
        allow-transfer { localhost; };                #区域传送仅限本机
};

下面是对应区域解析文件内容,为了简单起见只配置了这么几项,也没有配置反向解析库:

$TTL 1800
@       IN      SOA     ns.ops.xiaoxiao.com.        huanhuan.ops.xiaoxiao.com. (
                                10000
                                1H
                                10M
                                7D
                                10M
)
@                       IN      NS      ns.ops.xiaoxiao.com.
@                       IN      MX      10      mail.ops.xiaoxiao.com.
ns.ops.xiaoxiao.com.       IN      A       192.168.0.209
mail.ops.xiaoxiao.com.     IN      A       192.168.0.252
www.ops.xiaoxiao.com.      IN      A       192.168.0.250

修改权限,属组:

[root@baby-virt-3 named]# chown :named ops.xiaoxiao.com.zone 
[root@baby-virt-3 named]# chmod 640 ops.xiaoxiao.com.zone 
[root@baby-virt-3 named]# ll
total 32
drwxrwx--- 2 named named 4096 Jun  8 21:51 data
drwxrwx--- 2 named named 4096 May 19 21:27 dynamic
-rw-r----- 1 root  named 2075 Apr 23  2014 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
-rw-r----- 1 root  named  463 Jun 13 10:36 ops.xiaoxiao.com.zone
drwxrwx--- 2 named named 4096 May 19 21:27 slaves

检查配置文件和区域文件,无误后启动服务:

[root@baby-virt-3 named]# named-checkconf 
[root@baby-virt-3 named]# named-checkzone "ops.xiaoxiao.com" /var/named/ops.xiaoxiao.com.zone 
zone ops.xiaoxiao.com/IN: loaded serial 10000
OK
[root@baby-virt-3 named]# service named start
Starting named:                                            [  OK  ]

测试(192.168.0.165是父域的主DNS服务器):

[root@baby-CentOS-2 ~]# dig -t A www.ops.xiaoxiao.com @192.168.0.165

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6_6.3 <<>> -t A www.ops.xiaoxiao.com @192.168.0.165
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18872
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

#由于这个主机名的解析结果是由父域的DNS返回的,而真正负责解析的是子域中的DNS,所以
#这个不是权威应答(flags中没有aa)

;; QUESTION SECTION:
;www.ops.xiaoxiao.com.		IN	A

;; ANSWER SECTION:
www.ops.xiaoxiao.com.	1800	IN	A	192.168.0.250

;; AUTHORITY SECTION:
ops.xiaoxiao.com.	1800	IN	NS	ns.ops.xiaoxiao.com.

;; ADDITIONAL SECTION:
ns.ops.xiaoxiao.com.	1800	IN	A	192.168.0.209

;; Query time: 3 msec
;; SERVER: 192.168.0.165#53(192.168.0.165)
;; WHEN: Sat Jun 13 12:34:40 2015
;; MSG SIZE  rcvd: 87


当子域需要解析本该由父域解析的内容时,例如我把www.xiaoxiao.com提交给子域的服务器来解析,子域的DNS无法解析,则会直接提交给根域名服务器,然后找到.com,再找到xiaoxiao.com,在外面绕了一圈,浪费了时间。这种情况下可以在子域DNS服务器中定义一个转发器:

zone "xiaoxiao.com" IN {
        type forward;                       #类型为转发器
        forward only;                       #只进行转发
        forwarders { 192.168.0.165; };      #转发给父域的DNS
};
#forward  only|first    #设置only的话,若转发的服务器返回的查询结果为没有,则不会在自己去查
#询,若为first则会自己去查询


添加视图,视图之间的区域传送

通过view的配置可以实现根据请求的来源不同,响应不同的解析结果。下面是我的/etc/named.rfc1912.zones中的内容:

acl ipallow {                                       #可以在这里区分请求的来源
        192.168.0.207;                              #为了测试方便就只定义了一个
};
view iplocal{                                                                                    
        match-clients { ipallow; };                 #匹配哪些IP地址
        recursion yes;                              #是否允许递归查询
        allow-transfer { 192.168.0.209;localhost; };#仅允许本机和从服务器进行区域传送
        zone "." IN {                               #根域
                type hint;
                file "named.ca";
        };
        .......                                     #部分省略
        .......
        .......
        .......      
        zone "xiaoxiao.com" IN {
                type master;
                file "xiaoxiao.com.zone";
                allow-update { none; };
        };
        
        zone "0.168.192.in-addr.arpa" IN {
                type master;
                file "0.168.192.zone";
                allow-update { none; };
        };
};

view ipother{

match-clients { any; };                           #匹配所有来源
allow-recursion { 192.168.0.0/24; };              #仅允许这个网段递归查询
allow-transfer { 192.168.0.209;localhost; };      #仅允许本机和从服务器进行区域传送

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

zone "xiaoxiao.com" IN {
        type master;
        file "xiaoxiao.com.other.zone";
        allow-update { none; };
};
};

下面是我的两个区域解析库文件:

xiaoxiao.com.zone:

$TTL 1800
@       IN      SOA     ns.xiaoxiao.com.        baby.xiaoxiao.com. (
                                10013
                                1H
                                10M
                                7D
                                10M
)
@                       IN      NS      ns.xiaoxiao.com.
@                       IN      NS      2ns.xiaoxiao.com.
@                       IN      MX      10      mail.xiaoxiao.com.
ops                     IN      NS      ns.ops
ns.xiaoxiao.com.        IN      A       192.168.0.165
2ns.xiaoxiao.com.       IN      A       192.168.0.206
mail.xiaoxiao.com.      IN      A       192.168.0.240
www.xiaoxiao.com.       IN      A       192.168.0.241
web.xiaoxiao.com.       IN      A       192.168.0.242
ttt.xiaoxiao.com        IN      CNAME   www.xiaoxiao.com.
ooo.xiaoxiao.com.       IN      A       192.168.0.245
ns.ops                  IN      A       192.168.0.209


xiaoxiao.com.other.zone:

$TTL 1800
@       IN      SOA     ns.xiaoxiao.com.        baby.xiaoxiao.com. (
                                10005
                                1H
                                10M
                                7D
                                10M
)
@                       IN      NS      ns.xiaoxiao.com.
@                       IN      NS      2ns.xiaoxiao.com.
@                       IN      MX      10      mail.xiaoxiao.com.
ops                     IN      NS      ns.ops
ns.xiaoxiao.com.        IN      A       192.168.0.165
2ns.xiaoxiao.com.       IN      A       192.168.0.206
mail.xiaoxiao.com.      IN      A       192.168.0.4
www.xiaoxiao.com.       IN      A       192.168.0.5
web.xiaoxiao.com.       IN      A       192.168.0.6
ttt.xiaoxiao.com        IN      CNAME   www.xiaoxiao.com.
ooo.xiaoxiao.com.       IN      A       192.168.0.7
ns.ops                  IN      A       192.168.0.209


这上面多个view的次序很重要,定义在最前面的会被先匹配,匹配不成功才会匹配下一项,配置完成之后,named-checkconf,named-checkzone检查完成之后启动服务即可。

就单单一台主服务器的话可能看不出什么问题,但要是有从服务器也需要实现这样的功能呢?从DNS服务器的/etc/named.rfc1912.zones也完成了上述的配置,该如何同步呢?因为同样的区域名称(相同的zone)出现在了不同的view中,但是他们的区域解析库文件不相同,例如上面的zone  "xiaoxiao.com"出现在两个view中,但是他们对应的区域解析库文件不同,当从DNS服务器中也定义了相同的两个view和同名的zone,在同步时,主DNS服务器会把从DNS服务器的IP地址拿来进行匹配,我的从DNS服务器的IP地址是192.168.0.206,很明显跟第一个view iplocal匹配不上,匹配到了第二个view,然后同步其中file指定的区域文件,也就是从DNS服务器中两个view中的同名的zone会同步到相同的区域解析库文件,这显然不符合要求。这里就需要借助TSIG key的功能


1、使用dnssec-keygen -a HMAC-MD5 -b 128 -n HOST testkey命令来生成密钥。

     dnssec-keygen            #用来生成更新密钥。

    -a HMAC-MD5             #采用HMAC-MD5加密算法。

    -b 128                           #生成的密钥长度为128位。

    -n host testkey             #秘钥的属主的类型

#如果输入这个命令后,没有生成秘钥,可以加上这个选项-r /dev/urandom


2、完成之后会在当前目录下生成两个文件(如下),查看文件内容,将秘钥复制到配置文件中。

-rw-------  1 root root   165 Jun 13 15:13 Ktestkey.+***.private

如下是我的配置文件:

key "iplocal-key" {                          #声明iplocal-key秘钥
        algorithm HMAC-MD5;                  #采用的加密方式
        secret "e+BPvJ5JebQQnEYnlR1d2g==";   #秘钥内容
};

key "ipother-key" {                          #声明两个秘钥,两个view在区域传送时使用不同的秘钥
        algorithm HMAC-MD5;
        secret "VBcdXlTkql5atJ1yArwYkg==";
};

acl ipallow {
        192.168.0.207;
};

view iplocal{
        match-clients { key iplocal-key; ipallow; }; #仅匹配本机和iplocal-key加密过的请求
        recursion yes;                               #被当前view匹配到的请求允许递归查询
        allow-transfer { key iplocal-key; };         #只允许接收iplocal-key加密过的 zone transfer 请求 
        server 192.168.0.206 { keys iplocal-key; };  #向从DNS服务器发送信息时,用iplocal-key加密  
        zone "." IN {
                type hint;
                file "named.ca";
        };

        .........                                    #部分内容省略
        .........

        zone "xiaoxiao.com" IN {
                type master;
                file "xiaoxiao.com.zone";
                allow-update { none; };
        };

        zone "0.168.192.in-addr.arpa" IN {
                type master;
                file "0.168.192.zone";
                allow-update { none; };
        };
};

view ipother{

        match-clients { key ipother-key; any; };     #这个view中使用的key与上一个view不同
        allow-recursion { 192.168.0.0/24; };
        allow-transfer { key ipother-key; };
        server 192.168.0.206 { keys ipother-key; };
        
        zone "." IN {
                type hint;
                file "named.ca";
        };
        
        zone "xiaoxiao.com" IN {
                type master;
                file "xiaoxiao.com.other.zone";
                allow-update { none; };
        };
};


下面是从DNS服务器中的配置(基本相同):

key "iplocal-key" {
        algorithm HMAC-MD5;
        secret "e+BPvJ5JebQQnEYnlR1d2g==";
};

key "ipother-key" {
        algorithm HMAC-MD5;
        secret "VBcdXlTkql5atJ1yArwYkg==";
};

acl ipallow {
        192.168.0.207;
};

view iplocal{
      match-clients { key iplocal-key; ipallow; };
      allow-transfer { none; };
      recursion yes;
     server 192.168.0.165 { keys iplocal-key; }; #向主DNS服务器发送信息时,用iplocal-key加密
        
        zone "." IN {
                type hint;
                file "named.ca";
        };

...........                                          #省略内容
...........

        zone "xiaoxiao.com" IN {
                type slave;
                file "slaves/xiaoxiao.com.zone";
                masters { 192.168.0.165; };
        };
        
        zone "0.168.192.zone" IN {
                type slave;
                file "slave/0.168.192.zone";
                masters { 192.168.0.165; };
        };
};

view ipother{
        match-clients { key ipother-key; any; };
        allow-recursion { 192.168.0.0/24; };
        allow-transfer { none; };
        server 192.168.0.165 { keys ipother-key; };
        
        zone "." IN {
                type hint;
                file "named.ca";
        };
        
        zone "xiaoxiao.com" IN {
                type slave;
                file "slaves/xiaoxiao.com.other.zone";
                masters { 192.168.0.165; };
                allow-transfer { localhost; };
        };
};

这里需要注意几点:

    1)主从DNS服务器上都得有key,而且相同的view需要使用相同的key

    2)主从服务器时间上需要同步,不然TSIG key 验证通不过

    3)通常只为内网客户端提供递归查询功能,提供根区域等;

    4)通常只为外网客户端提供本机所负责的区域的解析;


重启服务测试一下

[root@baby-CentOS-1 slaves]# ll
total 8
-rw-r--r-- 1 named named 596 Jun 13 15:04 xiaoxiao.com.other.zone
-rw-r--r-- 1 named named 604 Jun 13 15:11 xiaoxiao.com.zone

两个文件均被同步过来了

下面是在192.168.0.207上的测试结果(206是我的从DNS服务器)

[root@baby-CentOS-2 ~]# host -t A www.xiaoxiao.com 192.168.0.206
Using domain server:
Name: 192.168.0.206
Address: 192.168.0.206#53
Aliases: 

www.xiaoxiao.com has address 192.168.0.241          #返回结果

下面是在192.168.0.210上的测试结果:

[root@baby-virt-4 ~]# host -t A www.xiaoxiao.com 192.168.0.206
Using domain server:
Name: 192.168.0.206
Address: 192.168.0.206#53
Aliases: 

www.xiaoxiao.com has address 192.168.0.5

用不同的ip请求返回不同的请求,OK!!!