创建DNS服务器

  • 环境:centOS6.1虚拟机

    [zhang@server ~]$ cat /etc/centos-release
    CentOS release 6.10 (Final)
    
  • 原理:
    域名是分等级的,最上面是 “.”根域(全球共有13个根域服务器)
    根下面是顶级域名(一级域名),像组织域,比如“com、edu”等
    以及国家域比如“cn、tw”等;
    再下面是二级域名,依次往下推。不过一般到三级都成了主机名了。

    主机都会配置dns服务器(下面暂称为直接dns服务器)。解析的时候,比如www.baidu.com,直接dns服务器先查看自己缓存中是否有该域名对应的ip,没有的话,dns服务器会直接向根dns服务器发起查询请求,根服务器也没有该域名的ip,但是它保存有一级dns服务器的ip,它会将一级dns服务器的ip地址告知直接dns服务器,然后该服务器再向一级dns服务器发起请求查询,这样逐级往下查,当查到com域的dns服务器时,它保存了www.baidu.com域名的ip地址,然后它告知了直接dns服务器。直接dns服务器拿到后先缓存起来,然后告知查询的主机。

    从上面可以看出,每个dns服务器只保存它域内的机器的ip地址(每个域对应一个网段),它并不保存它上面和域外面的主机的ip的记录。我们创建自己dns服务器的目的,就是要管理记录我们自己的域内的主机,以便域外部的其它主机访问。(当然域名还是要买的)

    主机向直接dns服务器查询,只查询了一次,其它由dns代劳,这样的称为“递归查询”,直接dns服务器先向根dns服务器,然后又向一级域名dns服务器,然后依次查询下去,这样多次查询称为“迭代查询”。

    递归:客户端只发一次请求,要求对方给出最终结果。

    迭代:客户端发出一次请求,对方如果没有授权回答,它就会返回一个能解答这个查询的其它名称服务器列表,客户端会再向返回的列表中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。

    授权回答:向dns服务器查询一个域名,刚好这个域名是本服务器负责,返回的结果就是授权回答。

    环境如下:
    客户端-----本地dns服务端----外网
    从递归和迭代查询可以看出:
    客户端-本地dns服务端:这部分属于递归查询。
    本地dns服务端---外网:这部分属于迭代查询。

    一般情况下,dns client发送的请求,都是属于递归查询请求。

    横向的话,dns服务器还可以分为主服务器(主从服务器都不是绝对的,一个主服务器也可是是其他主服务器的区域的从服务器)、从服务器、缓存服务器、转发器(代理服务器)

  • 步骤
    1 关闭selinux:

    [zhang@server ~]$ getenforce
    Enforcing
    [zhang@server ~]$ sudo setenforce 0
    [zhang@server ~]$ getenforce
    Permissive
    

    永久关闭的话:
    vim /etc/selinux/config,将里面的“SELINUX=enforcing”修改为“SELINUX=disabled”

    2 关闭防火墙(不关闭的话,也可以设置策略):
    关闭防火墙服务 sudo service iptables stop
    关闭开机启用防火墙设置

    [zhang@server ~]$ sudo chkconfig --list iptables
    iptables        0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
    [zhang@server ~]$ sudo chkconfig iptables off
    [zhang@server ~]$ sudo chkconfig --list iptables
    iptables        0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
    

    3 安装bind软件包(dns服务的软件包):
      yum install bind -y

    4 查看其安装文件列表(确定其可执行文件和配置文件)
      rpm -ql bind

    5 配置文件、程序文件

    文件 位置
    脚本程序文件 /etc/named
    rndc配置文件 /etc/rndc.conf(rndc:remote name domain control)
    检测/etc/named.conf文件语法 /usr/sbin/named-checkconf
    检测zone和对应zone文件的语法 /usr/sbin/named-checkzone
    远程dns管理工具 /usr/sbin/rndc
    生成rndc密钥 /usr/sbin/rndc-confgen
    主配置文件 /etc/named.conf
    区域配置文件 /etc/named.rfc1912.zones
    zone文件的默认路径 /var/named

    ①、主配置文件/etc/name.conf

      [zhang@server 桌面]$ sudo cat /etc/named.conf
    //
    // named.conf
    //
    // Provided by Red Hat bind package to configure the ISC BIND   named(8) DNS
    // server as a caching only nameserver (as a localhost DNS resolver   only).
    //
    // See /usr/share/doc/bind*/sample/ for example named configuration   files.
    //
    
    options {
          listen-on port 53 { 127.0.0.1; };//类似套接字socket(ip+端口)的意思,监听该地址的网卡的53号端口,如果机器有多个网卡的话,可在分号后面继续添加,any表示监听所以网卡接进来的请求。
          listen-on-v6 port 53 { ::1; };//同上,只不过网卡的地址是ipv6
          directory       "/var/named";//默认的区域(zone)数据文件的保存基目录
          dump-file       "/var/named/data/cache_dump.db";
          statistics-file "/var/named/data/named_stats.txt";
          memstatistics-file "/var/named/data/named_mem_stats.txt";
          allow-query     { localhost; };//接受哪些主机或网段内的机器发送dns请求
          recursion yes;//是否递归查询
    
          dnssec-enable yes;// dns安全扩展,可以改为no关闭
          dnssec-validation yes;//可以改为no关闭
    
          /* Path to ISC DLV key */
          bindkeys-file "/etc/named.iscdlv.key";
    
          managed-keys-directory "/var/named/dynamic";
    };
    
    logging {
          channel default_debug {
                  file "data/named.run";
                  severity dynamic;
          };
    };
    
    zone "." IN {//区域信息配置,zone后面跟的是待解析的域,比如“baidu.com”等, . 表示根域
          type hint;//区域类型,hint表根域,master表示主服务器,即本机负责该域名内的主机解析,slave表示从服务器,表示该机也是dns服务器,但是是从服务器,资源记录从另外一台主dns服务器传递而来
          file "named.ca";//表示区域数据文件名,结合上面的基目录,即该文件是在“/var/named/named.ca”,该文件保存了全球13个根服务器的资源记录,是安装服务时,自动创建的。其他的区域数据文件,需要自己在该文件夹中手动创建。
    };
    
    include "/etc/named.rfc1912.zones";//表示引入该文件中的配置,其实该文件中也是保存的一些区域配置的列表,可以不引入,像上面的zone一样,一个个直接写在该文件中也可以。
    include "/etc/named.root.key";
    

    其实,完全可以将该文件备份,自己手动创建一个,下面写个最简单的named.conf文件

    options {
           directory       "/var/named";//默认的区域数据文件的保存基目录
    }
    zone "lingfu.com"  IN {
            type master;//表示是该dns服务器为其解析该域的主服务器
            file "lingfu.com.zone";//保存资源记录的文件的名称
    }
    zone "1.168.192.in-addr.arpa" IN {//反向域,域的名称是将网段到过来写,然后后面跟随“.in-addr.arpa”,反向域解析是将ip地址解析为域名
             type master;
             file "192.168.1.zone"
    }
    

    这就是最简单的配置方法,没有的配置项会采用默认值。
    下面再介绍几个配置项,named.conf文件,

    options {
           directory       "/var/named";//默认的区域数据文件的保存基目录
           allow-query { 192.168.0.0/24;192.168.1.20; };只允许这个网段和这个地址查询
           recursion yes; // yes|no|off 是否允许客户递归查询,因为dns服务器保存有其域内主机的ip,所以查询域内主机ip的时候不需要通过上级dns一级一级查询;(允许递归就是别人请求你,你好人做到底,一定帮别人拿到答案,而不是让别人去自己一级一级找答案。通常设置为只为自己域内主机递归)
           该值如果是yes,并且一个DNS询问要求递归,那么服务器将会做所有能够回答查询请求的工作。如果recursion是off的,并且服务器不知道答案,它将会返回一个推荐(referral)响应。默认值是yes。注意把recursion设为no,不会阻止用户从服务器的缓存中得到数据,它仅仅阻止新数据作为查询的结果被缓存。服务器的内部操作还是可以影响本地的缓存内容,如NOTIFY地址查询。
           notify yes;//表示版本更新时(有新纪录添加时),会给区域中的所有服务器(区域的掌管者,即主从服务器)发送版本更新通知(但从服务器的真正版本更新,是从服务器向主服务器发送传递请求)。信息更新分为“全量传递”和“增量传递”,刚创建的从服务器,区域数据文件内容是空的,从主服务器传递资源记录是全量传递;主服务器资源记录有新增或修改内容时,更新版本,从服务器只从主服务器传递新增信息就是“增量传递”
    }
    zone "lingfu.com"  IN {
            type master;// master|slave|hint|forword,master表示是该dns服务器为其解析该域的主服务器,slave表示是从服务器,该区域的资源记录需要从指定的master服务器上传递,hint表示根域,forword表示转发域(把客户机的对该域的查询请求转发给指定的其他dns服务器,通常指定给该域的管理dns服务器)
            file "lingfu.com.zone";//保存资源记录的文件的名称
            allow-transfer {192.168.0.3;};//表示允许哪台从服务器从该服务器传递该域的资源记录,none表示不允许任何其他从服务器从此传递。
    }
    zone "wuai.com"  IN {
            type slave;// slave表示是从服务器,该区域的资源记录需要从主服务器传递过来
            master {192.168.0.4;};//指定主服务器
            file "slaves/wuai.com.zone";//保存资源记录的文件的名称为/var/named/slaves/wuai.com.zone
            allow-transfer {none;};表示不允许其他任何从服务器从此传递资源记录
    }
    

    ②、/var/named
    这是个文件夹,里面保存的是跟/etc/named.conf文件中zone项目中指定的区域数据文件(文件里面保存的称为资源记录:RR)

      [zhang@server 桌面]$ sudo ls -l /var/named
      总用量 28
      drwxrwx---. 2 named named 4096 6月  19 2019 data
      drwxrwx---. 2 named named 4096 6月  19 2019 dynamic
      -rw-r-----. 1 root  named 3289 4月  11 2017 named.ca
      -rw-r-----. 1 root  named  152 12月 15 2009 named.empty
      -rw-r-----. 1 root  named  152 6月  21 2007 named.localhost
      -rw-r-----. 1 root  named  168 12月 15 2009 named.loopback
      drwxrwx---. 2 named named 4096 6月  19 2019 slaves
    

      这是程序自带的一些区域数据文件,其中name.ca是根域的记录,named.loacalhost和named.loopback是本机(localhost)的记录,一个是正向域数据文件,一个是反向域数据文件。正向、反向域数据文件是分开写的。slaves是一个文件夹,当dns服务器作为从服务器时,从主服务器传递过来的数据一般设置保存在该文件夹内。
      注意,留意这里面的文件的权限和属主以及属主。自己创建新的区域数据文件也应当保持相同的权限。

      [zhang@server 桌面]$ sudo cat /var/named/named.localhost
      $TTL 1D //用宏定义一个TTL默认值为1天,下面数据直接引用此值.
      @       IN SOA  @ rname.invalid. (
                                              0       ; serial 版本号,每更新一版+1
                                              1D      ; refresh 更新时间
                                              1H      ; retry 重试时间
                                              1W      ; expire 过期时间
                                              3H )    ; minimum 否定答案的TTL值
                 NS      @
                 A       127.0.0.1
                 AAAA    ::1
    

    拿第一条资源记录来简单解释一下这个文件(此条记录从“@”开始到“: minium”结束),分号后面表示注释

    含义
    @ named字段,@为简写,表示默认域,可用于引用当前区域的名字(/etc/named.conf的‘zone’中定义的本域名),其后应该跟ttl项的,但因为前面已经定义了,算是全局继承。另外在写其他记录时,可以写FQDN(全限定域名),但最后一定要跟一个点,比如www.biadu.com.,也可以直接写主机名www。
    IN internet,表示将该记录标志为一个Internet DNS资源记录
    SOA type字段,记录类型
    @.... value字段

    注:这里的“ NS @”、“A 127.0.0.1”、“AAAA ::1”分别是第二条、第三条、第四条记录,之所以直接从记录类型开始,表示前面空的列值直接继承上一条记录的。

    named字段值 含义
    . 根域以” . “结束,并且只有一个,没有上级域。而在Internet中,根域一般不需要表现出来。
    @ 默认域,文件使用$ORIGIN domain 来说明默认域。紧跟其后的记录,其值后面可默认跟上该域
    ttl 全称”Time to Live “,以秒为单位记录该资源记录中存放高速缓存中的时间长度。通常此处设为空,表示采用SOA的最小ttl值。
    IN internet,表示将该记录标志为一个Internet DNS资源记录

    下面说一下记录类型:

    类型 含义
    SOA记录 Start Of Authority一个授权区的开始,配置文件的第一个记录必须是SOA的开始,并设定了了记录的版本号,刷新时间间隔等配置。会值内会有两个主机域名,前一个指定本域的主NS服务器(因为一个区域内,除了主服务器还有其它的从服务器),后一个指定管理者邮箱(因为@有特殊作用,所以邮箱中的“@”,用“.”代替)。
    NS记录 记录说明了在众多记录里哪一台才是名称服务器(无论主或从服务器都是该类型),其值一般是服务器域名,所以其后面还要跟一个正向解析该服务器ip地址的A记录,所以要成对出现。(一个域记录中之所以有NS记录,其作用一是标记哪些是ns服务器,另外还能用来在主从服务器同步同步记录时,作为向哪些机器发送通知信息的依据
    MX记录 Mail eXchanger,邮件交换器,其值内会有一个0-99之间的数字表示其在所有邮箱服务器中的优先级。另外同NS一样,还要有一条A记录,解析其ip地址,所以也是成对出现。邮件交换记录可将该域下所有邮件服务器 指向自己的邮件服务器,只需在线填写服务器的IP地址
    CNAME记录 Canonical NAME 别名记录,可允许多个名字映射到同一计算机,通常用于同时提供Web和邮件服务器的计算机。
    A记录 主机名对应的IP地址记录,用户可将该域名下网站服务器指向自己的Web服务器,同时也可设置域名的二级域名。值为ipv4地址。
    AAAA记录 主机名对应的IP地址记录,值为ipv6地址。
    PTR记录 用于地址到主机名的映射,反向映射。(区域数据文件分正向反向文件,反向映射记录在不同的文件里)
    HINFO记录 由一组描述主机的信息文件组成,通常包括硬件名称和操作系统名称。

    手动创建一个区域数据文件

     [root@server named]# cat lingfu.com.zone
     $TTL 1D
     @       IN SOA  nscp.lingfu.com         wal.lingfu.com. (;指定主ns服务器和管理者邮箱
                                             20200317        ; serial版本号
                                             2D      ; refresh
                                             1H      ; retry
                                             1W      ; expire
                                             3H )    ; minimum
             IN      NS              nscp    ;主ns服务器
             IN      NS              nscp2   ;从ns服务器
             IN      MX      10      mail
     nscp    IN      A               192.168.0.1     ;主ns服务器
     nscp2   IN      A               192.168.0.2     ;从ns服务器
     mail    IN      A               192.168.0.3
     wal     IN      A               192.168.0.10
     law     IN      A               192.168.0.11
     ssss    IN      CNAME           ysys
     ysys.lingfu.com.        IN      A       192.168.0.99
     *.lingfu.com.   IN      A       192.168.0.5  ;泛域名
    

    测试检查配置文件错误的工具:nslookup、dig、named-checkzone、host、named-checkconf及dlint。

  • 启动服务:
    配置完成后,启动服务(并设置开机启动)
    service named start
    chkconfig named on

  • 修改网络dns,测试dns服务器。
    修改/etc/resolv.conf :修改后可即时生效,启动同样有效
    或修改/etc/sysconfig/network-scripts/ifcfg-eth修改指定网卡的dns(添加项,dns1、dns2等,需要重启网络生效)

  • 参考文章

你可能感兴趣的:(创建DNS服务器)