实验环境:RHEL5.8 32Bit
DNS主从复制以及区域传送
如果我们希望用户在浏览器的地址栏里面通过域名就可以访问到我们的站点的话,我们直接给该域名添加一条A记录即可,但是如果如果期望用户在输错域名的情况下也能够正常的定向到我们的站点上面的话,就得使用泛域名解析,但是对于一个非常大的组织来讲泛域名解析并不是一个非常可取的做法,所以,在用户输错一个域名的情况下,我们尽可能的给用户也要返回一个页面,如果是web页面的话,那么就给用户返回一个错误页面,而不是向泛域名解析那样定向到我们的主页上,这个时候我们就得使用url重定向来实现这种功能了,即在我们的站点上,当用户访问了一个不存在的页面的时候,我们给它定向到一个错误页面即可。
我们的DNS服务器建立起来之后,不应该给所有用户都进行递归查询,尤其是当我们的DNS服务器被放到互联网上的时候,因为如果互联网上的某个用户将它的DNS服务器指向我们的服务器然,并且要求递归查询的话,那么我们的DNS服务器很有可能在该用户发起一些恶意查询的请求和递归查询下而挂掉,因此我们的DNS服务器在建立起来之后不应该随意给任意用户都可以进行递归查询,那么允许哪些用户进行递归查询,我们可以自己定义出来的。
·如何定义我们的DNS服务器可以允许哪些用户进行递归
还是编辑/etc/named.conf这个主配置文件,在全局选项中有一个recursion参数,给它赋值yes表示允许任何用户进行递归,recursion参数用来定义是否开启DNS服务器的递归功能,如果我们不定义该参数,默认情况下,该功能也是开启的,但是这样一来我们的DNS服务器默认给任何用户都可以递归,这种定义方式不好,我们可以先检测一下我们的DNS服务器在没有定义该参数的情况下是不是给互联网上的任何用户都可以进行递归,使用dig命令进行检测:
dig命令在工作的时候有很多的工作特性,dig +recurse命令表示以递归的方式对目标地址进行解析,而dig +norecurse表示以迭代的方式对目标地址进行解析,例如:
dig +recurse -t A www.sohu.com. @192.168.0.5命令表示让我们的DNS服务器以递归的方式给我们返回www.sohu.com.的A记录:
能够得到答案,说明我们的DNS服务器允许我们本机进行递归,而dig +norecurse -t A www.qq.com. @192.168.0.5命令则表示不允许我们的DNS服务器和我们本机之间进行递归:
如上图所示并不能返回答案,而只是返回了.com.域的NS记录。
dig +trace(跟踪)命令表示跟踪DNS解析的整个过程,例如:
dig +trace -t A www.baidu.com. @192.168.0.5命令表示跟踪DNS解析的整个递归的过程(dig命令默认就是dig +recurse的):
[[email protected] ~]# dig +trace -t A www.baidu.com. @192.168.0.5 ; <<>> DiG 9.7.0-P2-RedHat-9.7.0-6.P2.el5_7.4 <<>> +trace -t A www.baidu.com. @192.168.0.5 ;; global options: +cmd . 517408 IN NS h.root-servers.net. . 517408 IN NS l.root-servers.net. . 517408 IN NS e.root-servers.net. . 517408 IN NS j.root-servers.net. . 517408 IN NS g.root-servers.net. . 517408 IN NS m.root-servers.net. . 517408 IN NS k.root-servers.net. . 517408 IN NS b.root-servers.net. . 517408 IN NS f.root-servers.net. . 517408 IN NS c.root-servers.net. . 517408 IN NS i.root-servers.net. . 517408 IN NS a.root-servers.net. . 517408 IN NS d.root-servers.net. ;; Received 508 bytes from 192.168.0.5#53(192.168.0.5) in 5 ms com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. ;; Received 491 bytes from 192.5.5.241#53(f.root-servers.net) in 23 ms baidu.com. 172800 IN NS dns.baidu.com. baidu.com. 172800 IN NS ns2.baidu.com. baidu.com. 172800 IN NS ns3.baidu.com. baidu.com. 172800 IN NS ns4.baidu.com. baidu.com. 172800 IN NS ns7.baidu.com. ;; Received 201 bytes from 192.35.51.30#53(f.gtld-servers.net) in 3274 ms www.baidu.com. 1200 IN CNAME www.a.shifen.com. a.shifen.com. 1200 IN NS ns4.a.shifen.com. a.shifen.com. 1200 IN NS ns3.a.shifen.com. a.shifen.com. 1200 IN NS ns5.a.shifen.com. a.shifen.com. 1200 IN NS ns1.a.shifen.com. a.shifen.com. 1200 IN NS ns2.a.shifen.com. ;; Received 228 bytes from 180.76.76.92#53(ns7.baidu.com) in 22 ms [[email protected] ~]#
dig命令是我们测试DNS服务器工作方式的一个非常常用的命令而且功能异常强大。
以上是我们允许所有主机都可以和我们的DNS服务器进行递归的情况,接下来我们在全局选项中定义recursion参数并且赋值no,表示我们的DNS服务器不允许和任何主机进行递归:
接着使用dig命令检测:
没有答案,即无法递归。
但是还是可以解析我们这个域的:
但是如果DNS服务器不允许递归,那么它就没有任何存在的意义,所以我们一般情况下是在/etc/named.conf中的全局选项中定义一个allow-recursion参数,该参数用来明确定义我们的DNS服务器允许哪些主机进行递归的,例如allow-recursion { 192.168.0.0/24; };表示我们的DNS服务器只给该网段内的所有主机进行递归,而该网段以外的所有主机都不允许递归,allow-recursion参数用于定义递归对象即递归客户端来源:
由上图知,允许递归,但是如果使用的是本地回环地址去进行请求递归的话,看看是否被允许递归:
没有答案,即不允许递归,虽然127.0.0.1也是我们本机的地址,但是它不属于我们允许的网段,故一般情况下我们得允许本机回环地址进行递归的:
如上图所示,递归成功。
一般来说,当我们搭建好我们的DNS服务器之后,我们得允许许许多多的主机到我们的DNS服务器上面发起查询请求的,那么如果我们不想让某些主机在我们的DNS服务器上面发起查询请求的话该怎么办?在/etc/named.conf文件的全局选项中可以定一个参数叫做allow-query,该参数可以定义只允许哪些主机可以到我们的DNS服务器上面发起查询请求,但是该参数在互联网上面使用的并不是很多。
·区域传送
DNS服务器的区域传送分为两种类型:
1,axfr->完全区域传送
2,ixfr->增量区域传送
其实dig命令也可以实现区域传送的功能,例如:
dig -t axfr lkx.com.命令表示输出该区域中的所有数据:
也可以使用dig命令来完成ixfr,使用之前我们得先在区域文件中新增一条记录,我们每修改一次主DNS服务器的区域文件都得将SOA记录中的序列号加一:
接着使用dig命令进行增量区域传送:
上图显示有一条记录发生了更新。
上图中实现了增量区域传送,使用dig命令可以使得我们手动完成区域传送。
区域传送一般发生在我们的DNS服务器有主从结构的情况下,是由主DNS服务器向从DNS服务器传送数据的过程,使用dig命令进行区域传送是非常不安全的,因此我们绝对不允许任何主机都能够和我们的主DNS服务器进行区域传送,即不能够允许任何主机都得到我们主DNS服务器中的区域内容,而只可以允许我们的从DNS服务器和主DNS服务器进行区域传送,而其他任何主机都不可以,那么该如何定义呢?还是在主配置文件中的全局选项中定义一个参数,这个参数叫做allow-transfer,其实我们可以将该参数定义在每一个zone里面,这样定义起来会非常的方便:
localhost区域不允许任何主机进行区域传送
localhost的反向区域也不允许
而我们自己的主DNS服务器的正反向区域只允许向从DNS服务器进行区域传送,假设我们有一台从DNS服务器叫做192.168.0.15:
接着我们使用dig -t axfr lkx.com.命令:
由上图发现无法传送,说明现在只允许192.168.0.15这台主机进行传送,接下来我们将192.168.0.15这台主机配置为一台从DNS服务器,并将它的/etc/resolv.conf文件中的nameserver指向它自己,search指向lkx.com.,接下来我们使用dig -t axfr lkx.com. @192.168.0.5命令就可以完成区域传送:
如上图,允许传送,但是如果我们希望主从DNS服务器之间能够自动进行区域传送,就得将192.168.0.15这台主机配成一台真正的从DNS服务器即可。
·如何配置一台从DNS服务器
从DNS服务器的配置非常的简单,只需要配置主配置文件即可,区域文件无需配置,它会自动从主DNS服务器上面传送过来:
1,首先肯定是安装bind97的客户端和服务端软件,安装完成之后,会在/var/named目录下生成一个slaves目录,这个目录有一个特性,权限是770,并且属主和属组都是named:
而/var/named目录的权限是750,属主和属组分别是root和named:
但是进行区域传送的进程是DNS服务器上的named进程,该进程的属主和属组都是named,因此named进程对/var/named目录没有写权限,因此区域传送过来的数据文件无法保存在该目录下,故主DNS服务器进行区域传送的数据文件是不可以直接放到该目录下的,但是bind97专门给我们建了一个目录用于存放区域传送过程中主DNS服务器传送过来的数据文件,这个目录就是slaves目录。
2,关闭selinux
3,配置/etc/named.conf
我们可以使用scp命令从主DNS服务器中远程传输一份,再稍加修改即可:
开始修改:
将从DNS服务器中的lkx.com.区域中的区域类型改为slave,区域传送的文件的路径也要修改,还得指定自己的主DNS服务器是哪个,并且如果没有其他的从DNS服务器存在的话,那么从DNS服务器就不允许任何主机进行区域传送了,两台DNS服务器可以互为主从DNS服务器,比如说ns1为正向区域的主服务器,而ns2位反向区域的主服务器,虽然正向区域和反向区域共存于一台DNS服务器上,但是它们是毫不相干的两个区域,所以说正向区域的主DNS服务器完全可以是另一台主机反向区域的从服务器,即两台DNS服务器可以互为主从服务器:
但是一台主机完全作为主服务器而另一台主机完全作为从服务器,这样也是可以的,lkx.com.反向zone的定义和正向zone是一样的:
配置完成之后,检查配置文件语法错误,然后重读配置文件即可:
发现报错,接下来我们查看日志:
可能是配置文件的属主和属组有问题,于是我们更改配置文件的属组,再重新启动named进程即可:
接下来我们在主服务器上面查看日志:
发向正反向区域传送都已经成功,接着再在从服务器上查看日志:
发现区域传送也已经完成,最后在从服务器的slaves目录中查看传送过来区域文件:
如果有文件,表明区域传送成功!
我们可以查看传送到从服务器上的区域文件的内容:
我们可以发现传送过来的区域文件被添加了很多的注释,格式变得更加的正规,ORIGIN表示默认补全后的内容,ORIGIN .表示给底下的记录的区域名称默认补全.,而ORIGIN lkx.com.表示给底下的记录的FQDN默认补全lkx.com.,并且区域文件里面的TTL和ORIGIN可以被声明多次,反向区域也是一样的:
以上我们是使得主从DNS服务器之间自动完成了完全区域传送,接下来我们看看如何使得主从DNS服务器之间能够自动完成增量区域传送。
我们在主DNS服务器的区域文件里面加上一条A记录:
但是我们一定还得添加一条NS记录用来指定ns2位我们域内的一台新加入的DNS服务器,并且再加上ns2的A记录,因为ns2为我们域内新加入的一台DNS服务器,还有不要忘了序列号要加一,反向区域里面也得进行添加:
我们还可以在主配置文件的全局选项中添加一个notify参数并赋值yes,该参数表示启用通知功能,表示一旦主服务器上的区域数据发生改变得通知从服务器上进行同步:
然后检查主配置文件和正反向区域的语法错误:
之后重启服务,检测能否完成区域传送:
发现增量区域传送成功,以上就是如何实现主从DNS服务器之间的区域传送的所有内容。
·如何使用rndc来远程控制DNS服务器
使用rndc -h命令可以查看该命令的用法:
[[email protected] ~]# rndc -h Usage: rndc [-c config] [-s server] [-p port] #-c选项表示指定配置文件,-s选项表示指定远程 [-k key-file ] [-y key] [-V] command #服务器,-p选项表示指定远程连接的端口,-k #选项表示以哪个key文件向外发送 command is one of the following: #该命令还有很多的子命令 reload Reload configuration file and zones. #reload表示通知某个区域重读配置文件和区域文件 reload zone [class [view]] #reload zone表示重读区域文件,还可以指定重读哪个区域 Reload a single zone. refresh zone [class [view]] #refresh zone表示重新刷新区域文件 Schedule immediate maintenance for a zone. retransfer zone [class [view]] #retransfer zone表示重新传送区域文件 Retransfer a single zone without checking serial number. freeze Suspend updates to all dynamic zones. #freeze表示冻结一个动态区域 freeze zone [class [view]] Suspend updates to a dynamic zone. thaw Enable updates to all dynamic zones and reload them. thaw zone [class [view]] Enable updates to a frozen dynamic zone and reload it. notify zone [class [view]] #notify zone表示手动让某个区域向外发送通知 Resend NOTIFY messages for the zone. reconfig Reload configuration file and new zones only. #表示只重读配置文件和新的区域文件 sign zone [class [view]] Update zone keys, and sign as needed. stats Write server statistics to the statistics file. #stats表示手机服务器的统计信息 querylog Toggle query logging. #querylog表示打开查询日志 dumpdb [-all|-cache|-zones] [view ...] Dump cache(s) to the dump file (named_dump.db). stop Save pending updates to master files and stop the server. stop -p Save pending updates to master files and stop the server reporting process id. halt Stop the server without saving pending updates. halt -p Stop the server without saving pending updates reporting process id. trace Increment debugging level by one. trace level Change the debugging level. notrace Set debugging level to 0. flush Flushes all of the server‘s caches. #flush表示清空缓存 flush [view] Flushes the server‘s cache for a view. flushname name [view] Flush the given name from the server‘s cache(s) status Display status of the server. recursing Dump the queries that are currently recursing (named.recursing) validation newstate [view] Enable / disable DNSSEC validation. *restart Restart the server. * == not yet implemented Version: 9.7.0-P2-RedHat-9.7.0-6.P2.el5_7.4 [[email protected] ~]#
要使用rndc之前,先得给rndc提供一个key文件:
1,首先使用rndc-confgen > /etc/rndc.conf命令生成一个rndc的配置文件
2,查看该文件的内容
1 # Start of rndc.conf 2 key "rndc-key" { 3 algorithm hmac-md5; 4 secret "vYv9svNzKJJ+HMmaeKjzaQ=="; 5 }; 6 7 options { 8 default-key "rndc-key"; 9 default-server 127.0.0.1; 10 default-port 953; 11 }; 12 # End of rndc.conf 13 14 # Use with the following in named.conf, adjusting the allow list as needed: 15 # key "rndc-key" { 16 # algorithm hmac-md5; 17 # secret "vYv9svNzKJJ+HMmaeKjzaQ=="; 18 # }; 19 # 20 # controls { 21 # inet 127.0.0.1 port 953 22 # allow { 127.0.0.1; } keys { "rndc-key"; }; 23 # }; 24 # End of named.conf
该文件中的内容有一半是被注释掉的,另一半是开放的,开放的那一部分内容才是rndc.conf文件的真正内容,而后半段被注释掉的内容全部追加到/etc/named.conf文件中去,可以使用vim末行模式下的命令:
之后在named.conf文件中将注释全部打开,也可以使用vim末行模式下的命令:
rndc的密钥文件就是rndc-key,hmac-md5密钥叫做签名密钥,然后检查配置文件语法,重启服务,但是在使用之前我们还得将/etc/rndc.key文件删掉,该文件是我们在安装bing97之后自动生成的文件:
接下来就可以使用rndc命令了,例如:
[[email protected] ~]# rndc -c /etc/rndc.conf status version: 9.7.0-P2-RedHat-9.7.0-6.P2.el5_7.4 #表示DNS的版本号 CPUs found: 1 #主机上的CPU的个数 worker threads: 1 #有几个named工作进程 number of zones: 16 debug level: 0 xfers running: 0 xfers deferred: 0 #以上两项表示有没有发生区域传送 soa queries in progress: 0 query logging is OFF recursive clients: 0/0/1000 tcp clients: 0/100 server is up and running #表示DNS服务器目前的状态
上图中的命令表向lkx.com.这个域发起通知,并查看日志。
上图中的第一条命令表示清空缓存,第二条命令表示停止DNS服务器,stop之后我们发现53号端口已经没有在监听了,rndc命令在使用的时候也可以不用指定配置文件,因为rndc默认就回去读取该配置文件的:
但是我们刚刚一直在使用rndc在控制我们的本机,要想使得rndc可以实现控制远程DNS服务器的话,我们得将主配置文件中的rndc监听的地址改为主服务器的地址,allow的地址改为从服务器的地址:
然后检查配置文件语法错误,并重启DNS服务,之后就可以通过从服务器来远程控制主DNS服务器了,别忘了还得将/etc/rndc.conf文件远程复制到从服务器的家目录下面去:
之后修改该文件,将默认server修改为主服务器:
然后就可以使用rndc命令远程控制我们的主服务器了:
一般情况下,我们不允许开放rndc远程控制我们的DNS服务器。