关于DNS服务器我想大家并不陌生,通常情况下我们都只知道DNS服务器是域名解析用的,如果我们没有DNS服务器那么我们想要访问互联网上的网站什么的就不得不去记忆这些网站的IP地址了。对于我们而言众多的IP地址是很难记忆的而且也不方便。所以就出现过了DNS服务器。主要实现把主机名解析成IP地址,这样就方便我们在网上通信。

通常情况下我们之用到了DNS服务器的正向解析功能,而DNS还有方向解析功能,就是把IP地址解析成主机名的。

 

那么接下来就来跟大家分享一下DNS的工作方式。

 

DNS是基于C/S架构的,服务端是由程序来实现的,而客户端则是一个共享库。

      DNS默认是监听在UDP53端口和TCP53端口。

 

【名称解析】:解析主机名,说白了就是把一种名称转换成另一种名称的过程。

            【名称】:就是字串或者数字(就是我们通常所理解的主机名或者IP

【解析库】:存放名称和地址的对应关系(就是我们的DNS在解析过程中要解析库中查找名称和IP的对应关系)

【解析库存储方式】:1文本文件存储(缺点:文件过大时查找过程较慢,而且在查找过程中会把文件加载至内存中,这样就占用了我们大量的内存)

                   2关系型数据库(支持索引,这样查找起来就只用通过索引列表去查找,但是同样存在一个问题,如果我们的数据上千万行怎么办?这样创建出来的索引目录也会变得相当长,查找起来也是非常不方便的。不过还好关系型数据库支持多级索引,就是给索引再次创建索引。这样就会比较快。)

                   3LDAP (这种方式是监听在TCP389端口,LDAP的速度要比关系型数据库的快10倍不止,因此LDAP的用途就是某些站点拥有很多的用户的话,用来用户名的保存。)

 

【解析】:根据用户提供的一种名称,去查询解析库,以得到另一种名称。

 

如果是这样的话我们就会出现另外一个问题:

全球这么多的主机,那这些关系映射文件存放在哪呢?一台服务器存放行吗?

答案显然是不行的,众多的文件放在一台服务器上,天啊它不坏才怪,就算是不坏你也能想象出你的网速会有多快。

那么该怎么解决这个问题呢,DNS中才用了授权管理机制。

 

DNS授权管理机制】:最大域就是根域,用.表示

                     接下来就是一级域,也就是顶级域(如果把根域比喻成皇帝的话,那么一级域就是宰相,一人之下万人之上。)

                     注:根域和顶级域是特殊的,不能由个人指定。

                     然后就是二级域三级域等,直到最后的主机(这些是可以由公司、组织、个人申请使用的)

 

【简述有权管理机制】:其实授权管理机制很好理解的,就像是皇帝治理国家一样,根域(皇帝)不需要知道各个主机(百姓)的名字,就算是累死他他也记不住啊,根域只需要知道自己直接管理的是谁就行了,别的什么也不用管。

     【例】:一主机向根域申请访问www.baidu.com

            根域收到申请后就问:www.baidu.com这个小弟是由谁负责的?

            然后根域下的一个叫.com的大臣一看是自己辖区内的

            于是这个大臣就回话:回禀吾皇此乃微臣之小弟

            然后根域就说了:好了那这事就交给你了朕就不再管了

            然后叫.com的这个大臣就开始问自己辖区内的小官:www.baidu.com这个小弟是谁带的?

            然后有一个叫.baidu的家臣就回答:回禀老爷这是我的小弟

            然后.com这个大臣就说了:好了这事交给你了老爷我就不再过问了

            然后叫.baidu的这个家臣就在自己众多小弟中找到了叫www的小弟

            然后就把这个小弟的IP地址返回给主机。

            这样主机就知道了www.baidu.comIP地址。

            然后通过路由就能访问www.baidu.com了。

wKioL1PiBbfS_OBHAACzZ5mKVlQ669.jpg


通过上边实例我想大家大致明白了DNS的工作方式,但是又有一个问题出现了。

上述实例过程中,主机具体是怎么问到www.baidu.com的地址呢?

这里有两种方式:

方式1(递归):主机问根域->根域问一级域->一级域问二级域->二级域找到www.baidu.com把信息返回给一级域->一级域再把信息返回给根域->根域再把信息返回给主机

:2(迭代):主机问根域,根域说你去找一级域

               主机问一级域,一级域说你去找二级域

               主机问二级域,二级域把www.baidu.com的信息告诉主机

到底是由哪种方式实现的呢?

实际上DNS是由这来那个种方式结合实现的。

DNS具体实现过程】:事实上我们的主机是不能跟根域直接相连的,在解析过程中我们的主机事先是需要根域在哪的,主机在寻找根域的过程是用的递归的方式,而在找到根域后寻找目标主机时使用的是迭代方式。

注:如果在根域寻找目标主机的过程中使用的递归的方式的话,每次查找到后还要再次反馈给根域那么势必会增加根域服务器的负担,所以为了减少根域服务器的负担,在查找目标主机的过程中使用的是迭代的方式。

 

那么我们想要访问一台主机的话每次都这样去解析是很麻烦的一件事,而且势必会占用我们的带宽和时间。

有没有一种办法让我们第一次解析以后访问都不用再解析呢?

这就需要我们计算机中的缓存了,缓存的功能就是为了减轻DNS服务器的压力,第一次解析完成后就会把这条记录记忆在缓存中,下次访问的时候就会读取缓存中的记录,而不用去找DNS服务器解析。

同样的,DNS服务器中也有缓存,目的就是为了让一台主机访问后其他主机访问的时候不在去找根域解析。大大减轻了服务器的负担。

 

DNS中的名称与对应的主机名不要求是一样的,一个名称可以对应多个IP,一个IP也可以对应多个名称。

 

一级域(顶级域):组织域.com .org .net .mil .edu .gou

                 国家域.cn .us .uk .ip .tw .hk .iq .ir

                 

反向域:.in-addr.arpa(反向解析时使用)

域:domain (逻辑概念)

区域:zone (物理概念)

 

【区域解析库】每一行一个资源记录rrresource record

              资源记录:有类型概念,用于标记此记录解析的属性

              资源记录类型:

                  SOA:起始授权记录,一个区域文件只能有一个

                  NS : name server 标记谁是解析服务器,可有多个

                  MX: 标记谁是域内的邮件服务器,可有多个(有优先级0-99

                  A  : 主机名->IP的映射关系

                  PTRIP->主机名的映射关系

                  AAAA:主机名->IPV6的映射关系

                  CNAME:正式名称   如:A CNAME B AB的别名

注:APTR不能同时出现,一个解析库要么是正向解析库要么是反向解析库。

 

【权威服务器】:负责某域内全部主机的DNS服务器

【非权威应答】:通过本地缓存访问主机

 

DNS服务器类型】:主DNS服务器(权威DNS服务器)、缓存服务器、转发器、从DNS服务器(备DNS服务器)

 

当然了一个网络中只有一台DNS服务器是不安全的,如果哪天这台服务器坏掉了,那么将造成整个网络无法访问外部网络主机。因此我们引入了从DNS服务器。

那么从DNS服务器上的库文件是从哪里来的呢?

既然是主服务器的备用,当然是要跟主服务器的库文件一致了。从服务器会去复制主服务器上的库文件。

如果在复制过程中数据传输出现点小问题,传输的数据是一些错误的怎么办?

所以区域间传输库文件的时候是要基于TCP这种可靠的链接。(这就是为什DNS还要监听在TCP53端口)

那么在传输过程中是每次都要把全部的库文件传输过去还是只是把更新的库文件传输过去呢?

在区域间的传送分为两种:1、完全区域传送

                        2、增量区域传送

注:第一次的传送过程是完全区域传送,之后使用增量区域传送,只传送更新的库文件

那么从DNS服务器是怎么知道主服务的库文件有更新呢?

从服务器会定期发送请求,询问主服务器的库文件是否有改动,如果有改动那就开始传送更新的内容,如果没有更新则等待到下一个周期再次发送请求。

这样从服务器一次又一次的询问要是你是主服务器的话你也会烦死的吧!

其实主服务器的库内容发生变动的时候,主服务器会主动通知从服务器的,主服务器会告诉从服务器:我更新了,你来我这里更新吧。这就是DNS服务器的传送机制:周期性检查+通知

假如某天从服务器给主服务器发送请求,主服务器不理它,过了一段时间从发服务器再次请求,主服务器还是不理它怎么办?

这时从服务器就会很苦逼的一次又一次的发送请求,直到某天主服务器还是没有搭理从服务器,从服务器就认为主服务器一定是down了。这时从服务器也就随主服务器去了,不再工作了,整个网络陷于瘫痪状态。

 

资源记录类型:任何解析库的第一个文件必须为SOA(标记主DNS服务器)

【库文件通用格式】:

name           [ttl]         IN    RRType      

当前域名    缓存时长             记录类型    主机名

【记录类型格式】:

SOAname当前区域名,可简写为@

      值:主DNS的主机名,也可以是当前区域的区域名称

      管理员邮箱

      (serial number:解析库版本号

        Refresh time:周期性同步间隔

        Retry time  :重试时间间隔

        Expire time :过期时长

        Negative answer ttl:否定答案的统一缓存时间 )

【例如】:@      IN    SOA    ns.mageedu.com.  admin.mageedu.com. (

                               20140805

                               1H:一小时

                               2M:两分钟

                               1W:一周

                               2D:两天 )

 

NSname区域名称,可用@简写

值:DNS服务器的FQDN

 

【例如】:@     IN   NS    ns.mageedu.com.

注:1、如果有多台NS服务器,每一个都必须有对应的NS记录。

2、对于正向解析的文件来讲,每一个NSFQDN都应该有一个A记录。

 

MXname区域名称,可用@简写

     值:邮件服务器的FQDN

【例如】:@    IN    MX   10   mail.mageedu.com.

注:1、如果有多台MX服务器,每一个都必须有对应的MX记录,但各MX记录有优先级。

2、对于正向解析文件来讲,每一个MXFQDN都应该有一个A记录。

 

Aname主机的FQDN

   值:主机IP地址

 

【例如】:www.mageedu.com,   IN    A    172.16.0.12

 

 

CNAME:name别名FQDN

        值:FQDN

 

【例如】:www.mageedu.com.   IN   A     172.16.0.12

         wed.mageedu.com.   IN    CNAME  www.mageedu.com.

 

PTR:name:IP逆向的主机IP地址   如:172.16.0.12/16   name为:12.0.in-addr.arpa

值:FQDN

 

【例如】:12.0.in-addr.arpa   IN    PTR    www.mageedu.com.

 

Linux 下的DNS服务的工具:bind

       其服务脚本为:/etc/rc.d/init.d/named

       其主配置文件为:/etc/named.conf     /etc/named.rfc1912.zones

       其区域解析库文件:/var/named/ZONE_NAME.zone

 

Linux 下的DNS安全:服务进程以系统用户的身运行:named  named

                   named进程运行于chroot环境

 

 

【案例】:配置一个mageedu.comDNS服务器,其地址为172.16.249.29,包含的主机有www,mail,pop

注:1、在真实工作环境中我们首先是需要注册域名的;

2、支持泛域名解析,如:*    IN     A     172.16.249.29

     (表示任何主机名的IP都为172.16.249.29

 

安装配置过程1、安装程序包:yum install bind -y

              2、修改主配置文件:

                     定义区域:

                          Options {

                             全局配置段:

                             //directory /var/named;

                          };

                          zone ZONE_NAME IN {

                             type {master|slave|hint|forward};

                             file mageedu.com.zone;

                           };

                           logging {

                              日志段;

                           }

 

                3、为每一个区域提供解析库

                         变量的定义

                         资源记录

【正向解析配置过程实例】

   首先编辑主配置文件

wKioL1PiBffzqOR1AAAheG4jdzk218.jpg

编辑内容如下:

wKiom1PiBPmiP6UlAAJw1NslCZ0993.jpg


注:图片中加红线的内容是需要在前边加//注释掉的。

编辑完主配置文件,我们需要定义区域;

wKioL1PiBi2wZjrWAAAmH7sP4x8699.jpg

在区域配置文件中添加如下内容

wKioL1PiBkLih4eJAAA-mjX-IA0268.jpg

之后我们需要编辑区域文件

wKiom1PiBT7Su3mGAAA26z0LDeM046.jpg

添加如下内容

wKioL1PiBm-RZ_ATAADgsc3a8FM569.jpg

编辑完成后检查一下语法是否有错误并启动一下DNS服务

wKiom1PiBXDBJtAbAAGki913Edk224.jpg

然后为了安全,修改一下文件的属组和权限

wKiom1PiBYzz54lsAADhskLeffw237.jpg

这样就算是做好了一个正向的DNS解析器

我们可以测试一下

wKioL1PiDNOixzzuAADz2EqjHnY409.jpg

wKiom1PiC9KhraIPAADQFzx_yUg122.jpg

wKioL1PiDO3hyzovAAIFNROf8EA044.jpg

配置完正向的DNS解析器后我们还可以配置一个反向的解析器

 

【反向解析器配置】

首先编辑区域文件添加一个反向解析区域

wKiom1PiC_fgdoFaAAAzd5zWMBE587.jpg

添加内容如下

wKioL1PiDSWwAMVYAABA7z-Nf8Y819.jpg

添加完成后我们需要配置反向解析区域库文件

wKioL1PiDT-w6BPSAABT0M_oWUU879.jpg

添加内容如下

wKioL1PiDVSQpLNgAAB8JweF7Xo499.jpg

检查配置文件是否有语法错误

wKioL1PiDWvzGKNxAACALFwYaok369.jpg

重启服务器,然后进行测试

wKioL1PiDYOzjou9AABHErDcXyU796.jpg

wKiom1PiDIKCfMqXAACwAiZ2EnM657.jpg

说明:正向解析和反向解析文件中的名称可以仅使用相对名称,他们均相对当前区域而言。

      绝对后缀可以使用$ORIGIN来定义。

 

【从服务器的配置过程】

在另外一台服务器上我们首先要修改主配置文件,方法同正向解析过程

   首先编辑主配置文件

wKiom1PiDOOhbEI1AAAheG4jdzk876.jpg

编辑内容如下:

wKioL1PiDi3iBcMBAAJw1NslCZ0512.jpg

注:图片中加红线的内容是需要在前边加//注释掉的。

 

然后编辑区域配置文件

wKiom1PiDW3T4q0mAAAwTRfTOpI139.jpg

添加内容如下

wKioL1PiDpyxtcEOAABgyKVJJgE419.jpg

编辑完成后我们只需要在/var/named/slave目录下创建一个名叫congjsh.com.zone的文件

然后主从服务器会自动完成区域传送,无需手动配置。

注:区域传送需要两台服务器的时间保持一致,否则将造成传送出错,可以使用NTP服务器进行时间同步。

两台服务器的bind版本尽量相同,就算是不同,从服务器的版本必须要比主服务器的版本高。

从服务器的添加需要在父域的解析库文件中添加一条从服务器的NS记录。

从服务器与主服务器的关系如下


wKioL1PiDsugvYhgAAEDFTWjU94822.jpg


【区域传送的限制功能】

bind :有内置的ACL

     none表示所有的都不

     any表示任意的

     local表示仅本机

     localnet表示本网络

allow-transfer { IP;IP; } 表示允许括号内的主机递归,其他均拒绝

allow-uodate { none; } 表示不允许任何人更新(为了安全)

rndc命令:rndc flush 清空缓存信息

               reconfig 测试配置文件

               status  查看DNS状态

               reload 重新装载DNS

 

DNS子域授权】

  正向子域授权:只需在父域的区域解析库中添加“胶水记录”,格式如下:

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

例如:ops     IN    NS    ns.ops

      ns.ops   IN    A    172.16.100.7

      ops     IN    NS    ns2.ops

     ns2.ops   IN    A     172.16.100.29

   后两行是给子域添加的从域

 

DNS子域授权实例】

在之前创建的父区域库中添加如下内容

wKioL1PiDzSwT406AAEGbk_EpAA176.jpg

然后再172.16.249.208的主机上做子域

wKiom1PiDkyxfnXCAAJw1NslCZ0557.jpg

wKioL1PiD8CD27y3AAAqED5qlWc712.jpg

wKiom1PiDqeCQowdAABLVBSzvaA974.jpg

wKioL1PiD8HCGEieAAAk5XaTgRo217.jpg

wKiom1PiDqiRyYnNAACpkHbHefg039.jpg

wKioL1PiD8GDFIAeAABvqB-Oc0Y724.jpg


但是这样配置的话我们去测试父域的主机的时候就会找不到,默认的子域去找父域的主机,子域是不会直接去父域查找,而是通过互联网访问根来递归查找。

如果在局域网内我想通过子域直接找父域怎么办?

配置转发器

 

转发器:转发所有的非本机负责的区域的请求至某指定的DNS服务器

【转发器配置】

在我们的子域服务器的/etc/named.conf文件中添加内容

wKiom1PiDunARCuaAAAk_UsMHUo151.jpg

wKiom1PiDxHD6rwWAAD0EAUHg7c776.jpg

检查语法是否有错,并且重读配置文件

wKiom1PiD3LhjMiCAABLka-1DWg875.jpg

wKioL1PiEGbSK6z4AAERav959Qk403.jpg

如果我们只想转发某个区域呢?

【区域转发】

首先我们需要注释掉我们在主配置文件中添加的转发内容

wKiom1PiD56RWRGMAACxVZCGFow967.jpg

把这些内容注释掉以后我们需要在区域配置文件中添加一个区域

wKiom1PiD76wP0JWAAAp9b6p0ec927.jpg

添加如下内容

wKioL1PiEQKwXpTdAABR2Y-dd4Q370.jpg

然后再重读一下配置文件

wKiom1PiEAfQdlvpAAAwAm-9u8g873.jpg

bind view

bind view:根据客户端来源的不同,将同一个名称解析至不同的值。

智能的DNS服务商:dnspood  dns.la

其实bindview功能就相当于是一个访问控制列表,做一些访问控制规则来限制用户使用那个服务。

bind acl可以自己定义: acl ACL_NAME {

                           IP

                           IP

                           network;

                      }

bind view的使用:view VIEW_NAME {

                       match-clients { ACL_NAME; };

                       区域

                 }

                 view VIEW_NAME {

                        match-clients { any };

                        区域

                 }

注:这些acl的匹配规则是这样的,首先匹配第一条,第一条匹配成功则按照第一条规则来执行,如果第一条规则没有匹配成功,则继续匹配第二条...

bind view的用法】

编辑区域配置文件

wKioL1PiEUXjQFnKAACpyGrYm_Q067.jpg

把整个区域给括起来。

 

 

使用view的注意事项:

          1、通常只为内网客户端提供递归功能,提供跟区域等。

          2、通常只为外网客户端提供本机所负责的区域的解析。