一、DNS主从同步原理

本篇承接上两篇DNS的配置部分,本篇的主题是DNS的主从配置。主辅DNS服务器数据同步的过程: 

1、master DNS服务器每次修改完成并重启服务后,将传送notify给所有的slave DNS服务器; 2、slave DNS服务器将查询master服务器的SOA记录; 3、master DNS服务器收到请求后将SOA记录发送给Slave DNS服务器,Slave DNS服务器收到后同时对比查询结果中的serial值; 4、如果serial值不大于本机的话将结束数据同步过程;但是如果serial值大于本机的话,slave DNS将发送zone transfer请求要求(AXFR/IXFR)。Master响应zone transfer请求并传送结果,直到整个slave更新完成。

dns-master-slave

二、测试环境

配置前,需要先将主从服务器的时间先进行同步

1192.168.0.103      NS1        主DNS服务器
2192.168.0.107      NS2        从DNS服务器

三、主从环境搭建

1、主DNS配置部分

主服务器上named.conf部分无需变动,/etc/named.rfc1912.zones 部分也可以不变动,但是出于安全和加快同步速度,我们还是会增加一部分配置,完整配置如下 :

 1# cat /etc/named.rfc1912.zones
 2zone "localhost.localdomain" IN {
 3        type master;
 4        file "named.localhost";
 5        allow-update { none; };
 6};
 7zone "localhost" IN {
 8        type master;
 9        file "named.localhost";
10        allow-update { none; };
11};
12zone "1.0.0.127.in-addr.arpa" IN {
13        type master;
14        file "named.loopback";
15        allow-update { none; };
16};
17zone "0.in-addr.arpa" IN {
18        type master;
19        file "named.empty";
20        allow-update { none; };
21};
22zone "361way.com" IN {
23           type master;
24           file "361way.com.zone";
25           notify yes;     //使用该功能,是指在主服器一旦有更新,立即通知从DNS
26           also-notify { 192.168.0.107;  };  //指定通知哪些主机,一般上面的notify yes为notify explicit时使用
27           allow-transfer { 192.168.0.107;  };  //指定从服器的IP
28};
29zone "0.168.192.in-addr.arpa" IN{
30           type master;
31           file "192.168.0.zone";
32           notify yes;
33           also-notify { 192.168.0.107;  };
34           allow-transfer { 192.168.0.107;  };
35};

除了named.rfc1912.zones 文件,我们还需要在正反区域配置文件中增加从服务器的信息,具体如下:

 1# cat 361way.com.zone
 2$TTL 600
 3$ORIGIN 361way.com.
 4@      IN      SOA     ns.361way.com.  root.361way.com. (
 5                        2014121005      ;serial //记住这个串每修改一次值+1下,后面在同步部分时,也会提到和后面几个时间的关系
 6                        1D              ;refresh
 7                        5M              ;retry
 8                        1W              ;expiry
 9                        1H)             ;minimum
10@      IN      NS      ns1.361way.com.       //主DNS
11@      IN      NS      ns2.361way.com.       //从DNS
12       IN      MX  5   mail.361way.com.
13ns1     IN     A       192.168.0.103         //主DNS对应的IP
14ns2     IN     A       192.168.0.107         //从DNS对应的IP
15@      IN      A       192.168.0.102
16www    IN      A       192.168.0.103
17mail   IN      A       192.168.0.109
18pop3   IN      A       192.168.0.103
19iamp4  IN      A       192.168.0.103

反向区域文件也一样:

 1# cat 192.168.0.zone
 2$TTL 600
 3$ORIGIN 0.168.192.in-addr.arpa.
 4@      IN      SOA     ns1.361way.com.  root.361way.com. (
 5                        2014121005      ;serial
 6                        1D              ;refresh
 7                        5M              ;retry
 8                        1W              ;expiry
 9                        1H)             ;minimum
10@      IN      NS      ns1.361way.com.
11@      IN      NS      ns2.361way.com.
12       IN      MX   5 mail.361way.com.
13103      IN      PTR     ns1.361way.com.
14107      IN      PTR     ns2.361way.com.
15103      IN      PTR     www.361way.com.
16102      IN      PTR     361way.com.
17109      IN      PTR     mail.361way.com.
18103      IN      PTR     pop3.361way.com.
19103      IN      PTR     iamp4.361way.com.

