DNS简介:

        DNS是Domain Name System的缩写,即“域名系统”,其是一个分布式数据库,也就是说每个DNS只保存属于自己的数据,但是一旦有所需要的时候,大家可以自动合作,并且共享数据。

    DNS功能:

        (1)实现主机名和IP地址的查询,也就是实现主机名和IP之间的名称解析的,因此就有两种方式:将主机名解析成IP(正向解析)和将IP解析成主机名(反向解析)。

        (2)用户不必要像早期那样将所有的主机名和IP对应关系写进/etc/hosts这个文件中(毕竟现在也是不实际的),而是通过DNS服务器来查询主机名和IP的对应关系。

        (3)如果每次访问的时候都需要DNS来解析的话,这对DNS来说是痛苦且不公平的,因此DNS会将查询的答案缓存下来,这样下次访问的时候就可以做出更快的回应。

        (4)DNS服务器之间可以传递数据,以便他们之间的数据保持同步。

    DMS原理(这里只以Linux中的正向解析来说明):

      问题一:如果将所有的数据都保存在一台或者DNS服务器上,那么所有的域名解析都需要这些机器来完成(这本是理所当然的,而且DNS本就是多台并且都能解析),但是问题是所有的数据都在同一台上那么就需要每时每刻的保证每台服务器上的数据是一样的,这是不理智也是不科学的。

        为了解决这个问题,就讲DNS分成树状结构来管理(可以想象一下Linux中的文件管理结构),而每一个树枝就是一个“域”,每个域只关心自己的“份内之事”。就像“/”一样,DNS中的“根域”一共有13个(这也是不一样的地方)分布在世界的DNS服务器,代号为“.”(之所以现在访问网站的时候不需要带上"."是因为现在在访问网站的时候都自动加上去了),在"根域"下是“顶级域”,例如常见的有com;net;org;gov;cn等等,在“顶级域”下面是“二级域”,“二级域”通常就是个人和公司所使用的域名,只要放到互联网上的时候不与已经注册的同名即可,且注册的时候先到先得。依次类推,主机名,域名之间使用点号分隔,因此一个完整的主机名(FQDN)是由主机名加域名组成的。

      问题二:怎样查询

        当客户机访问一个站点的时候(比如www.magedu.com),客户机会首先查看/etc/hosts这个文件中有没有这个站点与IP的对应信息,如果有的话直接以这个IP来访问,没有的话就查看缓存(这里假设已经使用了DNS),如果缓存中有的话就直接使用,没有的话就去找客户机/etc/resolv.conf文件中指定的DNS服务器,如果www.magedu.com在这个DNS的管理范围之内就直接反馈给客户机,如果没有的话这个指定的DNS就去找“根”,由于“根”只管理“顶级域”,所以“根”并不知道www.magedu.com,但是它知道.com,因此它会将".com"这个”顶级域“的地址反馈给这个指定的DNS服务器,于是这个DNS服务器就去找这个“.com”服务器,同样的,它只管理属于自己的“二级域”,因此它也不知www.magedu.com的IP地址,但是它知道magedu.com在的DNS在哪里,于是就讲magecu.com的DNS的IP地址反馈给用户指定的DNS服务器,于是这个指定的DNS服务器就去找管理magedu.com的DNS,这个DNS发现www.magedu.com是自己的“子民”,于是就讲www.magedu.com的IP地址反馈给客户机指定的DNS服务器,于是客户机指定的DNS服务器就讲结构反馈给用户,用户就可以访问了。

      问题三:缓存

        试想一下如果每次访问网站的时候都需要DNS去解析,那么DNS的压力该是多么大,而且解析需要时间的啊。因此缓存提高了访问的速度,并且大大降低了DNS服务器的压力,但是因此是缓存,那么一旦真实的数据发生改变,那么通过缓存来访问就会出错,因此必须给缓存一个生存周期(TTL),虽然并不能完全解决,但是可以说是基本上的解决了这个问题(完美是需要代价的)。 

      问题四:如果指定的DNS服务器“挂”了怎么办?

        正所谓世事无常,天灾人祸谁人知?备份在计算机中是很重要的一部分,因此DNS也需要备份,但是这不仅仅是简单的备份文件,而是让另一台DNS服务器作为这个服务器的“从服务器”,并且时刻让两个的数据同步,一旦主服务器“挂”了,可以通过“从服务器”来访问。

      问题五:主服务器与从服务器的处理机制

        首先既然是主从关系,那么只能是从服务器从主服务器那里同步数据,并且主服务器上的数据是可读可写的,从服务器上的同步数据只能读不能写,那么如何去同步呢?首先在配置文件中定义同步刷新时间(refresh),这样每隔一段时间从服务器就从主服务器上同步一次数据,但是这样风险也不小,如其“被动等待不如主动出击”,当主服务器上的内容发生改变时候,主服务器会主动通知从服务器,这样双管齐下,数据同步保障就提高了很多了,并且当从服务器与主服务器“失联”,从服务器会每隔一段时间重新连接一次(retry),但是如果一直联系不上的话难道还要傻傻的一直联系吗,因此就需要一个超时时间来控制(expire),一旦超过这个时间,从服务器也“挂”了,因此还需要一个脚本来唤醒。 

    资源记录语法格式:       

    name   [TTL] IN RR_TYPE value

    其中RR_TYPE有:


    SOA:起始授权记录,一个区域只有一条,且必须放在最前面。

        name: 当前区域的名字;例如”mageud.com.”,或者“2.3.4.in-addr.arpa.”;

        value:有多部分组成

        (1) 当前区域的区域名称(也可以使用主DNS服务器名称);

        (2) 当前区域管理员的邮箱地址;但地址中不能使用@符号,一般使用点号来替代;

        (3) (主从服务协调属性的定义以及否定答案的TTL)


    例如:

    magedu.com. 86400 IN SOA magedu.com. admin.magedu.com.  (

                2016040906 ; 序列号

                2H; 同步刷新时间

                10M ; 重连时间

                1W ; 超时时长

                1D ; 否定缓存时长 

    )


    NS:域名服务器记录

        name: 当前区域的区域名称

        value:当前区域的某DNS服务器的名字,例如ns.magedu.com.;

        注意:一个区域可以有多个ns记录; 

    

        例如:

        magedu.com. 86400 IN NS   ns1.magedu.com.

        magedu.com. 86400 IN NS   ns2.magedu.com.

        

   MX:邮件交换器

    name: 当前区域的区域名称

    value:当前区域某邮件交换器的主机名;

    注意:MX记录可以有多个;但每个记录的value之前应该有一个数字表示其优先级,数字越小优先级越高;

    

    例如:

    magedu.com. IN MX 10   mx1.magedu.com.

    magedu.com. IN MX 20   mx2.magedu.com.

    

   A:IPv4的地址记录

    name:某FQDN,例如www.magedu.com.

    value:某IPv4地址;

    

    例如:

    www.magedu.com. IN A 1.1.1.1

    www.magedu.com. IN A 1.1.1.2

    bbs.magedu.com. IN A 1.1.1.1

    

  AAAA:IPv6的地址记录

        name:FQDN

