DNS: Domain Name Service 域名服务器(应用层协议)     

    DNS所监听的端口
        53/UDP,53/TCP(默认)

wKioL1cJF0DQUR3tAABL1TNsYas974.png

    一般情况下仅使用UDP协议进行讯通,若网络出现连接问题会自动转为TCP协议通讯

DNS所说的“域”是逻辑概念

域名结构:
    根域:为DNS根节点服务器,用"."表示           

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

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

       

    二级域:
     二级域就是我们常见的网站名,例如baidu.com就是一个二级域的域名,www.baidu.com是

     baidu.com这个域中的某个主机


    子域:

     子域是相对而言,对于根域来说,顶级域如.com就是跟域的子域;而对于二级域baidu.com来说

      www.baidu.com是baidu.com的子域

   

    FQDN: Full Qualified Domain Name 完全限定名称

    完全的限定名称书写为www.baidu.com. 没错,.com后面是有点的,在配置DNS的时候是必须要加

    上点的,这样才是一个完整的FQDN

        
    整个域名的的结构成为namespace:名称空间

DNS查找类型:        

    递归:recursion
     客户端对DN服务器只发起1次请求,DNS服务器响应并返回答案,称为递归

     DNS服务器对客户端递归意味着,客户端对DNS服务器发起请求,若DNS服务器本地缓存有答案

     则直接返答案,若没有,则需要多次查找答案,最终返回答案给客户端

            
    迭代:iteration
     客户端向DNS服务器请求答案,服务器没有授权回答,则指返回一个可查询的服务器IP给客户端客

     户端再对这个IP发起请求,循环往复,直到得到答案,称为迭代

     只对客户端迭代查询的服务器意味着,若客户端请求不属于服务器自己的解析区域,则不会为客户端

     查询答案,而是为客户端返回一个可查询的服务器IP,让客户端自己去查找答案           
     

     递归和迭代可以理解为DNS服务器的两种响应方式  

     注意:客户端指向的DNS服务器一定是允许给本地主机做递归的,只有DNS服务器才能进行迭代,根

     服务器不做任何递归性答复 (考虑到负载情况)
           

         
答复类型:

    权威回答:负责解析请求主机所在的域的DNS服务器的回答,比如查找www.johnson.com,刚好

    DNS服务器就是负责解析www.johnson.com主机,返回的答案就是权威答案

    非权威回答:非负责请求的域名解析的DNS服务器从缓存中查询到返回的答案


     域名解析请求答案有肯定和否定之分,避免DNS服务器做过多的不必要响应,肯定的答案和否定答案

     都会缓存到本地,当对同一主机解析再次请求时,都先从缓存从查找

    

域名解析流程:(以www.johnson.com为例)
    1.当客户端要解析一个域名时,客户端首先分析本地hosts文件,若无对应的主机条目,就去分析

    本地缓存,若没有答案,则向本地DNS服务器发起请求       
   

    2.DNS服务器接收到请求,首先分析服务器本地的缓存,看是否存在要解析的答案,有则直接返回

    没有则向根发起请求

   

    3.根接收到请求,但根并不负责任何递归性的回答,所以,根会返回www.johnson.com的顶级域

     .com所在的主机地址给本地DNS服务器   

   

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

    

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

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

   

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

    

    7.负责解析johnson.com这个二级域的DNS服务器接收到解析www.johnson.com请求后,分析自己

     的区域数据库文件,发现存在www主机,给本地DNS服务器返回答案(权威答案)

    

    8.本地DNS服务器收到答复,将答案返回给客户端,域名解析过程完成              
        
    是不是发现解析一个主机名的过程很麻烦,所以才需要缓存这个东西,把第一次请求的答案放到缓存  

    中,当同一请求再次出现时,直接从缓存中返回答案,客户端和DNS服务器都可以缓存

    需要注意的是,客户端是相对而言的,比如本地DNS服务器向根发起请求,那么相对于根,本地DNS

    服务器就是客户端,不管请求者是客户端还是DNS服务器,只要你向我发起请求,你就是客户端 


 



