写在前面:

    博客书写牢记5W1H法则:What,Why,When,Where,Who,How。


本篇主要内容:

● tcp/ip回顾

● DNS协议/DNS服务相关概念

● bind安装配置

  正向解析区域

  反向解析区域

  主从服务器

   子域配置

   转发配置

● bind安全设置

  acl访问控制列表

● bind view智能DNS



相关概念回顾:

   tcp/ip

      通信子网--->内核中实现

         传输层

            添加源端口与目标端口等信息。

            由于发送方与接收方的速率可能不同,这样可能会导致数据丢失,所以在传输层的tcp首部信息中设置有“window”(窗口)大小设置。

            裸套接字:

               应用层进程的报文自己有控制功能,不通过TCP和UDP支撑,直接调用互联网层的IP报文,这类报文称为裸套接字报文。

            TCP:Transmission Control Protocol

               面向连接的协议,双方通信之前需要实现建立虚连接。

            UDP:User Datagram Protocol

               用户数据报协议,双方通信之前无需建立虚连接。

            sctp等其他协议

         互联网层

            添加IP等信息,完成网络通讯

         物理层

            添加MAC地址等信息,万层本地通讯,转发、中继

      应用层

         请求信息数据,包或包组

         应用程序来实现各种协议

         如:http/ftp/邮件发送smtp/邮件接收pop3/


   tcp/ip协议中基于sockets的通讯一般为C/S结构的。

   Server端需要时刻监听(listen)在IP:Port上,Client同样需要一组IP:Port信息与Server通信。


DNS:Domain Name Service,应用层协议

   相关概念:

      将域名与IP地址进行相互转换的协议。

      C/S结构

         默认端口为:53/udp、53/tcp

      域名:FQDN(Full Qualified Domain Name)

   层级结构:

      根域:.

         记录顶级域服务器信息,全球目前有13个根

      顶级域:top level domain(tld)

         记录二级域服务器信息

         组织域:

            .com商业机构 .net网络组织 .org非盈利组织 .gov政府部门 .edu教育机构 .mil军工部门

         国家/行政区域:

            .cn中国 .iq伊拉克 .tw台湾 .hk香港 .jp日本

      二级域

         记录三级域服务器信息以及本地域主机信息

         baidu.com域 magedu.com域 com.cn域等

      ...

   DNS查询方式:

      (1)递归查询

         客户端向本地DNS查询记录,当本地DNS中没有对应条目时,DNS服务器去网络中查询,并将结果返回给客户端。

         客户端-->本地DNS

                  |-->根域

                  |-->顶级域 tld

                  |-->二级域

                  |...

      (2)迭代查询

         客户端向本地DNS查询记录,当本地DNS中没有对应条目时,DNS返回根域地址给客户端,客户端依次去查询。

         客户端-->本地DNS

            |-->根域

            |-->顶级域 tld

            |-->二级域

            |...

   DNS名称解析方式:

      以下两种解析方式,不是同一个名称空间、不是同一个目录树、也不是同一个解析库。

      正向解析:FQDN-->IP

      wKioL1cKdB2AH_WGAAAavyxuBk4792.png

      反向解析:IP-->FQDN

      wKioL1cKdCzCHK-LAAAdVYi3Y5M666.png

   域名注册方式:

      万网(国内,需备案)、godaddy(国外站点,无需备案)等代理注册站点。

      注意,一般注册的是二级域名,如baidu.com,而www.baidu.com只是域中的一台主机。

   DNS服务器类型

      不负责解析域名:

         缓存名称服务器

      负责解析至少一个域(也会缓存条目)

         主域名解析服务器

         从域名解析服务器

   服务器返回的解析答案类型

      肯定答案

      否定答案

         不存在查询的键,因此,不存在预期查询的键对应的值。

      权威答案

         返回本DNS服务器直接维护的条目,使用dig命令会有"aa"标识。

      非权威答案

         非本机维护的条目(缓存或转发)

   主-辅DNS服务器

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

      从DNS服务器:从主DNS服务器或其它从DNS服务器那里“复制”一份解析库;但只能进行读操作;(注意“复制”操作是以区域zone为单位的)

         主从服务器协调属性

            序列号:serial

               也即是数据库的版本号;主服务器数据库内容发生变化时,手动设置其版本号递增;

            刷新时间间隔:refresh

               从服务器每多久到主服务器检查序列号更新状况;

            重试时间间隔:retry

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

            过期时长:expire

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

            否定答案的缓存时长:

         注意:时长对应的单位可以是M、H、D、W,对应分钟、小时、天、星期

         另外,当主服务器数据变动时,主服务器会"主动通知"从服务器更新数据;

         区域传送

            全量传送:axfr, 传送整个数据库;一般第一次同步时使用。

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

         区域(zone)和域(domain)

            区域

               正向解析或反向解析的功能与数据库的集合。

           

               如baidu.com这个二级域,包含了正向解析和反向解析区域。

   区域数据库文件zone格式:

      资源记录Resource Record(rr)

      语法:

         name [TTL] IN RR_TYPE value

      记录类型(RR_TYPE)

         SOA

            起始授权记录,必须为第一条,有且只能有一条

            name:当前区域名称

               如“fredme.com.”或“4.3.2.in-addr.arpa.”

            value

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

               (2)当前区域管理员邮箱,其中"@"用"."代替

               (3)主从服务器协调属性定义,放入()内

               (4)“;”后为注释信息

 例:

