DNS Server Essentials
    DNS服务器的架设我个人感觉是从事linux运维工作中的重点、难点、更是linux网络服务工作的基础,所以我打算分两节给大家讲。本节以DNS的基础知识介绍为主,下节以DNS的高级应用为主。

     DNS,(domain name system)域名解析服务系统,这是一种工作在应用层的协议就是将我们熟知的域名(eg:www.sina.com)转换为大家不太易记的ip地址或在某些领域将ip地址转换成域名(在我们的邮件服务器中用到这种反向的解析)。方便人们的网络生活。DNS 是由美国伯克利大学研制,官方站点:http://www.isc.org
     DNS 是一种分层方式管理主机名称对应ip地址的的系统,在进行我们架设DNS之前我们需要了解域名系统中常用的FQDN host name ip的查询流程 正解与反解 zone 以及合法的授权DNS主机。
    
    1 DNS的概述
      1.1 /etc/hosts的历史
         我们人类记忆32位转换0~255数字组成的ip地址是很不易的,所以在早期为了我们方便使用,将我们常用的域名和其对应的ip地址存放在这个文件下。这样ip的搜索速度就会很快。(这里强调一下,在私网内部,最好将所有常用的ip地址写入/etc/hosts文件中。)
      1.2 DNS 的历史
         在我们早期的计算机数量比较少,可以全部靠/etc/hosts文件来给我们解域名但是随着计算机的快速发展,为了实现大规模ip和域名的同步,DNS就诞生了。我们的客户端在寻找本地/etc/hosts的不到结果的时候就会利用本地的dns服务器来进行域名解析服务。
      1.3 FQDN(fully qualified domain name)
          FQDN 是一种名称,eg:www.sina.com 。FQDN 包含了 Domain Name和Hostname,也就是说FQDN是由域名和主机名共同组成的。这里的域名标示了这台主机所处的域,主机名标示了在这个域中的这台主机,举个例子:希望小学(school)3年(3grade)2班(2class)有一个学生叫redhat希望小学school3年(3grade)4班(4class)也有一个学生叫redhat,我们是通过redhat.2class.3grade.school和redhat.4class.3grade.school来区分这两个不同的学生的。这里的redhat.4class.2grade.school是就是FQDN 而redhat 是主机名 .4class.grade.school是域名。
   2 DNS 的查询过程
    2.1 DNS 系统的架构 如图:


      最上方是一定是一个root的DNS主机(全球13台,日本一台,欧洲一台,剩下都在美国),这是一个根域。在它下面有com cn org edu gov net mil,这一层也被叫做一级域(顶级域)eg:.cn表示中国 .tw 台湾,这里面再次强掉DNS系统是分层次管理的 .com只记录其下一层的2个域名主机。至于apple.com下的bbs.apple.com,.com是不清楚的也是管理不到的,也就是说每个上层的dns主机所记录的信息其实只是下一层主机名称而已,至于在再下一层,则直接授权给下层的某台主机来管理。
   2.2  DNS 的搜索流程:
        本地主机应用DNS系统来进行域名解析时的搜索方法分为两类:递归搜索,迭代搜索递归搜索:也就是说只要我们的客户端发出一条请求,就会直接得到结果,而迭代搜索,则是客户端发出一条请求之后,返回的是一个参考答案。下面我给大家详细介绍DNS搜索流程:
      本地客户端client 输入
http://www.isc.org 后,client就会根据本机/etc/resolv.conf中定义的本地DNS服务器ip(这里我们使用server来表示,不过注意的是,我们dns服务器的ip地址一定是一个静态的ip地址,否则client很可能会找不到server)进行联机查询。
         1.首先client到自己的/etc/hosts文件下查看输入的FQDN对应的ip地址是否存在
         2.如果client的本地/etc/hosts文件不存在这条记录,就会到server上提出请求,server首先会看自己的dns缓存中和自己的数据记录文件中是否存在这条记录。
         3.如果server中也不存在这条记录就会向根(root .)查询,全球13台服务器中就会有一台根据你给的
http://www.isc.orgFQDN发现 .org是其管辖的主机,就会告诉server说:“我不知道http://www.isc.org,但是,你可以去问.org,"同时把管理.org的DNS主机ip传给你。
         4,。server根据上一步从根域得到的.org DNS主机的ip,向.org发出请求,.org一看域名说:”http://www.isc.org,我不知道,不过你可以去问.isc.org",并把.isc的主机ip发给server。
         5, server根据给的ip向.isc.org域内的DNS主机发出请求,该域的一台主机一看域名知道自己区域中有一台主机的名称是
