DNS系统概述
 DNS系统作用
     a) DNS,简单地说,就是Domain Name System,翻成中文就是“域名系统”。主要的功能就是将人易于记忆的Domain Name与人不容易记忆的IP Address作转换。
      b) DNS提供正向解析和反向解析
          正向解析:根据主机名称(域名)查找对应的IP地址。
          反向解析:根据IP地址查找对应的主机域名

 DNS系统结构
  系统结构原理
  目前DNS采用的是分布式的解析方案。互联网管理委员会规定,域名空间的解析权都归根服务器所有,也就是说,根服务器对互联网上所有的域名都享有完全的解析权!根服务器把com结尾的域名解析权委派给其他的DNS服务器,以后所有以com结尾的域名根服务器就都不负责解析了,而由被委派的服务器负责解析。而且根服务器还把以net,org,edu,gov等结尾的域名都一一进行了委派,这些被委派的域名被称为顶级域名,每个顶级域名都有预设的用途,例如com域名用于商业公司,edu域名用于教育机构,gov域名用于政府机关等等,这种顶级域名也被称为顶级机构域名。根服务器还针对不同国家进行了域名委派,例如把所有以CN结尾的域名委派给中国互联网管理中心,以JP结尾的域名委派给日本互联网管理中心,CN,JP这些顶级域名被称为顶级地理域名。


  wKiom1YWLQKylboeAACC5Gy8wdw029.jpg


  每个被委派的DNS服务器同样使用委派的方式向下发展,例如和讯公司想申请使用hexun.com域名,这时和讯就要向负责.com域名的DNS服务器提出申请,只要hexun.com还没有被其他公司或个人使用,而且申请者按时足额缴纳了费用,负责.com域名的服务器就会把hexun.com域名委派到和讯公司自己的DNS服务器60.28.251.1。只要DNS服务器使用委派,域名空间就会逐步形成现有的分布式解析架构。这种架构把域名解析权下放到各公司自己的DNS服务器上,既有利于及时更新记录,同时对平衡流量压力也很有好处。

  全球13台根节点
   A INTERNIC.NET(美国,弗吉尼亚州) 198.41.0.4
   B 美国信息科学研究所(美国,加利弗尼亚州) 128.9.0.107
   C PSINet公司(美国,弗吉尼亚州) 192.33.4.12
   D 马里兰大学(美国马里兰州) 128.8.10.90
   E 美国航空航天管理局(美国加利弗尼亚州) 192.203.230.10
   F 因特网软件联盟(美国加利弗尼亚州) 192.5.5.241
   G 美国国防部网络信息中心(美国弗吉尼亚州) 192.112.36.4
   H 美国陆军研究所(美国马里兰州) 128.63.2.53
   I Autonomica公司(瑞典,斯德哥尔摩) 192.36.148.17
   J VeriSign公司(美国,弗吉尼亚州) 192.58.128.30
   K RIPE NCC(英国,伦敦) 193.0.14.129
   L IANA(美国,弗吉尼亚州) 198.32.64.12
   M WIDE Project(日本,东京) 202.12.27.33

  查询方式及过程:
   名称查询从客户端计算机开始,不能就地解析(hosts文件)查询时,可根据需要查询DNS服务器来解析名称。
   服务器端如果找到请求的答案:为肯定应答,本地要缓存。如果找不到:为否定应答,本地也要缓存,免得它以后老是问还要再次花时间迭代找答案。
   从本地客户端到服务器是属于递归查询,而服务器之间就是迭代查询,整个查询过程如下图:


   wKioL1YWLXOhSKKkAAIGAw2R17M673.jpg


DNS服务器类型
  主要分主域名服务器(权威)、从域名服务器、缓存域名服务器(非权威)3种

  主域名服务器:
  特定DNS区域的官方服务器,具有唯一性
  负责维护该区域内所有域名->IP地址的映射记录
  对区域的所有更新都通过此服务器进行

  从域名服务器:
  也称为辅助域名服务器
  其维护的 域名->IP地址记录 来源于主域名服务器
  只从同一个区域的主服务器或其他从服务器同步区域数据库文件

  缓存域名服务器(非权威):
  也称为唯高速缓存服务器
  通过向其他域名服务器查询获得域名->IP地址记录,将查询结果缓存到本地,提高重复查询时的速度


