DNS域名解析服务器

一、DNS简介

    DNS是Domain Name System(域名系统)的简称,DNS可以为计算机、服务以及接入互联网或局域网的任何资源提供分层的域名解析功能。DNS提供了很多功能,其中最主要的功能就是进行域名与IP之间的解析。在互联网中标记唯一一台计算机使用的是IP地址,通过合法的IP地址,我们可以与全世界任何一台主机进行通信。然而在当今计算机如此普及的情况下,以人类现有的智慧与记忆力很难将大量的IP地址背诵下来,这时使用域名系统就可以将难以记忆的数字IP地址与容易记忆的域名建议映射关系,用户通过输入域名,计算机会寻找指定的DNS服务器,请求服务器帮助解析该域名对应的IP地址,成功解析后,将获得该域名对应的真实IP地址,然后使用该IP地址与对方通信。

    域名是分级的,一般分为:主机名.三级域名.二级域名.顶级域名.。注意,最后一个点代表的是根域,是所有域名的起点。域名有点像美国人的姓名一样,姓在后,名在前,而计算机域名中最后的点则是根,其次是根下的顶级域名,然后是二级域名等。图1为典型的域名树状结构图。例如,百度的域名为www.baidu.com,代表的是根域下有com子域,com子域下面有baidu子域,baidu子域下有主机www。注意,一般情况下,我们通过浏览器输入网址域名时,最后一个根域(.)是不需要输入的。一般顶级域代表国家或者组织形式,如cn代表中国;com代表商业公司;edu代表教育机构等。二级域名代表组织或者公司名称,三级域名代表组织或者公司内部的主机名称。最后通过完全合格的域名(FQDN)可以定位全球唯一的一台主机。这种分层管理机制的优势在于根域服务器不需要管理全世界所有的域名信息,它只需要管理顶级域信息即可,而顶级域服务器只需要管理二级域信息即可。以此类推,实现分层管理,这类似国家的行政管理机制。

图1:

DNS域名解析服务器

    域名查询分为递归查询和迭代查询,如图2所示。举例说明,如果客户端准备访问百度网站,客户端首先会检查本地缓存中是否有之前的查询记录,如果有,直接读取结果即可,如果没有相关的缓存记录,则向本地DNS服务器发送查询请求,也就是所谓的递归查询,本地DNS服务器如果有答案,就会将答案直接返回给客户端,但本地DNS服务器没有正确的答案时,它就需要向根服务器查询,但不是询问www.baidu.com对应的IP是多少,根服务器仅管理顶级域名,而且所有的顶级域名都属于根的管理范畴,所以此时本地DNS服务器向根查询结果是:根服务器会将它管理的com域对应的IP提供给本地DNS服务器,本地DNS服务器得到com域服务器的IP后,会再向com查询,然而com也没有最终的答案,com域服务器会将它所管理的baidu域服务器对应的IP提供给本地DNS服务器,最后本地DNS服务器再向baidu域服务器查询,询问该域下主机名为www的计算机对应的IP地址,由于www主机确实直接属于baidu域的管理范畴,所以baidu会将最终的正确答案返回给本地DNS服务器,最后本地DNS服务器将得到的结果返回给客户端,同时本地DNS服务器会将结果缓存起来,当下次再有相同的查询请求时,本地DNS服务器就可以直接从缓存中找到结果返回给客户端。

图2:

DNS域名解析服务器

二、安装DNS软件

    提供DNS服务的软件有很多,而伯克利加州大学研发的BIND(Berkeley Internet Name Domain)是目前应用最广泛的DNS服务系统。该项目软件除了BIND主程序外,在Linux平台下还提供了chroot和utils软件包,bind-chroot软件包的主要功能是使BIND软件可以运行在chroot模式下,这样BIND运行在相对路径的根路径,而不是Linux系统真正的根路径,即使有人对BIND软件进行攻击与破坏,影响的也仅仅是操作系统中的一个子目录,不会影响整个操作系统平台,以此来提升系统安全性。通过yum安装bind-chroot后,对bind而言,/var/named/chroot目录就是根路径,所有BIND软件的配置文件都在根下的某某路径下。bind-utils软件提供了一些DNS查询工具,如dig、host、nslookup等。

