一、DNS介绍

  

   DNS是计算机域名系统(Domain Name System 或Domain Name Service) 的缩写,它是由域名解析器和域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,一个IP地址可以有多个域名,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器通常为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。


  DNS所监听的端口: 53/UDP,53/TCP(默认)。 一般情况下仅使用UDP协议进行讯通,若网络出现连接问题会自动转为TCP协议通讯

   

  传输层协议: TCP, UDP, SCTP

TCP: Transmission Control Protocol

面向连接的协议:双方通信之前需要事先建立虚连接;

UDP:User Datagram Protocol

无连接的协议:双方无须通信之前需要事先建立虚连接;


 二、DNS域的组成
       根域:为DNS根节点服务器,用"."表示            

            全球有13组DNS根服务器
        
       顶级域:top level domain
        分类:
         组织域:.com, .org, gov, .edu, mil
         国家域:.tw, .hk, .cn
         反向域:.in-addr.arpa

         顶级域是由根域划分,由各种组织或商业公司代理

        

      二级域:
       二级域就是我们常见的网站名,例如taobao.com就是一个二级域的域名,www.taobao.com是taobao.com这个域中的某个主机


    三、FQDN 

    FQDN:(Fully Qualified Domain Name)完全合格域名/全称域名,是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。从全域名中包含的信息可以看出主机在域名树中的位置。DNS解析流程:首先查找本机HOSTS表,有的直接使用表中定义,没有查找网络连接中设置的DNS 服务器由他来解析
  例如,acmecompany公司的Web服务器的全域名可以是 acmecompany.,而若sales主机是在销售部子域,则它的全域名可以是sales.acmecompany。当给出的名字像acmecompany而不是acmecompany.时,他们通常是指主机名,而名字后边带有点号(“.”是指根域名服务器)的则认为是全域名。这种区别在理解和控制解析过程时是非常重要的。点号实际上指出了域名树的根


  四、DNS查询

  DNS查询分为:spacer.gif递归查询和迭代查询


  (1)递归查询: recursion

   递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求,必须使用一个准确的查询结果回复客户机。如果DNS 服务器本地没有存储查询DNS 信息,那么该服务器会询问其他服务器,并将返回的查询结果提交给客户机。


 (2)迭代查询: iteration  

   DNS 服务器另外一种查询方式为迭代查询,DNS 服务器会向客户机提供其他能够解析查询请求的DNS 服务器地址,当客户机发送查询请求时,DNS 服务器并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果

为止。

两种过程的示意图:

    wKiom1cMn4GjL4XYAARD_psTqLg164.png


   个人总结:

       DNS递归:内网区域(客户端---->服务器,服务器找到符合条件的内容---->客户端)


       DNS迭代:外网区域(客户端---->服务器,服务器找不到,让客户端找根)

   

五、DNS名称解析方式:

     名称 --> IP:正向解析

IP --> 名称:反向解析

注意:二者的名称空间,非为同一个空间,即非为同一棵树;因此,也不是同一个解析库;


六、DNS一次完整的查询请求经过的流程:

       Client --> hosts文件 --> DNS Local Cache --> DNS  Server (recursion) --> 

自己负责解析的域:直接查询数据库并返回答案;

不是自己负责解析域:Server Cache --> iteration(迭代)


 www.taobao.com为例

     

  1、当客户端要解析一个域名时,客户端首先分析本地hosts文件,若无对应的主机条目,就去分析

本地缓存,若没有答案,则向本地DNS服务器发起请求 。       
  2、DNS服务器接收到请求,首先分析服务器本地的缓存,看是否存在要解析的答案,有则直接返回,没有则向根发起请求

  3、根接收到请求,但根并不负责任何递归性的回答,所以,根会返回www.taobao.com的顶级域.com所在的主机地址给本地DNS服务器   

  4、本地DNS服务收到根的指向性答复,然后去找负责.com的DNS服务器

  5、负责.com的DNS服务器发现taobao.com是自己的管理的区域,但自己并不负责做递归性的答复

所以返回负责解析taobao.com的DNS服务器地址给本地DNS服务器

  6、本地DNS服务器向负责解析taobao.com这个域的DNS服务器发起请求

  7、负责解析johnson.com这个二级域的DNS服务器接收到解析www.johnson.com请求后,分析自己的区域数据库文件,发现存在www主机,给本地DNS服务器返回答案

  8、本地DNS服务器收到答复,将答案返回给客户端,域名解析过程完成   


七、DNS服务器类型和配置


   主DNS服务器:维护所负责解析的域数据库的那台服务器;读写操作均可进行;

   从DNS服务器:从主DNS服务器那里或其它的从DNS服务器那里“复制”一份解析库;但只能进行读操作;

    “复制”操作的实施方式:

  序列号:serial, 也即是数据库的版本号;主服务器数据库内容发生变化时,其版本号递增;

  刷新时间间隔:refresh, 从服务器每多久到主服务器检查序列号更新状况;

  重试时间间隔:retry, 从服务器从主服务器请求同步解析库失败时,再次发起尝试请求的时间间隔;

 过期时长:expire,从服务器始终联系不到主服务器时,多久之后放弃从主服务器同步数据;停止提供服务;

 否定答案的缓存时长:

    主服务器“通知”从服务器随时更新数据;

    区域传送:

   全量传送:axfr, 传送整个数据库;

   增量传送:ixfr, 仅传送变量的数据;


  主从服务器配置:

 注意:从服务器是区域级别的概念;