DNS域名解析方式:
    正向解析:FQDN --> IP
    反向解析:IP --> FQDN

    传统意义上,正反向解析技术不同,不应该存放于同一数据库文件中,主机名的解析式依赖于

    正反解析数据库文件

       

资源记录:Resource Record
    资源记录有类型,用于资源的功能
    SOA:Start Of  Authority, 起始授权
    NS: Name Server, 域名服务器
    MX: Mail eXchanger: 邮件服务器
    A: Address, FQDN --> IPv4
    PTR: PoiTeR, IPv4 --> FQDN
    AAAA: Address,FQDN --> IPv6
    CNAME: Canonical Name, 别名记录

 

    DNS数据库文件(区域数据文件,区域自身有名字):只能包含资源记录或宏的定义

    资源记录格式:
     name    [ttl]   In    RRtype   Value
      name:资源名称,不同资源类型名称不同
      [ttl]: 缓存有效期,可省略,可以在宏中定义
      IN: Internet,固定格式
      RRtype: 资源类型
      value:资源对应的值

     资源记录的起始行可以定义宏,如TTL,缓存有效期,这样就可在资源条目中省略不写  


     例子:A资源记录
      www  600     IN      A       172.16.11.1

      www.johnson.com.  600     IN  A    172.16.11.1

     注意:
      若给出相对路径,则会自动补全
      若给出绝对名称,后面的"."一定不能省略


    资源配置
     SOA:只能有一个
      name:为区域名称,通常可以简写为@
      value:主DNS服务器的FQDN(ns.johnsonxu.com.)

      注意:SOA必须是区域数据库的第一条记录

     例:@  600  IN  SOA  ns.johnson.com.  admin.johnson.com.  (
        serial number:为数据库的版本号,十进制格式,不能超过10位
        refresh time:从服务器到主服务器的更新间隔
        retry time:更新失败重试时间,应该小于refresh time
        expire time:重试多久后,依然没有联系到主DNS,自己拒绝提供服务的时间
        netgative answer ttl ):否定答案缓存时间

    NS: 可以有多条
     name:为区域名称,通常可简写为@
     value:DNS服务器的FQDN(可以使用相对名称)
    

     例:@     600     IN      NS      ns

     相对名称:如ns,则会自动补全为ns.johnson.com.(补全的名称为区域名字)

     @表示为区域名字,即johnson.com,一般域名即为区域名       
    

    A:
     name:FQDN(可使用相对名称)
     value:IP

    例:
     www     600  IN  A    172.18.17.1
     www     600  IN  A    172.18.17.2

    同一主机名使用不同IP地址可作简略的负载均衡(轮询访问)

     www     600  IN  A     172.18.17.1
     tp          600  IN  A     172.18.17.1

    同一ip地址使用不同主机名,同一主机提供多种服务

    注意:任何Value以FQDN作为其值的资记录,都应该添加一条A资源记录,以确保该资源的FQDN能

    解析为IP地址

    MX: 可以有多个
     name:区域名称,用于表示smtp服务器
     value:优先级和FQDN
     优先级:0-99,数字越小,优先级越高

    例:
     @   600    IN   MX  10   mail
     @   600    IN   MX  20   mail

    注意:配置MX资源的时候千万不能把优先级省略,否则会报错

    CNAME:
     name: FQDN
     value:FQDN

    例:
     ftp     IN      CNAME   www
     ftp的正式名称为www,即ftp为www的别名

    PTR: IP --> FQDN
     name:IP是逆向的‘主机’地址,如172.18.17.2的name为2.17,其完全
     的书写格式为2.17.18.172.in-addr-arpa.
     value: FQDN

    例:
    2.17   600    IN     PTR    www.johnson.com

    需要提醒的是:PTR资源记录name为主机地址(注意区分网络地址和主机地址,IP包含两者)

    若网络地址是16位,那么主机是16位,name的填写如172.18.17.2,为2.17,后面不用填写,会自动

    补全,反向区域的命名为IP的网络地址,为"18.172.in-addr.arpa"

    其实,若反向区域命名为"17.18.172.in-addr.arpa",则在PTR资源记录中name填写2即可,不管怎样

    使用相对名称,则补全后必须是一个完整的IP,或name直接写全2.17.18.172.in-addr.arpa.

  

    区域和域:
     Domain:域是逻辑概念
     zone:区域是物理概念,可以说区域是域的实现,区域数据库文件定义了此域能够解析的资源条目
    

     在一个域内的ns,正向解析文件和反向解析文件各标示为一个物理空间,称为区域
   