BIND域名服务基本安装及配置文件说明
 BIND的安装与服务管理
  yum -y install bind 就可以完成安装。安装后/etc/init.d/下启动脚本为named,服务名称也为named
 
 BIND的配置文件说明
  主配置文件:/etc/named.conf,里面至少有三个区域,根、localhost、127.0.0.1
  区域数据库文件:/var/named/

  运行用户和组:都是named

  主配置文件named.conf
  options{
   //全局选项
  };     每一行必须以;结尾,{} 里面两侧必须有空格

  zone "zone name" {
   //定义区域 
  }

  logging{
  //定义日志系统
  }


  区域类型:
  type{hint|master|slave|forward} 分别是根、主、从、转发


  端口和监听地址:
      listen-on port 53 { 0.0.0.0; } 这样写是不行的,ss -tunl可以检查到没有监听到相应端口
       listen-on port 53 { 127.0.0.1; 192.168.1.1; }这样是正确的
      //listen-on port 53 { 127.0.0.1; } 把源文件这条注释,就可以监听所有地址和端口了


  以下三条是统计数据用的:
     dump-file   "/var/named/data/cache_dump.db";
      statistics-file "/var/named/data/named_stats.txt";
      memstatistics-file "/var/named/data/named_mem_stats.txt";


  安全控制选项:
     allow-transfer{} 通常都需要启用,从服务器
     allow-query{}; 默认只允许本地查询,此项仅用于服务器是缓存名称服务器时,只开放查询功能给本地客户端
     //allow-query     { localhost; }; 注释后就允许所有人查询了
     allow-recursion{可以使用网段}; 允许递归的白名单.是否允许递归,如果要给别人使用,必须要yes
     allow-update{ none; } 允许动态更新数据文件的主机白名单

     dns安全加强选项:
      dnssec-enable yes;
      dnssec-validation yes;
      dnssec-lookaside auto;


  ACL:BIND支持使用访问控制列表
      acl ACL_NAME{
         172.16.0.0/16
         192.168.0.0/24
         127.0.0.0/8
       }

     访问控制列表只有定义后才能使用,通常acl要定义在named.conf的最上方
     BIND有四个内置的acl:
       any:任何主机
       none:无一主机
       local:本机
       localnet:本机所在的网络   

     注意:
     配置文件的默认选项有很多我们是用不上的,listen-on port,allow-query 注释就好
     区域数据库文件的权限必须是:640,属主属组权限 root:named
     区域数据库文件的检查:
      named-checkzone "a.com" /var/named/a.com.zone 区域名,区域文件
      或
      service named configtest  同时检查主配置文件和区域配置文件


 区域数据库文件详解

  区域数据库文件的一些写法(假如这里的区域名称是a.com,主机名dns.a.com):
   a.com. IN  NS  dns.a.com.
   @  IN  NS  dns
     IN  NS  dns
   这三种写法是一样的

   例如上面第二条dns后面不加. 会自动在后面补上区域自身名字,等于dns.a.com
   如果要写全,必须把最后一个.写上,例
www.a.com.

     
  SOA记录(第一条记录):
   name:  只能是区域名称,例:a.com.  通常可以用@简写
   value: 必须是主DNS服务器的FQDN
   SOA必须是区域数据库文件的第一条记录

   例:
   @(引用区域名称) 600  IN(关键字)  SOA (类型) ns.a.com. (主DNS名字)  dnsadmin.a.com. (邮箱地址,其中不用用@,用.代替) (
   serial number ; 序列号,这里;为注释,十进制数字,不能超过10位,通常使用日期,例如2014031001
   refresh time ;刷新时间,每隔多久到主服务器检查一次
   retry time ;重试时间,应该小于refresh time
   expire time ;过期时间
   negative answer ttl ;否定答案的ttl,客户端缓存的时间,设定过长会导致无法立即生效,设定过短导致客户端频繁请求
   )


  SOA后的记录基本格式:
   name [ttl] IN RRtype Value
   例:
   www  600  IN A  1.2.3.4
   
