DNS的主从配置

DNS从服务器也叫辅服DNS服务器,如果网络上某个节点只有一台DNS服务器的话,首先服务器的抗压能力是有限的,当压力达到一定的程度,服务器就可能会宕机罢工,
其次如果这台服务器出现了硬件故障那么服务器管理的区域的域名将无法访问。为了解决这些问题,最好的办法就是使用多个DNS服务器同时工作,
并实现数据的同步,这样两台服务器就都可以实现域名解析操作。

从服务器要点

1、应该为一台独立的名称服务器
2、主DNS服务器的区域解析库文件中必须有一条NS记录指向从服务器
3、从DNS服务器只需要定义区域,而无须提供解析库文件;解析库文件自动生成文件放置于/var/named/slaves/目录中,并且有写权限。
4、主DNS和辅助DNS服务器设置区域复制权限。防止使用 dig -t axfr hunk.tech 抓取信息。
5、主DNS和辅助DNS服务器时间应该同步,可通过ntp进行;
6、bind程序的版本应该保持一致;否则,应该辅助DNS版本高,主DNS版本低
定义从区域的方法:
zone "ZONE_NAME" IN {
type slave;
masters { 主DNS服务器IP; };
file "slaves/ZONE_NAME.zone";
};

主DNS服务器架设好后,辅助的DNS服务器的架设就相对简单多了。

很重要的一点:主从服务器时间不同步的话,则会导致各种意想不到的问题发生。因此,先配置NTP时间同步吧。

NTP服务器网址http://www.pool.ntp.org/zone/cn
ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org

自行选择快而稳定的。

创建从DNS步骤

1.记录下主DNS服务器的/etc/named.rfc1912.zones中需要进行主从设置的区域信息

2.在辅助的DNS服务器的/etc/named.rfc1912.zones文件,添加需要进行同步的区域记录,这两个记录是主DNS服务器配置文件里已经存在的记录。

zone "hunk.tech" IN {
        type slave;                     #type类型修改为slave
        masters { 192.168.4.200; }        #定义主DNS服务器IP
        file "slaves/named.hunk.tech";  #定义辅助DNS数据库文件
};

zone "4.168.192.in-addr.arpa" IN {
        type slave;                     #type类型修改为slave
        masters { 192.168.4.200; };        #定义主DNS服务器IP
        file "slaves/named.192.168.4";  #定义辅助DNS数据库文件
};

3. 主DNS服务器设置允许辅助DNS服务器作区域传送

在主DNS的/etc/named.conf全局属性中options {}
添加 allow-transfer { 允许的辅助DNS服务器IP; };防止未授权的区域复制。
如:allow-transfer { 192.168.4.201; } ;     
options {
                allow-transfer { 192.168.4.201; } ;
            }

4. 辅助DNS服务器设置禁止从本服务器作区域传送

辅助DNS服务器/etc/named.conf全局属性中options {}
添加 allow-transfer { none; };视情况不再允许未授权区域复制。
allow-transfer  { none; };

5.使用命令检查主配置文件和区域数据库

6.重新加载主配置文件和区域数据库文件

rndc: neither /etc/rndc.conf nor /etc/rndc.key was found
如果报以上错误,请重新启动服务#service named restart

7.测试

会自动生成区域文件
#ll ../slaves/
-rw-r--r--. 1 named named 481 Jan 19 02:25 named.192.168.4
-rw-r--r--. 1 named named 536 Jan 19 02:25 named.hunk.tech

生成的文件的格式比较规范

$ORIGIN .
$TTL 600        ; 10 minutes
hunk.tech               IN SOA  6-DNS-1.hunk.tech. admin.hunk.tech. (
                                0          ; serial
                                7200       ; refresh (2 hours)
                                600        ; retry (10 minutes)
                                86400      ; expire (1 day)
                                10800      ; minimum (3 hours)
                                )
                        NS      6-DNS-1.hunk.tech.
                        NS      6-DNS-2.hunk.tech.
                        MX      10 mail.hunk.tech.