DNS服务器类型:
    主DNS服务器
    辅助DNS服务器
        
    缓存名称服务器
     不做特定的区域解析,所有请求都将转发出去,并把查询的结果缓存至本地
     若再有相同的请求,则从缓存中直接返回结果给请求者(此答案为非权威答案)



DNS协议实现:
    DNS --> BIND --> named

    DNS是协议,而协议的实现靠软件,实现DNS协议的软件是BIND,BIND的进程名称为named

BING安装:

    本文只是基本的DNS服务配置,只安装BIND即可

  

创建新的DNS主配置文件:

    1.手动创建新的named.conf文件,内容如下(在创建之前先把原文件重命名使其失效)

options {  # 全局配置,定义区域文件目录,后面file引用的路径都是相对此定义的路径
    directory "/var/named";
};

zone "." IN {         # 根区域配置
    type hint;
    file "named.ca";
};

zone "localhost." IN {        # 本地正向解析区域配置
    type master;
    file "named.localhost";
};

zone "1.0.0.172-in.addr.arpa" IN {   # 本地反向解析区域配置
    type master;
    file "named.loopback";
};

# 实际上,仅有以上区域配置,一个简单DNS服务就能运行起来了
下面是自己定义的区域配置

zone "johnson.com." IN {        # 正向解析区域配置
    type master;
    file "johnson.com.zone";
};

# 检查主配置文件的语法错误 

[root@johnson-linux ~]# named-checkconf

# 修改主配置文件的属主和属组,并修改权限为640
[root@johnson_server ~]# chown root:named /etc/named.conf
[root@johnson_server ~]# chmod 640 /etc/named.conf

    其实可以不用创建一个主配置文件,因为软件安装后就已经生成了,这里自己手动配置,只是为了对主配置文件做一个简单了解,在自己能够手动配置完并且能够把服务运行起来,相信文件配置就不是问题了,若你不想自己编辑,则直接使用原来的主配置文件即可


    2.在/var/named目录创建johnson.com.zone区域数据文件,内容如下       

$TTL 600
@       IN      SOA     ns.johnson.com.     admin.johnson.com. (
            2016140913 ;serial number
            2H ; fresh time
            20M ; retry time
            7D ; expire time
            4H ) ; netgtive time
@       IN      NS      ns
@       IN      NS      ns2
@       IN      MX  10  mail
ns      IN      A       172.18.17.16
mail    IN      A       172.18.17.3
www     IN      A       172.18.17.3
ns2     IN      A       172.18.17.2
img     IN      A       172.18.17.4
ftp     IN      CNAME   www
http    IN      CNAME   www

# 配置完成保存退出,检测语法错误
[root@johnson-linux ~]# named-checkzone "johnson.com" /var/named/johnson.com.zone 
zone johnson.com/IN: loaded serial 2016140913
OK
# 显示OK则表示没有语法问题

# 同样需要修改文件的属主和属组及权限
[root@johnson_server ~]# chown root:named /var/named/johnson.com.zone
[root@johnson_server ~]# chmod 640 /var/named/johnson.com.zone

    注意:在配置新区域文件是必须要给出从服务器的数据同步各项参数,缺一不可
       

    3.启动服务,使用dig工具测试

     在测试之间,简单了解dig工具使用

     dig [-t TYPE] NMAE [@SERVER]

      -t type:指定测试类型,如 -t A,就是测试A资源类型(FQDN --> IP)

      @SERVER:使用指定DNS服务器来测试,如@172.18.17.16

      NAME:要测试的主机名,如www.johnson.com

