操作环境 Redhat 5.8虚拟机
一.DNS的由来
   1. 人脑总是不如计算机的,人们对文字的记忆力要比对数字的记忆力高很多。因此一个名为 DNS 的服务,帮我们将主机名解析为IP地址, 例如我们输入www.baidu.com就可以访问这个网站了,而不用费力取记住IP地址
  2.  早期人们用/etc/hosts 这个文件来将主机名解析为IP地址,但是当网络上的主机越来越多,主机名与 IP 的对应无法在所有的计算机内更 新, 另外要将主机名加入该文件内仅能向 INTERNIC 注册,若 IP 数量太多时,该文件会很大,也就不利于其他主机同步了。客户端计算机每次都 得要重新下载一次文件才能顺利联网。
  3. 为了解决这个严重的问题,柏克莱大学发展出管理主机名对应 IP 的系统, 我们称它 为BIND (Berkeley Internet Name Domain),这个系统可以轻松的进行维护的工作~太棒了!这也是目前全世界使用最广泛 的领域名系统 DNS(Domain Name System) 通过DNS ,我们不需要知道主机的 IP ,只要知道该主机的名称,就能够轻易的连上 该主机了。
二. DNS的组织结构  
1.如图

   2.常见的顶级域
.com:商业机构,任何人都可以注册
.edu:教育机构
.gov:政府部门
.int:国际组织
.mil:军事部门
.net:网络组织
.org:非盈利组织,任何人都可以注册
.info:网络信息服务组织
.au:  澳大利亚
.ca :  加拿大
.cn:   中国
.tw:   中国台湾
.hk:  中国香港
.in:  印度
.jp:  日本
 
 
三. DNS的查询过程
例:
1. client去找本地DNS,去问www.163.com的ip地址,如果本地DNS的缓存有www.163.com对应的ip地址,直接返回给client
 
2.如果没有缓存:
   @1. 本地DNS去找根域服务器,问www.163.com的ip地址,根域服务器不知道,但是知道com的ip地址,返回给本地DNS。
   @2. 本地DNS去找com域服务器,问www.163.com的ip地址;
   @3. com域服务器不知道,但是知道163.com的ip地址,返回给本地DNS
   @4. 本地DNS去找163.com域服务器,问www.163.com的ip地址;
   @5. 63.com域服务器知道www.163.com的ip地址;返回给本地DNS
   @6.本地DNS把查询到的结果返回给client,并缓存下来,供其他的
 
3.查询方式
 client去本地DNS直接拿到想要的结果,这种查询方式递归查询。 本地DNS去找根域、com域、163.com域查询的过程是迭代查询。
 
四.DNS的正向解析
 1.装包
[root@tx1 ~]# yum install bind bind-chroot -y   //dns需要的包bind bind-chroot
 
2.与dns相关的内容
[root@tx1 ~]# rpm -ql bind ; rpm -ql bind-chroot
/etc/logrotate.d/named    DNS日志轮滚配置文件
/etc/rc.d/init.d/named     DNS启动脚本
/usr/sbin/dns-keygen         
/usr/sbin/named-checkconf   检查主配置文件语法正不正确
/usr/sbin/named-checkzone   检查区域配置文件语法正不正确
/usr/share/doc/bind-9.3.6/sample   
/var/named/chroot    安全措施,把DNS 服务器禁锢在这里
 
3.具体配置
@1
[root@tx1 ~]# cd /var/named/chroot/          //  /var/named/chroot/ 这是一个伪目录,相当于一个虚拟的根,为了提高安全性
[root@tx1 chroot]# ls
dev  etc  var
[root@tx1 chroot]# cd etc
[root@tx1 etc]# ls
localtime  rndc.key      这里没有name.conf 这个文件,我们手动拷贝一份
[root@tx1 etc]# rpm -ql bind
[root@tx1 etc]#  cp /usr/share/doc/bind-9.3.6/sample/etc/named.conf  ./named.conf   //不会写可以找模板
编辑named.conf这个文件,把文件里面多余的东西删除了,然后我们来编辑
[root@tx1 etc]# vim named.conf
zone "." IN{
     type hint;     //表示这个区域内的高速缓存的域名服器
     file "named.root";
};
由于本人在虚拟机里做实验,所以这几行没有加
[root@tx1 etc]# vim named.conf
options
{
        listen-on port 53 {any;};     //any表示监听所有客户端发来的信息 
        directory "/var/named";    //  /--> /var/named/chroot 保存区域配置文件
        dump-file               "data/cache_dump.db";  
        statistics-file         "data/named_stats.txt";   
        memstatistics-file      "data/named_mem_stats.txt";  
        allow-query     {any;};   //any表示允许所有客户端进行dns查询
};
IN 是internet记录
type是类型 主的类型是master,从类型是slave
file是根区域文件
zone "tx.com"  IN{
      type master;
      file "tx.com.zone";
};
 