$ORIGIN hunk.tech.
*                       A       192.168.0.206
6-DNS-1                 A       192.168.4.200
6-DNS-2                 A       192.168.4.201
6-WEB-1                 A       192.168.4.205
                        A       192.168.4.206
7-WEB-2                 A       192.168.4.206
mail                    A       192.168.4.205
www                     CNAME   6-WEB-1

其他情况

A.把辅助DNS的区域文件删除了
    1.重启辅助DNSnamed服务后可以恢复
    2.主DNS服务器版本更新并重新加载时,辅助DNS会同步生成文件
    3.rndc retransfer 区域名称
    如:rndc retransfer 4.168.192.in-addr.arpa
        rndc retransfer hunk.tech
B.版本更新后,只要reload,会立即发生同步    

C.辅助DNS辅助器生成的区域文件,Centos 6 可以使用cat等文本工具查看,Centos 7 已经使用data格式存放,
    需要使用这个命令配合参数查看 #named-compilezone -f raw -o - zone name  zone文件

D.端口使用。
查询单条记录时,使用UDP 53
区域传输的时候 需要使用TCP 53 和 UDP 53

基于TSIG加密的主从设置

Transaction signatures(TSIG)通常是一种确保DNS消息安全,并提供安全的服务器与服务器之间通讯(通常用在主从服务器之间)的机制。

TSIG可以保护以下类型的DNS服务器:Zone区域传送、Notify、动态更新、递归查询邮件。

TSIG适用于BIND v8.2及以上版本。TSIG使用共享秘密和单向散列函数来验证的DNS信息。

TSIG 可确认 DNS 之信息是由某特定 DNS Server 所提供。通常TSIG 应用于域名服务器间的区带传输,确保数据不会被篡改或产生 dns spoofing

1. 按照上文配置好主从并测试没问题后才执行以下步骤操作

dnssec-keygen  
DNSSEC 密钥生成工具

-a 选择加密算法
    对于DNSSEC 值必须是 RSAMD5, RSASHA1(强制实现), DSA(推荐), NSEC3RSASHA1, NSEC3DSA, RSASHA256, RSASHA512, ECCGOST
    对于TSIG/TKEY, 值必须是DH (Diffie Hellman), HMAC-MD5(强制实现),HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA384, HMAC-SHA512

-b 指定密钥中的位数。
    密钥大小的选择取决于使用的算法。RSAMD5 和 RSASHA1 密钥必须在 512 和 2048 位之间。
    Diffie-Hellman 密钥必须在 128 和 4096 位之间。DSA 密钥必须在 512 和 1024 位之间,并且必须是 64 的整数倍。HMAC-MD5 密钥必须在 1 位和 512 位之间。

-f  在 KEY/DNSKEY 记录的标志字段中设置指定的标志。唯一识别的标志是 KSK(Key Signing Key,密钥签名密钥)DNSKEY。

-h 列出 dnssec-keygen 的选项和参数的简短摘要

-n 指定密钥的所有者类型。nametype 的值必须是 ZONE(对于 DNSSEC 区域密钥 (KEY/DNSKEY))、HOST 或 ENTITY(对于与主机相关的密钥 (KEY))、USER(对于与用户相关的密钥 (KEY))或 OTHER (DNSKEY)。这些值不区分大小写。缺省值是 ZONE(用于生成 DNSKEY)

-r 指定随机源,有助与生成速度。如果操作系统不提供 /dev/random 或等效设备,则缺省的随机源是键盘输入.

-K(大写) <directory>: 设置要写入的密钥文件的目录

2. 在主DNS服务器中生成密钥

#dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST -K /root/dnskey/ -r /dev/urandom hunk-tech-key