www.isc.org,就把该主机对应的ip地址返回给server,server首先会在自己的dns缓存中存下这个记录。并把www.isc.org的ip地址返回给client。一般来说dns缓存中的文件在1天之内从没有再次被访问,就会失效。
         我们回顾整个过程就会发现,从client到最后。client对server这一段的查询属于递归而server对根 .org .isc.org的查询是迭代。
     2.3 DNS使用的端口号
      我们dns是用的是tcp udp 53号端口,其中udp 53是用来DNS查询的时候用到的,而tcp 53号主要是用来主从服务器数据的同步或第一次查询结果不完整第二次dns查询时用到的,大家知道udp的传输速率是很快的,而tcp的传输速率慢但是结果精准。
   3 正解与反解的zone意义
     有域名查ip为正解,而从ip查域名是反解
     在正解中,只要我们的域名是相同的,我们根据域名来划分zone 我们是可以将不同的ip网段写在一个域内。  而反解中,我们必须以一段ip地址来划分不同的zone ,不过这里我想说的是,假如我想自己设置一个域名名称,并去外面的isp供应商申请一个合法的名字来架设我的dns,从此别人就可以通过我的dns正向查询我的主机ip,但是如果别人想通过我的ip的到我的主机名称,我就必须请管理我主机所在域的上层dns管理员来设置
     zone,一个正向解析和反向解析的设置就是一个zone,而定义zone的文件是/etc/named.conf这个文件中,不过这个文件在我们装完bind(这是dns服务器所要安装的软件)后,默认是没有的。我们需要自己去手动的写,不过要想让我们的dns工作起来,这个文件中不仅要包含zone 还要有option 在定义zone的时候不能只仅仅定义正向zone或方向zone,还要有 根zone localhost的正、反向设置。,这里不细说,在下面的操作中会给大家讲明白。
   4 配置DNS所要用到的软件
     1 bind-utils 这是客户端使用到的一些工具命令,dig nslookup
     2 bind-9.3.3-7.el5.i386.rpm 这个是我们的主程序包
     3 bind-chroot 这是redhat官方为了加强linux DNS的安全,提供的一种安装包,装了之后我们原本在/etc 或/var/named/ 目录下的文件会跑到/etc/named/chroot/这个目录中,就相当于提供了一个沙箱,即便我们的dns服务器被攻破也不会影响我们的linux的系统安全。不过这里为了大家明白我
就不安装这个包了。

    下面是详细的解说操作:
     我们打算在我自己的linux主机中安装DNS服务,所要解析的域是ayu.com 并在yayu.com中设置对
www.yayu.com mail1.yayu.com ftp.yayu.com pop3.yayu.com 主机的解析功能

     ]#yum install bind    这里我使用yum安装,如果大家对yum不理解可以看我的blog,有介绍。 bind在我们安装完之后会给我们提供一个rndc(remote name domain controlle)的工具,rndc默认是以密钥的形式来验证我们对DNS服务器的管理权限,所以先做好rndc,对我们以后的管理很有帮助
     ]#rndc-confgen > /etc/rndc.conf
     ]#cat /etc/rndc.conf
      # Start of rndc.conf
      key "rndckey" {
     algorithm hmac-md5;
     secret "HmZJ64GjeG6i12fs/n7lbw==";
      };

      options {
     default-key "rndckey";
     default-server 127.0.0.1;
     default-port 953;
      };
      # End of rndc.conf

      # Use with the following in named.conf, adjusting the allow list as needed:
      # key "rndckey" {
      #  algorithm hmac-md5;
      #  secret "HmZJ64GjeG6i12fs/n7lbw==";
      # };
      #
      # controls {
      #  inet 127.0.0.1 port 953
      #   allow { 127.0.0.1; } keys { "rndckey"; };
      # };
      # End of named.conf
              将我表示为红色的部分去掉前面的#和#号后面根的一个空格放到/etc/named.conf 文件中。至此rndc配置好了
    etc]#vim named.conf

      options 这是一个全局配置选项 directory中定义了记录文件存放的位置 version 定义了我们dns当前的DNS服务器软件bind的版本,这里我是故意写成这样,以防******我们DNS时根据bind的版本找漏洞。
      zone "." 是定义了一个根域 type 是hints 。 file 定义了对应于我们这个根域所在的记录文件下面的zone 就是定义了不同的域,有的类型是master  master表示我们这个是一个主服务器对应的域,hints 表示是根域 slaves 表示从域名。
    ]#cd /var/named
    ]#vim name.ca  这里定义了我们全球13台根域名服务器
 A.ROOT-SERVERS.NET.     3600000 IN      A       198.41.0.4
 A.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:503:ba3e::2:30
 B.ROOT-SERVERS.NET.     3600000 IN      A       192.228.79.201
 C.ROOT-SERVERS.NET.     3600000 IN      A       192.33.4.12
 D.ROOT-SERVERS.NET.     3600000 IN      A       128.8.10.90
 E.ROOT-SERVERS.NET.     3600000 IN      A       192.203.230.10
 F.ROOT-SERVERS.NET.     3600000 IN      A       192.5.5.241
 F.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:500:2f::f
 G.ROOT-SERVERS.NET.     3600000 IN      A       192.112.36.4
 H.ROOT-SERVERS.NET.     3600000 IN      A       128.63.2.53
 H.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:500:1::803f:235
 I.ROOT-SERVERS.NET.     3600000 IN      A       192.36.148.17
 J.ROOT-SERVERS.NET.     3600000 IN      A       192.58.128.30
 J.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:503:c27::2:30
 K.ROOT-SERVERS.NET.     3600000 IN      A       193.0.14.129
 K.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:7fd::1
 L.ROOT-SERVERS.NET.     3600000 IN      A       199.7.83.42
 M.ROOT-SERVERS.NET.     3600000 IN      A       202.12.27.33
 M.ROOT-SERVERS.NET.     3600000 IN      AAAA    2001:dc3::35
   named]#vim localhost.zone
 $TTL    86400
