添加从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服务器准备的,用来存放同步至本地的区域解析库文件。
[[email protected] named]# ll -d /var/named/ drwxr-x---. 5 root named 4096 Jun 12 12:15 /var/named/ [[email protected] 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):
ns.xiaoxiao.com. IN A 192.168.0.165 #主DNS服务器 2ns.xiaoxiao.com. IN A 192.168.0.206 #从DNS服务器
有几台从服务器,就需要在这儿添加几条,当然不要忘了下面对应的A记录!!!然后检查配置,重启服务!!!
[[email protected] 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 [[email protected] named]# service named restart Stopping named: . [ OK ] Starting named: [ OK ]
启动从服务器named进程:
[[email protected] slaves]# service named start Starting named: [ OK ] [[email protected] 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目录:
[[email protected] slaves]# ll total 4 -rw-r--r-- 1 named named 603 Jun 13 10:17 xiaoxiao.com.zone #对应的区域文件已存在
查看53号端口:
[[email protected] 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):
[[email protected] 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
修改权限,属组:
[[email protected] named]# chown :named ops.xiaoxiao.com.zone [[email protected] named]# chmod 640 ops.xiaoxiao.com.zone [[email protected] 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
检查配置文件和区域文件,无误后启动服务:
[[email protected] named]# named-checkconf [[email protected] named]# named-checkzone "ops.xiaoxiao.com" /var/named/ops.xiaoxiao.com.zone zone ops.xiaoxiao.com/IN: loaded serial 10000 OK [[email protected] named]# service named start Starting named: [ OK ]
测试(192.168.0.165是父域的主DNS服务器):
[[email protected] ~]# 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 51 Jun 13 15:13 Ktestkey.+***.key -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)通常只为外网客户端提供本机所负责的区域的解析;
重启服务测试一下
[[email protected] 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服务器):
[[email protected] ~]# 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上的测试结果:
[[email protected] ~]# 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!!!