@2.  写区域配置文件
[root@tx1 ~]# cd /var/named/chroot/var/named/
[root@tx1 named]# rpm -ql bind
[root@tx1 named]# cp /usr/share/doc/bind-9.3.6/sample/var/named/localhost.zone ./tx.com.zone 
//不会写可以找模板
[root@tx1 named]# cat -n tx.com.zone    //先看一下这个文件
     1$TTL86400
     2@IN SOA@       root (
     342; serial (d. adams)
     43H; refresh
     515M; retry
     61W; expiry
     71D ); minimum
     8
     9        IN NS@
    10 IN A127.0.0.1
    11IN AAAA::1
    12
第一行 :TTL是生存期,单位是秒 ,$TTL是全局定义的 
第二行: @表示当前域,IN指internet ,SOA起始授权机构,@取代在/etc/named.conf中指定的域名。 SOA段中的数字,分别为:序列号、刷新、重试、过期、生存期
第三行:序列号用于Slave与Master的更新用
第四行:除了序列号外还可以用它规定多久slave进行一次主动更新
第五行:重试一旦Slave尝试连接Master失败,规定多久尝试下一次连接
第六行:过期如果Slave无法连通Master规定多久后不在尝试连接
第七行:生存期服务器回答 ‘无此域名’ 的间隔时间。
数字的默认单位为秒。否则:W= 周、D= 日、H= 小时、M= 分钟。
第九行:NS指定域名服务器,NS后面的主机名称必须有IP对应
第十行:指定域名对应的IP
 
@3.下面我们来写自己的ZONE文件
$TTL    86400
@               IN SOA  ns.tx.com.  //com后的点千万不要忘记.它代表一个完整的主机名     root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
@               IN NS           ns.tx.com.
ns              IN A            192.168.8.70    //指定DNS服务器的ip
www             IN A            192.168.8.64
tx              IN A            192.168.8.65
[root@tx1 etc]# service named restart
Stopping named:                                            [  OK  ]
Starting named:                                            [  OK  ]
有的时候看到OK,但不一定能成功,所以还要看一下日志文件
[root@tx1 named]# tail -n 20 /var/log/messages | grep named
Feb  6 01:33:01 tx1 named[12350]: starting BIND 9.3.6-P1-RedHat-9.3.6-20.P1.el5 -u named -t /var/named/chroot   
 //这里可知chroot的目录与named启动的参数等数据
Feb  6 01:33:01 tx1 named[12350]: found 1 CPU, using 1 worker thread
Feb  6 01:33:01 tx1 named[12350]: loading configuration from '/etc/named.conf'
 //这里可以知道配置文件是有哪里加载的
Feb  6 01:33:01 tx1 named[12350]: using default UDP/IPv4 port range: [1024, 65535]
Feb  6 01:33:01 tx1 named[12350]: listening on IPv4 interface lo, 127.0.0.1#53
Feb  6 01:33:01 tx1 named[12350]: listening on IPv4 interface eth0, 192.168.8.70#53
Feb  6 01:33:01 tx1 named[12350]: command channel listening on 127.0.0.1#953
//可以知道有哪几个接口提供DNS的相关服务
Feb  6 01:33:01 tx1 named[12350]: zone tx.com/IN: loaded serial 42
Feb  6 01:33:01 tx1 named[12350]: running
//loaded serial的数据,这里不能出错
 
@4.客户端测试
[root@tx2 ~]# cat /etc/resolv.conf 
search uplooking.com
nameserver 192.168.8.70
[root@tx2 ~]# nslookup www.tx.com
Server:192.168.8.70
Address:192.168.8.70#53
Name:www.tx.com
Address: 192.168.8.64
 