@               IN SOA  localhost.     root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum

                IN NS           localhost.
                IN A            127.0.0.1
                IN AAAA         ::1
    这里的内容我先不解释,到下面再说   
   named]#vim named.local
  $TTL    86400
@       IN      SOA     localhost. root.localhost.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
        IN      NS      localhost.
1       IN      PTR     localhost.
    这里的内容我先不解释,到下面再说
   named]#vim yayu.com.zone
  1 $TTL 86400
  2 $ORIGIN yayu.com.
  3 @     IN    SOA  linux.yayu.com. admin.yayu.com. (
  4                2011112306  ;
  5                  3H        ;
  6                 15M        ;
  7                  1W        ;
  8                  1D        ;
  9                   )
 10       IN    NS    linux
 11       IN    NS    mysql
 12       IN    MX 10 mail1
 13       IN    MX 20 mail2
 14 linux IN    A     192.168.106.3
 15 mysql IN    A     192.168.106.4
 16 www   IN    A     192.168.106.3
 17 www   IN    A     192.168.106.6
 18 mail2 IN    A     192.168.106.4
 19 mail1 IN    A     192.168.106.3
 20 ftp   IN    A     172.16.4.2

    
   这里我给大家详细说说这个文件yayu.com.zone ,首先yayu.com.zone 是对应我们前面/etc/named.conf中的zone “yayu.com” 的 至于说localhost.zone 和 named.local 和这个yayu.com.zone的机理是一样的。 1 2行使定义了两个宏,专门用来声明用的,1行表示 外部DNS查到我这个DNS服务一条记录的时候会存放在对方的缓存中多长时间。2行,这个值可以重新指定,通常这个不会用到,默认情况下正反解记录文件的zone是由/etc/named.conf所定的,3行@ 代表zone 在/etc/named.conf中定义zone为yayu.com,所以这里的@就表示yayu.com 。( .)表示这是一个完整的主机名称FQDN 例如你在写一个主机名称www时,那台主机的FQDN就是"
www.yayu.com." 如果你写FQDN时没有添加.那么主机的FQDN就是“www.yayu.com.yayu.com.”也就是说zone会自动将主机名加上的。SOA 其实授权记录  linux.yayu.com.是本DNS服务器的主机名称admin.hotmail.com.是主机的邮箱地址,本来的@用.表示  2011112306是一个序列号,用来标示记录的,记录每修改一次就加1,并通知从服务器来跟新数据 。3H表示从服务器每隔3小时来主服务器主动刷新一次,15M表示第一次主动更新记录没有成功,重新更新的时间间隔,1W表示如果从服务器1周内不能连接到主服务器,从服务器也会down掉的时间间隔,注意一般我们的主服务器down掉从服务器就会立刻顶上,只不过我们的从服务器只能工作我们这里所定的1W时间,1D表示无效的记录缓存时间,也就是说假如一条记录本地服务器无法解析,就会在1D的时间内任何主机在向我询问该记录时,我都不理睬。 NS 后面跟的是主机名也就是DNS服务器的名称。 A是正向解析记录  MX是 定义mail服务器名称。

          IN    NS    linux  这里前面空白的地方表示@这里可以省去,linux没有加.这里会自动补全为linux.yayu.com ,所以这条记录表示对于yayu.com 域中有一台DNS服务器名称是:linux.yayu.com,注意一个域可以对应对个DNS服务器,但是必须要对每个DNS服务器做自我解析。所以下面的linux  IN    A     192.168.106.3 就表示 linux.yayu.com 的IP 地址是192.168.106.3 ,我们这里有两台DNS服务器,两台邮件服务器,并在yayu.com这个域中定义了www.yayu.com  ftp.yayu.com  主机的A记录


 
  好了。到这里我们的dns正向解析已经做完了,
  ]#service named start  启动服务了
 
  至于DNS的子域分配,智能DNS解析,主从DNS服务,我们下一节在讲!说实话DNS服务包罗万象,不是我一两句所能讲好的,欢迎大家留言,希望和大家一起讨论。一起进步!