一、DNS( Domain Name System)--域名系统,是一种组织成域层次结构的计算机和网络服务系统,用于TCP/IP网络,提供将主机名和域名与IP地址相互转换的服务。它的基本工作原理用下图来表示。       

DNS基本原理与配置_智能DNS

   

    域名虽然便于人们记忆,但计算机只能通过IP地址互相通信, 它们之间的转换工作就称为域名解析,而DNS就是提供域名解析服务的系统.DNS是一个具有树状层次结构的联机分布式数据库系统,是C/S架构,其树状层次结构


DNS基本原理与配置_资源记录_02

二、域与区域

    对于常见的www.magedu.com,它不是一个域名,而是一个主机名,也称为FQDN,即Full Qualified Domain Name完全限定域名,

树状层次中最顶端的称为根域(.),根域下面的几个域称为顶级域(Top level Domain),简写为TLD,

TLD:

    组织域: .com,.net,.org,...

    国家域: .cn, .tw, .hk, .jp, .iq, .ir

    反向域: IP --> FQDN

再下面是二级域,三级域,...

    对于分布式数据库系统,每个域名都只负责其直接下级域名的解析,在.magedu下有一台为www的主机,那它的FQDN即为www.magedu.com,因为DNS的主机名是自底向上的,授权是自底向下的.  

DNS中域与区域的区别:

    对于DNS来说,域是一个逻辑概念,区域是一个物理概念

区域传送的类型:(主从服务器进行数据传送时)

    完全区域传送: axfr

    增量区域传送: ixfr

区域类型:

    主区域: master

    从区域: slave

    提示区域: hint,根域为hint区域

    转发区域: forward 

三、区域文件

    对于一个域来说,一般都有域本身负责解析域的数据库,这样的一个数据库文件就是域的区域文件,数据库中的每一行(每一个条目)称作一个资源记录(resource record),简写为RR。这样的一个数据库文件就是域的区域文件,在区域文件中分号代表注释。

资源记录的格式:

    NAME(名称)    [TTL(缓存时间)]    IN(internet上的RR)     RRT(资源记录类型)    VALUE(值)

    www.magedu.com.                     IN                        A                1.1.1.1


    1.1.1.1                             IN                        A                www.magedu.com.

注意:如果TTL值均相同,可以在RR上方统一定义TTL值,对其下面的条目均有效.


资源记录类型:

SOA(START Of Authority): 

    ZONE NAME     TTL    IN    SOA    FQDN    ADMINISTRATOR_MAILBOX(

                    serial number(最长10位数字)

                        refresh

                        retry

                        expire

                        na ttl)

注意:

    1、这条资源记录类型必须是区域文件的第一条;

    2、时间单位:M(分),H(小时),D(天),W(周),默认单位是秒

    3、邮箱格式: admin@magedu.com --> admin.magedu.com.

NS(nameserver): ZONE NAME --> FQDN

        magedu.com.    600    IN    NS    ns.magedu.com.

        ns.magedu.com.    600    IN    A    1.1.1.2

MX(Mail eXchange): ZONE NAME --> FQDN

        ZONE NAME    TTL    IN    MX    PRIORITY(优先级)    VALUE

            优先级: 0-99, 数字越小, 级别越高

        magedu.com.    600    IN    MX    10    mail.magedu.com.

        mail.magedu.com.    600    IN    1.1.1.3

A(Adress): FQDN --> ipv4

AAAA: FQDN --> ipv6

PTR(pointer): IP --> FQDN

CNAME(canonical name):FQDN --> FQDN

        www2.magedu.com.    600    IN    CNAME    www.magedu.com.


四、DNS服务器的递归和迭代查询

    在.magedu域内配置一台主机专门用于DNS服务的请求和解析, 主机名为ns.magedu.com,同时在.magedu域下有一台主机, 主机名为www.magedu.com, 这台主机想请求解析www.fin.example.com的IP地址,过程如下:

    1、www.magedu.com把请求直接提交给DNS服务器ns.magedu.com;

    2、ns.magedu.com本身并不负责www.fin.example.com的解析,同时本地也没有缓存, 于是就把请求直接交给根域;

    3、根域接到请求,会把负责解析.com域的DNS服务器作为结果返回给ns.magedu.com,这时,ns.magedu.com会继续向.com的DNS服务器发送请求,得到一个负责解析.example.com域的DNS服务器的结果;

    4、继续发送请求,直到返回www.fin.example.com的IP地址结果;

    5、ns.magedu.com再将返回的结果发送给www.magedu.com,完成请求.

    综上, www.magedu.com向ns.magedu.com请求的查询过程称为递归查询, 而ns.magedu.com向根域及其子域请求的查询过程称为迭代查询,一般情况下域名服务器对于本地客户端(stub resolver)的请求都是递归查询,对于DNS服务器的请求都是迭代查询.


五、DNS服务器的类型

    主服务器

    从服务器

    缓存服务器

    转发服务器


六、DNS服务器的安装与配置