# 语法检测没有问题后启动服务
[root@johnson-linux ~]# service named start
Starting named:                       [  OK  ]

# 可以通过/var/log/message 查看日志获取服务信息
[root@johnson-linux ~]# tail /var/log/messages
Apr  9 20:25:26 johnson-linux named[6371]: automatic empty zone: B.E.F.IP6.ARPA
Apr  9 20:25:26 johnson-linux named[6371]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA
Apr  9 20:25:26 johnson-linux named[6371]: command channel listening on 127.0.0.1#953
Apr  9 20:25:26 johnson-linux named[6371]: command channel listening on ::1#953
Apr  9 20:25:27 johnson-linux named[6371]: zone 1.0.0.172-in.addr.arpa/IN: loaded serial 0
Apr  9 20:25:27 johnson-linux named[6371]: zone johnson.com/IN: loaded serial 2016140913
Apr  9 20:25:27 johnson-linux named[6371]: zone localhost/IN: loaded serial 0
Apr  9 20:25:27 johnson-linux named[6371]: managed-keys-zone ./IN: loaded serial 5
Apr  9 20:25:27 johnson-linux named[6371]: running   # 已经运行起来了
Apr  9 20:25:27 johnson-linux named[6371]: zone johnson.com/IN: sending notifies (serial 2016140913)

# 服务有任何问题,都记得要看一下日志,要养成习惯

# 测试DNS服务器是否能解析
[root@johnson-linux ~]# dig -t A www.johnson.com @172.18.17.16

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www.johnson.com @172.18.17.16
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12888
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.johnson.com.        IN    A      <--------------# 我们的请求

;; ANSWER SECTION:  # 返回的答案,主机名成功解析
www.johnson.com.    600    IN    A    172.18.17.3   <-------------

;; AUTHORITY SECTION:       # 解析此区域的dns
johnson.com.        600    IN    NS    ns.johnson.com.
johnson.com.        600    IN    NS    ns2.johnson.com.

;; ADDITIONAL SECTION:      # 附加信息,把dns服务器的地址也解析出来了
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2
# 我这里配置了主从DNS,所以又两个DNS服务器

;; Query time: 1 msec
;; SERVER: 172.18.17.16#53(172.18.17.16)
;; WHEN: Sat Apr  9 20:12:14 2016
;; MSG SIZE  rcvd: 116

    

    提醒:dig 工具测试可以指定解析的DNS,若不指定,则使用/etc/resolv.conf中的DNS,也可手动

    把配置文件的中DNS改为自己配置的DNS,这样就不必手动指定

    

    正向解析的配置到此就搞定了,下面来搞一下反向解析区域的配置
  
反向解析区域配置:
    1.编辑/etc/named.conf文件,添加反向解析区域,添加内容如下

# 添加区域授权
 zone "18.172.in-addr.arpa" {
    type master;
     file "172.18.zone";
 };
# 检测语法错误
[root@johnson-linux ~]# named-checkconf
# 没有结果就是最好的结果

    注意:反向解析区域名以逆向‘网络地址’.in-addr.arpa命名

    2.编辑反向解析数据库文件:
     第一条应该为SOA记录
     应该具有NS记录,但不能出现MX和A记录
     较为常见的即为PTR记录
     名称为逆向‘主机’地址 

# 在/var/named目录下创建反向解析区域数据库文件
$TTL 600
@       IN      SOA     ns.johnson.com.  admin.johnson.com. (
                2016040914
                2H
                20M
                7D
                3H )
        IN      NS      ns.johnson.com.
        IN      NS      ns2.johnson.com.
3.17    IN      PTR     www.johnson.com.
2.17    IN      PTR     ns2.johnson.com.
4.17    IN      PTR     img.johnson.com.

#完成保存退出,检测区域文件语法错误
[root@johnson-linux ~]# named-checkzone "18.172.in-addr.arpa" /var/named/172.18.zone 
zone 18.172.in-addr.arpa/IN: loaded serial 2016040914
OK