五.DNS的反向解析
1.在上一个的基础上修改一下
[root@tx1 etc]# vim named.conf
options
{
        listen-on port 53 {any;};
        directory "/var/named";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
zone "tx.com" IN {
      type master;
      file "tx.com.zone";
};
zone "8.168.192.in-addr.arpa" IN {  //DNS的反解ip要从后往前写然后加上in-addr.arpa表示反解结束
      type master;
      file "192.168.20.zone";
};
[root@tx1 etc]# cd ../var/named/
[root@tx1 named]# ls
data  slaves  tx.com.zone
[root@tx1 named]# vim 192.168.8.zone
$TTL    86400
@               IN SOA  ns.tx.com.       root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
@               IN NS           ns.tx.com.
ns              IN A            192.168.8.70
65              IN PTR           www.tx.com.
 
2.客户端测试
[root@tx2 ~]# nslookup 192.168.8.65
Server:192.168.8.70
Address:192.168.8.70#53
65.8.168.192.in-addr.arpaname =  www.tx.com.
 
六.DNS的主从同步
1.
条件:需要两台 server ,主(192.168.8.70)从(192.168.8.71)。另外要注意这两台机器的时间
优点:
(1)从服务器可以分担主服务器的查询请求
(2)有了从服务器之后,可以快速的响应client的请求
(3)即使主服务器出现问题,从服务器依然可以提供查询服务
原理:
(1)当主服务器做好配置之后,会通知从服务器
(2)从服务器收到通知之后,查询SOA记录查 42  序列号
(3)从服务器去和主服务器比对序列号,如果从的序列号比主的小,那么他就要去和主进行数据同步。因此,主服务器修改完配置文件之后,都要把序列号调大,建议使用日期格式
(4)从服务器向主服务器发起数据请求;主服务器收到请求之后,开始传输数据
2. 具体配置
@1. Server的配置,这里面装包就不再提了
 
[root@tx1 etc]# vim named.conf 
options
{
        listen-on port 53 {any;};
        directory "/var/named";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
zone "tx.com" IN {
      type master;
      file "tx.com.zone";
      allow-transfer {192.168.8.71;};//指定自己的从服务器的ip如果想实现多个从服务器,可以在{}里填写,以;结束
};
[root@tx1 etc]# cd ../var/named/
[root@tx1 named]# vim tx.com.zone 
$TTL    86400
@               IN SOA  ns.tx.com.       root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
@               IN NS           ns.tx.com.
ns              IN A            192.168.8.70
www             IN A            192.168.8.64
//与之前的没有什么变化
 
@2.Slave的配置
[root@tx2 chroot]# vim named.conf
options
{
        listen-on port 53 {any;};
        directory "/var/named/slaves";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
zone "tx.com" IN {
      type slave;    //指定类型为从
      file "tx.com.slave";
      masters  {192.168.8.70; }; //指定主服务器的ip
};
 
@3.启动服务
[root@tx1 named]# service named restart
[root@tx1 ~]# tail -0f /var/log/messages 
[root@tx2 etc]# service named restart
[root@tx2 named]# cd slaves/
[root@tx2 slaves]# ls
tx.com.slave(由DNS服务器同步过来的)
[root@tx1 ~]# tail -0f /var/log/messages 
Apr 13 16:21:58 tx1 named[3195]: client 192.168.8.71#43262: transfer of 'tx.com/IN': AXFR started
Apr 13 16:21:58 tx1 named[3195]: client 192.168.8.71#43262: transfer of 'tx.com/IN': AXFR ended    //日志里面可以看到传输的信息
 
七.DNS的主从加密传输
dnssec-keygen
-a :后面接的 [type] 为演算方式的意思,主要有 RSAMD5, RSA, DSA, DH 
与 HMAC-MD5 等。建议你可以使用常见的 HMAC-MD5 来演算密码; 
-b :你的密码长度为多少?通常给予 512 位的 HMAC-MD5; 
-n :后面接的则是客户端能够更新的类型,主要有底下两种,建议给 HOST 即可: 
ZONE:客户端可以更新任何标志及整个 ZONE;  
HOST:客户端仅可以针对他的主机名来更新
[root@tx1 named]# dnssec-keygen -a hmac-md5 -b 128 -n host txkey
Ktxkey.+157+28539
[root@tx1 named]# ls
chroot  Ktxkey.+157+28539.key      slaves
data    Ktxkey.+157+28539.private
[root@tx1 named]# cat Ktxkey.+157+28539.key 
txkey. IN KEY 512 3 157 kX7RaouImmrvdTFvoFYfxg==   要kX7RaouImmrvdTFvoFYfxg==  //在上一DNS主从同步上做就可以
 
主:
[root@tx1 etc]# vim named.conf 
options
{
        listen-on port 53 {any;};
        directory "/var/named";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
key  txkey {       //在上一个基础上加上这几行
          algorithm hmac-md5;    //algorithm运算法则
           secret "kX7RaouImmrvdTFvoFYfxg== ";
};
zone "tx.com" IN {
      type master;
      file "tx.com.zone";
      allow-transfer {key txkey;};     //这里也改动一下
};
从:
[root@tx2 etc]# vim named.conf 
options
{
        listen-on port 53 {any;};
        directory "/var/named/slaves";
        dump-file               "data/cache_dump.db";
        statistics-file         "data/named_stats.txt";
        memstatistics-file      "data/named_mem_stats.txt";
        allow-query     {any;};
};
key txkey {
       algorithm hmac-md5;
       secret "kX7RaouImmrvdTFvoFYfxg== ";
};
zone "tx.com" IN {
      type slave;   
      file "tx.com.slave";
      masters  { 192.168.8.70 key txkey; };
};
从:
[root@tx2 slaves]# rm -f tx.com.slave 
[root@tx1 named]# service named restart
[root@tx1 ~]# tail -0f /var/log/messages 
从:
[root@tx2 etc]# service named restart
[root@tx2 etc]# cd ../var/named/slaves/
[root@tx2 slaves]# ls
tx.com.slave
[root@tx1 ~]# tail -0f /var/log/messages 
Apr 13 17:08:12 tx1 named[29970]: client 192.168.8.71#36850: transfer of 'tx.com/IN': AXFR started: TSIG txkey
Apr 13 17:08:12 tx1 named[29970]: client 192.168.8.71#36850: transfer of 'tx.com/IN': AXFR ended

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~未完待续~~~~~~~~~~~~~~~~~~~~~~~~~~~~