1、简单配置

    目前使用的最多的DNS服务器软件是BIND(Berkeley Internet Name Domain),在RED HAT5.8上安装bind97配置DNS服务器.

    首先配置好yum源,安装bind97和bind97-utils    

    # yum -y install bind97 bind97-utils

    编辑配置文件/etc/named.conf,定义区域   

    options{
       directory    "/var/named";
       allow-resursion { 192.168.1.0/24; 127.0.0.0/8; };
       notify yes;
          };
   
   zone "." IN {
       type hint;
       file "named.ca";
       };
       
 
zone "localhost" IN {
       type master;
       file "named.localhost";
       allow-tranfer{none;};
   };
   
   zone "0.0.127.in-addr.arpa" IN {
       type master;
       file "named.loopback";
       allow-tranfer{none;};
       };
       
   zone "51test.com" IN {
       type master;
       file "51test.com.zone";
       allow-tranfer{ 192.168.1.102;};
   };
   zone "1.168.192.in-addr.arpa" IN {
       type master;
       file "1.168.192.in-addr.arpa.zone";
       allow-tranfer{ 192.168.1.102;};
   };

    手动编辑区域数据文件

    # vim /var/named/51test.com.zone
   
   $TTL 86400
   51test.com.    IN    SOA    ns1.51test.com.    mail.51test.com. (
                               2017072502
                               2H
                               60
                               7D
                               1D)
                  IN    NS    ns1.51test.com.
                  IN    MX 2    mail.51test.com
   ns1.51test.com.    IN    A    192.168.1.101
   mail.51test.com.    IN    A    192.168.1.101
   www.51test.com.    IN    A    192.168.1.102
   www.51test.com.    IN    A    192.168.1.103
   www2.51test.com.    IN    CNAME    www.51test.com.  

 # vim /var/named/1.168.192.in-addr.arpa.zone
   
   $TTL 86400
   @    IN    SOA    ns1.51test.com.    mail.51test.com. (
                               2017072502
                               2H
                               60
                               7D
                               1D)
                  IN    NS    ns1.51test.com.
   101    IN    PTR    ns1.51test.com.
   101    IN    PTR    mail.51test.com
   102    IN    PTR    www.51test.com.
   103    IN    PTR    www.51test.com.

    修改区域数据文件的属性

    # chmod 640 /var/named/51test.com.zone

    # chown root.named /var/named/51test.com.zone

    # chmod 640 /var/named/1.168.192.in-addr.arpa.zone

    # chown root.named /var/named/1.168.192.in-addr.arpa.zone

    检查配置文件和区域数据文件是否有语法错误

    # named_checkconf

    # named_checkzone "51test.com" /var/named/51test.com.zone 

    # named_checkzone "1.168.192.in-ddr.arpa" /var/named/1.168.192.in-addr.arpa.zone

    启动服务,开始用dig命令进行查询测试

    dig 简单用法:

        dig -t RT NAME @IP

        dig -x IP  根据IP查找FQDN, 但需要定义反向区域数据文件

    # service named start
   # dig -t A www.51test.com
@192.168.1.101
       一个FQDN若有两个IP地址,则轮流返回
   # dig -t CNAME www2.51test.com @192.168.1.101
   # dig -x 192.168.1.103
 
   
    # dig +norecurse -t A www.sohu.com @192.168.1.101 非递归查询
    # dig +recurse -t A www.sohu.com @192.168.1.101  若在配置文件中定义不予递归,则不返回任何结果
    # dig +trace -t A www.sohu.com @192.168.1.101   查询的详细过程
   
    # dig -A axfr 51test.com
    # dig -A ixfr=serial number 51test.com  区域传送不安全

2、主从服务器配置

    配置从服务器,其IP地址为192.168.1.102

    注意: 在定义从服务器时,也要把从服务器的NS记录写入区域数据文件,即在主服务器上编辑正向区域文件加入条目:           

           IN    NS    ns2
    ns2    IN    A    192.168.1.102

在反向区域数据文件中加入条目:

           IN    NS    ns2.51test.com.
    102    IN    PTR   ns2.51test.com.

    安装bind97,bind97-utils

    编辑配置文件/etc/named.conf 

     options{
       directory    "/var/named";
       allow-resursion { 192.168.1.0/24; 127.0.0.0/8; };
          };
   
   zone "." IN {
       type hint;
       file "named.ca";
       };
       
   zone "localhost" IN {
       type master;
       file "named.localhost";
       allow-tranfer{none;};
   };
   
   zone "0.0.127.in-addr.arpa" IN {
       type master;
       file "named.loopback";
       allow-tranfer{none;};
       };
       
   zone "51test.com" IN {
       type slave;
       file "slaves/51test.com.zone";
       master{192.168.1.101;};
       allow-tranfer{ none;};
   };
   zone "1.168.192.in-addr.arpa" IN {
       type slave;
       file "slaves/1.168.192.in-addr.arpa.zone";
       master{192.168.1.101;};
       allow-tranfer{ none;};
   };

    启动服务,开始完全同步

    在主服务器上编辑区域文件,增加条目,观察从服务器是否可以完成增量区域传送就可以了.

3、正向区域授权配置

    有时候会希望在域51test.com下面注册两个子域,分别为fin 和market,则此时正向区域数据文件中添加条目