yum -y install bind bind-chroot bind-utils

三、配置文件说明

    BIND配置文件主要分为主配置文件与域数据记录文件,主配置文件包括很多使用花括号引起来的定义语句,在定义语句中可以设置多个选项,主配置文件的核心功能就是定义域,以及告之计算机到哪里可以找到相应域的数据记录文件。而域数据记录文件则存储具体的域名与IP之间的解析记录,DNS通过读取域数据记录文件来解答客户端的查询请求。

    主配置文件一般为/etc/named.conf文件,但当我们安装了bind-chroot软件包后,在后面的内容中提供到的一些路径默认指的是一个虚拟路径,都是相对于虚拟根路径而言的,虚拟根路径默认为/var/named/chroot目录。如果主配置文件是/etc/named.conf,那么最终主配置文件在本机的绝对路径应该为/var/named/chroot/named.conf,修改主配置文件时一定要注意,如果语法格式有问题,则DNS服务是无法正常启动的,一个典型的主配置文件语法格式如下。

statement_name {option1;option2;... ...;};

     下面介绍/etc/named.conf文件中常用的定义语句。

    acl(Access Control List)语句允许我们预定义一组主机,从而控制是允许还是拒绝他人访问域名服务器,BIND预定义了一些主机访问控制列表,其中,any可以匹配任意IP地址,localhost可以匹配本地系统上所有的IP地址,localnets匹配本地系统所连接的任意网络,none将不匹配任何IP地址。下面通过实例自定义了两个访问控制列表,一个名为黑名单,一个为白名单。

acl black {172.16.0.0/16;192.168.0.12;192.168.0.18;};acl white {10.0.0.0/8;192.168.0.0/24;};options {allow-query { white; };blackhole { black; };};

    options语句用来定义全局配置选项,在全局配置中至少需要定义一个工作路径,默认的工作路径为/var/named/,具体的常见的参数为表1 。

表1:

DNS域名解析服务器

    zone语句用来定义域及相关选项,定义域也就意味着你希望维护自己公司的域名解析。该语句的重点选项有type与file,表2为zone语句内常用的选项及描述。

表2:

DNS域名解析服务器

    下面一个简单的zone语句实例,example.com是定义的域,type定义本机为example.com域的主域名服务器,该域的解析文件保存在example.com.zone文件中,该文件被保存在/var/named/目录下。当定义反向解析域时,需要将网络地址反过来输入,并以固定的.in-addr.arpa格式结尾。通过定义类型为hint的根域,这样当客户端查询不属于自己维护的域名时,可以寻找根服务器进行迭代查询,最终返回正确的结果,全球的根域名服务器信息保存在named.ca文件中,该文件是在安装BIND文件后自动生成的模板文件,我们可以在/usr/share/doc/bind-9.8.2/sample/var/named/目录下找到它。

DNS域名解析服务器

    在BIND软件的主配置文件中,如果定义了zone语句,还需要额外创建域数据文件,默认域数据文件被存储在/var/named/目录下,文件名称由zone语句中的file选项定义。数据文件分为正向解析数据文件和反向解析数据文件,正向解析数据文件保存了域名到IP地址的映射记录,反向解析数据文件保存了IP地址到域名的映射记录,表3列出了常用的记录类型及描述。

表3:

DNS域名解析服务器

    下面通过一个简短的正向解析的域数据文件,说明各种记录的语法格式,配置文件中的TTL的值为DNS记录的缓存时间,这个值是其他域名服务器将数据存放在缓存中的时间,1D代表一天。SOA记录后面的root.example.com.代表域的权威服务器,chytest1.163.com是管理员的邮箱,由于@在数据文件中代表特殊含义,这里使用.来代表@符号,所以实际的邮箱应该是chytest1@163.com,SOA记录可以跨行输入,跨越多行时使用括号引用。NS记录代表域名服务器记录,如果公司有多个域名服务器,可以添加多条NS记录,但每个NS记录在下面都需要有对应的A记录。A记录为正向解析记录,格式为在域名后面输入相应的IP地址,IN代表Internet,A代表正向解析记录。在使用MX记录指定邮件服务器时,我们给mai.example.com.服务器设着优先级为10,最后CNAME记录为别名,可以使用web.example.com来代表www.example.com。具体的配置文件如下。