value: IPv6


    PTR:反向解析

    name:IP地址,有特定格式,IP反过来写,而且加特定后缀;例如1.2.3.4的记录应该写为4.3.2.1.in-addr.arpa.;

    value:FQND

    

    例如:

    4.3.2.1.in-addr.arpa.   IN  PTR www.magedu.com.


    CNAME:别名记录

    name:FQDN格式的别名;

    value:FQDN格式的正式名字;

    

    例如:

    web.magedu.com.   IN   CNAME  www.magedu.com.

    

    

    注意:

    (1) TTL可以从全局继承;

    (2) @表示当前区域的名称;

    (3) 相邻的两条记录其name相同时,后面的可省略;

    (4) 对于正向区域来说,各MX,NS等类型的记录的value为FQDN,此FQDN应该有一个A记录;

    BIND简介:

        BIND是Berkeley Internet Name Domain(伯克利因特网域名)的缩写,是由Berkeley大学的四名研究生研发的一个开源软件。是dns协议的一种实现,注意BIND程序运行的程序名是named。

    BIND的安装与配置:

        最简单的方式:yum -y install bind

      主要的软件包有:

        bind:提供DNS Server和常用的测试程序

    bind-utils(默认已安装):bind客户端程序集(主要是dig,host,nslookup)

        bind-libs(默认已安装):bind和bind-utils所需要的库文件 

       配置文件:

        BIND的配置文件分为主配置文件和解析库文件。

       主配置文件为:/etc/named.conf,遵循C语言语法,其主要的内容有

        options块:

        wKiom1cIsqvAQxi5AAAkerd6ycg863.png

        wKioL1cIs-PhsCpfAAAn3XTebUA278.png     

        主要有:listen-on port:表示监控在哪个地址上哪个端口上,这里是通用的53号端口,大括号中的地址可以有多个,以分号分隔,分号结尾,并且大括号的两端有空格。(第二个是IPv6地址的)       

        directory:指定解析库文件目录位置,这里是/var/named。

        allow-query:指定接受DNS查询的客户端。

        recursion:指定允许递归查询的DNS服务器

        补充:

        forwarders:指定转发服务器

        forward only|first:当查询不在此DNS服务器区域内时候,是只通过指定的转发服务器来查询,还是如果查询不在转发服务器区域的时候此DNS服务器继续查询。 

        logging块:定义DNS查询的日志数据参数。

        zone块:定义区域信息。

        其包含的配置文件:

            /etc/named.iscdlv.key

            /etc/named.rfc1912.zones:区域定义文件。

            /etc/named.root.key

        解析库文件:

            在/var/named目录下,名字一般是ZONE_NAME.zone

    DNS配置:

     先修改/etc/named.conf这个文件,开启此服务器地址的监听,关闭查询限制,以及别的功能。   

 listen-on port 53 { 127.0.0.1;192.168.1.109; };开启监听192.168.1.109的53号地址
 //      allow-query     { localhost; };允许所有人查询
 dnssec-enable no;
 dnssec-validation no;  关闭dnssec功能


     正向解析区域:

        首先在主配置文件中定义一个区域比如magedu55.com,在/etc/named.rfc1912.zones这个专门的文件中定义比较好,当然也可在/etc/namec.conf中定义。      