(注意:如果子域有多台服务器,则需要在父域的区域数据文件中添加多条记录,子域的IP可以不与父域在同一网段中)

    fin.51test.com.         IN    NS    ns1.fin.51test.com.
   ns1.fin.51test.com.     IN    A    192.168.1.106
   
   market.51test.com.        IN    NS    ns1.market.51test.com.
   ns1.market.51test.com.    IN    A   172.16.100.1
   

    需要在另外一台主机上配置子域DNS服务器,与上述过程相同

    编辑配置文件/etc/named.conf

     options{
       directory    "/var/named";
          };
   
   zone "." IN {
       type hint;
       file "named.ca";
       };
       
   zone "localhost" IN {
       type master;
       file "named.localhost";
   };
   
   zone "0.0.127.in-addr.arpa" IN {
       type master;
       file "named.loopback";
       };

       
   zone "fin.51test.com" IN {
       type master;
       file "fin.51test.com.zone";
   };

    手动编辑子域的区域数据文件 

    # vim /var/named/fin.51test.com.zone
   
   $TTL 86400
   fin.51test.com.    IN    SOA    ns1.fin.51test.com.    mail.fin.51test.com. (
                               2017072502
                               2H
                               60
                               7D
                               1D)
                  IN    NS      ns1
                  IN    MX 2    mail
   ns1     IN    A    192.168.1.106
   mail    IN    A    192.168.1.106
   www     IN    A    192.168.1.107

    修改区域数据文件的属组为named,权限为640

    此时就可以用dig命令进行查询测试了

    通常情况下子域是不知道父域的地址的,但是可以通过定义一个转发区域,直接把父域的IP地址告诉给子域,

    全局转发,除了对自己所在域的请求,否则对于其他域的请求都转发,在/etc/named.conf中的options中定义

    forward first;
   forwarders { 192.168.1.101;};

    若只对对其父域51test.com的请求进行转发,对其他域的请求就不再转发, 则需要在配置文件中单独定义一个域

    zone "51test.com" IN {
       type forward;
       forward first;
       forwarders {192.168.1.101; };
   };

1、简化配置文件/etc/named.conf

    在配置文件中定义列表,可以把一类内容写入这个列表,格式为

    acl ACL_NAME {

        172.168.0.0/16;

        127.0.0.0/8;

    };

    注意: acl定义在配置文件的最上面

    用法,如:  

    acl innet {

        172.168.0.0/16;

        127.0.0.0/8;

    };

    allow-recursion { innet; };

4、智能DNS配置

    由于中国有两个运营商,telecom和unicom,这是两个独立的网络,在实际应用中,经常把全国划分为多个分区,在每个分区中有其对应的DNS服务器,根据客户端来源的不同返回指定的解析结果,这样的机制称为智能DNS.

    具体实现: DNS可以在自己的服务器内部做视图.一个区域需要定义多个数据区域文件对应不同的客户端来源,也就是将一个区域分割成多个区域.

   现在将192.168.1.0/24的网络定义为电信的用户,其他客户端都定义为联通的用户

    DNS定义视图时,格式为

    view VIEW_NAME{};

    注意: 所有的区域都必须定义在视图中,根区域只需要定义在需要递归的视图中

    acl innet {
        192.168.1.0/24;
        127.0.0.0/8;
    };
    options{
        directory    "/var/named";
        allow-recursion {innet;};
           };
    view telecom {
        match-clients {innet;}; 
        zone "." IN {
           type hint;
           file "named.ca";
       };   
        zone "telecom.51test.com" IN {
            type master;
            file "51test.com.zone";
        };
    };
    
     view unicom {
       match-clients {any;};    
       zone "unicom.51test.com" IN {
           type master;
           file "unicom.51test.com.zone";
       };
   };

    编辑区域数据文件

    # vim /var/named/telecom.51test.com.zone
   
   $TTL 46300
   @        IN    SOA    ns1.51test.com.    mail.51test.com.    (
                           2015072501
                             1H
                             5M
                             3D
                             2D)
             IN    NS    ns1
             IN    MX 2    mail
    ns1     IN    A    192.168.1.101
    www     IN    A    192.168.1.102
    mail    IN    A    192.168.1.101

    修改属组为named,权限为640

    # chown :named /var/named/telecom.51test.com.zone

    # chmod 640 /var/named/telecom.51test.com.zone

    # vim /var/named/unicom.51test.com.zone
   
   $TTL 46300
   @        IN    SOA    ns1.51test.com.    mail.51test.com.    (
                           2015072501
                             1H
                             5M
                             3D
                             2D)
             IN    NS    ns1
             IN    MX 2    mail
    ns1     IN    A    192.168.1.101
    www     IN    A    192.168.1.106
    mail    IN    A    192.168.1.107

    修改属组为named,权限为640

    # chown :named /var/named/unicom.51test.com.zone

    # chmod 640 /var/named/unicom.51test.com.zone

    启动DNS服务,测试查询解析

    注意: 如果解析一个域,但不需要返回不同的结果,那这个域需要定义在所有的view中,不过区域数据文件是一样的就可以了