DNS域名解析服务器

    关于配置文件中的简写,在BIND主配置文件中,zone语句后定义的域对于数据文件的简写来说很重要,如果区数据文件中不以”.”结尾的名称后会被自动加上该域名称,如zone语句定义了example.com,而数据文件中有一个mail没有以”.”结尾,那么系统会自动追加example.com到mail后,有时候管理员将A记录错误地写成www.example.com这种形式,由于没有以”.”结尾,实际系统识别的应该是www.example.com.example.com.。此外,在数据文件中使用@符号也同样代表zone所定义的域名称。最后,如果在数据文件中某条记录名称为空格或制表符,那么BIND系统会直接使用上一条记录的名称,当我们为同一个域名设置多个A记录,则客户端请求该域名解析时,服务器会以轮询的方式将结果返回给客户端,可以从一定程度上实现负载均衡的功能。

四、部署主域名服务器

    随着ABC公司业务的扩张,计算机I越来越多的情况下,让员工记忆公司内部服务器所有的IP地址简直就是一场噩梦,因此,公司决定采用DNS解决方案,这样所有的员工仅需要记忆域名就可以访问各种服务。案例中使用的域为abc.com域,这个是正向解析的域,网络采用的是私有网络地址为:172.16.0.0/16。本次案例仅对公司主要的服务器编写解析记录,如果读者需要更多的记录,可以按照这些模板添加其他主机的信息,在公司内部服务器列表见表4.

表4:

DNS域名解析服务器

1.安装软件

    如前所述,在部署DNS服务器时需要安装bind、bind-chroot以及bind-utils软件包。

2.修改主配置文件

    默认chroot之后的虚拟根目录/var/named/chroot/etc 下面并没有现成的配置文件,需要在/usr/share/doc/bind-9.8.2/sample/etc目录下找到配置文件模板,复制该文件至/var/named/chroot/etc目录下,并根据自己的实际情况进行修改配置文件。案例中均以表4为模型进行配置。

cd /usr/share/doc/bind-9.8.2/sample/etc/cp named.conf  /var/named/chroot/etc/chown  root.named  /var/named/chroot/etc/named.confvim /var/named/chroot/etc/named.conf
DNS域名解析服务器

3.创建区数据文件

    主配置文件仅是对zone域的定义,关于域内主机的具体记录的解析,还需要依赖于数据文件的内容,常见的域名解析有正向解析记录、反向解析记录、CNAME记录以及MX记录等。在上一步完成了主配置文件中关于zone域的配置后,我们就根据模板创建具体的区数据解析文件,这些文件的创建可以根据软件包中提供的named.localhost文件作为模板。下面我们将创建一个用于正向解析的abc.com.zone域数据文件,再创建一个用于进行反向解析的172.16.zone域数据文件。

cd /usr/share/doc/bind-9.8.2/sample/var/namedcp named.ca /var/named/chroot/var/named/chown root.named /var/named/chroot/var/named/named.cacp named.localhost /var/named/chroot/var/named/abc.com.zonechown root.named /var/named/chroot/var/named/abc.com.zonevim /var/named/chroot/var/named/abc.com.zone
DNS域名解析服务器
vim  /var/named/chroot/var/named/172.16.zone
DNS域名解析服务器

4.服务管理

    在dns主服务器部署完成后,如果不禁用防火墙或通过防火墙开启特定的端口,客户端主机是无法进行查询工作的。下面我们就通过Linux自带的防火墙iptables来演示如何开启DNS服务所需要使用的53端口,其中,TCP的53端口用于主从复制,UDP的53端口用于数据查询。 

iptables -I INPUT -p udp --dport 53 -j ACCEPTiptables -I INPUT -p tcp --dport 53 -j ACCEPTservice iptables saveservice named startchkconfig named on

5.客户端验证

    客户端正确配置DNS服务器之后,查询工具比较多,常用的有nslookup、dig、host,下面分别演示这些命令的基本用法。

nslookup www.abc.comnslookup 176.16.0.100dig abc.com  MXhost www.abc.com