# 修改文件属主属组及文件权限
[root@johnson_server ~]# chown root:named /var/named/172.18.zone
[root@johnson_server ~]# chmod 640 /var/named/172.18.zone
数据
# 没有任何语法错误,则启动重载一下服务
[root@johnson-linux ~]# service named reload
Reloading named:                     [  OK  ]


    注意:逆向解析库文件name为‘主机地址’,会自动以区域名字补全网络号
    逆向解析文件的FQDN必须给全,不能使用简写

   

    3.测试反向解析是否正常

[root@johnson-linux ~]# dig -x 172.18.17.3 @172.18.17.2

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -x 172.18.17.3 @172.18.17.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52862
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:       # 发出的请求
;3.17.18.172.in-addr.arpa.    IN    PTR

;; ANSWER SECTION:      # DNS服务器返回答案,反向解析成功
3.17.18.172.in-addr.arpa. 600    IN    PTR    www.johnson.com.

;; AUTHORITY SECTION:
18.172.in-addr.arpa.    600    IN    NS    ns.johnson.com.
18.172.in-addr.arpa.    600    IN    NS    ns2.johnson.com.

;; ADDITIONAL SECTION:
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2

;; Query time: 1 msec
;; SERVER: 172.18.17.2#53(172.18.17.2)
;; WHEN: Sat Apr  9 20:57:15 2016
;; MSG SIZE  rcvd: 138


以上都是基于自己手动编辑的主配置文件进行的,可以直接使用原来的主配置文件/etc/named.conf

和区域配置文件/etc/named.rfc1912.zones,添加区域直接往里面写即可

    主配置文件:

    全局配置段:
        options { ... }
    日志配置段:
        logging { ... }
    区域配置段:
        zone { ... }

    要点:

     1.服务监听端口:
      listen-on port 53 { 127.0.0.1; };
      默认监听与本地的主机,若要改为监听任意主机,将配置文件中此行
      使用//注释即可,或者括号内容改为{ any; },注意前后需要有空格

     2.allow-query   { localhost; }
      此项定义允许查询的主机范围,localhost为只允许本地计算机查询,若想让其他特定主机查询,{}内改为IP地址即可,若想让所有主机查询,使用//注释或 改为{ any; } 即可          
        
     3.recursion yes;
      是否允许递归,yes为允许,no为不允许

wKiom1cJ07awD8FUAACf5p99ZZg869.png
    




主从同步:

    为了防止一个DNS服务器出现宕机或压力过大,往往要配置多台辅助DNS服务器,此时就涉及到主从

    数据同步的问题

    

    区域传送:
     辅助DNS服务器向主DNS服务器或其他辅助DNS服务器请求数据传输的过程
     完全区域传送:传送区域的所有数据,AXFR
     增量区域传送:传送区域中改变的数据,IXFR

    在设立了主从DNS服务器之后,从服务器每隔一段时间就会到主服务器上查询区域数据,看看是否发

    生变化,以保证数据的准确性;当主服务器修改区域数据时,版本号发生改变,将会通知从服务器数

    据发生变化,从服务器便会执行同步操作
   

    注意:主从DNS服务器的BIND版本最好能保持一致,从服务器BIND版本不能低于主服务器,可以是

    等于或大于


从DNS服务器配置:

    我这里使用虚拟机实现,创建一台新的centos6.7,IP地址为172.18.17.2

    named主配置文件不再手动创建,直接使用原来的,简单做一下注释

   

    其实在配置从服务器的第一部要先向上级授权,就是.com,否则在互联网上,从DNS服务不会被找

    到,但我们这里是测试,所以忽略这一步

        
    1.安装BIND并配置从服务器区域文件信息
      编辑/etc/named.rfc1912.zones,添加条目
                       
    正向解析区域配置

zone "johnson.com" {
        type slave;
        masters { 172.18.17.16; };
        file "slaves/johnson.com.zone";  #从服务器区域文件存放
        allow-transfer { none; };    #设置传送权限,不允许其他主机传送
};

     

    反向解析区域配置        

