参考:http://scholar.blog.51cto.com/9985645/1631058

一、主从服务器配置

1、主从服务器关系

   如果公司内DNS服务器负载过重或者为了实现冗余这一类功能就需要用到一个备份DNS服务器,备份服务器和主DNS服务器就形成了主从关系,如果主服务器的区域文件更新就会通知从服务器同步最新的区域文件,平时从服务器不提供解析服务,如果主服务器有故障从服务器就立刻激活提供域名解析服务。

2、主从复制工作过程

DNS软件bind使用(二)_第1张图片


主从复制配置 注意事项

①开始配置从服务器之前,请确保主从服务器时间同步

②从服务器bind版本可高于主服务器

3、实战主从复制配置 

案例要求: 

实验接上文,为主DNS服务器192.168.1.8添加从服务器192.168.1.6,要求只允许从服务器传输区域文件,其它主机一律禁止传送。

在主服务器正反向配置文件中添加从服务器:

[[email protected] ~]# vim /var/named/example.com.zone 
$TTL 3600
@       IN      SOA     dns.example.com.        admin.example.com. (
                                                        2015100302   #每次主服务器更新,必须更改版本号
                                                        2H
                                                        10M
                                                        7D
                                                        1D )
        IN      NS      dns1
        IN      NS      dns2        #添加从服务器NS记录
        IN      MX 10   mail
dns1    IN      A       192.168.1.8
dns2    IN      A       192.168.1.6        #添加从服务器地址
mail    IN      A       192.168.1.9
www     IN      A       192.168.1.10
pop     IN      CNAME   mail
ftp     IN      CNAME   www
[[email protected] ~]# vim /var/named/192.168.1.zone 
$TTL 3600
@       IN      SOA     dns.example.com.        admin.example.com. (
                                                        2015100302
                                                        2H
                                                        10M
                                                        7D
                                                        1D )
        IN      NS      dns1.example.com.
        IN      NS      dns2.example.com.        #添加从服务器NS记录
8       IN      PTR     dns1.example.com.
6       IN      PTR     dns2.example.com.       #添加从服务器地址
9       IN      PTR     mail.example.com.
10      IN      PTR     www.example.com.

在主服务器添加区域传送限制,只允许从服务器传送:

[[email protected] ~]# vim /etc/named.conf          #区域定义在哪就修改那个配置文件
zone "example.com" IN {  
        type master;
        allow-transfer { 192.168.1.6; };     #定义传输白名单,可多个IP用分号分隔
        file "example.com.zone";
};
zone "1.168.192.in-addr.arpa" IN {
        type master;
        allow-transfer { 192.168.1.6; };        #定义反向区域传输白名单
        file "192.168.1.zone";
};

检查配置文件并重启服务:

[[email protected] ~]# service named configtest
zone example.com/IN: loaded serial 2015100302
zone 1.168.192.in-addr.arpa/IN: loaded serial 2015100302
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
[[email protected] ~]# named-checkconf 
[[email protected] ~]# named-checkzone "example.com" /var/named/example.com.zone 
zone example.com/IN: loaded serial 2015100302
OK
[[email protected] ~]# service named restart
停止 named:                                               [确定]
启动 named:                                               [确定]

在从服务器上定义与主服务器相同的正反向区域:

[root@hpf-linux ~]# vim /etc/named.conf           #也可编辑/etc/named.rfc1912.zones
zone "example.com" IN {
        type slave;                                                     #定义服务器类型为从服务器
        masters { 192.168.1.8; };                                #定义主服务器,可多个IP用分号分隔
        file "slaves/example.com.zone";
        allow-transfer { none; };  
};
zone "1.168.192.in-addr.arpa" IN {
        type slave;
        masters { 192.168.1.8; };
        file "slaves/192.168.1.zone";
        allow-transfer { none; };  
};
include "/etc/named.rfc1912.zones";
//include "/etc/named.root.key";                        #为避免不必要的错误最好把此项注释

测试语法,启动服务:

[root@hpf-linux ~]# 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
[root@hpf-linux ~]# named-checkconf 
[root@hpf-linux ~]# service named start
Generating /etc/rndc.key:                                  [确定]
启动 named:                                               [确定]
[root@hpf-linux ~]# ss -tnlp |grep named
LISTEN     0      3                       ::1:53                      :::*      users:(("named",1878,21))
LISTEN     0      3                 127.0.0.1:53                       *:*      users:(("named",1878,20))
LISTEN     0      128                     ::1:953                     :::*      users:(("named",1878,23))
LISTEN     0      128               127.0.0.1:953                      *:*      users:(("named",1878,22))