2、从DNS配置部分

从DNS的/etc/named.conf直接从主DNS上直接scp过来,named.rfc1912.zones也可以从主DNS上scp过来,不过copy过来后,还需要修改下,自定义关键部分如下:

 1zone "361way.com" IN {
 2           type slave;   //类型是slave,与上面的master对应
 3           file "slaves/361way.com.zone";  //文件同步到/var/named/slaves目录下的
 4           masters { 192.168.0.103; };     //指定主DNS服务器信息
 5           allow-notify {192.168.0.103; }; //指定允许notify的主机信息
 6};
 7zone "0.168.192.in-addr.arpa" IN{
 8           type slave;
 9           file "slaves/192.168.0.zone";
10           masters { 192.168.0.103; };
11           allow-notify {192.168.0.103; };
12};

从服务器上配置完成后,直接启动named服务即可,并重启下主DNS上的named服务。

3、同步日志

主服务器上的/var/log/message中的同步记录日志如下:

1Nov 12 00:43:53 localhost named[6318]: managed-keys-zone ./IN: loaded serial 15
2Nov 12 00:43:53 localhost named[6318]: running
3Nov 12 00:43:53 localhost named[6318]: zone 361way.com/IN: sending notifies (serial 2014121005)
4Nov 12 00:43:53 localhost named[6318]: zone 0.168.192.in-addr.arpa/IN: sending notifies (serial 2014121005)
5Nov 12 00:46:32 localhost named[6318]: client 192.168.0.107#57508: transfer of '361way.com/IN': AXFR-style IXFR started
6Nov 12 00:46:32 localhost named[6318]: client 192.168.0.107#57508: transfer of '361way.com/IN': AXFR-style IXFR ended
7Nov 12 00:46:32 localhost named[6318]: client 192.168.0.107#27744: received notify for zone '361way.com'
8Nov 12 00:50:53 localhost named[6318]: client 192.168.0.107#54176: transfer of '0.168.192.in-addr.arpa/IN': AXFR-style IXFR started
9Nov 12 00:50:53 localhost named[6318]: client 192.168.0.107#54176: transfer of '0.168.192.in-addr.arpa/IN': AXFR-style IXFR ended

四、相关问题

在主从配置中很多人遇到同步或启动出错的问题,一般先确认并排除时间不同步和named用户无法读文件的问题。然后再确认是否启用了notify功能,该功能也可以 在全局项options内配置,只不过全局配置是针对所有域的。

关于同步时间过长的问题?在解决问题的过程中有的朋友说将SOA中的Refresh值修改小一点,没错!但是这个值什么时候生效呢?当我们主DNS服务器上修改完成后 重启服务,会主动传送notify值(但并不是立即同步,中间还是会有几分钟的时间间隔的,具体详见参考页面中 的DNS与BIND中notify的原理),如果辅助DNS服务器没有收到才参考Refresh,Refresh 不成功,则参考Retry ,Retry 一直不成功, 则参考 Expire,如果Expire也 不成功,则选择放弃zone transfer的过程。

在实际应用中如果存在较多的slave的情况下还要考虑如下情况。

对于master而言:

  1. 是否有delay notify消息,这个配置是 notify-delay,默认是5s,有必要的话是需要缩短的。 
  2. transfers-out 限制同时允许区传输的数量,默认是10,如果slave多,zone多需要调大。 
  3. serial-query-rate 对于master而言会限制master给slave发送notify的速度,默认是20,需要调大。

对于slave而言:

  1. transfers-per-ns限制了从单个master同步的并发,默认也是10,需要调大。 
  2. transfers-in 限制了同时从master(可能有多个)同步的总数,默认是10,需要调大。 
  3. serial-query-rate 在slave中会限制slave向mastetr做SOA查询的频率。默认是20,需要调大。

五、测试

测试时,将测试主机的DNS修改为从DNS先测试是否能正常解析;测试完成后,可以同时配置主备DNS,将主服务器的DNS服务关掉 后,可以再验证下从服务器是否仍可以提供服务。具体步骤省略(可以参看上一篇)。

参考页面 DNS与BIND(第5版) lsscto的博客