首页 > 代码库 > DNS and BIND

DNS and BIND

  DNS服务器,为了获取目标IP地址,从而达到目标区域的服务器;DNS服务器可以手动指定IP地址从而将IP地址转化为域名进行访问,也可以通过域名转化为IP地址进行访问;就像我们平常使用的www.baidu.com,就是可以通过域名解析成IP地址进行访问的;那么这类域名是如何找到这个域名所表示的主机呢;我们通过访问域名或IP地址得出对应的IP地址或域名来进行访问,那这些海量的数据都是保存在哪,若都是保存在一个服务器中,这些海量的数据,要通过一个服务器去查找那效率是非常底下且不实用的;所以加州大学的伯克利分校就提出了名称域这一概念;设置一个根域,由根域去管理下属的第一级顶级域,如com,org,edu,gov,mil,net等组织域;cn,tw,hk,jp,iq等地理域;以及反向域in-addr.arpa;这个反向域其实就是原本的根,但为了突出根的独一无二,而把他单独划为一个顶级域,由这些顶级域去管理下属的第二级域空间,第二级域空间去管理第三极域空间,依次往下;

  当客户端想要去访问一个域名,首先就要去查看他所在域空间的服务器中是否有该域名,若没有,则查看该服务器中的缓存信息;若还是没有,服务器需要向客户端递归传回无法提供的信息;不管结果如何都要向客户端给一个“交代”;当当前域的服务器无法满足客户端要求时,服务器会直接把客户端的要求发向根域,由根域进行查找,根域会通过域名尾部的顶级域判断该域名的顶级域是什么,再传给该顶级域;如百度的顶级域为com,则传给第一级顶级域com,com再去查找下属的域名,查找到baidu这个域名后,再去查找baidu这个域名下的www主机,当找到后,将信息回馈给客户端;这种返回给根域的查询方式叫做迭代;客户端发出请求后能够收到的只有两种结果,一种是肯定的结果,能够按客户端的请求给出正确的名称解析;第二种是否定答案,无法根据客户端的请求作出回应;

  DNS服务器分类有两种,一种是至少负责一个域的数据库,当遇到请求时可以先查找自身域是否满足要求,若无,则将请求转向根域;第二种是不负责任何域数据库的,如联通,移动等,当遇到请求时直接将其转向根域;

  DNS服务器中的数据,是网络连接的根本;当DNS服务器因为一些突然地事故而中断时,对于一些在生产环境下的网络服务用户而言是一个很麻烦的问题;而针对于这类问题,DNS服务器便发展为现在的主从通信机制;DNS主服务器对于区域数据有读写功能,当主服务器中的数据进行改变后,就会将数据更新到从服务器上,而从服务器只能就行读操作,没有改写数据的权限;若主服务器长时间没有进行更新,从服务器会根据之前在主服务器设定好的刷新时间,进行主动更新;若从服务器请求刷新失败的话,则根据重试时间重新请求刷新;若从DNS一直无法联系上主服务器,那么久根据设定好的过期时间,当达到期限时停止从DNS服务器的工作;这对于这三个时间,需要注意的是主DNS服务器和从DNS服务器两者之间的时间必须要同步,若不同步则会造成信息混乱;

  刷新时间间隔:refresh,从DNS服务器每隔多长时间到主DNS服务器上检查序列号的变化情况;

  重试时间间隔:retry,从服务器向主DNS服务器要求同步数据库失败之后,再次发起尝试请求的时间间隔;

  过期时间:expire,从DNS服务器始终联系不上主DNS服务器时,从DNS服务器多长时间之后停止服务;

  否定答案的缓存时常:minimal TTL

  DNS主从服务器是如何保证主DNS服务器与从DNS服务器中的区域数据是一致的,需要判断什么时候更新数据,什么时候不更新数据;当主DNS服务器出现修改后其序号会递增;从服务器根据判断其序号是否递增来判断主服务器是否修改,若递增,则更新从服务器,若不递增则保持原样;数据区域的传送对于双方而言,主服务器可以主动要求更新,而从服务器在满足刷新时间后也可以主动要求主服务器进行更新操作;数据区域的传送方式有两种:

  增量传送:IXFR;只传送上次未更新的数据;

  全量传送:AXFR;传送所有数据区域;

  区域是DNS服务器用于进行正常的权威解析活动的必要的基础;称存放于区域数据库文件中的那些用于解析工作的数据为资源记录,简称RR;

  资源记录类型有七种:

  SOA:起始授权记录,在任何一个区域数据文件当中都要有一条SOA资源记录,用于设定FQDN,邮件交换器,以及从DNS服务器的刷新时间,重试时间,过期时间和否定答案的缓存时间;

  NS:声明当前域中所有DNS服务器;

  MX:邮件交换服务器,由邮件域名映射到完全合格域名;Domain-->FQDN

  A:设置完全合格域名映射到IP地址,可以映射NS,MX等服务器的IP地址,并使用dig调用测试;针对于IPv4;

  AAAA:设置完全合格域名映射到IP地址,针对于IPv6;

  CNAME:设置别名,可以设置服务器或域名的别名,通过别名进行调用测试;

  PTR:标识从完全合格域名到IP地址的转化,常用于反向区域的配置和解析;

  

  区域数据库中资源记录的定义格式:

    语法:name|FQDN [TTL] IN RR_TYPE VALUE

  需要在对应的配置文件中书写资源记录,才能配备出一个DNS服务器;由我们手动为DNS服务器添加域名,FQDN,以及域名所对应的IP地址,域名所对应的别名等;

  区域数据资源记录的开头,可以是去除主机名的域名,也可以是FQDN,至于TTL可写可不写,用于整体实现的时间,RR_TYPE则是资源记录的类型,VALUE表示不同资源记录所代表的有效值;“@”符号可以用于引用当前区域的域名;我们可以用“@”来代替开头的名称;也可以通过宏定义的方式,如:

  若不采用宏定义的一条资源记录:

  qhdlink.com. [TTL] IN RR_TYPE VALUE

  采用宏定义的一条资源记录:

  $ORIGIN qhdlink.com.

  $TTL 86400

  IN RR_TYPE VALUE

  当采用宏定义的方式,之前所需要书写的内容就会缩减,相当于之前声明过的变量,如今不需要再去声明;

  七种资源记录:

  SOA记录:

   name:当前域的域名,可以使用“@”替代;

    VALUE:

      1.当前区域的主DNS的域名,或者FQDN;

      2.当前区域数据库管理员的邮件地址;邮件常用格式为mail@qhdlink.com但是在资源记录中却不可以使用带有特殊含义的“@”,这样系统会认为其为mailqhdlink.com.com不符合邮件格式;将“@”符号替换为“.”即可;

      3.对应主服务器序列号以及区域传送的刷新时间,重试时间,过期时间,否定答案缓存时间;

    如:

    ①

    qhdlink.com. 86400 IN SOA ns1.qhdlink.com. admin.qhdlink.com. (

                                         2017811;serial

                                         1H;refresh

                                         10M;retire

                                         1W;expire

                                         1D

                                         );ttl

    ②

    @ 86400 IN ns1.qhdlink.com. admin.qhdlink.com. (

                                         2017811;serial

                                         1H;refresh

                                         10M;retire

                                         1W;expire

                                         1D

                                         );ttl

    1H:一小时,从服务器主动要求刷新检查是否需要更新;

    10M:十分钟,从服务器未得到回应,十分钟后再次重试;

    1W:一周,一周后若主服务器还未回应则停止从服务器工作;

    1D:一天,否定时间;

   

  NS记录:表示当前域中的所有服务器,在使用NS记录后,还要通过A记录指定服务器的IP地址,才能进行正常访问;

    name:当前域域名;可以在前方宏定义,省略name;

     VALUE:当前域中的完全合格域名;

       如:

         无宏定义:

           qhdlink.com. 86400 IN NS ns1.qhdlink.com.

         有宏定义:

           $ORIGIN qhdlin.com.

           $TTL 86400

           IN NS ns1

     注意:每个域中可以有多条NS记录,但每条NS记录只能对应一个A记录;

  

  MX记录:邮件交换服务器;

    name:当前域域名,可以在前方宏定义,省略name;

     VALUE:当前域中的有效邮件服务器的主机名;

      如:

        无宏定义:

          qhdlink.com. 86400 IN MX mail.qhdlink.com.

        有宏定义:

          IN MX mail

    注意:每个域中可以有多条MX记录,但每条MX记录对应一个A记录;


 A记录: 

    name:域中某主机名称或FQDN;

     VALUE:域中某主机名称或FQDN所对应的IP地址;

      如:

      无宏定义:

       www.qhdlink.com. 86400 IN A 172.16.72.1

      有宏定义:

       $ORIGIN qhdlink.com.

       $TTL 86400

       www IN A 172.16.72.1

  PTR记录:

     name:将IP地址反过来写,并在其后缀加反向域的标准后缀,所以其完整写法应该是:

       1.72.16.172.in-addr.arpa

      value:FQDN

        如:

        1.72.16.172.in-addr.arpa. 86400 IN PTR www.qhdlink.com.

  

  BIND软件:

   BIND--Berkeley Internet Name Domain, ISC(isc.org)

     bind-libs:为bind的其他应用程序提供共享库文件

     bind-utils:通用工具包,如:dig,host,nslookup等;

     bind:主程序包,包括DNS服务器程序,解析库,检测工具;

     bind-chroot:设置伪根,启用监牢模式;安全体现;

   BIND软件只需挂载光盘,使用yum命令安装即可;

   BIND命令的主服务进程是named,接下来我们也要围绕着named来进行DNS服务器的配置工作;

   首先打开named进程服务;

     如:

       CentOS7:systemctl start named.service

       CentOS6-:service named start

       打开后使用status查看状态;

   bind:

     主配置文件/etc/named.conf

       可以在主配置文件中设定DNS服务器的named进程监听的IP地址,令其监听DNS主服务器IP地       址;可以设置允许那些主机查询请求到服务器,使用IP段的方式最好;4

     主配置文件格式:

       1.注释的方式:

         //:单行注释;

         /* */:任意内容注释;

        2.分段配置的特点:

          a.访问控制列表的定义段;

          acl ACL_NAME {...}; "分号结尾"

          b.全局选项段:

          options {...};

          c.日志配置段:

          logging {...};

          d.区域配置段:

          zone "ZONE_NAME" IN {...};

          e.视图配置段:

          view VIEW_NAME {...};     

          f.include包含段:

          include /PATH/TO/SOME_CONFIG_FILE


   如:

     技术分享

   