magedu.com.    86400    IN       SOA    magedu.com.    admin.magedu.com.  (
   2017010801   ; serial
   2H          ; refresh
   10M       ; retry
   1W         ; expire
   1D         ; negative answer ttl 
)

         NS

            域名服务器条目

            name:当前区域名称

            value:当前区域某DNS服务器FQDN名,如ns1.fredme.com

  例:

fredme.com.   86400   IN    NS       ns1.fredme.com.

         MX

           邮件服务器条目

            name:当前区域名称

            优先级:0-99,数字越小,优先级越高,即使只有一个mx服务器,也需要设置优先级

            value:当前区域某邮件交换器的FQDN名

  例:

fredme.com.   IN    MX    10   mx1.fredme.com.

         A

            IPv4-->FQDN条目

            name:FQDN

            value:IPv4地址

  例:

www.fredme.com.   IN    A    1.1.1.1

         AAAA

            IPv6地址条目

            name:FQDN

            value:IPv6

         CNAME

            FQDN别名

            name:FQDN格式的别名

            value:FQDN正式名称

  例:

web.fredme.com.    IN    CNAME    www.fredme.com.

         PTR

            FQDN-->IPv4条目

            仅反向区域文件中配置

  例:

23    IN    PTR    www.gredme.com.

         注意

            (1)TTL可以全局继承。如头部定义$TTL 3600

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

            (3)相邻两条记录name相同时,后者可以省略name项

            (4)正向解析区域文件中,各MX、NS记录中的FQDN应该有对应的A记录