选项解读:
-a HMAC-SHA512  :采用HMAC-SHA512加密算法
-b 512          :生成的密钥长度为512位
-n HOST         :指定密钥的所有者类型为主机类型
-K /root/dnskey/:指定生成密钥的目录
-r /dev/urandom :指定生成密钥使用的随机数来源,否则将会让你在键盘上敲入随机字符,导致会非常慢。
hunk-tech-key   :密钥的名称

之后,会在指定的目录/root/dnskey/生成2个文件
Khunk-tech-key.+165+40008.key     > 公钥
Khunk-tech-key.+165+40008.private > 私钥

内容类似如下:
#cat Khunk-tech-key.+165+40008.key 

hunk-tech-key. IN KEY 512 3 165 MmQEQV+fSKe/uEKfxcpMa4avCFPTY3ipmcg+JqaPU2dV9yYx9rOdXesP aVnUyv6XarzJ3ml1H2gCgR0cDf3TGg==

#cat Khunk-tech-key.+165+40008.private 

Private-key-format: v1.3
Algorithm: 165 (HMAC_SHA512)
Key: MmQEQV+fSKe/uEKfxcpMa4avCFPTY3ipmcg+JqaPU2dV9yYx9rOdXesPaVnUyv6XarzJ3ml1H2gCgR0cDf3TGg== (这一行内容等会用到)
Bits: AAA=
Created: 20180206083046
Publish: 20180206083046
Activate: 20180206083046

3. 在主DNS服务器上创建密钥验证文件

#vim /etc/named/dns-key

key "hunk-tech-key" {   > 这个双引号内填写的字符串可以是任意的。这个字符串主从必须要一致。这个例子使用dnssec-keygen生成时指定的密钥的名称
        algorithm HMAC-SHA512;   > 这个加密算法填写的是dnssec-keygen生成时指定的加密算法
        secret "MmQEQV+fSKe/uEKfxcpMa4avCFPTY3ipmcg+JqaPU2dV9yYx9rOdXesPaVnUyv6XarzJ3ml1H2gCgR0cDf3TGg==";  > 这里填写的生成密钥中K*.private文件中的key值。注意双引号和分号
};

4. 修改密钥验证文件所有者与权限

#chown root:named /etc/named/dns-key
#chmod 640 /etc/named/dns-key

5. 修改主DNS服务器的主配置文件

# vim /etc/named.conf

include "/etc/named/dns-key"; 将此行内容添加至文件尾部

在全局options配置中修改以下内容,没有的话就添加
        dnssec-enable yes;
        dnssec-validation yes;
        allow-update { localhost;192.168.7.253; };                    > 定义仅有本机和从DNS才可以动态更新
        allow-transfer { localhost;192.168.7.253; };    > 定义只允许本机和从DNS主机才能使用区域传送
        notify yes;

以下行不在全局定义的范围内,不要误写入options的{ }中
server 192.168.7.253 { keys hunk-tech-key; };       > 定义与从dns服务器使用密钥通讯

6. 导入密钥验证文件到从DNS服务器

为了确保传输的文件没有被破坏,请使用md5sum之类的哈希算法进行校验
#md5sum /etc/named/dns-key > /etc/named/md5sum
#scp /etc/named/* 192.168.7.253:/etc/named/
dns-key                               100%
md5sum                                100%

在从DNS服务上验证文件的完整性
#md5sum -c md5sum
/etc/named/dns-key: OK

7. 修改密钥验证文件所有者与权限

#chown root:named /etc/named/dns-key
#chmod 640 /etc/named/dns-key

8. 修改从DNS服务器的主配置文件

# vim /etc/named.conf

include "/etc/named/dns-key"; 将此行内容添加至文件尾部

在全局options配置中修改以下内容,没有的话就添加
        dnssec-enable yes;
        dnssec-validation yes;
        allow-update { none; };             > 不允许客户端动态更新
        allow-transfer { localhost; };      > 定义只允许本机才能使用区域传送