[root@localhost ~]# vim /etc/named.rfc1912.zones 
zone "magedu55.com" IN {
        type master; 定义为主DNS服务器
        file "magedu55.com.zone"; 区域解析库文件的相对/var/name的位置
};在最后一行加上这个简单的区域定义,其中type指明类型为主DNS服务器,解析库文件位置/var/named/magedu55.com.zone

    然后在/var/named/下建magedu55.com.zone这个文件

        wKiom1cIyT2Q896qAAArjxlUH_M964.png

    第一步:区域定义模式

        zone “区域名字” IN{

            type master|slave|stub|forward;

            file “区域解析库文件路径”;

        };

        type指明类型:master表示主服务器,slave表示从服务器,forward表示转发区域,stub表示存根区域。

        file指明的文件路径是相对于/etc/named.conf中的directory指定的路径的相对路径,这里是/var/named

        需要注意的是注意每句后面带上“;”号。

        第二步:解析库文件定义

        $TTL:表示肯定缓存存活时间,这里定义以后资源记录里面就不用设置了

        $ORIGIN:区域名,以后就可以直接使用@来代替区域名了

        下面的内容就是资源记录内容,需要注意的是相邻两条记录名字一样时候后面的可以省略,名字只写一部分不以“.”结尾的会自动补全域名。注意点号不要掉了。

    配置完了以后注意使用named-checkfong来检查主配置文件的语法,named-checkzone来检查区域解析库文件的语法