bind安装配置:

   BIND:

      Berkeley Internet Name Domain,ISC.org

      是DNS协议的一种实现软件程序,其主程序名称为named。

   程序包:

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

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

      

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

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

   配置文件:

      主配置文件/etc/named.conf 

         或包含进来其它文件;

            /etc/named.iscdlv.key

            /etc/named.rfc1912.zones

            /etc/named.root.key

         文件格式:

            全局配置段:

               options { ... };

            日志配置段:

               logging { ... };

            区域配置段:

               zone { ... };

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

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

      解析库文件:

         /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

      远程管理bind程序的软件

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

      命令:

         用于named服务控制

         rndc  status

            查看named服务状态

         rndc  stats

            查看统计信息

         rndc  reload/stop/restart

            重读配置文件/停止服务/重启服务

         rndc  flush

            清空named缓存

         

   缓存名称服务器的配置:

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

      监听地址配置:

         修改为外卡IP,以供能够访问此IP的客户端访问DNS服务。

         listen-on port 53;

         listen-on port 53 { 172.16.100.67; };

      关闭dnssec

         初学者建议关闭dnssec

         dnssec-enable no;

         dnssec-validation no;

         dnssec-lookaside no;   

      关闭仅允许本地查询:

         //allow-query  { localhost; };

      注意:

         (1)"{}"左右有空格

         (2)C语言格式的注释信息,单行注释//,多行注释/* */

   检查配置文件语法错误

      named-checkconf   [/etc/named.conf]

   测试工具:

      dig

         用来测试DNS系统,所以不会查询hosts文件中的记录

         正向解析测试

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

            query options:

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

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

         反向解析测试

            dig  -x  IP [@server]

         模拟完全区域传送

            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:要查询的FQDN;


   正向解析区域配置:

      (1)修改主配置文件/etc/named.conf

         options部分:

            listen-on

               修改监听IP地址,此地址为客户端能够访问的地址

            allow-query

               设定允许查询的主机。注释掉,不做限制

            dnssec-enable

            dnssec-validation

               dnssec相关配置,关闭,设置为no

      (2)根据主配置文件的include项,修改/etc/named.rfc1912.zones

         一般自定义zone配置都写入到此文件

         新建自定义zone条目:

            zone  "ZONE_NAME"  IN  {

               type  {master|slave|hint|forward};

               file  "ZONE_NAME.zone"; 

            };   

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

      (3)根据上步骤,新建zone文件

         根据上步配置,假设指明的zone文件为grub2.com.zone,在/var/named/目录新建此文件,内容为:

            $TTL 3600  ;单位为秒

            $ORIGIN grub2.com. ;设定域名

            @   IN       SOA      ns1.grub2.com.    admin.grub2.com. (

               2016041001 ;标识符

               10M ;同步时间

               1H ;重试时间

               1D ;过期时间

               1D ;否定回答的过期时间

               )

               IN       NS       ns1

               IN       MX       10 mx1  ;注意MX记录有优先级值

            ns1   IN       A       192.18.31.7

            mx1   IN       A       192.18.31.6

            www   IN       A       192.168.31.7

               IN       A       192.168.31.6 ;定义多个相同FQDN条目时,客户端每次访问显示顺序不同,相当于进行了负载均衡。省略FQDN表示与上一条目相同。

            web   IN       CNAME    www

         注意:需要修改权限信息以保证数据安全:

            chgrp named grub2.com.zone

            chmod o= grub2.com.zone

      (4)检查配置文件与zone文件,重读配置文件

         named-checkconf

         named-checkzone grub2.com. /var/named/grub2.com.zone

         rndc reload

   反向解析区域配置:

      (1)修改/etc/named.rfc1912.zones文件

         自定义zone条目:

         zone  "ZONE_NAME"  IN  {

               type  master|slave|hint|forward;

               file  "FILE.zone"; 

            };

         补充:

            ZONE_NAME:

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

                  31.18.172.in-addr.arpa

            FILE.zone:

               网段.zone即可

                  172.18.31.zone

      (2)定义zone文件

         假设为:172.18.31.zone

         内容为:

            $TTL 36000

            $ORIGIN 31.18.172.in-addr-arpa 

            @ IN    SOA    ns1.grub2.com. admin.grub2.com. (

               2016041001

               10M

               1H

               1D

               1D

               )

               IN    NS       ns1.grub2.com.

            7   IN    PTR    ns1.grub2.com.

            6    IN    PTR    mx1.grub2.com.

            7    IN    PTR    www.grub2.com.

            6    IN    PTR    www.grub2.com.

         补充:

            反向解析区域zone文件也可以设置CNAME条目,但与正向解析zone不同,应该填写IP


   主从服务器:

      从服务器是区域(zone)级别的同步。

      其他从服务器仍然可以从从服务器同步,即级联

      负载均衡:

         即多台DNS服务器都发挥作用为客户端提供服务的实现。

         (1)将本地客户端的DNS顺序修改一下,一部分将主服务器设置为主DNS,一部分将从服务器设置为主DNS

         (2)由上级完成,告知上级DNS服务器有多台服务器,由上级分发到不同服务器上。

      服务器原则:

         (1)只给本地客户端递归查询

         (2)非本地客户端只提供本地管理的域名的查询

      从DNS配置方法:

         (1)定义区域

            指名类型为从服务器(slave)

            zone "ZONE_NAME" IN {

               type slave;

               file "slave/ZONE_NAME.zone";

               masters { MASTER_IP; };

            };

            注意:之所以将zone文件指定到salve目录下,是为了安全,默认/var/named/目录对named组没有写权限,而修改权限势必会有安全隐患,所以选择在salve子目录是非常明智的。

         (2)检查配置文件,重载配置或重启服务

            named-checkconf

            rndc reload

         注意:

            a.需要确保主服务器的区域数据文件中为此从服务器配置了NS记录以及对应的A或PTR记录,修改区域文件后记得序列号修改一下。

            b.主服务器应该设置访问控制,只允许从DNS进行区域传送。

            c.需要注意系统时间需要同步,这样才能保证后续同步操作。

               ntpdate命令。

      子域配置:

         (1)正向解析区域授权子域:

            只需要在上级域中添加子域的NS记录以及对应的A记录即可

               子域名称 IN NS 子域域名服务器的FQDN

               子域服务器FQDN IN A NS_IP

                  例:

                     ops.grub2.com.   IN    NS    ns1.ops.grub2.com.

                     ns1.ops.grub2.com. IN A 172.18.31.9

               注意:如果子域有主从等多台服务器,需要在上级域中记录多条。

         (2)子域服务器配置

            正常配置属于此子域的主机或其子域即可。


      定义转发:

         当客户端从子域DNS服务器查询父域中定义的域名条目时,由于子域中没有相关记录,所以子域DNS默认会去根域服务器递归查询,而这样做显然没有必要。比如,客户端向ops.grub2.com的域服务器请求"www.grub2.com"域名对应IP地址。

         当本地查询不到条目时,设置转发到其他特定服务器。

         注意!只有允许递归查询的客户端请求才会被转发。参照下面访问控制指令。

         区域转发

            仅转发某特定区域的解析请求

            zone "ZONE_NAME" IN {

               type forward;

               forward first|only;

               forwarders { SEREVER_IP; ... };

            };

            first:首先转发。服务器不响应时,再去迭代查询

            only:只转发。

         全局转发

            凡本地未定义区域,全部转发给其他服务器。

            在/etc/named.conf配置文件的开头options {}中添加

               forward only|first;

               forwarders { SERVER_IP; ... };

   

   bind安全相关配置:

      acl:

         访问控制列表

         将1个或多个地址归并为一个集合,通过集合对集合中所有地址进行统一调用。

         由于acl只能先定义再使用,所以建议放到配置文件最前端。

         在主配置文件/etc/named.conf最前端定义:

            acl ACL_NAME {

               IP;

               NET/PRELEN;

            };

            注意:网段只支持"/数字"的格式

            如:

               acl localnet {

                  172.18.31.0/24;

                  127.0.0.0/8;

                  172.18.30.7;

               };

         内置acl:

            none:空

            any:任意

            local:本机

            localnet:本机IP所属的网路

         访问控制指令:

            在主配置文件中options {  };中进行配置。

            allow-query {  }; 

              允许查询的主机,白名单

            allow-transfer {  }; 

              允许向哪些主机做区域传送,默认为所有主机,建议设置为仅允许从DNS服务器。

            allow-recursion {  }; 

              允许哪些主机可以向当前DNS服务器发起递归查询请求,默认允许所有主机。

               使用时记得先注销掉options{};中"recursion yes;"条目,此条目表示为所有主机发起递归查询。

            allow-update {  };

              DDNS,允许动态更新区域数据库文件内容。


   bind view

      智能DNS。对不同来源的客户端解析为不同的IP地址。CDN就是利用这种原理。

      view VIEW_NAME {

         zone

         zone

         ...

      };

      如:

      view internal  {

         match-clients { 172.18.0.0/8; };

         zone "grub2.com"  IN {

            type master;

            file  "grub2.com/internal";

         };

      };

      

      view external {

         match-clients { any; };

         zone "grub2.com" IN {

            type master;

            file grub2.com/external";

         };

      };

      注意:view条目是从上到下匹配的,所以,应该将小范围view放到前面。