查看是否文件传输过来:

[root@hpf-linux ~]# ll /var/named/slaves/
总用量 8
-rw-r--r-- 1 named named 448 10月  3 21:56 192.168.1.zone
-rw-r--r-- 1 named named 467 10月  3 21:54 example.com.zone
[root@hpf-linux ~]# less /var/named/slaves/example.com.zone
$ORIGIN .
$TTL 3600       ; 1 hour
example.com             IN SOA  dns.example.com. admin.example.com. (
                                2015100302 ; serial
                                7200       ; refresh (2 hours)
                                600        ; retry (10 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      dns1.example.com.
                        NS      dns2.example.com.
                        MX      10 mail.example.com.
$ORIGIN example.com.
dns1                    A       192.168.1.8
dns2                    A       192.168.1.6
ftp                     CNAME   www
mail                    A       192.168.1.9
pop                     CNAME   mail
www                     A       192.168.1.10
[root@hpf-linux ~]# less /var/named/slaves/192.168.1.zone 
$ORIGIN .
$TTL 3600       ; 1 hour
1.168.192.in-addr.arpa  IN SOA  dns.example.com. admin.example.com. (
                                2015100302 ; serial
                                7200       ; refresh (2 hours)
                                600        ; retry (10 minutes)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      dns1.example.com.
                        NS      dns2.example.com.
$ORIGIN 1.168.192.in-addr.arpa.
10                      PTR     www.example.com.
6                       PTR     dns2.example.com.
8                       PTR     dns1.example.com.
9                       PTR     mail.example.com.

从服务器解析测试:

[root@hpf-linux ~]# dig -t A www.example.com @192.168.1.8

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.example.com @192.168.1.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55986
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

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

;; ANSWER SECTION:
www.example.com.	3600	IN	A	192.168.1.10

;; AUTHORITY SECTION:
example.com.	3600	IN	NS	dns1.example.com.
example.com.	3600	IN	NS	dns2.example.com.

;; ADDITIONAL SECTION:
dns1.example.com.	3600	IN	A	192.168.1.8
dns2.example.com.	3600	IN	A	192.168.1.6

;; Query time: 1 msec
;; SERVER: 192.168.1.8#53(192.168.1.8)
;; WHEN: Sat Oct  3 21:57:32 2015
;; MSG SIZE  rcvd: 119
[root@hpf-linux ~]# dig -t NS example.com @192.168.1.8

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t NS example.com @192.168.1.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60598
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2

;; QUESTION SECTION:
;example.com.	IN	NS

;; ANSWER SECTION:
example.com.	3600	IN	NS	dns1.example.com.
example.com.	3600	IN	NS	dns2.example.com.

;; ADDITIONAL SECTION:
dns1.example.com.	3600	IN	A	192.168.1.8
dns2.example.com.	3600	IN	A	192.168.1.6

;; Query time: 1 msec
;; SERVER: 192.168.1.8#53(192.168.1.8)
;; WHEN: Sat Oct  3 22:16:09 2015
;; MSG SIZE  rcvd: 99


二、rndc命令说明

   Bind 9之后提供新的功能,不过可视为Bind旧版ndc的延伸,它可使系统管理者利用rndc command远端或本端(localhost)控制管理Bind,并以加密方式来传送资料,以防止其他非授权使用者控制Bind。使用TCP连接,默认953端口。为保证使用的安全性,rndc持有一半密钥,保存于rndc的配置文件中 ,BIND持有一半密钥,保存在主配置文件中。

1、常用选项

  • -b source-address :绑定rndc客户端使用的源地址,因为一个网卡可有多个地址。 

  • -c config-file :指定连接时使用的配置文件,而不是默认的/etc/rndc.conf。 

  • -s server :指定要连接的服务器的IP地址。 

  • -p port :指定要连接的服务器的端口。 

  • -k key-file:指定连接时使用的密钥文件,而不是默认的/etc/rndc.key。

  • -y key-id:指定要使用的密钥标识,必须与服务器一致。

  • -v:输出详细的日志信息。

2、命令

  • reload:重新加载配置文件和域(zone)的配置。

  • reload zone [class [view]]:重新加载一个指定的域。

  • refresh zone [class [view]]:定期维护一个指定的域。

  • reconfig:重新加载named.conf和新的域,但不会重新加载已存的域文件。

  • stats:将统计信息写入到统计文件中。

  • querylog:启动用户请求的日志记录。

  • dumpdb:把服务器缓存中的信息转储到dump文件中去。

  • stop:服务器停机,并将更新保存到host文件中。

  • halt:服务器马上停机,不保存更新,但重启是会写入日志。

  • trace:增加一个服务器的debug级别。

  • trace level:直接设置服务器的debug等级。

  • notrace:将服务器的debug等级设成0。

  • flush:清除缓存。

  • status:显示服务器状态。

   说明:若我们编译安装bind软件时,如果rndc无法正常工作,可尝试使用rndc-confgen生成/etc/rndc.conf配置文件,并将配置文件中的后半部分复制到BIND的主配置文件中按指示启用即可。

# rndc-confgen [ - /dev/urandom ] > /etc/rndc.conf


三、子域授权和转发

1、子域授权概念

   DNS本来的数据结构就是一个层级结构,犹如一个倒立的树状结构,由一点出发,一层层的向下分成了多个分支,而这些分支就是其上级域的子域,其上级域就是相对的父域,子域是从父域中划出来的一个域,子域中的DNS服务器负责这个子域中的地址解析,从而减轻了父域中DNS服务器的压力,这不仅提高了解析服务的效率,同样也提高了解析服务的稳定性,此部分我们就是学习如何给一个域划分出一个子域,并让这个子域中的DNS服务器能够进行子域中的域名解析服务,这个过程也叫做子域授权。

胶水记录包括:

  • 授权的子区域域名称 

  • 子区域的名称服务器 

  • 子区域的名称服务器IP地址 

2、子域授权和转发工作过程

DNS软件bind使用(二)_第2张图片


4、子域授权和转发配置

正向子域授权 :只需要在父域的区域解析库中添加“胶水记录”

例如:

ops    IN    NS    dns.ops
ops     IN      A       172.16.10.110

配置转发器 :转发所有非本机负责的区域的请求至某指定的DNS服务器

options {
    ...
forward only|first;
forwarders { IP; };
        }

only:只使用forwarders DNS服务器做域名解析,如果查询不到则返回查询失败。

first:优先使用forwarders DNS服务器做域名解析,如果查询不到再使用本地DNS服务器做域名解析。

访问控制:

allow-transfer {};  #区域传输白名单
allow-query {};     #此项仅用于服务器是缓存名称服务器时,只开放查询功能给本地客户端
allow-update {};   #允许动态更新数据文件的主机白名单,一般为none

递归白名单:

allow-recursion {};
recursion yes;

配置转发区域 :转发本区域解析不到的请求至某指定的DNS服务器,而非根

zone "ZONE NAME" IN {
type forward;
foward only|first;
forwarders { IP; };
}

访问控制列表:

只有定义后才能使用,通常acl要定义在named.conf的最上方,内置的acl:any (任何主机)、none(拒绝任何)、localhost(本机)、localnet(本机所在网络)。 

自定义acl:

acl ACL_NAME {
ip;
ip;
network;
};

例如:

acl localnetwork {
172.16.0.0/16;
192.168.0.0/24;
};
allow-recursion { localnetwork; }#通常定义于options之上

5、实战子域授权和转发

   父域服务器为192.168.1.8,域名example.com,运维部需要一个子域ops.example.com,子域服务器为192.168.1.22,要求完成子域授权,确保子域可以使用,将子域解析不到的请求向父域转发,只向父域查询,父域解析不了,返回失败。

父域做以下操作

在父域正向区域文件添加胶水记录:

[[email protected] ~]# less /var/named/example.com.zone 
$TTL 3600
@       IN      SOA     dns.example.com.        admin.example.com. (
                                                        2015100303
                                                        2H
                                                        10M
                                                        7D
                                                        1D )
        IN      NS      dns1
        IN      NS      dns2
        IN      MX 10   mail
dns1    IN      A       192.168.1.8
dns2    IN      A       192.168.1.6
mail    IN      A       192.168.1.9
www     IN      A       192.168.1.10
pop     IN      CNAME   mail
ftp     IN      CNAME   www
ops     IN      NS      dns.ops
dns.ops IN      A       192.168.1.22         #子域可在不同网段

查语法,重新启动服务:

[[email protected] ~]# service named configtest
zone example.com/IN: loaded serial 2015100303
zone 1.168.192.in-addr.arpa/IN: loaded serial 2015100302
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
[[email protected] ~]# named-checkzone "example.com" /var/named/example.com.zone 
zone example.com/IN: ops.example.com/NS 'dns.ops.example.com' (out of zone) has no addresses records (A or AAAA)
zone example.com/IN: loaded serial 2015100303
OK
[[email protected] ~]# service named reload
重新载入named:                                             [确定]


子域做以下操作

添加子域区域及转发域:

[root@Slave ~]# vim /etc/named.conf 
zone "ops.example.com" IN {      #添加正向区域
        type master;
        file "ops.example.com.zone";
};
zone "example.com" IN {            #添加转发域    
        type forward;                        #指定服务器类型为转发
        forwarders { 192.168.1.8; 192.168.1.9; };  #转发列表,可多个IP
        forward only;                       #定义转发类型
};
include "/etc/named.rfc1912.zones";
#include "/etc/named.root.key";   #转发需注释此行

创建子域区域文件:

[root@Slave ~]# cat /var/named/ops.example.com.zone 
$TTL 3600
@       IN      SOA     dns.ops.example.com.    admin.ops.example.com. (
                                                2015100301
                                                2H
                                                10M
                                                7D
                                                1D )
@       IN      NS      dns.ops.example.com.
@       IN      MX 10   mail.ops.example.com.
dns     IN      A       192.168.1.23
www     IN      A       192.168.1.24
mail    IN      A       192.168.1.25
ftp     IN      CNAME   www
pop     IN      CNAME   mail

修改文件权限并启动服务:

[root@Slave ~]# chown root:named /var/named/ops.example.com.zone
[root@Slave ~]# chmod 640 /var/named/ops.example.com.zone
[root@Slave ~]# ll /var/named/ops.example.com.zone 
-rw-r----- 1 root named 608 10月  4 10:48 /var/named/ops.example.com.zone
[root@Slave ~]# service named configtest
zone ops.example.com/IN: loaded serial 2015100301
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
[root@Slave ~]# named-checkzone "ops.example.com" /var/named/ops.example.com.zone 
zone ops.example.com/IN: loaded serial 2015100301
OK
[root@Slave ~]# service named start
Generating /etc/rndc.key:                                  [确定]
启动 named:                                               [确定]

测试子域能否解析:

[root@Slave ~]# dig -t A www.ops.example.com @192.168.1.22

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.ops.example.com @192.168.1.22
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42319
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

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

;; ANSWER SECTION:
www.ops.example.com.	3600	IN	A	192.168.1.24

;; AUTHORITY SECTION:
ops.example.com.	3600	IN	NS	dns.ops.example.com.

;; ADDITIONAL SECTION:
dns.ops.example.com.	3600	IN	A	192.168.1.23

;; Query time: 2 msec
;; SERVER: 192.168.1.22#53(192.168.1.22)
;; WHEN: Sun Oct  4 10:50:52 2015
;; MSG SIZE  rcvd: 87

子域测试转发:

[root@Slave ~]# dig -t A www.example.com @192.168.1.22
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.example.com @192.168.1.22
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58483
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

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

;; ANSWER SECTION:
www.example.com.	3600	IN	A	192.168.1.10

;; AUTHORITY SECTION:
example.com.	3600	IN	NS	dns2.example.com.
example.com.	3600	IN	NS	dns1.example.com.

;; ADDITIONAL SECTION:
dns1.example.com.	3600	IN	A	192.168.1.8
dns2.example.com.	3600	IN	A	192.168.1.6

;; Query time: 2013 msec
;; SERVER: 192.168.1.22#53(192.168.1.22)
;; WHEN: Sun Oct  4 10:51:51 2015
;; MSG SIZE  rcvd: 119
[root@Slave ~]# dig -t A www.google.com @192.168.1.22   

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.4 <<>> -t A www.google.com @192.168.1.22
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47772
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4

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

;; ANSWER SECTION:
www.google.com.	300	IN	A	216.58.221.228

;; AUTHORITY SECTION:
google.com.	172800	IN	NS	ns3.google.com.
google.com.	172800	IN	NS	ns2.google.com.
google.com.	172800	IN	NS	ns4.google.com.
google.com.	172800	IN	NS	ns1.google.com.

;; ADDITIONAL SECTION:
ns2.google.com.	172800	IN	A	216.239.34.10
ns1.google.com.	172800	IN	A	216.239.32.10
ns3.google.com.	172800	IN	A	216.239.36.10
ns4.google.com.	172800	IN	A	216.239.38.10

;; Query time: 644 msec
;; SERVER: 192.168.1.22#53(192.168.1.22)
;; WHEN: Sun Oct  4 11:25:16 2015
;; MSG SIZE  rcvd: 184