配置一个从区域:

  (1) 定义区域

zone "ZONE_NAME"  IN {

type  slave;

file  "slaves/ZONE_NAME.zone";

masters  { MASTER_IP; };

};

  配置文件语法检查:named-checkconf

  (2) 重载配置

    CentOS 6 ~]# rndc  reload

              CentOS 7 ~]# systemctl  reload  named.service

配置一个主区域:

 (1) 确保区域数据文件中为每个从服务配置NS记录,并且在正向区域文件需要每个从服务器的NS记录的主机名配置一个A记录,且此A后面的地址为真正的从服务器的IP地址;

 注意:时间要同步;

   ntpdate命令

            

   

八、区域数据库文件

   

   8.1  区域(zone)和域(domain)

  magedu.com域:

FQDN --> IP

正向解析库;区域

IP --> FQDN

反向解析库;区域



   8.2 资源记录:Resource Record, 简称rr;

  记录有类型:A, AAAA, PTR, SOA, NS, CNAME, MX

  SOA:Start Of Authority,起始授权记录; 一个区域解析库有且只能有一个SOA记录,而且必须放在第一条;

  NS:Name Service,域名服务记录;一个区域解析库可以有多个NS记录;其中一个为主的;

  A: Address, 地址记录,FQDN --> IPv4;

  AAAA:地址记录, FQDN --> IPv6;

  CNAME:Canonical Name,别名记录;

  PTR:Pointer,IP --> FQDN

  MX:Mail eXchanger,邮件交换器;

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

   8.3 资源记录的定义格式:

 语法:name   [TTL] IN  RR_TYPE  value


    name:资源名称,不同资源类型名称不同

          [ttl]: 缓存有效期,可省略,可以在宏中定义
          IN: Internet,固定格式
          RRtype: 资源类型
          value:资源对应的值

 

   8.4 记录类型


   SOA:只能有一个

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

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

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

例如:

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

       2017010801 ; serial(为数据库的版本号,十进制格式,不能超过10位)

   2H ; refresh(从服务器到主服务器的更新间隔)

  10M ; retry(更新失败重试时间,应该小于refresh time)

  1W ; expire(重试多久后,依然没有联系到主DNS,自己拒绝提供服务的时间)

  1D ; negative answer ttl(否定答案缓存时间) 

)

    NS:可以有多条

  name: 当前区域的区域名称

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

 

例如:

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

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

   

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

  name: 当前区域的区域名称

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

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

     例如:

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

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

   

   A:

  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:

  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,  ISC.org

dns: 协议

bind: dns协议的一种实现

named:bind程序的运行的进程名

程序包:

bind-libs:被bind和bind-utils包中的程序共同用到的库文件;

bind-utils:bind客户端程序集,例如dig, host, nslookup等;

bind:提供的dns server程序、以及几个常用的测试程序;

bind-chroot:选装,让named运行于jail模式


   

  创建新的DNS主配置文件:

 

      主配置文件:/etc/named.conf 

   或包含进来其它文件;

/etc/named.iscdlv.key

/etc/named.rfc1912.zones

/etc/named.root.key

解析库文件:

/var/named/目录下;

 一般名字为:ZONE_NAME.zone

 注意:(1) 一台DNS服务器可同时为多个区域提供解析;

    (2) 必须要有根区域解析库文件: named.ca;

    (3) 还应该有两个区域解析库文件:localhost和127.0.0.1的正反向解析库;

正向:named.localhost

反向:named.loopback


      

      rndc:remote name domain contoller

953/tcp,但默认监听于127.0.0.1地址,因此仅允许本地使用;

   bind程序安装完成之后,默认即可做缓存名称服务器使用;如果没有专门负责解析的区域,直接即可启动服务;

  CentOS 6: service  named  start

  CentOS 7: systemctl  start  named.service

主配置文件格式:

全局配置段:

   options { ... }

日志配置段:

   logging { ... }

区域配置段:

   zone { ... }

那些由本机负责解析的区域,或转发的区域;

  注意:每个配置语句必须以分号结尾;

缓存名称服务器的配置:

监听能与外部主机通信的地址;

  listen-on port 53;

                  listen-on port 53 { 172.16.100.67; };

学习时,建议关闭dnssec

  dnssec-enable no;

  dnssec-validation no;

  dnssec-lookaside no;

关闭仅允许本地查询:

  //allow-query  { localhost; };

检查配置文件语法错误:

named-checkconf   [/etc/named.conf]

测试工具:

dig, host, nslookup等

dig命令:

dig  [-t RR_TYPE]  name  [@SERVER]  [query options]

用于测试dns系统,因此其不会查询hosts文件;

查询选项:

+[no]trace:跟踪解析过程;

+[no]recurse:进行递归解析;

注意:反向解析测试

dig  -x  IP