listen-on port 53 { 127.0.0.1; 172.16.72.2; };:监听端口53,53端口用于完成主机名的     查询以及区域传送;named进程监听的IP地址;

     directory "/var/named";:区域数据库的根目录;在该目录下创建文件书写资源记录;

     allow-query     { 172.16.0.0/16; };:访问控制语句,默认是localhost,只为自身服务     器提供查询请求;修改为让所有172.16网段的都可以访问DNS服务器;

     recursion yes;全局开启的递归查询;默认为所有客户端开启递归查询;

     初学时,建议关闭dnssec功能;

          dnssec-enable yes;

          dnssec-validation no;

          dnssec-lookaside no


  当配置好DNS服务器后,需要去测试DNS服务器的可用性,是否正确;这时候我们就需要一个能够通过域名和IP地址来访问到指定的区域的工具;如dig,host以及nslookup;

  dig:

    dig [@Server] [-t RR_TYPE] [QUERY_OPTIONS]

    @Server:表示此次服务请求由主DNS服务器来完成,Server为该服务器IP地址;

    -t RR_TYPE:表示此次服务请求所要查询的资源记录;

    QUERY_OPTIONS:

     +[no]recurse:要求目标DNS服务器必须[不]进行递归查询;

     +[no]trace:对整个解析过程进行跟踪,由根域开始直到指定主机;

    如:

    ①由域名正向解析

     技术分享

     对baidu.com进行dig跟踪,查看在当前主机如何去访问baidu.com;

     首先访问根域,再有根域去访问下属的13个在世界范围的服务器;判断,baidu.com;在哪块服     务器上;

     技术分享

     去访问顶级域名com

     技术分享

     由com去找在他之下的baidu;找到5个与baidu相关的服务器;

     技术分享

     表示baidu.com存在别名为a.shifen.com;可以通过别名访问baidu

    

    ②dig -x IPADDR

      由IP地址反向解析

     技术分享

     反向解析出该IP地址的资源记录;


  host命令:

     host [-t RR_TYPE] DOMAIN_NAME SERVER

     host www.kernel.org 172.16.72.1(本机IP)

     技术分享

     没有加-t选项;host命令直接显示www.baidu.com使用那个DNS服务器;

 

  nslookup命令:

     使用交互的方式来对域名或IP地址进行查询;

     nslookup(交互命令)

     set type=RR_TYPE(设置查询的资源记录)

     set q=RR_TYPE(设置查询的资源记录)

     两种设置方式

     如

     使用域名解析

     技术分享

 

  DNS服务器配置:

   1.基本的正向和反向区域的配置和解析;

   2.主从服务器的设置;

   3.子域和子域的委派;

   4.转发器;

   5.访问控制列表和视图;

   步骤

   ①配置DNS服务器,首先需要将DNS主配置文件/etc/named.conf中的监听IP地址处加上该DNS服务器的IP地址;如listen-on port 53 { 127.0.0.1; 172.16.72.2; };再将allow-query { 172.16.0.0/16; };修改为让所有172.16网段都能访问该DNS服务器;

   ②配置数据区域,数据区域的配置有正向反向之分,在/etc/named.rfc1912.zones中定义;

   如

   zone "ZONE_NAME" IN {

               type {master|slave|forward|hint};

               file "ZONE_NAME.zone";

           };括号后需要加分号

   type:

     master表示该数据区域为主DNS服务器;

     slave表示该数据区域为从DNS服务器;

   file:

      在该命令后的文件名,作为相对路径,需要在/etc/named/下创建对应的文件;

   技术分享

   ③配置DNS服务器的资源记录;在/var/named/下创建与配置数据区域文件相同的文件名;如