www.a.com. 600  IN  A   1.2.3.4
   注意:
   1.$TTL 600 可以在开头定义一个ttl用于全局
   2.$ORIGIN magelinux.com.  如果不放心,还可以定义区域名称,就是给下面@引用的


  NS记录格式说明:
   可以有多个
   name:区域名称,通常可以简写为@,即引用区域名称
   value:DNS服务器的FQDN,可以使用相对名称
   注意:任何一个NS记录,必须有一条对应的A记录
   例:
   @ 600  IN NS  ns.dx.com.
   ns.dx.com. IN A 192.168.1.201 
 


  A记录格式说明:
   只能定义在正向区域数据库文件中
   name:FQDN(可以使用相对名称)
   value IP

   例: 当2条记录主机名相同,IP不相同时,目的是实现简单的负载均衡,当第一次访问www.a.com指向1.2.3.4,第二次就到1.2.3.5,还有其他的话继续轮询,可以设置N个
   www  600  IN  A   1.2.3.4
   www  600  IN  A   1.2.3.5

   当IP相同,有多个不同主机名,只是实现不同名称指向同一IP
   www  600  IN  A   1.2.3.4
   ftp  600  IN  A   1.2.3.4


  MX记录格式说明:
   可以有多个
   必须给一个A记录
   name:区域名称,用于表示smtp服务器
   value:包含优先级和FQDN
    优先级:0-99,数字越小,级别越高
   
   例:(如果第一个没响应就找第二个)
   @ 600 IN MX  10 mail(注意没加. 会自动补上区域名称 )
   @ 600 IN MX  20 mail


  PTR记录格式说明:
   方向解析,IP -> FQDN,只能定义在反向区域数据库文件中
   反向区域名称为逆向网络地址加.in-addr.arpa.后缀组成
   name:IP,主机地址反过来写,例:172.16.100.7的name为7.100.16.172.in-addr.arpa.
   value:FQDN
   例:
   201.1.168.192.in-addr.arpa. 600 IN PTR
www.a.com. 这里的1.168.192.in-addr.arpa为区域名称
   或简写成
   201 600 IN PTR
www.a.com.  会自动补上区域名称1.168.192.in-addr.arpa


  反向解析区域数据库文件:
      可用正向文件直接修改,SOA和NS一样的,只是不需要MX记录和A记录
      区域名称以逆向的网络地址,并以.in-addr.arpa为后缀
      第一条必须SOA
      应该具有NS记录,但不能出现MX和A记录
      较常见的即为PTR记录
       名称为逆向的主机地址
       例:
       @  IN  SOA  dns.magelinux.com. dnsadmin.magelinux.com. (
           2014031001 序列号
           1H 刷新时间
           5M  重试时间
           3D 过期时间
           12H 客户端缓存时间
       )
         IN  NS  dns.magelinux.com.
       7  IN  PTR dns.magelinux.com.
       1  IN  PTR
www.magelinux.com.
       2  IN  PTR mail.magelinux.com.


使用BIND构建域名服务器-主从DNS服务器

 主从间区域数据库文件的传输有两种方式:完全和增量
 辅服务器自主服务器开始启用,就会自动完整同步一次区域数据库文件,然后每隔一段时间增量同步一次。如果在请求同步时,主服务器没有响应,先隔一段时间重复请求,还是没有响应的话,辅服务器会认为主服务器已经不对这区域提供服务了,它自己也不会再对这区域提供服务

 主服务器有通知机制:
  当主服务器修改了区域数据库文件后,会主动通知辅服务器 


 主从同步配置:
  1.编辑主服务器配置文件named.conf,在需要同步的区域中添加transfer
   例(如有反向解析也可以添加):
   zone "dengxi.com" IN {
          type master;
     file "dengxi.zone";
     allow-transfer { 192.168.1.200; }; 从服务器地址,可以多个
    };
 
    zone "1.168.192.in-addr.arpa" IN {
     type master;
     file "1.168.192.zone";
     allow-transfer { 192.168.1.200; }; 从服务器地址,可以多个
    };

   2.编辑对应区域数据库文件,增加从服务器NS和A记录
    正向区域数据库文件和反向区域数据库文件都需要修改
    例:
    正向区域数据库文件:
    $TTL 600
      @   IN  SOA dengxi.com. admin.dengxi.com. (
                 0
                 1H
                 5M
                 3D
                 10H
      )
      @   IN  NS  dns1.dx.com.
      @   IN  NS  dns2.dx.com.
      dns2.dengxi.com.    IN  A   192.168.1.200
      dns1.dengxi.com.    IN  A   192.168.1.201
     