模拟完全区域传送:

dig  -t  axfr  DOMAIN  [@server]

host命令:

host  [-t  RR_TYPE]  name  SERVER_IP

nslookup命令:

nslookup  [-options]  [name]  [server]

交互式模式:

nslookup>

   server  IP:以指定的IP为DNS服务器进行查询;

   set  q=RR_TYPE:要查询的资源记录类型;

   name:要查询的名称;

rndc命令:named服务控制命令

rndc  status

rndc  flush

     

    bind view:

视图:

view  VIEW_NAME {

zone

zone

zone

}

view internal  {

match-clients { 172.16.0.0/8; };

zone "magedu.com"  IN {

type master;

file  "magedu.com/internal";

};

};

view external {

match-clients { any; };

zone "magecdu.com" IN {

type master;

file magedu.com/external";

};

};



  十一、正向和反向区域配置

   

    配置解析一个正向区域:

  以taobao.com域为例:

  (1) 定义区域

在主配置文件中或主配置文件辅助配置文件中实现;

 zone  "ZONE_NAME"  IN  {

type  {master|slave|hint|forward};

file  "ZONE_NAME.zone"; 

 };

注意:区域名字即为域名;

  (2) 建立区域数据文件(主要记录为A或AAAA记录)

在/var/named目录下建立区域数据文件;

文件为:/var/named/taobao.com.zone

$TTL 3600

$ORIGIN magedu.com.

@       IN      SOA     ns1.taobao.com.   dnsadmin.taobao.com.               2017041201

       1H

            8M

       4D

            2D )

     IN      NS      ns1

IN      MX   10 mx1

IN      MX   20 mx2

ns1     IN      A       172.16.100.67

mx1     IN      A       172.16.100.68

mx2     IN      A       172.16.100.69

www     IN      A       172.16.100.67

web     IN      CNAME   www

bbs     IN      A       172.16.100.70

bbs     IN      A       172.16.100.71

  权限及属组修改:

~]#  chgrp  named  /var/named/taobao.com.zone

~]#  chmod  o=  /var/named/taobao.com.zone

 检查语法错误:

~]#  named-checkzone  ZONE_NAME   ZONE_FILE

~]#  named-checkconf 

(3) 让服务器重载配置文件和区域数据文件

~]#  rndc  reload 或

~]#  systemctl  reload  named.service

    配置解析一个反向区域

(1) 定义区域

在主配置文件中或主配置文件辅助配置文件中实现;

zone  "ZONE_NAME"  IN  {

type  {master|slave|hint|forward};

file  "ZONE_NAME.zone"; 

};

注意:反向区域的名字

反写的网段地址.in-addr.arpa 

100.16.172.in-addr.arpa

(2) 定义区域解析库文件(主要记录为PTR)

示例,区域名称为100.16.172.in-addr.arpa;

 $TTL 3600

 $ORIGIN 100.16.172.in-addr.arpa.

 @       IN      SOA     ns1.magedu.com.  nsadmin.magedu.com. (

   2017041201

   1H

   8M

   4D

        2H )

  IN      NS     ns1.magedu.com.

67       IN      PTR     ns1.magedu.com.

68       IN      PTR     mx1.magedu.com.

69       IN      PTR     mx2.magedu.com.

70       IN      PTR     bbs.magedu.com.

71       IN      PTR     bbs.magedu.com.

67       IN      PTR     www.magedu.com.

  权限及属组修改:

~]# chgrp  named  /var/named/172.16.100.zone

~]# chmod  o=  /var/named/172.16.100.zone

  检查语法错误:

~]# named-checkzone  ZONE_NAME   ZONE_FILE

~]# named-checkconf 

(3) 让服务器重载配置文件和区域数据文件

~]#  rndc  reload 或

~]#  systemctl  reload  named.service


 十二、主从服务器配置:

 注意:从服务器是区域级别的概念;

配置一个从区域:

(1) 定义区域

zone "ZONE_NAME"  IN {

type  slave;

file  "slaves/ZONE_NAME.zone";

masters  { MASTER_IP; };

};

  配置文件语法检查:named-checkconf

     (2) 重载配置

    CentOS 6 ~]# rndc  reload

              CentOS 7 ~]# systemctl  reload  named.service

配置一个主区域:

(1) 确保区域数据文件中为每个从服务配置NS记录,并且在正向区域文件需要每个从服务器的NS记录的主机名配置一个A记录,且此A后面的地址为真正的从服务器的IP地址;

注意:时间要同步;

ntpdate命令;

 子域授权:

正向解析区域授权子域的方法:

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


定义转发:

 注意:被转发的服务器必须允许为当前服务做递归;

   (1) 区域转发:仅转发对某特定区域的解析请求;

   zone  "ZONE_NAME"  IN {

       type  forward;

forward  {first|only};

forwarders  { SERVER_IP; };

   };

  

           first:首先转发;转发器不响应时,自行去迭代查询;

   only:只转发;

   (2) 全局转发:针对凡本地没有通过zone定义的区域查询请求,通通转给某转发器;

   options {

    ... ...

    forward  {only|first};

    forwarders  { SERVER_IP; };

.. ...

   };