如果只想要在某个zone中使用密钥传送,按以下写法即可
        zone "hunk.tech" {
                type slave;
                masters { 192.168.7.254 key hunk-tech-key; };

如果有多个zone中需要使用密钥传送,保持zone的设置不更改,只需要定义一个全局的server配置项即可
server 192.168.7.254 { keys hunk-tech-key; };

9. 在主DNS服务上生效配置

#named-checkconf
#rndc reload
server reload successful

如果有情况的话,可以尝试重启服务

10. 在从DNS服务上生效配置

#named-checkconf
#rndc reload
server reload successful

如果有情况的话,可以尝试重启服务

11. 测试TSIG

在从DNS服务器
#dig -t axfr hunk.tech -k /etc/named/dns-key @192.168.7.254    > -k 指定密钥

从日志和传送过来的区域中可以看出来

image
image

使用专用的动态更新工具来测试

#nsupdate -k /etc/named/dns-key 
> server 192.168.7.254
> zone hunk.tech
> update add 9.hunk.tech 600 A 9.9.9.9
> send
> quit

在主DNS服务器日志中可以看到

client 192.168.7.254#42738: view net_192: signer "hunk-tech-key" approved
client 192.168.7.254#42738: view net_192: updating zone 'hunk.tech/IN': adding an RR at '9.hunk.tech' A

在从DNS服务器日志中可以看到

transfer of 'hunk.tech/IN/net_192' from 192.168.7.254#53: connected using 192.168.7.253#34324
zone hunk.tech/IN/net_192: transferred serial 61: TSIG 'hunk-tech-key'
transfer of 'hunk.tech/IN/net_192' from 192.168.7.254#53: Transfer completed: 1 messages, 11 records, 428 bytes, 0.006 secs (71333 bytes/sec)

在从DNS服务器传送过来的区域中可以看到序列为61的更新记录

image

最后一个测试,进入从DNS的slaves目录把所有区域删除,不用担心,前面讲过重启从DNS服务后,会立即同步主DNS的区域文件。

#rm -rf *
#ls
#service named restart
Stopping named: .                                          [  OK  ]
Starting named:                                            [  OK  ]
#ls
named.192.168.7  named1.hunk.tech

至此,TSIG已经正常工作了

动态DNS更新工具nsupdate

可以向DNS服务器提交更新记录的请求,它可以从区文件中添加或删除资源记录,而不需要手动进行编辑zone文件

必须的条件:指定的zone语句块或全局中添加:allow-update { any; }; 或 allow-update { IP范围; };

语法:
nsupdate [-dD] [-L level] [-l][-g | -o | -y keyname:secret | -k keyfile] [-v] [filename]

-d 调试模式。
-k 从keyfile文件中读取密钥信息。
-y keyname是密钥的名称,secret是以base64编码的密钥。
-v 使用TCP协议进行nsupdate.默认是使用UDP协议。
filename:可以从终端或文件中读取命令.每个命令一行.一个空行或一个”send”命令,则会将先前输入的命令发送到DNS服务器上
指定密钥
# nsupdate -k /etc/named/dns-key

更新命令
update delete|add {domain-name} [ttl] [class] [type [data...]]
class不指定的话,默认是IN
ttl可以单独写一行,后面的行继承此值
#nsupdate
> server 192.168.7.254     > 指定动态更新的DNS服务器
> zone hunk.tech            > 指定更新zone
> update add hunk.tech 600 IN A 192.168.7.204 >添加A记录
> update delete hunk.tech A 192.168.7.204     >删除A记录
> send                  > 发送更新指令到DNS服务器

从文件读取指令
#nsupdate update_dns.txt
文件中的指令与交互式是一样的,一行一条指令

要求domain-name中不存在任何资源记录
prereq nxdomain domain-name

要求domain-name存在,并且至少包含有一条记录
prereq yxdomain domain-name

要求domain-name中没有指定类别的资源记录
prereq nxrrset domain-name [ class ] type

要求存在一条指定的资源记录.类别和domain-name必须存在
prereq yxrrset domain-name [ class ] type