www.dengxi.com.     IN  A   192.168.1.201

      反向区域数据库文件:
       1 $TTL 600
    @   IN  SOA dengxi.com. admin.dengxi.com. (
                  0
                  1H
                  5M
                  3D
                  10H
      )
    @   IN  NS  dns1.dx.com.
    @   IN  NS  dns2.dx.com.
    200 IN PTR dns2.dx.com.
    201 IN  PTR dns1.dx.com.
    209 IN PTR 
www.dengxi.com.


   3.从服务器安装bind和修改named.conf文件
    yum -y install bind
    修改配置文件
    zone "dengxi.com" IN {
          type slave; 指定为从服务器
          file "slaves/dengxi.com.zone";
          masters { 192.168.1.201; }; 主服务器指定,可以多个
   };

   zone "1.168.192.in-addr.arpa" IN {
          type slave; 指定为从服务器
          file "slaves/1.168.192.zone";
          masters { 192.168.1.201; }; 主服务器指定,可以多个
   };
   
   检查配置文件没有问题后,启动named服务生效,会自动复制生成区域数据库文件。


   注意:(1).正反区域数据库文件要放slaves目录下,系统已经预留,设置好权限的,文件名要和主服务器一致!
         (2).主从可以不再同一网段,只要能通信即可
         (3).向区域中添加从服务器的关键两步
           在上级获得授权
           在区域数据文件中为从服务器添加一条NS记录和对应的A或PTR记录(如果有做反向解析的话)
         (4).同步后,只要主服务器修改了配置,都要service named reload和把区域数据库文件中的序列号+1


使用BIND构建域名服务器-子域授权:
 用途:例如dengxi.com这个域上面有1台DNS服务器,当公司内某些部门越来越庞大,例如技术部,需要把它单独划分一台DNS服务器来处理tech.dengxi.com,他们下面还可以有
www.tech.dengxi.com、mail.tech.dengxi.com等


 实现步骤:
  1.在主DNS服务器上,编辑对应的正向区域数据库文件,例如这里的dengxi.com.zone添加
   tech IN  NS  tech.dx.com. 
   tech.dx.com. IN A 192.168.1.33  加上相应的A记录
   
   如果子域上有主从两台DNS服务器,可以这样
   tech IN  NS  tech.dx.com.
   tech IN  NS  tech2.dx.com.  
   tech.dx.com. IN A 192.168.1.33
   tech2.dx.com. IN A 192.168.1.38

   这里要注意! 当添加的NS记录,如果写有名称,就是当成子域的配置,一般为@或留空。
   还有,为了从服务器也同步,配置文件修改后,序列号要加1哦
  
  2.在新的tech.dx.com主机上安装bind,建立区域数据库文件时,SOA记录那里区域名称改为tech.dengxi.com 就可以了
   yum -y install bind
   然后编辑/etc/named.conf,增加区域
   zone "tech.dx.com" IN {
    type master;
    file "tech.dx.com.zone"
   }

   再编辑区域数据库文件:
   vim /var/named/tech.dx.com.zone
   $TTL 600
   @ IN SOA tech.dx.com. dnsadmin.tech.dx.com. (
     0
     1H
     5M
     3D
     10H
   )
   @ IN NS tech.dx.com.
   @  IN MX mail.tech.dx.com.
   tech.dx.com. IN A 192.168.1.33
   mail.tech.dx.com. IN A 192.168.1.34
   
www.tech.dx.cm. IN A 192.168.1.35


使用BIND构建域名服务器-区域转发设置:
 解析某本机不复制的区域内的名称时不转发给根,而是转给指定的主机
 例如上面配置的子域授权服务器,在子域服务器上是不能解析