zone "18.172.in-addr.arpa" {
        type slave;
        masters { 172.18.17.16; };
        file "slaves/18.172.zone";
         allow-transfer { none; };
};

# 配置完后,检测语法错误,无报错启动服务
[root@johnson_server ~]# service named start
Starting named:                                            [  OK  ]

             
    注意:

     1.从服务器不需要创建区域数据文件,会自动从主DNS服务器中复制,只要在添加区域是设定好

     区域文件目录为/var/named/slaves/file_name.zone 即可

     2.基于安全考虑,从服务器应设置为不接受任何人的转,发使用allow-transfer { IP; };,实现

     区域数据安全传输控制

    
    2.在主DNS服务器添加从DNS服务器NS条目和A或PTR条目
                
     正向解析区域数据文件添加从服务器资源条目:
     编辑/var/named/johnson.com.zone

    IN  NS  ns2
ns2  IN  A   172.18.17.2


     反向解析区域数据文件添加从服务器资源条目:
     编辑/var/named/172.18.zone

       IN  NS  ns2.johnson.com.
2.17    IN  PTR  ns.johnson.com.

   

    若无语法错误,重载主DNS服务和从DNS的服务 

# 服务重启后,区域数据已经复制过来了
[root@johnson_server ~]# ls /var/named/slaves/
18.172.zone  johnson.com.zone


    3.测试从服务器是否能完成解析

[root@johnson_server ~]# dig -t A www.johnson.com @172.18.17.2 #指定为从DNS服务器地址

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www.johnson.com @172.18.17.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61007
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.johnson.com.        IN    A

;; ANSWER SECTION:
www.johnson.com.    600    IN    A    172.18.17.3   # 成功解析

;; AUTHORITY SECTION:
johnson.com.        600    IN    NS    ns.johnson.com.
johnson.com.        600    IN    NS    ns2.johnson.com.

;; ADDITIONAL SECTION:
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2


# 反向解析-------------------------------------------------------
[root@johnson_server ~]# dig -x 172.18.17.3 @172.18.17.2

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -x 172.18.17.3 @172.18.17.2
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36439
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;3.17.18.172.in-addr.arpa.    IN    PTR

;; ANSWER SECTION:
3.17.18.172.in-addr.arpa. 600    IN    PTR    www.johnson.com.

;; AUTHORITY SECTION:
18.172.in-addr.arpa.    600    IN    NS    ns2.johnson.com.
18.172.in-addr.arpa.    600    IN    NS    ns.johnson.com.

;; ADDITIONAL SECTION:
ns.johnson.com.        600    IN    A    172.18.17.16
ns2.johnson.com.    600    IN    A    172.18.17.2

    

 区域增量传送就不演示了,也没办法演示实时的效果,要注意的是,在主从DNS服务配置完成之后,每次修改主DNS服务器的区域数据都要将版本号修改(大小加1即可),这样这样从服务器才会更新




子域授权:
    (1)在主DNS服务器的区域数据文件中添加以下内容:
     1.NS条目添加子域名称,如test.johnson.com
     2.子域对应的A记录

# 添加如下资源记录
test    IN      NS      ns.test      
ns.test IN      A       172.18.17.5

   

    (2)在新的DNS服务器中添加以下内容:
     1.添加区域(以子域名称命名)
     2.创建区域数据文件

# 定义zone
[root@johnson_linux named]# vim /etc/named.rfc1912.zones
zone "test.johnson.com" IN {
        type master;
        file "test.johnson.com.zone";
};

# 创建区域数据文件
$TTL 600
@       IN      SOA     ns.test.johnson.com.    admin.test.johnson.com. (
                2016041010
                2H
                20M
                7D
                3H )
@       IN      NS      ns
ns      IN      A       172.18.17.5
www     IN      A       172.18.17.6

    注意:在父域zone中添加的子域记录只是授权作用,把父域和子域联系起来,不能做解析,需要转发到子域DNS服务器才能解析

    

    测试是否能正常解析(父域为DNS为172.18.17.16,子域的DNS地址为172.18.17.5)