[root@localhost named]# named-checkconf  默认是检查/etc/name.conf和其包含的文件
[root@localhost named]# named-checkzone magedu55.com /var/named/magedu55.com.zone 
zone magedu55.com/IN: loaded serial 2016040906
OK
[root@localhost named]#

    下面启动bind并检测状态

    wKiom1cIyfvhfcMUAAB1S_tBOoE907.png 

    改变/var/named/magedu55.com.zone的数组为named,改变其权限为644.      

        下面来测试一下是否能解析成功,以www.magedu55.com为例

    wKiom1cIy3KAhr69AAA9Ebb-rX0526.png 

        刚好是192.168.1.112,虽然这是随便编的一个ip,但是DNS只是负责解析,并不管是否能访问,因此这里可以随便设定IP和主机名。

        反向解析区域:

        同样的创建区域:

zone "1.168.192.in-addr.arpa" IN {
        type master;
        file "1.168.192.zone";
};这里注意文件不带后缀

    然后建立区域解析库文件/var/named/1.168.192.zone

[root@localhost slaves]# vim  /var/named/1.168.192.zone

    wKiom1cI2bzjYyusAAAjtNQrGas913.png

        改变文件的属组为named,权限为644

        检查文件语法错误

[root@localhost slaves]# named-checkconf
[root@localhost slaves]# named-checkzone 1.168.192.in-addr.arpa /var/named/1.168.192.zone 
zone 1.168.192.in-addr.arpa/IN: loaded serial 2016040906
OK
[root@localhost slaves]#

        rndc reload或者systemctl restart named.service    

        测试结果:

        wKioL1cI3O3CFnrAAAA6cbwbcLM560.png

        从DNS服务器:

        同样的先安装bind软件,修改主配置文件/etc/named.conf

        然后创建区域




        子域授权:

        首先安装bind,然后修改/etc/named.conf,然后先到上级服务器的/var/named/magedu55.com建一个字域

ops     IN      NS      ns3.ops
ns3.ops IN      A       192.168.1.108 在这个文件中简单的新添加这两条,然后检查语法错误

    接着到字域服务器上建一个新的区域

zone "ops.magedu55.com" IN {
        type master;
        file "ops.magedu55.com.zone";
};然后检查语法错误
[root@bogon ~]# named-checkconf
[root@bogon ~]# 没问题

    然后在子域服务器上新建解析库文件

[root@bogon ~]# vim /var/named/ops.magedu55.com.zone

    wKioL1cI9A_gtMnPAAAhmeCGjDs113.png


     然后检查语法错误,并修改文件的属组为named,权限为644

     然后启动服务

     开始测试:

        wKioL1cI9G3RKxZdAAA8hxHv6Kk552.png

  区域转发:

        建立一个新的区域(注意forwarders后面的主机必须能接受此主机的转发)

zone "magedu.com" IN {
        type forward;
        forward only;
        forwarders { 192.168.1.109; };
};检查语法没有错误后重载

  全局转发:

        在option全局配置段中加上forward only|first以及指定forwarders         

 子域授权:只需要在区域解析文件中加上子域至少一条NS记录,以及每个NS记录的A记录即可,然后其他的步骤就和正常的DNS配置一样   

    例如在正向解析区域授权子域:

    ops.magedu.com. IN NS   ns1.ops.magedu.com.

    ops.magedu.com. IN NS   ns2.ops.magedu.com.

    ns1.ops.magedu.com. IN A IP.AD.DR.ESS

    ns2.ops.magedu.com. IN A IP.AD.DR.ESS

    然后在子DNS服务器主机上创建ops.magedu.com.的zone,接着创建区域解析文件。