www.dx.com的,它自己解析不了就要转给根了,我们可以配置区域转发,指定转发给父域服务器解析,不过如果父域不响应的话,还是要配置再转给根解析
 方法:
 编辑子域服务器/etc/named.conf 加上
 zone "dx.com" IN {
  type forward; 指定类型:转发
  forwarders { 192.168.1.201;192.168.1.200; }; 指定转发服务器,可以多个
 };

 注意:

  1.留意named.conf里的include "/etc/named.root.key";这行有可能导致一些问题,如有问题可以注释试试

  2.Forward first|Only 这里默认是first,如果不写就是默认first
   forwarders { IP; }
  这个参数只表示:如果 forwarders list 为非空,默认为first值,服务器首先请求 forwarders list ,如果 forwarders list 中的DNS主机不应答,该主机将自己去找应答,如果设置值为only,服务器将只会请求 forwarders中的DNS主机



使用BIND构建域名服务器-缓存域名服务器

 1.安装bind,yum -y install bind
 2.修改/etc/named.conf配置文件(其实安装完什么都不用修改,启动后就是缓存服务器了)
  根据需要注释:
   listen-on port 53 { 192.168.1.201; };
    listen-on-v6 port 53 { ::1; };
    allow-query     { localhost; };
    ...

  3.启动服务即可:service named start


使用BIND构建域名服务器-分离解析的域名服务器(基于View的智能DNS)

 分离解析的域名服务器实际还是主域名服务器,这里所说的分离解析,主要是指根据不同客户端提供不同的域名解析记录。例如公司内外有WEB服务器(www.dengxi.com),当DNS服务器面向internet和企业内部局域网同时提供服务时,DNS为内网客户端把www.dengxi.com解析为内网IP(192.168.1.5),把internet上请求解析为公网IP,外网就可以通过NAT访问内网的服务器,而局域网内用户直接访问,减轻了网关地址转换的负担。
  我们以上面配置好的主从域名服务器基础上来做分离解析的域名服务器。
  
  (1) 编辑/etc/named.conf文件,只要使用view把对应的区域分成内、外网就可以
  view "LAN" IN { //设置面向内网用户的视图
   match-clients {192.168.1.0/24;}; //匹配来自内网的客户端地址
   zone “dengxi.com” IN {
   type master ;
   file "dengxi.com.zone.lan"; //指定面向内网用户的地址数据库文件
   };
  };
  
  view "WAN" IN { //设置面向外网用户的视图
   match-clients {any;}; //匹配来自外网的客户端地址,any 为任意
   zone “dengxi.com” IN {
   type master ;
   file "dengxi.com.zone.wan"; //指定面向外网用户的地址数据库文件
   };
  };

  注意将包含match-clients {any;};的view 配置段放在文件中的最后一部分,否则会
导致其后的view 配置段失效(找到一个匹配结果后即不再继续向下匹配)。


  (2) 编辑相应的dengxi.com.zone.lan和dengxi.com.zone.wan文件
   dengxi.com.zone.lan:
   $TTL 600
      @   IN  SOA dengxi.com. admin.dengxi.com. (
                 0
                 1H
                 5M
                 3D
                 10H
      )
      @   IN  NS  dns1.dx.com.
      @   IN  NS  dns2.dx.com.
      dns2.dengxi.com.    IN  A   192.168.1.200
      dns1.dengxi.com.    IN  A   192.168.1.201
     
www.dengxi.com.     IN  A   192.168.1.201

      dengxi.com.zone.wan:
   $TTL 600
      @   IN  SOA dengxi.com. admin.dengxi.com. (
                 0
                 1H
                 5M
                 3D
                 10H
      )
      @   IN  NS  dns1.dx.com.
      @   IN  NS  dns2.dx.com.
      dns2.dengxi.com.    IN  A   173.16.1.1
      dns1.dengxi.com.    IN  A   173.16.1.2
     
www.dengxi.com.     IN  A   173.16.1.2 

  (3) 重新启动服务
  (4) 验证分离解析域名服务器

     a)nslookup命令在内网的客户端中解析
www.abc.com
      b)nslookup命令在外网的客户端中解析
www.abc.com