这次来说说反向解析和主从同步的话题.
反向解析 之前的Part1中 ,我们已经搭建了能够正向解析的DNS服务器.
首先我们来看看反向区域这个概念.
反向区域是什么呢? 首先他的区域名称是很独特的, 要讲注册的得到的网络名称反过来写并且加上in-addr.arpa.
例如: 得到了 172.16.100 这个非变化部分就是我们的网络地址, 那么就写成: 100.16.172.in-addr.arpa.
[注意后面的.]
那么怎么定义这个反向区域呢? 和定义正向区域基本相似:
1 2 3 4 zone "ZONE_NAME" IN { type {master|slave|forward}; file "网络地址.zone" ; };
接下就是提供解析库文件了. 反向区域和正向区域的解析库是有区别的, 他需要SOA和NS记录, 但它不需要A,AAAA,MX, 以PTR记录为主.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $TTL 86400$ORIGIN 199.168.192.in-addr.arpa.@ IN SOA ns1.yaoxuannn.com. admin.yaoxuannn.com ( 2017090101 1H 5M 7D 1D ) IN NS ns1.yaoxuannn.com. IN NS ns2.yaoxuannn.com. 1 IN PTR ns1.yaoxuannn.com. 2 IN PTR ns2.justin13wxy.me. 10 IN PTR www.yaoxuannn.com. 10 IN PTR wwww.yaoxuannn.com.
与之对应, 我们在/etc/named.rfc1912.zones里面加上一条:
1 2 3 4 zone "199.168.192.in-addr.arpa" IN { type master; file "199.168.192.zone" ; };
接着重新载入解析库文件之后, 我们进行反向解析:
1 2 3 4 5 6 7 8 9 10 11 12 [root@WWW named] 10.199.168.192.in-addr.arpa domain name pointer www.yaoxuannn.com. 10.199.168.192.in-addr.arpa domain name pointer wwww.yaoxuannn.com. [root@WWW named] ...(omitted) ;; ANSWER SECTION: 1.199.168.192.in-addr.arpa. 86400 IN PTR ns1.yaoxuannn.com. ;; AUTHORITY SECTION: 199.168.192.in-addr.arpa. 86400 IN NS ns1.yaoxuannn.com. 199.168.192.in-addr.arpa. 86400 IN NS ns2.yaoxuannn.com. ...(omitted)
dig还有一个特别神奇的技能, 他可以进行模拟区域传送 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@WWW named] ; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> -t axfr yaoxuannn.com ;; global options: +cmd yaoxuannn.com. 86400 IN SOA ns1.justn13wyx.me. admin.yaoxuannn.com.yaoxuannn.com. 2017090101 3600 300 604800 86400 yaoxuannn.com. 86400 IN NS ns1.yaoxuannn.com. yaoxuannn.com. 86400 IN NS ns2.yaoxuannn.com. ns1.yaoxuannn.com. 86400 IN A 192.168.199.1 ns2.yaoxuannn.com. 86400 IN A 192.168.199.2 www.yaoxuannn.com. 86400 IN A 192.168.199.10 wwww.yaoxuannn.com. 86400 IN CNAME www.yaoxuannn.com. yaoxuannn.com. 86400 IN SOA ns1.justn13wyx.me. admin.yaoxuannn.com.yaoxuannn.com. 2017090101 3600 300 604800 86400 ;; Query time: 3 msec ;; SERVER: 192.168.56.101 ;; WHEN: Sat Sep 09 11:44:59 EDT 2017 ;; XFR size: 8 records (messages 1, bytes 247)
这种全量区域传送是挺不安全的, 因为如果大家都可以进行这种, 那么全公司的网络拓扑甚至可以猜测出来.
如果用户想要访问 www.yaoxuannn.com 这个优秀的网站, 但是不小心它在前面加了一个 nizubang.yaoxuannn.com 这样解析就会出现问题, 所以 我们可以为刚才的解析库中增加一条泛解析条目:
1 2 3 4 [root@WWW named] [root@WWW named] wwww IN CNAME www * IN CNAME www
OK, reload之后, 就可试着解析了. 但是试着试着又发现了一个问题, 如果我什么都不写的话好像还是解析不了, 那么就需要再添加一条:
1 2 3 4 5 6 7 8 9 10 11 12 [root@WWW named] [root@WWW named] www IN A 192.168.199.10 wwww IN CNAME www * IN CNAME www yaoxuannn.com. IN A 192.168.199.10 [root@WWW named] server reload successful [root@WWW named] ...(omitted) ;; ANSWER SECTION: yaoxuannn.com. 86400 IN A 192.168.199.10
主从复制 主从复制并不是说就那么死板的安排的. 其实你可以有很多种不同的主从设计, 一台主服务器同时可以成从服务器, 从服务器也可以成为另一台从服务器的主服务器等等..
现在我的实验环境是这样安排的:
实验机一号: CentOS Linux release 7.3.1611 (Core) IP: 192.168.56.101 – 主
实验机二号: CentOS Linux release 7.3.1611 (Core) IP: 192.168.56.103 – 从
OK, 实验环境已经准备好了, 现在现在我们的二号机上做个测试:
正向解析 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@WWW ~] ; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> axfr yaoxuannn.com @192.168.56.101 ;; global options: +cmd yaoxuannn.com. 86400 IN SOA ns1.justn13wyx.me. admin.yaoxuannn.com.yaoxuannn.com. 2017090101 3600 300 604800 86400 yaoxuannn.com. 86400 IN A 192.168.199.10 yaoxuannn.com. 86400 IN NS ns1.yaoxuannn.com. yaoxuannn.com. 86400 IN NS ns2.yaoxuannn.com. *.yaoxuannn.com. 86400 IN CNAME www.yaoxuannn.com. ns1.yaoxuannn.com. 86400 IN A 192.168.56.101 ns2.yaoxuannn.com. 86400 IN A 192.168.56.102 www.yaoxuannn.com. 86400 IN A 192.168.199.10 wwww.yaoxuannn.com. 86400 IN CNAME www.yaoxuannn.com. yaoxuannn.com. 86400 IN SOA ns1.justn13wyx.me. admin.yaoxuannn.com.yaoxuannn.com. 2017090101 3600 300 604800 86400 ;; Query time: 3 msec ;; SERVER: 192.168.56.101 ;; WHEN: Sun Sep 10 01:06:08 EDT 2017 ;; XFR size: 10 records (messages 1, bytes 279)
显然没有问题, 和Part1不同的是, 我把ns1和ns2的地址进行了更改, 因此和之前的解析库不一样了.
配置一个从服务器是比主服务器要简单的(废话啊), 我们先安装bind.
接着编辑namd.conf文件, 监听地址, 查询权限, dnssec啥的. 在Part1这些都提到过了, 所以就不说了.
我们先从正向区域的从服务器开始建立. 首先, 我们前往rfc1912.zones:
1 2 3 4 5 zone "yaoxuannn.com" IN { type slave; masters { 192.168.56.101; }; file "slaves/yaoxuannn.com.zone" ; };
你可能想问, 难道说我们一定要把文件放在slaves这个目录下? 一般来说, 是的. 我们观察一下这个named目录下的构造:
1 2 3 4 5 6 7 8 9 10 11 [root@WWW named] total 16 drwxrwx--- 2 named named 23 Sep 9 03:39 data/ drwxrwx--- 2 named named 60 Sep 10 01:22 dynamic/ -rw-r----- 1 root named 2281 May 22 05:51 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 drwxrwx--- 2 named named 33 Sep 10 01:35 slaves/ [root@WWW named] drwxr-x--- 5 root named 127 Sep 10 01:02 /var/named/
经过观察可以很清楚的看出来, named用户仅仅可以对slaves, data, dynamic有写权限, 事实上. 这个就是bind为我们提供的结构. 凡是从解析库文件都扔到slaves里面就可以了.
接下来我们进行配置reload:
1 2 3 4 5 6 7 8 9 10 11 12 [root@WWW named] server reload successful [root@WWW named] Sep 10 01:35:20 WWW named[10333]: reloading configuration succeeded Sep 10 01:35:20 WWW named[10333]: reloading zones succeeded Sep 10 01:35:20 WWW named[10333]: all zones loaded Sep 10 01:35:20 WWW named[10333]: running Sep 10 01:35:20 WWW named[10333]: zone yaoxuannn.com/IN: Transfer started. Sep 10 01:35:20 WWW named[10333]: transfer of 'yaoxuannn.com/IN' from 192.168.56.101 Sep 10 01:35:20 WWW named[10333]: zone yaoxuannn.com/IN: transferred serial 2017090101 Sep 10 01:35:20 WWW named[10333]: transfer of 'yaoxuannn.com/IN' from 192.168.56.101 Sep 10 01:35:20 WWW named[10333]: zone yaoxuannn.com/IN: sending notifies (serial 2017090101)
看到没~ 我们的文件传输过来了, 来看一下是否多出了个文件? 你可能会有有趣的发现.
接下来, 我们再看看主服务器那边 的情况吧:
1 2 3 4 5 [root@WWW ~] Sep 10 01:35:19 WWW named[10298]: client 192.168.56.103 Sep 10 01:35:19 WWW named[10298]: client 192.168.56.103 Sep 10 01:35:20 WWW named[10298]: client 192.168.56.103 ...(omitted)
如果刷新时间没有到, 但是我们主服务的解析记录发生了变化的话, 那么从服务器会得到更改吗? 我们来做这个实验:
首先我们为yaoxuannn.com这个域增加一个MX记录并且更新Serial Num.(+1)
1 2 IN MX 10 mx1 mx1 IN A 192.168.199.20
接着我们reload配置
1 2 [root@WWW named] server reload successful
看看日志怎么样
1 2 3 4 5 6 7 8 9 [root@WWW named] Sep 10 02:35:33 WWW named[10298]: reloading configuration succeeded Sep 10 02:35:33 WWW named[10298]: reloading zones succeeded Sep 10 02:35:33 WWW named[10298]: zone yaoxuannn.com/IN: loaded serial 2017090102 Sep 10 02:35:33 WWW named[10298]: all zones loaded Sep 10 02:35:33 WWW named[10298]: running Sep 10 02:35:33 WWW named[10298]: zone yaoxuannn.com/IN: sending notifies (serial 2017090103) Sep 10 02:35:33 WWW named[10298]: client 192.168.56.103 Sep 10 02:35:33 WWW named[10298]: client 192.168.56.103
不错, 我们更改过后, 主服务器就直接去通知自己的从服务器去更新这份记录了.
那么现在来稍微总结一下:
从服务器应该为一台独立的名称服务器
主服务器的区域解析库文件中必须有一条NS记录是指向从服务器的
从服务器只需要定义区域, 不需要提供解析库文件
主服务器需要仅允许从服务器做区域传送
主从服务器的时间应该得到同步
bind程序的版本应该保持一致, 即使不一样, 也需要保证从服务器的版本高于主服务器.
定义从服务器的方法上面也说明的挺详细了. 这就是正向解析从服务器的建立啦.
反向解析 上面都铺垫这么多了, 我们就直接进行zone的编辑就好了! 其实超乎想象的快:
1 2 3 4 5 zone "56.168.192.in-addr.arpa" IN { type slave; masters { 192.168.56.101; }; file "slaves/56.168.192.in-addr.arpa.zone" ; };
哦对了, 这里的示例记录也和Part1是不一样的.
接下来, check一下:
1 2 [root@WWW slaves] [root@WWW slaves]
OK!万事俱备, 只差reload啦.
1 2 3 4 5 6 7 8 9 [root@WWW slaves] server reload successful [root@WWW slaves] Sep 10 02:51:10 WWW named[10333]: client 192.168.56.101 Sep 10 02:51:10 WWW named[10333]: zone 56.168.192.in-addr.arpa/IN: Transfer started. Sep 10 02:51:10 WWW named[10333]: transfer of '56.168.192.in-addr.arpa/IN' from 192.168.56.101 Sep 10 02:51:10 WWW named[10333]: zone 56.168.192.in-addr.arpa/IN: transferred serial 2017090101 Sep 10 02:51:10 WWW named[10333]: transfer of '56.168.192.in-addr.arpa/IN' from 192.168.56.101 Sep 10 02:51:10 WWW named[10333]: zone 56.168.192.in-addr.arpa/IN: sending notifies (serial 2017090101)
这样就完成了. 同理 如果我们改变了主服务器上的记录, 从服务器也会被通知来改变.
RNDC 来说说RNDC吧. 这个小东西管理named通过连接一个套接字来实现. 这是客户端的情况 而服务器端是通过监听在953/tcp端口的. 可以这么理解 rndc客户端(A主机)会去连接rndc服务端(B主机 953/tcp)来进行管理. 但是这样十分的不安全 所以你可以理解成这个A主机和B主机是一台主机. rndc只允许连接自己.
那么这个rndc到底除了reload还有什么能力呢? 直接rndc -help
我们可以得到很多子命令.
Usage: rndc
1 [-b address][-c config][-s server][-p port][-k key-file ] [-y key] [-V] command
由于一般不会特别需要指定server port key-file什么的, 所以我们就直接专注于command就好.
COMMAND:
reload : 重新载入主配置文件和区域解析库文件
retransfer : 手动触发zone传送, 不看serial number
notify : 对区域传送发送通知
reconfig : 重载主配置文件
querylog : 开启/关闭查询日志
trace [LEVEL] : 开启DEBUG, 后面用0-5来表示等级, 不添加LEVEL只递增等级VEL]**: 开启DEBUG, 后面用0-5来表示等级, 不添加LEVEL只递增等级