五、部署从域名服务器

   部署从域名服务器的作用是防止出现单点故障或实现负载均衡。如果只有一台服务器,当该服务器宕机时,将导致所有客户机的地址解析出现问题。另外,为了满足大规模的查询请求,我们可以创建多台DNS服务器实现负载均衡。然而如果所有的DNS都作为主服务器,会有大量的配置需要我们重复进行,再有就是当解析记录发生改变后,各个服务器之间的区数据文件的版本比较混乱(不方便统一),所以我们需要部署从域名服务器,从域名服务器会从主域名服务器上下载数据文件,只要主服务器修改了数据文件中的记录,从服务器就可以自动同步数据。

1.安装软件

    如前所述,在部署DNS服务器时需要安装bind、bind-chroot以及bind-utils软件包。

2.修改配置文件

    与主服务器一样,我们需要复制模板配置文件,并修改named.conf配置文件与主服务器配置文件。有所不同的是,所有从服务器配置文件中除根域以外的所有zone域类型均为slave,依次声明自己是从服务器,并使用masters语句指定与哪台主服务器进行数据同步。

 cd /usr/share/doc/bind-9.8.2/sample/etc/ cp named.conf  /var/named/chroot/etc/ chown  root.named  /var/named/chroot/etc/named.conf vim /var/named/chroot/etc/named.conf
DNS域名解析服务器

3.同步数据文件 

    从服务器进行同步操作前,需要创建一个BIND软件读取操作的目录,以便将主服务器的数据文件保存至该目录。

    在从服务器上,我们仅需要简单设置以下BIND主配置即可,当从服务器的主配置文件修改完成后,通过启动服务,BIND会自动根据配置文件中的masters语句寻找主域名服务器,并将主域名服务器上的数据文件下载至从服务器本地。完成第一次的数据同步后,从服务器会根据同步过来的数据文件中的SOA记录选项,决定下次同步数据的时间,本次案例中主域名服务器的SOA记录括号中有五个选项。

    第一个选项10是序列号,从服务器会根据这个序列号来决定是否进行同步操作,只有当主服务器中数据文件的序列号大于从服务器中数据文件的序列号,从服务器才会真正与主服务器进行数据同步,该序列号建议使用时间格式,如20180610001,表示2018年6月10日的第一次修改(序列号只要数字即可,BIND不强制要求具体数字格式)。

    第二个选项1D,代表从服务器多久与主服务器进行序列号的对比(仅在主服务器序列号大于从服务器的序列号时,才进行数据同步),D代表Day,这里为一天。

    第三个选项1H,代表如果从服务器请求连接主服务器时,由于网络延迟、主服务器故障等原因,暂时无法连接到主服务器,那么从服务器会每隔一个小时再试一次。

    第四个选项1W,代表如果从服务器尝试一周后还未能连接到主服务器,则不再进行连接。

    第五个选项3H,代表的是缓存的时间为3个小时。

setsebool -P named_write_master_zones=1mkdir -p /var/named/chroot/var/named/slaves/chown root.named /var/named/chroot/var/named/slaveschmod 775 /var/named/chroot/var/named/slavesservice named startchkconfig named on