qhdlink.com.zone;再在该文件中书写DNS服务器的资源记录; 

    第一条SOA记录;在该文件中的唯一一条;

    定义一条NS记录,用来表示当前唯一的服务器;

    定义一条MX记录,用来表示当前的邮件交换服务器;

    定义NS的A记录;

    定义MX的A记录;

    定义三条当前域域名的A记录,分别指向不同的IP地址;

    如:

   技术分享

   ④修改资源记录文件的权限;因为文件创建过后的属主和属组都是root,named进程无法调用,虽然其他用户的权限可以,但这样不符合生产环境要求;所以将属组改为named,并将其他用户权限删除;

    ~named]chown :named qhdlink.com.zone

    ~named]chmod o-r qhdlin.com.zone 

   ⑤使用named-checkconf命令检查DNS主配置文件/etc/named.conf及其辅助配置文件是否有错;

再使用named-checkzone "ZONE-NAME" ZONE-FILE 去检查我们所书写的资源记录是否出错;

   技术分享

   ⑥使用rndc命令重启配置文件

   ⑦关闭防火墙,并将SElinux置于允许状态;

    iptables -F

    setenforce 0

   ⑧开启另一台虚拟机;使用dig测试是否能访问DNS

   技术分享

   

  DNS服务器主从通信:

   配置从DNS服务器:

    步骤

     ①定义区域,在配置文件/etc/named.rfc1912.zones中,将type改为slave表从服务器,同时将file改为slave/qhdlink.com.zone;最后再在从服务器的区域中加上其为谁工作,也就是主服务器的IP地址;

     zone "qhdlink.com" IN {

          type slave;

          file "slaves/qhdlink.com.zone";

          masters { 172.16.72.2; };  //主服务器IP

     };

     当主DNS服务器出现数据改变,序列号增加时,自动更新并将区域数据发往从服务器;

     ②使用named-checkconf命令检查DNS主配置文件/etc/named.conf及其辅助配置文件是否有错;

     ③在/etc/named.conf中添加从服务器IP的监听;

     ④在主DNS服务器中的资源记录中添加一条从服务器的NS记录;否则,主服务器无法传送区域数据给从服务器; 

     如:

     技术分享

     增加一条从服务器的NS记录;

     当修改了主DNS的资源记录后,将序列号递增;

     rndc reload便可以将主服务器更新到从服务器中;

     可以查看区域数据传输的日志

     /var/named/data/named.run文件内容

     如:

     技术分享

     表示区域数据以全量传输的方式传送过去了;因为是第一次传输,所以采用全量;

  

     

   

     

     

DNS and BIND