# 测试父域是否能解析子域
[root@johnson-linux named]# dig -t NS test.johnson.com @172.18.17.16

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t NS test.johnson.com @172.18.17.16
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31281
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;test.johnson.com.        IN    NS

;; ANSWER SECTION:    # 解析成功
test.johnson.com.    600    IN    NS    ns.test.johnson.com.

;; ADDITIONAL SECTION:
ns.test.johnson.com.    600    IN    A    172.18.17.5

# 测试子域DNS是否能正常解析
[root@johnson_linux named]# dig -t A www.test.johnson.com @172.18.17.5

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www.test.johnson.com @172.18.17.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5725
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.test.johnson.com.        IN    A

;; ANSWER SECTION:    #
www.test.johnson.com.    600    IN    A    172.18.17.6

;; AUTHORITY SECTION:
test.johnson.com.    600    IN    NS    ns.test.johnson.com.

;; ADDITIONAL SECTION:
ns.test.johnson.com.    600    IN    A    172.18.17.5

注意:此时子域只能解析自己服务器定义的zone的主机,无法解析父域的主机





区域转发:
    在默认情况下,任何不属于自己解析区域的主机,都将转发给根
    客户端请求的主机不属于自己解析的区域,而又不想转发给根,想直接转发给指定的能够解析此主机的DNS服务器,就需要配置区域转发

    定义一个要转发的zone

     如:在上面的提到子域中转发johnson.com这个域的所有主机,子域本身不能解析父域的主机

# 定义转发的zone
[root@johnson_linux named]# vim /etc/named.rfc1912.zones
zone "johnson.com" {
        type forward;
        forwarders { 172.18.17.16; };
        forward only;
};

# 重启服务后测试这时是否能解析解析父域的主机
[root@johnson_linux named]# dig -t A www.johnson.com @172.18.17.5 #本机DNS

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6_7.7 <<>> -t A www.johnson.com @172.18.17.5
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 65094
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;www.johnson.com.        IN    A

;; ANSWER SECTION:
www.johnson.com.    595    IN    A    172.18.17.3  # 有结果,成功转发

;; AUTHORITY SECTION:
johnson.com.        595    IN    NS    ns2.johnson.com.  #答案来自于父域的DNS
johnson.com.        595    IN    NS    ns.johnson.com.

;; ADDITIONAL SECTION:
ns.johnson.com.        595    IN    A    172.18.17.16  # 父域DNS的IP
ns2.johnson.com.    595    IN    A    172.18.17.2

    forward only|first
     only:代表此域仅做转发,即使转发的服务器不做回应也不再向根请求
     first:表示先做转发,若转发的服务器无响应,则自己去找根

    在named.conf的options定义格式:
     forward first|only
     forward { IP; };
        
    要点:
     1.添加特定的转发区域,定义一个zone即可
     2.不属于自己解析的主机都转发到指定的DNS服务器,在named.conf的options中定义即可       



安全控制选项:
    allow-transter { IP|none;};

    主从传送控制,通常需要开启

        一般主填写从服务器,从填写none,不允许任何人传送

    allow-query{ IP; };

        一般不启用此设置,此项一般仅用于缓存名称服务器,仅对本地开放       

    allow-recursion{ IP; };

        设置允许递归的白名单,可以使用网络,如172.18.0.0/16

    allow-update{};

        设置是否允许动态更新区域数据文件的主机IP,此项一般为{ none;},不建议开启,安全风险很

    大,动态更新一般基于DHCP服务器的动态地址分配   

    ACL:访问控制列表

     通常定义acl列表在主配置文件name.conf的上方(options的上方)

     内置列表:
      any:任何主机
      none:无
      local:本机
      localnet:本机所在的网络
    

     自定义:
      acl NAME {
       172.18.17.1/16
       192.168.1.19/24
        ...
       };

    当需要在多个zone中的安全控制选项中定义大量的主机,为了方便修改,ACL访问控制列表就起到很好的作用,只要定义好一个主机列表,将列表名称填上即可,列表名即表示此列表中的所有主机

   

--END