六、DNS视图应用案例

    view语句用来创建视图,视图可以让不同的网络或主机在查询同一个DNS记录时得到不同的解析结果,也可以为不同的网络或者主机创建不同的数据文件。大型企业可以利用视图实现负载均衡,例如,当北京地区的网民访问新浪网时,域名服务器可以将结果就解析为北京本地的新浪网服务器,上海地区的网民访问新浪网时,域名服务器会将上海的新浪网服务器IP地址作为结果返还给用户。这样所有的人访问新浪网页查看新闻时,总是可以连接距离自己最近的服务器。

    在BIND9版本中,如果没有在主配置文件中使用view语句,则BIND会自动将所有的域定义一个大视图。通过配置文件中使用view语句,并结合match-clients语句,实现 不同用户查询相同的记录时所得到的结果不同。这样做的最大好处是可以让北京地区的网民访问新浪网时连接的是北京当地的服务器,而上海地区的网民需要连接新浪网时,DNS解析 的结果为上海本地的新浪服务器。

    一般我们会为同一个域创建多个视图,不同的视图对应不同的解析文件,此时需要注意的是,有多个视图就需要创建多少个对应的数据解析文件。当客户端发送查询请求后,服务器根据视图内的match-clients语句来匹配客户端主机,匹配成功后,服务器读取特定的视图内file指定的数据文件,并将结果返回给客户端,如果没有匹配成功,则继续查询下一个视图。如果所有的视图都未能匹配成功,服务器将返回无相关数据记录的信息给客户端。下面的案例通过修改主域名服务器的主配置文件演示视图的应用,当172.16.0.88请求abc.com域的相关解析记录时,服务器会读取abc.com.zone.develop这个数据解析文件,172.16.0.89请求abc.com域相关解析记录时,服务器会读取abc.com.zone.tech这个数据解析文件。注意,在此需要创建4个数据解析文件,相同域的正向域名解析文件有两个,反向域名解析文件有两个,只要在不同的数据解析文件中对相同的记录给予不同的解析结果,就可实现不同的用户得到不同的返回结果也不一样。

    只要根据自己的实际需要创建相应的数据文件,并在各个数据文件中对同一个数据记录给出不同的解析数据,即可实现智能DNS的分离解析功能。这里我们不可能将全北京或全上海的所有IP地址写入match-clients,根据DNS解析原理我们知道,所有的终端用户访问网络时都会连接到当地ISP服务商所提供的DNS服务器,这些服务商的DNS服务器会根据根服务器的提示迭代查询到我们的权威服务器。也就是说,我们在match-clients后面仅需填写全国主要的ISP所提供的DNS服务器IP地址即可。不同地区服务商的DNS,我们给予不同的解析结果,最终所有的终端用户会间接获得正确的解析结果。这里我们不再给出具体的数据文件记录,读者可以根据实际情况进行自行填写数据记录。

    以下为主配置文件named.conf实现视图应用的案例模板,读者根据自己的实际需要进稍作修改即可。

vim /var/named/chroot/etc/named.conf
DNS域名解析服务器
DNS域名解析服务器

七、常见问题分析

1.由于BIND配置文件中,默认allow-query被设置为仅localhost可以进行DNS查询,如果开放DNS服务,则需要将allow-query修改为特定的主机或任意主机可以查询的DNS服务。

2.在主配置文件中,默认listen-on被设置为仅监听本地回环地址,这样客户端也是无法连接服务器进行查询的。

3.客户端连接服务器发送的查询请求使用的是UDP的53端口,而从服务器与主服务器同步数据用的是TCP53端口,开放DNS服务后,要注意修改防火墙设置。

4.在Centos6系统环境下,从域名服务器与主域名服务器同步数据时,默认SELinux会拒绝从远程下载的数据文件写入本地磁盘,此时需要修改SELinux的布尔值,方法如下:

setsebool -P named_write_master_zones=1

5.配置文件问题,如果管理员在配置文件中的语法格式有错误,则named服务无法正常启动。例如,如果在配置文件语句后面少写了分好,启动服务时会提示类似的提示信息:/etc/named.conf:15:missing ‘;’before ‘view’,提示named.conf文件第15行左右少’;’符号。

6.文件与目录权限。由于BIND相关进程都是以named用户身份启动的,当配置文件或数据文件的权限无法被正确读取时,则系统将无法启动BIND服务。查看/var/log/messages日志文件,可以看到none:0:open:/etc/named.conf:permission denied这样的提示,说明BIND软件启动时无权对named.conf文件。类似的问题还可能出现在从服务器同步的时候,要求从服务器一定要把主服务器的数据文件同步到本地有读写权限的目录下。

7.缩写问题。由于BIND数据文件有缩写功能,这样就有可能产生低级错误,就是在数据文件中输入的完整域名没有以”.”结尾。例如,www.abc.com  IN  A  172.16.0.200,这样客户端无法查询到www.abc.com的解析记录,只能查询www.abc.com.abc.com的解析记录,但这应该不是我们所需要的。

原创文章,作者:Zhang Miao Miao,如若转载,请注明出处:https://www.yidc.net/archives/11454