快捷搜索:
来自 67677新澳门手机版 2019-11-24 15:40 的文章
当前位置: 67677新澳门手机版 > 67677新澳门手机版 > 正文

bind从根底到深刻

基础服务类系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html**

第7章 DNS & bind从基础到深入,第7章dns


本文目录:

7.1 DNS必懂基础

7.1.1 域的分类

7.1.2 主机名、域名、FQDN

7.1.3 域的分层授权

7.1.4 DNS解析流程

7.1.5 /etc/resolv.conf

7.2 DNS术语

7.2.1 递归查询和迭代查询

7.2.2 权威服务器和(非)权威应答

7.2.3 DNS缓存

7.2.4 主、从DNS服务器

7.2.5 资源记录(Resource Record,RR)

7.3 安装DNS

7.4 配置和使用DNS

7.4.1 named.conf配置简要说明

7.4.2 区域数据文件配置说明

7.4.3 测试DNS的解析

7.5 配置反向查找区域

7.6 配置"仅缓存"DNS服务器

7.7 配置DNS转发服务器

7.8 ACL

7.9 递归查询详述

7.10 明确指定不查询的DNS服务器

7.11 配置主、从dns服务器

7.11.1 主、从初体验

7.11.2 配置完整的主从服务器

7.11.3 何时进行区域传送

7.11.4 notify通知

7.11.5 区域文件备份的重要性

7.12 rndc控制dns服务器

7.12.1 named.conf中的controls指令

7.12.2 控制端生成rndc.conf

7.12.3 rndc命令

7.13 子域

7.13.1 子域的原理分析

7.13.2 创建子域

7.14 智能DNS——视图view

7.15 DNS日志系统


DNS是Domain name system的简称,有些地方也成为Domain name server,这东西是一个很大的话题。如果不是要配置DNS服务,只需要理解DNS的解析流程和DNS有关的基本知识即可。如果要配置DNS服务,则可以看完全文。


7.1 DNS必懂基础

DNS主要是用于将域名解析为IP地址的协议,有时候也用于将IP地址反向解析成域名,所以DNS可以实现双向解析。

DNS可以使用TCP和UDP的53端口,基本使用UDP协议的53端口。

DNS是Domain name system的简称,有些地方也称为Domain name server,这东西是一个很大的话题。如果不是要配置DNS服务,只需要理解DNS的解析流程和DNS有关的基本知识即可。如果要配置DNS服务,则可以看完全文。

7.1.1 域的分类

域是分层管理的,就像中国的行政级别。

最高层的域是根域(root)".",就是一个点,它就像国家主席一样。全球只有13个根域服务器,基本上都在美国,中国一台根域服务器都没有。

根域的下一层就是第二层次的顶级域(TLD)了,那么它就是各省省长了。顶级域一般两种划分方法:按国家划分和按组织性质划分。

◇ 按国家划分:.cn(中国)、.tw(台湾)、.hk(香港)。基本都是两个字母的。

◇ 按组织性质划分:.org、.net、.com、.edu、.gov、.cc等。

◇ 反向域:arpa。这是反向解析的特殊顶级域。

顶级域下来就是普通的域,公司或个人在互联网上注册的域名一般都是这些普通的域,如baidu.com。

推荐阅读书籍:《DNS & bind》,第四版有中文版,第五版目前只有英文版。

7.1.2 主机名、域名、FQDN

以百度(www.baidu.com)和百度贴吧(tieba.baidu.com)来举例。

◇ 域名

不论是www.baidu.com还是tieba.baidu.com,它们的域名都是baidu.com,严格地说是"baidu.com."。这是百度所购买的com域下的一个子域名。

◇ 主机名

对于www.baidu.com来说,主机名是www,对于tieba.baidu.com来说,主机名是tieba。其实严格来说,www.baidu.com和tieba.baidu.com才是主机名,它们都是baidu.com域下的主机。一个域下可以定义很多主机,只需配置好它的主机名和对应主机的IP地址即可。

◇ FQDN

FQDN是Fully Qualified Domain Name的缩写,称为完全合格域名,是指包含了所有域的主机名,其中包括根域。FQDN可以说是主机名的一种完全表示形式,它从逻辑上准确地表示出主机在什么地方。

例如www.baidu.com的FQDN是"www.baidu.com.",com后面还有个点,这是根域;tieba.baidu.com的FQDN是"tieba.baidu.com."。

7.1 DNS必懂基础

DNS主要是用于将域名解析为IP地址的协议,有时候也用于将IP地址反向解析成域名,所以DNS可以实现双向解析。

DNS可以使用TCP和UDP的53端口,基本使用UDP协议的53端口。

7.1.3 域的分层授权

域是从上到下授权的,每一层都只负责自己的直辖下层,而不负责下下层。例如根域给顶级域授权,顶级域给普通域授权,但是根域不会给普通域授权。和现实中的行政管理不一样,域的授权和管理绝对不会向下越级,因为它根本不知道下下级的域名是否存在。

7.1.1 域的分类

域是分层管理的,就像中国的行政级别。

最高层的域是根域(root)".",就是一个点,它就像国家主席一样。全球只有13个根域服务器,基本上都在美国,中国一台根域服务器都没有。

根域的下一层就是第二层次的顶级域(TLD)了,那么它就是各省省长了。顶级域一般两种划分方法:按国家划分和按组织性质划分。

◇ 按国家划分:.cn(中国)、.tw(台湾)、.hk(香港)。基本都是两个字母的。

◇ 按组织性质划分:.org、.net、.com、.edu、.gov、.cc等。

◇ 反向域:arpa。这是反向解析的特殊顶级域。

顶级域下来就是普通的域,公司或个人在互联网上注册的域名一般都是这些普通的域,如baidu.com。

67677新澳门手机版 1

7.1.4 DNS解析流程

以访问www.baidu.com为例。

(1).客户端要访问www.baidu.com,首先会查找本机DNS缓存,再查找自己的hosts文件,还没有的话就找DNS服务器(这个DNS服务器就是计算机里设置指向的DNS)。

(2).DNS服务器收到询问请求,首先查看自己是否有www.baidu.com的缓存,如果有就直接返回给客户端,没有就越级上访到根域".",并询问根域。

(3).根域看到是找.com域的,把到.com域的路(地址)告诉DNS服务器,让DNS服务器去找.com询问。

(4).DNS服务器去找.com,".com"一看是自己辖下的baidu.com,就把baidu.com的IP地址给DNS服务器,让它去找baidu.com。

(5).DNS找到baidu.com,baidu.com发现DNS服务器要找的是自己区域里的www主机,就把这个主机IP地址给了DNS服务器。

(6).DNS服务器把得到的www.baidu.com的IP结果告诉客户端,并缓存一份结果在自己机器中(默认会缓存,因为该服务器允许为客户端递归,否则不会缓存非权威数据)。

(7).客户端得到回答的IP地址后缓存下来,并去访问www.baidu.com,然后www.baidu.com就把页面内容发送给客户端,也就是百度页面。

最后要说明的是:

1.本机查找完缓存后如果没有结果,会先查找hosts文件,如果没有找到再把查询发送给DNS服务器,但这仅仅是默认情况,这个默认顺序是可以改变的。在/etc/nsswitch.conf中有一行" hosts: files dns"就是定义先查找hosts文件还是先提交给DNS服务器的,如果修改该行为"hosts:  dns files"则先提交给DNS服务器,这种情况下hosts文件几乎就不怎么用的上了。

2.由于缓存是多层次缓存的,所以真正的查询可能并没有那么多步骤,上图的步骤是完全没有所需缓存的查询情况。假如某主机曾经向DNS服务器提交了www.baidu.com的查询,那么在DNS服务器上除了缓存了www.baidu.com的记录,还缓存了".com"和"baidu.com"的记录,如果再有主机向该DNS服务器提交ftp.baidu.com的查询,那么将跳过"."和".com"的查询过程直接向baidu.com发出查询请求。

7.1.2 主机名、域名、FQDN

以百度(www.baidu.com)和百度贴吧(tieba.baidu.com)来举例。

◇ 域名

不论是www.baidu.com还是tieba.baidu.com,它们的域名都是baidu.com,严格地说是"baidu.com."。这是百度所购买的com域下的一个子域名。

◇ 主机名

对于www.baidu.com来说,主机名是www,对于tieba.baidu.com来说,主机名是tieba。其实严格来说,www.baidu.com和tieba.baidu.com才是主机名,它们都是baidu.com域下的主机。一个域下可以定义很多主机,只需配置好它的主机名和对应主机的IP地址即可。

◇ FQDN

FQDN是Fully Qualified Domain Name的缩写,称为完全合格域名,是指包含了所有域的主机名,其中包括根域。FQDN可以说是主机名的一种完全表示形式,它从逻辑上准确地表示出主机在什么地方。

例如www.baidu.com的FQDN是"www.baidu.com.",com后面还有个点,这是根域;tieba.baidu.com的FQDN是"tieba.baidu.com."。

7.1.5 /etc/resolv.conf文件

这个文件主要用于定义dns指向,即查询主机名时明确指定使用哪个dns服务器。该文件的详细说明见Linux网络管理之:/etc/resolv.conf。

例如此文件中指定了"nameserver 8.8.8.8",则每当要查询主机名时,都会向8.8.8.8这台dns服务器发起递归查询,这台dns服务器会帮忙查找到最终结果并返回给你。

当然,在后文的实验测试过程中,使用了另一种方式指定要使用的dns服务器:dig命令中使用"@dns_server"。

7.1.3 域的分层授权

域是从上到下授权的,每一层都只负责自己的直辖下层,而不负责下下层。例如根域给顶级域授权,顶级域给普通域授权,但是根域不会给普通域授权。和现实中的行政管理不一样,域的授权和管理绝对不会向下越级,因为它根本不知道下下级的域名是否存在。

7.2 DNS术语

7.1.4 DNS解析流程

67677新澳门手机版 2

以访问www.baidu.com为例。

(1).客户端要访问www.baidu.com,首先会查找本机DNS缓存,再查找自己的hosts文件,还没有的话就找DNS服务器(这个DNS服务器就是计算机里设置指向的DNS)。

(2).DNS服务器收到询问请求,首先查看自己是否有www.baidu.com的缓存,如果有就直接返回给客户端,没有就越级上访到根域".",并询问根域。

(3).根域看到是找.com域的,把到.com域的路(地址)告诉DNS服务器,让DNS服务器去找.com询问。

(4).DNS服务器去找.com,".com"一看是自己辖下的baidu.com,就把baidu.com的IP地址给DNS服务器,让它去找baidu.com。

(5).DNS找到baidu.com,baidu.com发现DNS服务器要找的是自己区域里的www主机,就把这个主机IP地址给了DNS服务器。

(6).DNS服务器把得到的www.baidu.com的IP结果告诉客户端,并缓存一份结果在自己机器中(默认会缓存,因为该服务器允许为客户端递归,否则不会缓存非权威数据)。

(7).客户端得到回答的IP地址后缓存下来,并去访问www.baidu.com,然后www.baidu.com就把页面内容发送给客户端,也就是百度页面。

最后要说明的是:

1.本机查找完缓存后如果没有结果,会先查找hosts文件,如果没有找到再把查询发送给DNS服务器,但这仅仅是默认情况,这个默认顺序是可以改变的。在/etc/nsswitch.conf中有一行" hosts: files dns"就是定义先查找hosts文件还是先提交给DNS服务器的,如果修改该行为"hosts:  dns files"则先提交给DNS服务器,这种情况下hosts文件几乎就不怎么用的上了。

2.由于缓存是多层次缓存的,所以真正的查询可能并没有那么多步骤,上图的步骤是完全没有所需缓存的查询情况。假如某主机曾经向DNS服务器提交了www.baidu.com的查询,那么在DNS服务器上除了缓存了www.baidu.com的记录,还缓存了".com"和"baidu.com"的记录,如果再有主机向该DNS服务器提交ftp.baidu.com的查询,那么将跳过"."和".com"的查询过程直接向baidu.com发出查询请求。

7.2.1 递归查询和迭代查询

例如A主机要查询C域中的一个主机,A所指向的DNS服务器为B,递归和迭代查询的方式是这样的:

递归查询:A --> B --> C --> B --> A

迭代查询:A --> B       A --> C --> A

将递归查询和迭代查询的方式放到查询流程中,就如下图所示。(未标出Client指向的DNS服务器)

也就是说,递归的意思是找了谁谁就一定要给出答案。那么允许递归的意思就是帮忙去找位置,如A对B允许递归,那么B询问A时,B就去帮忙找答案,如果A不允许对B递归,那么A就会告诉B的下一层域的地址让B自己去找。

可以想象,如果整个域系统都使用递归查询,那些公共的根域和顶级域会忙到死,因此更好的方案就是把这些压力分散到每个个人定制的DNS服务器。

所以DNS的解析流程才会如下图。并且在客户端到DNS服务器端的这一阶段是递归查询,从DNS服务器之后的是迭代查询。也就是说,顶级域和根域出于性能的考虑,是不允许给其他任何机器递归的。

为什么客户端到DNS服务器阶段是递归查询?因为客户端本身不是DNS服务器,它自己是找不到互联网上的域名地址的,所以只能询问DNS服务器,最后一定由DNS服务器来返回答案,所以DNS服务器需要对这个客户端允许递归。因此,dns解析器(nslookup、host、dig等)所发出的查询都是递归查询。

7.1.5 /etc/resolv.conf文件

这个文件主要用于定义dns指向,即查询主机名时明确指定使用哪个dns服务器。该文件的详细说明见Linux网络管理之:/etc/resolv.conf。

例如此文件中指定了"nameserver 8.8.8.8",则每当要查询主机名时,都会向8.8.8.8这台dns服务器发起递归查询,这台dns服务器会帮忙查找到最终结果并返回给你。

当然,在后文的实验测试过程中,使用了另一种方式指定要使用的dns服务器:dig命令中使用"@dns_server"。

7.2.2 权威服务器和(非)权威应答

权威服务器(权威者)可以理解为直接上层域的DNS服务器。例如www.baidu.com这台主机的上层域是baidu.com,那么对www来说,它的权威服务器就是baidu.com这个域内负责解析的DNS服务器,而对于baidu.com这个主机来说,它的权威服务器是.com这个域负责解析的DNS服务器。

更具体的说,某域的权威服务器是可以直接查看该域数据(即区域数据文件)的DNS服务器,主、从DNS服务器都是权威服务器。

只有权威服务器给出的应答才是权威应答,否则就是非权威应答。为什么呢?因为一个域中所有的主机都是在DNS服务器中的区域数据文件中记录的,对于主机来说,它们的位置只有直接上层才知道在哪里。

因此如果解析www.baidu.com时要获得权威应答,应该将DNS指向baidu.com这个域内负责解析的DNS服务器。

只有权威服务器直接给出的答案才是永远正确的,通过缓存得到的答案基本都是非权威应答。当然这不是一定的,因为权威服务器给的答案也是缓存中的结果,但是这是权威答案。DNS服务器缓存解析的数据库时间长度是由权威服务器决定的。

7.2 DNS术语

7.2.3 DNS缓存

在Client和DNS服务器这些个人订制的DNS解析系统中都会使用缓存来加速解析以减少网络流量和查询压力,就算是解析不到的否定答案也会缓存。

但是要访问的主机IP可能会改变,所有使用缓存得到的答案不一定是对的,因此缓存给的答案是非权威的,只有对方主机的上一级给的答案才是权威答案。缓存给的非权威答案应该设定缓存时间,这个缓存时间的长短由权威者指定。

另外访问某个域下根本不存在的主机,这个域的DNS服务器也会给出答案,但是这是否定答案,否定答案也会缓存,并且有缓存时间。例如某个Client请求51cto.com域下的ftp主机,但是实际上51cto.com下面可能根本没有这个ftp主机,那么51cto.com就会给否定答案,为了防止Client不死心的访问ftp搞破坏,51cto.com这个域负责解析的DNS服务器有必要给Client指定否定答案的缓存时间。

7.2.1 递归查询和迭代查询

例如A主机要查询C域中的一个主机,A所指向的DNS服务器为B,递归和迭代查询的方式是这样的:

递归查询:A --> B --> C --> B --> A

迭代查询:A --> B       A --> C --> A

将递归查询和迭代查询的方式放到查询流程中,就如下图所示。(未标出Client指向的DNS服务器)

67677新澳门手机版 3

也就是说,递归的意思是找了谁谁就一定要给出答案。那么允许递归的意思就是帮忙去找位置,如A对B允许递归,那么B询问A时,A就去帮忙找答案,如果A不允许对B递归,那么A就会告诉B的下一层域的地址让B自己去找。

可以想象,如果整个域系统都使用递归查询,那些公共的根域和顶级域会忙到死,因此更好的方案就是把这些压力分散到每个个人定制的DNS服务器。

所以DNS的解析流程才会如下图。并且在客户端到DNS服务器端的这一阶段是递归查询,从DNS服务器之后的是迭代查询。也就是说,顶级域和根域出于性能的考虑,是不允许给其他任何机器递归的。

67677新澳门手机版 4

为什么客户端到DNS服务器阶段是递归查询?因为客户端本身不是DNS服务器,它自己是找不到互联网上的域名地址的,所以只能询问DNS服务器,最后一定由DNS服务器来返回答案,所以DNS服务器需要对这个客户端允许递归。因此,dns解析器(nslookup、host、dig等)所发出的查询都是递归查询。

7.2.4 主、从dns服务器

dns服务器也称为name server,每个域都必须有dns服务器负责该域相关数据的解析。但dns服务器要负责整个域的数据解析,压力相对来说是比较大的,且一旦出现问题,整个域都崩溃无法向外提供服务,这是非常严重的事。所以,无论是出于负载均衡还是域数据安全可用的考虑,两台dns服务器已经是最低要求了,多数时候应该配置多台dns服务器。

多台dns服务器之间有主次之分,主dns服务器称为master,从dns服务器称为slave。slave上的域数据都是从master上获取的,这样slave和master就都能向外提供名称解析服务。

7.2.2 权威服务器和(非)权威应答

权威服务器(权威者)可以理解为直接上层域的DNS服务器。例如www.baidu.com这台主机的上层域是baidu.com,那么对www来说,它的权威服务器就是baidu.com这个域内负责解析的DNS服务器,而对于baidu.com这个主机来说,它的权威服务器是.com这个域负责解析的DNS服务器。

更具体的说,某域的权威服务器是可以直接查看该域数据(即区域数据文件)的DNS服务器,主、从DNS服务器都是权威服务器。

只有权威服务器给出的应答才是权威应答,否则就是非权威应答。为什么呢?因为一个域中所有的主机都是在DNS服务器中的区域数据文件中记录的,对于主机来说,它们的位置只有直接上层才知道在哪里。

因此如果解析www.baidu.com时要获得权威应答,应该将DNS指向baidu.com这个域内负责解析的DNS服务器。

只有权威服务器直接给出的答案才是永远正确的,通过缓存得到的答案基本都是非权威应答。当然这不是一定的,因为权威服务器给的答案也是缓存中的结果,但是这是权威答案。DNS服务器缓存解析的数据库时间长度是由权威服务器决定的。

7.2.5 资源记录(Resource Record,RR)

对于提供DNS服务的系统(DNS服务器),域名相关的数据都需要存储在文件(区域数据文件)中。这些数据分为多种类别,每种类别存储在对应的资源记录(resource record,RR)中。也就是说,资源记录既用来区分域数据的类型,也用来存储对应的域数据。

DNS的internet类中有非常多的资源记录类型。常用的是SOA记录、NS记录、A记录(IPV6则为AAAA记录)、PTR记录、CNAME记录、MX记录等。

其中:(以下内容如果不了解,可以先跳过,在配置区域数据文件时回头来看)

(1).SOA记录:start of authority,起始授权机构。该记录存储了一系列数据,若不明白SOA记录,请结合下面的NS记录,SOA更多的信息见"子域"部分的内容。格式如下:

longshuai.com.      IN  SOA dnsserver.longshuai.com.    mail.longshuai.com. (
                                1     
                                3h    
                                1h    
                                1w    
                                1h )

第四列指定了"dnsserver.longshuai.com."为该域的master DNS服务器。

第五列是该域的管理员邮箱地址,但注意不能使用@格式的邮箱,而是要将@符号替换为点".",正如上面的例子"mail.longshuai.com.",其实际表示的是"[email protected]"。

第六列使用括号将几个值包围起来。第一个值是区域数据文件的序列编号serial,每次修改此区域数据文件都需要修改该编号值以便让slave dns服务器同步该区域数据文件。第二个值是刷新refresh时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件的时间间隔。第三个值是重试retry时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件时,如果联系不上master,则等待多久再重试联系,该值一般比refresh时间短,否则该值表示的重试就失去了意义。第四个值是过期expire时间值,表示slave dns服务器上的区域数据文件多久过期。第五个值是negative ttl,表示客户端找dns服务器解析时,否定答案的缓存时间长度。这几个值可以分行写,也可以直接写在同一行中使用空格分开,所以,上面的SOA记录可以写成如下格式:

longshuai.com.   IN  SOA dnsserver.longshuai.com.   mail.longshuai.com. ( 1 3h 1h 1w 1h )

前三列是声明性的语句,表示"longshuai.com."这个域内的起始授权机构为第四列的值"dnsserver.longshuai.com."所表示的主机。第五列和第六列是SOA的附加属性数据。

每个区域数据文件中都有且仅能有一个SOA记录,且一般都定义为区域数据文件中的资源记录。

注意,资源记录的作用之一是存储域相关的对应数据,所以第4、5、6列表示的是该SOA记录所存储的相关值。

(2).NS记录:name server,存储的是该域内的dns服务器相关信息。即NS记录标识了哪台服务器是DNS服务器。格式如下:

longshuai.com.    IN  NS  dnsserver.longshuai.com.

前三列仍然是声明性语句,表示"longshuai.com."域内的DNS服务器(name server)为第四列值所表示的"dnsserver.longshuai.com."主机。

如果一个域内有多个dns服务器,则必然有主次之分,即master和slave之分。但在NS记录上并不能体现主次关系。例如:

longshuai.com.    IN  NS  dnsserver1.longshuai.com.
longshuai.com.    IN  NS  dnsserver2.longshuai.com.

表示主机"dnsserver1.longshuai.com."和主机"dnsserver2.longshuai.com."都是域"longshuai.com."内的dns服务器,但没有区分出主次dns服务器。

不少朋友搞不懂SOA记录,也很容易混淆SOA和NS记录。其实,仅就它们的主要作用而言,NS记录仅仅只是声明该域内哪台主机是dns服务器,用来提供名称解析服务,NS记录不会区分哪台dns服务器是master哪台dns服务器是slave。而SOA记录则用于指定哪个NS记录对应的主机是master dns服务器,也就是从多个dns服务器中挑选一台任命其为该域内的master dns服务器,其他的都是slave,都需要从master上获取域相关数据。由此,SOA的名称"起始授权机构"所表示的意思也就容易理解了。

(3).A记录:address,存储的是域内主机名所对应的ip地址。格式如下:

dnsserver.longshuai.com.    IN  A   172.16.10.15

客户端之所以能够解析到主机名对应的ip地址,就是因为dns服务器中的有A记录存储了主机名和ip的对应关系。
AAAA记录存储的是主机名和ipv6地址的对应关系。

(4).PTR记录:pointer,和A记录相反,存储的是ip地址对应的主机名,该记录只存在于反向解析的区域数据文件中(并非一定)。格式如下:

16.10.16.172.in-addr.arpa.  IN  PTR  www.longshuai.com.

表示解析172.16.10.16地址时得到主机名"www.longshuai.com."的结果。

(5).CNAME记录:canonical name,表示规范名的意思,其所代表的记录常称为别名记录。之所以如此称呼,就是因为为规范名起了一个别名。什么是规范名?可以简单认为是fqdn。格式如下:

www1.longshuai.com.     IN  CNAME  www.longshuai.com.

最后一列就是规范名,而第一列是规范名即最后一列的别名。当查询"www1.longshuai.com.",dns服务器会找到它的规范名"www.longshuai.com.",然后再查询规范名的A记录,也就获得了对应的IP地址并返回给客户端。

CNAME记录非常重要,很多时候使用CNAME可以解决很复杂的问题。而且目前常用的CDN技术有一个步骤就是在dns服务器上设置CNAME记录。

(6).MX记录:mail exchanger,邮件交换记录。负责转发或处理该域名内的邮件。和邮件服务器有关,且话题较大,所以不多做叙述,如有深入的必要,请查看《dns & bind》中"Chapter 5. DNS and Electronic Mail"。

关于资源记录,最需要明确的概念就是它不仅仅用来区分和标识区域数据的类型,还用来存储对应的域数据。

7.2.3 DNS缓存

在Client和DNS服务器这些个人订制的DNS解析系统中都会使用缓存来加速解析以减少网络流量和查询压力,就算是解析不到的否定答案也会缓存。

但是要访问的主机IP可能会改变,所有使用缓存得到的答案不一定是对的,因此缓存给的答案是非权威的,只有对方主机的上一级给的答案才是权威答案。缓存给的非权威答案应该设定缓存时间,这个缓存时间的长短由权威者指定。

另外访问某个域下根本不存在的主机,这个域的DNS服务器也会给出答案,但是这是否定答案,否定答案也会缓存,并且有缓存时间。例如某个Client请求51cto.com域下的ftp主机,但是实际上51cto.com下面可能根本没有这个ftp主机,那么51cto.com就会给否定答案,为了防止Client不死心的访问ftp搞破坏,51cto.com这个域负责解析的DNS服务器有必要给Client指定否定答案的缓存时间。

7.3 安装DNS

Linux上搭建DNS服务的软件有bind9、NSD(Name server domain)和unbound,其中bind9是市场占有率最高的软件。本文也以此软件来介绍DNS服务。当前CentOS7.2上使用yum安装的bind为bind 9.9版本,bind实现DNS的最佳最详细说明文档是"DNS & BIND"和"Bind97 Manual",网上都有中文版本的资源。

[[email protected] ~]# yum -y install bind

以下是bind生成的命令程序。

[[email protected] ~]# rpm -ql bind | grep sbin
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-checkds
/usr/sbin/dnssec-coverage
/usr/sbin/dnssec-dsfromkey
/usr/sbin/dnssec-importkey
/usr/sbin/dnssec-keyfromlabel
/usr/sbin/dnssec-keygen
/usr/sbin/dnssec-revoke
/usr/sbin/dnssec-settime
/usr/sbin/dnssec-signzone
/usr/sbin/dnssec-verify
/usr/sbin/genrandom
/usr/sbin/isc-hmac-fixup
/usr/sbin/lwresd
/usr/sbin/named
/usr/sbin/named-checkconf
/usr/sbin/named-checkzone
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc
/usr/sbin/rndc-confgen

其中加粗标红的工具在后文可能都是要用的,它们是做什么的,可以直接man以下看看描述。其中named是提供DNS服务的主程序,它默认会读取配置文件/etc/named.conf。

安装bind后生成了以下几个配置文件。

[[email protected] ~]# rpm -ql bind | grep etc
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/rwtab.d/named
/etc/sysconfig/named
/usr/share/doc/bind-9.9.4/sample/etc
/usr/share/doc/bind-9.9.4/sample/etc/named.conf
/usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones

其中named.conf是named工具默认的配置文件,它的配置指令项非常多。

7.2.4 主、从dns服务器

dns服务器也称为name server,每个域都必须有dns服务器负责该域相关数据的解析。但dns服务器要负责整个域的数据解析,压力相对来说是比较大的,且一旦出现问题,整个域都崩溃无法向外提供服务,这是非常严重的事。所以,无论是出于负载均衡还是域数据安全可用的考虑,两台dns服务器已经是最低要求了,多数时候应该配置多台dns服务器。

多台dns服务器之间有主次之分,主dns服务器称为master,从dns服务器称为slave。slave上的域数据都是从master上获取的,这样slave和master就都能向外提供名称解析服务。

7.4 配置和使用DNS

7.2.5 资源记录(Resource Record,RR)

对于提供DNS服务的系统(DNS服务器),域名相关的数据都需要存储在文件(区域数据文件)中。这些数据分为多种类别,每种类别存储在对应的资源记录(resource record,RR)中。也就是说,资源记录既用来区分域数据的类型,也用来存储对应的域数据。

DNS的internet类中有非常多的资源记录类型。常用的是SOA记录、NS记录、A记录(IPV6则为AAAA记录)、PTR记录、CNAME记录、MX记录等。

其中:(以下内容如果不了解,可以先跳过,在配置区域数据文件时回头来看)

(1).SOA记录:start of authority,起始授权机构。该记录存储了一系列数据,若不明白SOA记录,请结合下面的NS记录,SOA更多的信息见"子域"部分的内容。格式如下:

longshuai.com.      IN  SOA dnsserver.longshuai.com.    mail.longshuai.com. (
                                1     
                                3h    
                                1h    
                                1w    
                                1h )

第四列指定了"dnsserver.longshuai.com."为该域的master DNS服务器。

第五列是该域的管理员邮箱地址,但注意不能使用@格式的邮箱,而是要将@符号替换为点".",正如上面的例子"mail.longshuai.com.",其实际表示的是"mail@longshuai.com"。

第六列使用括号将几个值包围起来。第一个值是区域数据文件的序列编号serial,每次修改此区域数据文件都需要修改该编号值以便让slave dns服务器同步该区域数据文件。第二个值是刷新refresh时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件的时间间隔。第三个值是重试retry时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件时,如果联系不上master,则等待多久再重试联系,该值一般比refresh时间短,否则该值表示的重试就失去了意义。第四个值是过期expire时间值,表示slave dns服务器上的区域数据文件多久过期。第五个值是negative ttl,表示客户端找dns服务器解析时,否定答案的缓存时间长度。这几个值可以分行写,也可以直接写在同一行中使用空格分开,所以,上面的SOA记录可以写成如下格式:

longshuai.com.   IN  SOA dnsserver.longshuai.com.   mail.longshuai.com. ( 1 3h 1h 1w 1h )

前三列是声明性的语句,表示"longshuai.com."这个域内的起始授权机构为第四列的值"dnsserver.longshuai.com."所表示的主机。第五列和第六列是SOA的附加属性数据。

每个区域数据文件中都有且仅能有一个SOA记录,且一般都定义为区域数据文件中的资源记录。

注意,资源记录的作用之一是存储域相关的对应数据,所以第4、5、6列表示的是该SOA记录所存储的相关值。

(2).NS记录:name server,存储的是该域内的dns服务器相关信息。即NS记录标识了哪台服务器是DNS服务器。格式如下:

longshuai.com.    IN  NS  dnsserver.longshuai.com.

前三列仍然是声明性语句,表示"longshuai.com."域内的DNS服务器(name server)为第四列值所表示的"dnsserver.longshuai.com."主机。

如果一个域内有多个dns服务器,则必然有主次之分,即master和slave之分。但在NS记录上并不能体现主次关系。例如:

longshuai.com.    IN  NS  dnsserver1.longshuai.com.
longshuai.com.    IN  NS  dnsserver2.longshuai.com.

表示主机"dnsserver1.longshuai.com."和主机"dnsserver2.longshuai.com."都是域"longshuai.com."内的dns服务器,但没有区分出主次dns服务器。

不少朋友搞不懂SOA记录,也很容易混淆SOA和NS记录。其实,仅就它们的主要作用而言,NS记录仅仅只是声明该域内哪台主机是dns服务器,用来提供名称解析服务,NS记录不会区分哪台dns服务器是master哪台dns服务器是slave。而SOA记录则用于指定哪个NS记录对应的主机是master dns服务器,也就是从多个dns服务器中挑选一台任命其为该域内的master dns服务器,其他的都是slave,都需要从master上获取域相关数据。由此,SOA的名称"起始授权机构"所表示的意思也就容易理解了。

(3).A记录:address,存储的是域内主机名所对应的ip地址。格式如下:

dnsserver.longshuai.com.    IN  A   172.16.10.15

客户端之所以能够解析到主机名对应的ip地址,就是因为dns服务器中的有A记录存储了主机名和ip的对应关系。
AAAA记录存储的是主机名和ipv6地址的对应关系。

(4).PTR记录:pointer,和A记录相反,存储的是ip地址对应的主机名,该记录只存在于反向解析的区域数据文件中(并非一定)。格式如下:

16.10.16.172.in-addr.arpa.  IN  PTR  www.longshuai.com.

表示解析172.16.10.16地址时得到主机名"www.longshuai.com."的结果。

(5).CNAME记录:canonical name,表示规范名的意思,其所代表的记录常称为别名记录。之所以如此称呼,就是因为为规范名起了一个别名。什么是规范名?可以简单认为是fqdn。格式如下:

www1.longshuai.com.     IN  CNAME  www.longshuai.com.

最后一列就是规范名,而第一列是规范名即最后一列的别名。当查询"www1.longshuai.com.",dns服务器会找到它的规范名"www.longshuai.com.",然后再查询规范名的A记录,也就获得了对应的IP地址并返回给客户端。

CNAME记录非常重要,很多时候使用CNAME可以解决很复杂的问题。而且目前常用的CDN技术有一个步骤就是在dns服务器上设置CNAME记录,将客户端对资源的请求引导到与它同网络环境(电信、网通)以及地理位置近的缓存服务器上。关于CDN的简介,见下文CDN和DNS的关系。

(6).MX记录:mail exchanger,邮件交换记录。负责转发或处理该域名内的邮件。和邮件服务器有关,且话题较大,所以不多做叙述,如有深入的必要,请查看《dns & bind》中"Chapter 5. DNS and Electronic Mail"。

关于资源记录,最需要明确的概念就是它不仅仅用来区分和标识区域数据的类型,还用来存储对应的域数据。

7.4.1 named.conf配置简要说明

下文将以longshuai.com域以及这个域中的主机的定义来说明相关配置方法。

named.conf是named默认加载的配置文件,该配置文件中使用"#"或"/**/"或"//"作为注释符号,每个非注释语句都必须使用分号";"结束。

该配置文件中只能有一个options,在这里面用于配置全局项。其中下例中的directory指令定义区域数据文件的存放目录。

options {
    directory "/var/named";
};

除了option,还必需有区域的配置。zone关键字后面接的是域和类,域是自定义的域名,IN是internet的简称,是bind 9中的默认类,所以可以省略。type定义该域的类型是"master | slave | stub | hint | forward"中的哪种,file定义该域的区域数据文件(区域数据文件的说明见下文),因为这里是相对路径db.longshuai.com,它的相对路径是相对于/var/named的,也可以指定绝对路径/var/named/db.longshuai.com。

zone "longshuai.com" IN{
    type master;
    file "db.longshuai.com"
};

除此外,在每个named.conf中还应该配置几个必须的区域。

(1).根域名"."的区域配置。

zone "." IN {
    type hint;
    file named.ca;
}

type hint表示该区域"."类型为hint。回顾dns解析流程,在客户端让dns服务器迭代查询时,迭代查询的第一步就是让dns服务器去找根域名服务器。但是dns服务器如何知道根域名服务器在哪里?这就是hint类型的作用,它提示dns服务器根据其区域数据文件named.ca中的内容去获取根域名地址,并将这些数据缓存起来,下次需要根域名地址时直接查找缓存即可。

由于根域名地址也是会改变的,有了根区域的提示,就可以永远能获取到最新的根区域地址。其实也可以手动下载这些数据,地址为:

因此,只有根区域"."才会设置为hint类型。

(2)."localhost"域名(用于解析localhost为127.0.0.1)和127.0.0.1的方向查找区域。这两个没有定义在named.conf中,而是定义在/etc/named.rfc1912.zones中,然后在named.conf中使用include指令将其包含进来。

include "/etc/named.rfc1912.zones";

其中named.rfc1912.zones中部分内容:

zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};

当然,反向查找区域可以定义为域而不是直接定义成主机。例如:

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};

但这样的话,就需要相对应地修改/var/named/named.loopback文件。

其实根域名"."和"localhost"以及"1.0.0.127.in-addr.arpa"完全没必要去改变,照搬就是了。

所以,/etc/named.conf的内容如下:

[[email protected] ~]# cat /etc/named.conf
options {
    directory "/var/named";
};

zone "longshuai.com" {
    type master;
    file "db.longshuai.com";
};

zone "." IN {
    type hint;
    file "named.ca";
};

include "/etc/named.rfc1912.zones";

到此并没有结束,因为/etc/named*的属组都是named,且权限要为640。如下:

[[email protected] ~]# ls -l /etc/named*
-rw-r--r-- 1 root root   205 Aug 12 21:58 /etc/named.conf
-rw-r----- 1 root named 1705 Mar 22  2016 /etc/named.conf.bak
-rw-r--r-- 1 root named 3923 Jul  5 18:15 /etc/named.iscdlv.key
-rw-r----- 1 root named  931 Jun 21  2007 /etc/named.rfc1912.zones
-rw-r--r-- 1 root named 1587 May 22 21:10 /etc/named.root.key

所以,对于新建的/etc/named.conf应该要改变属组和权限。

[[email protected] ~]# chown root:named /etc/named.conf
[[email protected] ~]# chmod 640 /etc/named.conf

然后使用/usr/sbin/named-checkconf命令来检查下/etc/named.conf文件的配置是否正确,如果不返回任何信息,则表示配置正确。

[[email protected] ~]# named-checkconf

配置好配置文件后,接下来要书写域相关数据库——区域数据文件。

7.3 安装DNS

Linux上搭建DNS服务的软件有bind9、NSD(Name server domain)和unbound,其中bind9是市场占有率最高的软件。本文也以此软件来介绍DNS服务。当前CentOS7.2上使用yum安装的bind为bind 9.9版本,bind实现DNS的最佳最详细说明文档是"DNS & BIND"和"Bind97 Manual",网上都有中文版本的资源。

[root@xuexi ~]# yum -y install bind

以下是bind生成的命令程序。

[root@xuexi ~]# rpm -ql bind | grep sbin
/usr/sbin/arpaname
/usr/sbin/ddns-confgen
/usr/sbin/dnssec-checkds
/usr/sbin/dnssec-coverage
/usr/sbin/dnssec-dsfromkey
/usr/sbin/dnssec-importkey
/usr/sbin/dnssec-keyfromlabel
/usr/sbin/dnssec-keygen
/usr/sbin/dnssec-revoke
/usr/sbin/dnssec-settime
/usr/sbin/dnssec-signzone
/usr/sbin/dnssec-verify
/usr/sbin/genrandom
/usr/sbin/isc-hmac-fixup
/usr/sbin/lwresd
/usr/sbin/named
/usr/sbin/named-checkconf
/usr/sbin/named-checkzone
/usr/sbin/named-compilezone
/usr/sbin/named-journalprint
/usr/sbin/nsec3hash
/usr/sbin/rndc
/usr/sbin/rndc-confgen

其中加粗标红的工具在后文可能都是要用的,它们是做什么的,可以直接man以下看看描述。其中named是提供DNS服务的主程序,它默认会读取配置文件/etc/named.conf。

安装bind后生成了以下几个配置文件。

[root@xuexi ~]# rpm -ql bind | grep etc
/etc/logrotate.d/named
/etc/named
/etc/named.conf
/etc/named.iscdlv.key
/etc/named.rfc1912.zones
/etc/named.root.key
/etc/rndc.conf
/etc/rndc.key
/etc/rwtab.d/named
/etc/sysconfig/named
/usr/share/doc/bind-9.9.4/sample/etc
/usr/share/doc/bind-9.9.4/sample/etc/named.conf
/usr/share/doc/bind-9.9.4/sample/etc/named.rfc1912.zones

其中named.conf是named工具默认的配置文件,它的配置指令项非常多。

7.4.2 区域数据文件配置说明

区域数据文件即named.conf中zone关键字定义的域的数据文件,由zone中的file指令指定文件名,例如上面定义的"db.longshuai.com",说明longshuai.com这个zone的区域数据文件为/var/named/db.longshuai.com。

区域数据文件中很多地方都可以使用缩写,如果不使用缩写的书写方式,那么每一条记录中的域名或主机名都要写全,即要写到根域"."。

假设longshuai.com域内有3台主机www、ftp和mydb,它们的ip分别为172.16.10.{16,17,18},还有一台DNS服务器主机名为dnsserver,其ip为172.16.10.15。

 于是,longshuai.com这个区域的数据文件可以如下书写:区域数据文件中使用分号";"来注释。

$TTL 6h
longshuai.com.              IN  SOA dnsserver.longshuai.com.   xyz.longshuai.com. (
                       1     ; serial num
                       3h    ; refresh time 
                       1h    ; retry time 
                       1w    ; expire time
                       1h )  ; negative time

longshuai.com.              IN  NS  dnsserver.longshuai.com.

dnsserver.longshuai.com.    IN  A   172.16.10.15
www.longshuai.com.          IN  A   172.16.10.16
ftp.longshuai.com.          IN  A   172.16.10.17
mydb.longshuai.com.         IN  A   172.16.10.18

www1.longshuai.com.         IN  CNAME  www.longshuai.com.

其中第一行的"$TTL 6h"表示缓存周期,即查询该域中记录时肯定答案的缓存时间长度。例如本地查询www.baidu.com时,本地将缓存baidu.com域的相关查询结果,缓存时间长度由baidu.com这个域的区域数据文件中定义的$TTL的值决定。

在区域数据文件中,"$TTL"的定义表示其后的记录都以此TTL为准,直到遇到下一个"$TTL"。也就是说,两个$TTL之间的所有记录都以前面的$TTL为准。不过大多数时候,一个区域数据文件中只会在第一行定义一个$TTL值,表示该文件中所有记录都使用该缓存周期值。

第二行定义的是SOA记录,每个区域文件中的第一个资源记录定义行都要是SOA记录。在该行中除了指定了master dns服务器,还指定了一些附加属性,包括序列号为1,还有各种时长等信息。

第二个资源记录行定义的是NS记录,NS记录行表示该行定义的主机"dnsserver.longshuai.com."是这个域"longshuai.com."内的dns服务器。

接下来的几个资源记录行定义的都是A记录,分别定义了"{dnsserver,www,ftp,mydb}.longshuai.com."这几个主机对应的ip地址为172.16.10.{15,16,17,18}。A记录中存储的是主机名和IP地址之间的映射关系,在为外界主机提供主机名查询服务时,就是从A记录中获取对应的ip地址。

最后一个资源记录行定义的是CNAME记录,它存储的是canonical name所对应的别名。例如此处定义的是"www.longshuai.com."的别名为"www1.longshuai.com."。

然后修改/var/named/db.longshuai.com文件的属组和权限。

[[email protected] ~]# chmod 640 /var/named/db.longshuai.com 
[[email protected] ~]# chown root:named /var/named/db.longshuai.com

然后使用named-checkzone命令检查区域数据文件是否书写正确。例如,要检查"longshuai.com"区域,其区域数据文件为/var/named/named.conf。

[[email protected] ~]# named-checkzone longshuai.com /var/named/db.longshuai.com
zone longshuai.com/IN: loaded serial 1
OK

实际上,应该对所有的区域都进行检查,使用named-checkzone一个一个进行手动检查,显得非常繁琐。在CentOS 6上,支持使用"service named configtest"来检查,CentOS 7上没有对应的功能。但无论是CentOS 6还是CentOS 7上,在启动named服务的时候,都会自动检查配置文件的正确性。

回到区域数据文件的配置说明上。在上面的配置过程中,完全没有使用缩写,但其实很多地方都能使用缩写的书写方式。以下是区域数据文件中的一些书写规则,包括缩写规则:

(1)."$"符号:定义宏。最常见的是"$TTL"、"$ORIGIN"。origin的的意思是起点,可以自行定义$ORIGIN的值。

例如:"$ORIGIN ."表示定义的$ORIGIN的起点值为根域符号,"$ORIGIN longshuai.com."表示$ORIGIN的值为"longshuai.com.",未定义$ORIGIN时,值为zone "domain"的domain部分。

(2).fqdn自动补齐:在区域数据文件中,没有使用点号"."结尾的,在实际使用的时候都会自动补上域名,使其变为fqdn。

例如区域"longshuai.com.",以下是完全格式的资源记录:

dnsserver.longshuai.com.    IN  A   172.16.10.15

可以缩写为:

dnsserver    IN    A   172.16.10.15

因为dnsserver后没有点,所以会补齐整个域名"longshuai.com."。

实际上,自动补齐的部分是$ORIGIN的值,只不过默认没定义$ORIGIN时,$ORIGIN的值为zone定义的域名,所以默认是自动补齐域名。

(3)."@"符号:可以使用@符号来缩写$ORIGIN的值。

由于自定义的区域数据文件中,一般不会主动定义$ORIGIN的值,而第一个资源记录一般都是SOA记录,所以此时SOA记录中的第一列就可以使用@符号,其它地方只要值为$ORIGIN,都可以使用@符号缩写。例如:

@     IN  SOA  dnsserver  xyz. ( 1 3h 1h 1w 1h )
@     IN  NS   dnsserver

(4).重复最近一个名称:区域数据文件中的第一列可以使用空格或制表符使该列继承上一行的第一列的值。

例如第一行定义的是SOA记录,第一列是"longshuai.com.",那么第二行定义的NS记录中,其第一列就可以留空来继承第一行第一列的"longshuai.com."。不止第一行和第二行,第三行也可以继承第二行的第一列,第n 1行也可以继承第n行的第一列,只要它们的值一样即可。

所以,/var/named/db.longshuai.com这个文件完全缩写后的结果如下:

[[email protected] named]# vim /var/named/db.longshuai.com 
$TTL 6h
@            IN  SOA    dnsserver   xyz ( 1 3h 1h 1w 1h )
@            IN  NS     dnsserver

dnsserver    IN  A      172.16.10.15
www          IN  A      172.16.10.16
ftp          IN  A      172.16.10.17
mydb         IN  A      172.16.10.18

www1         IN  CNAME  www

是否缩写正确,可以使用named-checkzone来检查下,还可以使用named-compilezone命令对区域数据文件进行编译,并输出编译后的结果。

[[email protected] named]# named-compilezone  -o  -  longshuai.com  /var/named/db.longshuai.com 
zone longshuai.com/IN: loaded serial 1
longshuai.com.            21600 IN SOA    dnsserver.longshuai.com. xyz.longshuai.com. 1 10800 3600 604800 3600
longshuai.com.            21600 IN NS     dnsserver.longshuai.com.
dnsserver.longshuai.com.  21600 IN A      172.16.10.15
ftp.longshuai.com.        21600 IN A      172.16.10.17
mydb.longshuai.com.       21600 IN A      172.16.10.18
www.longshuai.com.        21600 IN A      172.16.10.16
www1.longshuai.com.       21600 IN CNAME  www.longshuai.com.
OK

"-o"选项表示将编译后的结果输出到指定文件中,"-"表示输出到标准输出。

由上面编译的结果可以看出,缩写后的结果并没有任何错误。

在/etc/named.conf中,还定义了3个区域,分别是"."、"localhost"和"1.0.0.127.in-addr.arpa",它们的区域数据文件分别是/var/named/{named.ca,named.localhost,loopback},这几个文件的内容可以自行解读。

[[email protected] ~]# cat /var/named/named.ca 
; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3.2 <<>>  bufsize=1200  norec @a.root-servers.net
; (2 servers found)
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17380
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      a.root-servers.net.
.                       518400  IN      NS      b.root-servers.net.
.                       518400  IN      NS      c.root-servers.net.
.                       518400  IN      NS      d.root-servers.net.
.                       518400  IN      NS      e.root-servers.net.
.                       518400  IN      NS      f.root-servers.net.
.                       518400  IN      NS      g.root-servers.net.
.                       518400  IN      NS      h.root-servers.net.
.                       518400  IN      NS      i.root-servers.net.
.                       518400  IN      NS      j.root-servers.net.
.                       518400  IN      NS      k.root-servers.net.
.                       518400  IN      NS      l.root-servers.net.
.                       518400  IN      NS      m.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net.     3600000 IN      A       198.41.0.4
a.root-servers.net.     3600000 IN      AAAA    2001:503:ba3e::2:30
b.root-servers.net.     3600000 IN      A       192.228.79.201
b.root-servers.net.     3600000 IN      AAAA    2001:500:84::b
c.root-servers.net.     3600000 IN      A       192.33.4.12
c.root-servers.net.     3600000 IN      AAAA    2001:500:2::c
d.root-servers.net.     3600000 IN      A       199.7.91.13
d.root-servers.net.     3600000 IN      AAAA    2001:500:2d::d
e.root-servers.net.     3600000 IN      A       192.203.230.10
e.root-servers.net.     3600000 IN      AAAA    2001:500:a8::e
f.root-servers.net.     3600000 IN      A       192.5.5.241
f.root-servers.net.     3600000 IN      AAAA    2001:500:2f::f
g.root-servers.net.     3600000 IN      A       192.112.36.4
g.root-servers.net.     3600000 IN      AAAA    2001:500:12::d0d
h.root-servers.net.     3600000 IN      A       198.97.190.53
h.root-servers.net.     3600000 IN      AAAA    2001:500:1::53
i.root-servers.net.     3600000 IN      A       192.36.148.17
i.root-servers.net.     3600000 IN      AAAA    2001:7fe::53
j.root-servers.net.     3600000 IN      A       192.58.128.30
j.root-servers.net.     3600000 IN      AAAA    2001:503:c27::2:30
k.root-servers.net.     3600000 IN      A       193.0.14.129
k.root-servers.net.     3600000 IN      AAAA    2001:7fd::1
l.root-servers.net.     3600000 IN      A       199.7.83.42
l.root-servers.net.     3600000 IN      AAAA    2001:500:9f::42
m.root-servers.net.     3600000 IN      A       202.12.27.33
m.root-servers.net.     3600000 IN      AAAA    2001:dc3::35

;; Query time: 18 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Po kvě 22 10:14:44 CEST 2017
;; MSG SIZE  rcvd: 811

该文件中记录了获取根区域的方法:dig bufsize=1200 norec @a.root-servers.net。

[[email protected] ~]# cat /var/named/named.{localhost,loopback}   
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1


$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
        PTR     localhost.

 至此,配置文件和区域数据文件都已经配置结束了,可以启动named服务。

[[email protected] named]# systemctl restart named.service 
[[email protected] named]# netstat -tnlup | grep named     
tcp        0      0 172.16.10.15:53     0.0.0.0:*       LISTEN      66248/named 
tcp        0      0 127.0.0.1:53        0.0.0.0:*       LISTEN      66248/named 
tcp        0      0 127.0.0.1:953       0.0.0.0:*       LISTEN      66248/named 
tcp6       0      0 ::1:953             :::*            LISTEN      66248/named 
udp        0      0 172.16.10.15:53     0.0.0.0:*                   66248/named 
udp        0      0 127.0.0.1:53        0.0.0.0:*                   66248/named 

从结果中看到,named默认监听在所有接口的tcp和udp的53端口上,但还监听了环回地址的tcp的953端口,这是named为rndc提供的控制端口,rndc是named的远程控制工具,在后文会专门介绍其用法。

7.4 配置和使用DNS

7.4.3 测试DNS的解析

任找一台机器(也可以是dns服务器本身),将其dns指向dns服务器的监听地址。例如,直接在上文中dns服务器172.16.10.15上设置。

[[email protected] ~]# vim /etc/resolv.conf
search localdomain longshuai.com
nameserver 172.16.10.15

然后使用nslookup命令或host命令或bind-utils包中提供的dig命令来测试能否解析longshuai.com这个域相关数据。建议使用dig命令,因为host太简陋,nslookup在某些情况下有缺陷,dig命令则相对更完美些。dig命令的用法请参见man文档。

例如,解析longshuai.com域中的主机www的A记录。

[[email protected] ~]# dig -t a www.longshuai.com
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> -t a www.longshuai.com
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8670
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.longshuai.com.             IN      A

;; ANSWER SECTION:
www.longshuai.com.      21600   IN      A       172.16.10.16

;; AUTHORITY SECTION:
longshuai.com.          21600   IN      NS      dnsserver.longshuai.com.

;; ADDITIONAL SECTION:
dnsserver.longshuai.com. 21600  IN      A       172.16.10.15

;; Query time: 0 msec
;; SERVER: 172.16.10.15#53(172.16.10.15)
;; WHEN: Sat Aug 12 23:38:17 CST 2017
;; MSG SIZE  rcvd: 102

在结果中:

(1)."QUESTION SECTION"表示所发起的查询,表示要查询"www.longshuai.com."的A记录。

(2)."ANSWER SECTION"表示对查询的回复。回复的结果是"www.longshuai.com."的A记录值为"172.16.10.16",这正是dig所期望的结果。

(3)."AUTHORITY SECTION"表示该查询是权威服务器给的答案,并给出了权威服务器的ns记录。在此例中,"www.longshuai.com"主机所在的域"longshuai.com"的权威服务器为"dnsserver.longshuai.com."。如果没有该段,表示非权威应答。

(4)."ADDITIONAL SECTION"段是额外的回复,回复的内容是权威服务器的A记录。

还可以测试ns记录、soa记录、cname记录等。

不过需要注意的是soa记录和ns记录查询的对象是域名而不是主机名,而CNAME记录的对象则必须是主机名。

[[email protected] ~]# dig -t ns longshuai.com
[[email protected] ~]# dig -t soa longshuai.com
[[email protected] ~]# dig -t cname www1.longshuai.com

7.4.1 named.conf配置简要说明

下文将以longshuai.com域以及这个域中的主机的定义来说明相关配置方法。

named.conf是named默认加载的配置文件,该配置文件中使用"#"或"/**/"或"//"作为注释符号,每个非注释语句都必须使用分号";"结束。

该配置文件中只能有一个options,在这里面用于配置全局项。其中下例中的directory指令定义区域数据文件的存放目录。

options {
    directory "/var/named";
};

除了option,还必需有区域的配置。zone关键字后面接的是域和类,域是自定义的域名,IN是internet的简称,是bind 9中的默认类,所以可以省略。type定义该域的类型是"master | slave | stub | hint | forward"中的哪种,file定义该域的区域数据文件(区域数据文件的说明见下文),因为这里是相对路径db.longshuai.com,它的相对路径是相对于/var/named的,也可以指定绝对路径/var/named/db.longshuai.com。

zone "longshuai.com" IN{
    type master;
    file "db.longshuai.com"
};

除此外,在每个named.conf中还应该配置几个必须的区域。

(1).根域名"."的区域配置。

zone "." IN {
    type hint;
    file named.ca;
}

type hint表示该区域"."类型为hint。回顾dns解析流程,在客户端让dns服务器迭代查询时,迭代查询的第一步就是让dns服务器去找根域名服务器。但是dns服务器如何知道根域名服务器在哪里?这就是hint类型的作用,它提示dns服务器根据其区域数据文件named.ca中的内容去获取根域名地址,并将这些数据缓存起来,下次需要根域名地址时直接查找缓存即可。

由于根域名地址也是会改变的,有了根区域的提示,就可以永远能获取到最新的根区域地址。其实也可以手动下载这些数据,地址为:

因此,只有根区域"."才会设置为hint类型。

(2)."localhost"域名(用于解析localhost为127.0.0.1)和127.0.0.1的方向查找区域。这两个没有定义在named.conf中,而是定义在/etc/named.rfc1912.zones中,然后在named.conf中使用include指令将其包含进来。

include "/etc/named.rfc1912.zones";

67677新澳门手机版 ,其中named.rfc1912.zones中部分内容:

zone "localhost" IN {
        type master;
        file "named.localhost";
        allow-update { none; };
};

zone "1.0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};

当然,反向查找区域可以定义为域而不是直接定义成主机。例如:

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback";
        allow-update { none; };
};

但这样的话,就需要相对应地修改/var/named/named.loopback文件。

其实根域名"."和"localhost"以及"1.0.0.127.in-addr.arpa"完全没必要去改变,照搬就是了。

所以,/etc/named.conf的内容如下:

[root@xuexi ~]# cat /etc/named.conf
options {
    directory "/var/named";
};

zone "longshuai.com" {
    type master;
    file "db.longshuai.com";
};

zone "." IN {
    type hint;
    file "named.ca";
};

include "/etc/named.rfc1912.zones";

到此并没有结束,因为/etc/named*的属组都是named,且权限要为640。如下:

[root@xuexi ~]# ls -l /etc/named*
-rw-r--r-- 1 root root   205 Aug 12 21:58 /etc/named.conf
-rw-r----- 1 root named 1705 Mar 22  2016 /etc/named.conf.bak
-rw-r--r-- 1 root named 3923 Jul  5 18:15 /etc/named.iscdlv.key
-rw-r----- 1 root named  931 Jun 21  2007 /etc/named.rfc1912.zones
-rw-r--r-- 1 root named 1587 May 22 21:10 /etc/named.root.key

所以,对于新建的/etc/named.conf应该要改变属组和权限。

[root@xuexi ~]# chown root:named /etc/named.conf
[root@xuexi ~]# chmod 640 /etc/named.conf

然后使用/usr/sbin/named-checkconf命令来检查下/etc/named.conf文件的配置是否正确,如果不返回任何信息,则表示配置正确。

[root@xuexi ~]# named-checkconf

配置好配置文件后,接下来要书写域相关数据库——区域数据文件。

7.5 配置反向查找区域

反向查找是根据ip地址查找其对应的主机名。在/etc/named.conf中,需要定义"zone *.in-addr.arpa",其中"*"是点分十进制ip的反写,可以是反写ip后的任意一段长度,例如127.0.0.1反写后是1.0.0.127,所以zone所定义的可以是"1.0.0.127"、"0.0.127"、"0.127",甚至是"127",长度位数不同,在区域数据文件中需要补全的数值就不同。

另外,反向查找区域的各种缓存时间可以都设置长一点,因为用的不多。

就以127.0.0.1解析为localhost为例。

在/etc/named.rfc1912.zones中已有这样一段:

zone "1.0.0.127.in-addr.arpa" IN {
       type master;
       file "named.loopback";
       allow-update { none; };
};

其区域数据文件/var/named/named.loopback内容如下:

[[email protected] ~]# cat /var/named/named.loopback 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
        PTR     localhost.

将/etc/named.rfc1912.zones中将1.0.0.127.in-addr.arpa区域的配置注释掉,改为如下内容:

zone "0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback.test";
        allow-update { none; };
};

然后书写其区域数据文件/var/named/named.loopback.test。

$TTL 1D
@    IN    SOA     1.0    rname.invalid. ( 0 1D 1H 1W 3H )  
           NS      1.0.0.127.in-addr.arpa.
1.0        A       127.0.0.1
1.0        PTR     local.

在上述配置中,特意将1.0的ptr记录写成了"local.",这样查询1.0.0.127的主机名时,将得到local而不是localhost。

修改属组、权限后重启named,并使用dig -x测试,dig的"-x"选项专门用于反向查找。

[[email protected] ~]# chown root:named /var/named/named.loopback.test
[[email protected] ~]# chmod 640 /var/named/named.loopback.test
[[email protected] ~]# systemctl restart named

[[email protected] ~]# dig -x 127.0.0.1

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> -x 127.0.0.1
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51058
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 86400   IN      PTR     local.

;; AUTHORITY SECTION:
0.127.in-addr.arpa.     86400   IN      NS      1.0.0.127.in-addr.arpa.

;; ADDITIONAL SECTION:
1.0.0.127.in-addr.arpa. 86400   IN      A       127.0.0.1

;; Query time: 0 msec
;; SERVER: 172.16.10.15#53(172.16.10.15)
;; WHEN: Sun Aug 13 04:58:47 CST 2017
;; MSG SIZE  rcvd: 100

现在,可以配置longshuai.com中主机的反向解析区域,由于在实验过程中,该域中的主机地址都是172.16.10.0/24网段内的主机,所以只需要配置一个10.16.172.in-addr.arpa反向查找区域即可,如果域内主机跨了多个网段,例如172.16.10.0/24和192.168.100.0/24,则需要配置两个反向查找区域。

以下是配置结果:

[[email protected] ~]# cat /etc/named.conf
options {
    directory "/var/named";
};

zone "longshuai.com" {
    type master;
    file "db.longshuai.com";
};

zone "10.16.172.in-addr.arpa" in {
    type master;
    file "db.10.16.172";
};

zone "." IN {
    type hint;
    file "named.ca";
};

include "/etc/named.rfc1912.zones";

[[email protected] ~]# vim /var/named/db.10.16.172
$TTL 1D
@    IN   SOA   15                         xyz.longshuai.com. ( 0 1D 1H 1W 3H )
     IN   NS    dnsserver.longshuai.com.
15   IN   PTR   dnsserver.longshuai.com.
16   IN   PTR   www.longshuai.com.
17   IN   PTR   ftp.longshuai.com.
18   IN   PTR   mydb.longshuai.com.

重启named,然后使用dig -x测试。

[[email protected] ~]# chown root:named /var/named/db.10.16.172
[[email protected] ~]# chmod 640 /var/named/db.10.16.172   
[[email protected] ~]# systemctl restart named

[[email protected] ~]# dig -x 172.16.10.16

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> -x 172.16.10.16
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60502
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;16.10.16.172.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
16.10.16.172.in-addr.arpa. 86400 IN     PTR     www.longshuai.com.

;; AUTHORITY SECTION:
10.16.172.in-addr.arpa. 86400   IN      NS      dnsserver.longshuai.com.

;; ADDITIONAL SECTION:
dnsserver.longshuai.com. 21600  IN      A       172.16.10.15

;; Query time: 0 msec
;; SERVER: 172.16.10.15#53(172.16.10.15)
;; WHEN: Sun Aug 13 05:18:35 CST 2017
;; MSG SIZE  rcvd: 125

7.4.2 区域数据文件配置说明

区域数据文件即named.conf中zone关键字定义的域的数据文件,由zone中的file指令指定文件名,例如上面定义的"db.longshuai.com",说明longshuai.com这个zone的区域数据文件为/var/named/db.longshuai.com。

区域数据文件中很多地方都可以使用缩写,如果不使用缩写的书写方式,那么每一条记录中的域名或主机名都要写全,即要写到根域"."。

假设longshuai.com域内有3台主机www、ftp和mydb,它们的ip分别为172.16.10.{16,17,18},还有一台DNS服务器主机名为dnsserver,其ip为172.16.10.15。

67677新澳门手机版 5

 于是,longshuai.com这个区域的数据文件可以如下书写:区域数据文件中使用分号";"来注释。

$TTL 6h
longshuai.com.              IN  SOA dnsserver.longshuai.com.   xyz.longshuai.com. (
                       1     ; serial num
                       3h    ; refresh time 
                       1h    ; retry time 
                       1w    ; expire time
                       1h )  ; negative time

longshuai.com.              IN  NS  dnsserver.longshuai.com.

dnsserver.longshuai.com.    IN  A   172.16.10.15
www.longshuai.com.          IN  A   172.16.10.16
ftp.longshuai.com.          IN  A   172.16.10.17
mydb.longshuai.com.         IN  A   172.16.10.18

www1.longshuai.com.         IN  CNAME  www.longshuai.com.

其中第一行的"$TTL 6h"表示缓存周期,即查询该域中记录时肯定答案的缓存时间长度。例如本地查询www.baidu.com时,本地将缓存baidu.com域的相关查询结果,缓存时间长度由baidu.com这个域的区域数据文件中定义的$TTL的值决定。

在区域数据文件中,"$TTL"的定义表示其后的记录都以此TTL为准,直到遇到下一个"$TTL"。也就是说,两个$TTL之间的所有记录都以前面的$TTL为准。不过大多数时候,一个区域数据文件中只会在第一行定义一个$TTL值,表示该文件中所有记录都使用该缓存周期值。

第二行定义的是SOA记录,每个区域文件中的第一个资源记录定义行都要是SOA记录。在该行中除了指定了master dns服务器,还指定了一些附加属性,包括序列号为1,还有各种时长等信息。

第二个资源记录行定义的是NS记录,NS记录行表示该行定义的主机"dnsserver.longshuai.com."是这个域"longshuai.com."内的dns服务器。

接下来的几个资源记录行定义的都是A记录,分别定义了"{dnsserver,www,ftp,mydb}.longshuai.com."这几个主机对应的ip地址为172.16.10.{15,16,17,18}。A记录中存储的是主机名和IP地址之间的映射关系,在为外界主机提供主机名查询服务时,就是从A记录中获取对应的ip地址。

最后一个资源记录行定义的是CNAME记录,它存储的是canonical name所对应的别名。例如此处定义的是"www.longshuai.com."的别名为"www1.longshuai.com."。

然后修改/var/named/db.longshuai.com文件的属组和权限。

[root@xuexi ~]# chmod 640 /var/named/db.longshuai.com 
[root@xuexi ~]# chown root:named /var/named/db.longshuai.com

然后使用named-checkzone命令检查区域数据文件是否书写正确。例如,要检查"longshuai.com"区域,其区域数据文件为/var/named/named.conf。

[root@xuexi ~]# named-checkzone longshuai.com /var/named/db.longshuai.com
zone longshuai.com/IN: loaded serial 1
OK

实际上,应该对所有的区域都进行检查,使用named-checkzone一个一个进行手动检查,显得非常繁琐。在CentOS 6上,支持使用"service named configtest"来检查,CentOS 7上没有对应的功能。但无论是CentOS 6还是CentOS 7上,在启动named服务的时候,都会自动检查配置文件的正确性。

回到区域数据文件的配置说明上。在上面的配置过程中,完全没有使用缩写,但其实很多地方都能使用缩写的书写方式。以下是区域数据文件中的一些书写规则,包括缩写规则:

(1)."$"符号:定义宏。最常见的是"$TTL"、"$ORIGIN"。origin的的意思是起点,可以自行定义$ORIGIN的值。

例如:"$ORIGIN ."表示定义的$ORIGIN的起点值为根域符号,"$ORIGIN longshuai.com."表示$ORIGIN的值为"longshuai.com.",未定义$ORIGIN时,值为zone "domain"的domain部分。

(2).fqdn自动补齐:在区域数据文件中,没有使用点号"."结尾的,在实际使用的时候都会自动补上域名,使其变为fqdn。

例如区域"longshuai.com.",以下是完全格式的资源记录:

dnsserver.longshuai.com.    IN  A   172.16.10.15

可以缩写为:

dnsserver    IN    A   172.16.10.15

因为dnsserver后没有点,所以会补齐整个域名"longshuai.com."。

实际上,自动补齐的部分是$ORIGIN的值,只不过默认没定义$ORIGIN时,$ORIGIN的值为zone定义的域名,所以默认是自动补齐域名。

(3)."@"符号:可以使用@符号来缩写$ORIGIN的值。

由于自定义的区域数据文件中,一般不会主动定义$ORIGIN的值,而第一个资源记录一般都是SOA记录,所以此时SOA记录中的第一列就可以使用@符号,其它地方只要值为$ORIGIN,都可以使用@符号缩写。例如:

@     IN  SOA  dnsserver  xyz. ( 1 3h 1h 1w 1h )
@     IN  NS   dnsserver

(4).重复最近一个名称:区域数据文件中的第一列可以使用空格或制表符使该列继承上一行的第一列的值。

例如第一行定义的是SOA记录,第一列是"longshuai.com.",那么第二行定义的NS记录中,其第一列就可以留空来继承第一行第一列的"longshuai.com."。不止第一行和第二行,第三行也可以继承第二行的第一列,第n 1行也可以继承第n行的第一列,只要它们的值一样即可。

所以,/var/named/db.longshuai.com这个文件完全缩写后的结果如下:

[root@xuexi named]# vim /var/named/db.longshuai.com 
$TTL 6h
@            IN  SOA    dnsserver   xyz ( 1 3h 1h 1w 1h )
@            IN  NS     dnsserver

dnsserver    IN  A      172.16.10.15
www          IN  A      172.16.10.16
ftp          IN  A      172.16.10.17
mydb         IN  A      172.16.10.18

www1         IN  CNAME  www

是否缩写正确,可以使用named-checkzone来检查下,还可以使用named-compilezone命令对区域数据文件进行编译,并输出编译后的结果。

[root@xuexi named]# named-compilezone  -o  -  longshuai.com  /var/named/db.longshuai.com 
zone longshuai.com/IN: loaded serial 1
longshuai.com.            21600 IN SOA    dnsserver.longshuai.com. xyz.longshuai.com. 1 10800 3600 604800 3600
longshuai.com.            21600 IN NS     dnsserver.longshuai.com.
dnsserver.longshuai.com.  21600 IN A      172.16.10.15
ftp.longshuai.com.        21600 IN A      172.16.10.17
mydb.longshuai.com.       21600 IN A      172.16.10.18
www.longshuai.com.        21600 IN A      172.16.10.16
www1.longshuai.com.       21600 IN CNAME  www.longshuai.com.
OK

"-o"选项表示将编译后的结果输出到指定文件中,"-"表示输出到标准输出。

由上面编译的结果可以看出,缩写后的结果并没有任何错误。

在/etc/named.conf中,还定义了3个区域,分别是"."、"localhost"和"1.0.0.127.in-addr.arpa",它们的区域数据文件分别是/var/named/{named.ca,named.localhost,loopback},这几个文件的内容可以自行解读。

[root@xuexi ~]# cat /var/named/named.ca 
; <<>> DiG 9.9.4-RedHat-9.9.4-38.el7_3.2 <<>>  bufsize=1200  norec @a.root-servers.net
; (2 servers found)
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17380
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      a.root-servers.net.
.                       518400  IN      NS      b.root-servers.net.
.                       518400  IN      NS      c.root-servers.net.
.                       518400  IN      NS      d.root-servers.net.
.                       518400  IN      NS      e.root-servers.net.
.                       518400  IN      NS      f.root-servers.net.
.                       518400  IN      NS      g.root-servers.net.
.                       518400  IN      NS      h.root-servers.net.
.                       518400  IN      NS      i.root-servers.net.
.                       518400  IN      NS      j.root-servers.net.
.                       518400  IN      NS      k.root-servers.net.
.                       518400  IN      NS      l.root-servers.net.
.                       518400  IN      NS      m.root-servers.net.

;; ADDITIONAL SECTION:
a.root-servers.net.     3600000 IN      A       198.41.0.4
a.root-servers.net.     3600000 IN      AAAA    2001:503:ba3e::2:30
b.root-servers.net.     3600000 IN      A       192.228.79.201
b.root-servers.net.     3600000 IN      AAAA    2001:500:84::b
c.root-servers.net.     3600000 IN      A       192.33.4.12
c.root-servers.net.     3600000 IN      AAAA    2001:500:2::c
d.root-servers.net.     3600000 IN      A       199.7.91.13
d.root-servers.net.     3600000 IN      AAAA    2001:500:2d::d
e.root-servers.net.     3600000 IN      A       192.203.230.10
e.root-servers.net.     3600000 IN      AAAA    2001:500:a8::e
f.root-servers.net.     3600000 IN      A       192.5.5.241
f.root-servers.net.     3600000 IN      AAAA    2001:500:2f::f
g.root-servers.net.     3600000 IN      A       192.112.36.4
g.root-servers.net.     3600000 IN      AAAA    2001:500:12::d0d
h.root-servers.net.     3600000 IN      A       198.97.190.53
h.root-servers.net.     3600000 IN      AAAA    2001:500:1::53
i.root-servers.net.     3600000 IN      A       192.36.148.17
i.root-servers.net.     3600000 IN      AAAA    2001:7fe::53
j.root-servers.net.     3600000 IN      A       192.58.128.30
j.root-servers.net.     3600000 IN      AAAA    2001:503:c27::2:30
k.root-servers.net.     3600000 IN      A       193.0.14.129
k.root-servers.net.     3600000 IN      AAAA    2001:7fd::1
l.root-servers.net.     3600000 IN      A       199.7.83.42
l.root-servers.net.     3600000 IN      AAAA    2001:500:9f::42
m.root-servers.net.     3600000 IN      A       202.12.27.33
m.root-servers.net.     3600000 IN      AAAA    2001:dc3::35

;; Query time: 18 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Po kvě 22 10:14:44 CEST 2017
;; MSG SIZE  rcvd: 811

该文件中记录了获取根区域的方法:dig bufsize=1200 norec @a.root-servers.net。

[root@xuexi ~]# cat /var/named/named.{localhost,loopback}   
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1


$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
        PTR     localhost.

 至此,配置文件和区域数据文件都已经配置结束了,可以启动named服务。

[root@xuexi named]# systemctl restart named.service 
[root@xuexi named]# netstat -tnlup | grep named     
tcp        0      0 172.16.10.15:53     0.0.0.0:*       LISTEN      66248/named 
tcp        0      0 127.0.0.1:53        0.0.0.0:*       LISTEN      66248/named 
tcp        0      0 127.0.0.1:953       0.0.0.0:*       LISTEN      66248/named 
tcp6       0      0 ::1:953             :::*            LISTEN      66248/named 
udp        0      0 172.16.10.15:53     0.0.0.0:*                   66248/named 
udp        0      0 127.0.0.1:53        0.0.0.0:*                   66248/named 

从结果中看到,named默认监听在所有接口的tcp和udp的53端口上,但还监听了环回地址的tcp的953端口,这是named为rndc提供的控制端口,rndc是named的远程控制工具,在后文会专门介绍其用法。

7.6 配置"仅缓存"dns服务器

仅用作提供缓存的dns服务器,当有客户端请求该dns服务器帮忙解析某个地址时,它不会直接为外界主机提供dns解析,而是自己去找其他dns服务器解析,并将结果缓存在本地,并将缓存结果提供给客户端。

也就是说,仅缓存dns服务器其实扮演的角色和客户端一样,只不过它还未其他客户端提供解析查询而已。

要配置仅缓存dns服务器,只要配置3个任何时候都必要的域:根域"."、"localhost"域和"1.0.0.127.in-addr.arpa"。也就是说,任何一台完整的dns服务器,至少都是"缓存"服务器。

所以,仅缓存dns服务器配置如下:

[[email protected] ~]# vim /etc/named.conf
options {
    directory "/var/named";
};

#zone "longshuai.com" {
#    type master;
#    file "db.longshuai.com";
#};

zone "." IN {
    type hint;
    file "named.ca";
};

include "/etc/named.rfc1912.zones";

其他的采用默认即可。

dig测试时,如何区分是否是由缓存给答案还是解析后给答案,有些时候不是很好判断,但如果仅仅是测试仅缓存服务器的缓存效果,方法还是很简单的。例如,将上述dns服务器指向8.8.8.8,另找一台机器,执行dig命令,并明确指定使用该缓存dns服务器来帮忙解析。例如,dig一下www1.baidu.com的别名记录。

[[email protected] ~]# dig -t cname www1.baidu.com @172.16.10.15

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6 <<>> -t cname www1.baidu.com @172.16.10.15
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43817
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 5, ADDITIONAL: 5

;; QUESTION SECTION:
;www1.baidu.com.                        IN      CNAME

;; ANSWER SECTION:
www1.baidu.com.         7200    IN      CNAME   www.baidu.com.

;; AUTHORITY SECTION:
baidu.com.              86400   IN      NS      ns2.baidu.com.
baidu.com.              86400   IN      NS      dns.baidu.com.
baidu.com.              86400   IN      NS      ns3.baidu.com.
baidu.com.              86400   IN      NS      ns4.baidu.com.
baidu.com.              86400   IN      NS      ns7.baidu.com.

;; ADDITIONAL SECTION:
ns4.baidu.com.          172800  IN      A       220.181.38.10
ns3.baidu.com.          172800  IN      A       220.181.37.10
ns2.baidu.com.          172800  IN      A       61.135.165.235
dns.baidu.com.          172800  IN      A       202.108.22.220
ns7.baidu.com.          172800  IN      A       119.75.219.82

;; Query time: 527 msec
;; SERVER: 172.16.10.15#53(172.16.10.15)
;; WHEN: Thu Aug 10 04:53:07 2017
;; MSG SIZE  rcvd: 220

查询消耗了527毫秒。再次执行上面的dig,发现查询时间一定是0毫秒,因为是缓存给的答案。

由于缓存在于多个域空间层次上,我们个人能控制缓存的机器只有执行dig命令的客户端和仅缓存dns服务器172.16.10.15,所以可以在两台机器上依次执行"rndc flush"命令来清空缓存测试dig命令,看什么时候query time变回几百几千毫秒,这时就说明dig的答案不是缓存提供的。

7.4.3 测试DNS的解析

任找一台机器(也可以是dns服务器本身),将其dns指向dns服务器的监听地址。例如,直接在上文中dns服务器172.16.10.15上设置。

[root@xuexi ~]# vim /etc/resolv.conf
search localdomain longshuai.com
nameserver 172.16.10.15

然后使用nslookup命令或host命令或bind-utils包中提供的dig命令来测试能否解析longshuai.com这个域相关数据。建议使用dig命令,因为host太简陋,nslookup在某些情况下有缺陷,dig命令则相对更完美些。dig命令的用法请参见man文档。

例如,解析longshuai.com域中的主机www的A记录。

[root@xuexi ~]# dig -t a www.longshuai.com
; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> -t a www.longshuai.com
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8670
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.longshuai.com.             IN      A

;; ANSWER SECTION:
www.longshuai.com.      21600   IN      A       172.16.10.16

;; AUTHORITY SECTION:
longshuai.com.          21600   IN      NS      dnsserver.longshuai.com.

;; ADDITIONAL SECTION:
dnsserver.longshuai.com. 21600  IN      A       172.16.10.15

;; Query time: 0 msec
;; SERVER: 172.16.10.15#53(172.16.10.15)
;; WHEN: Sat Aug 12 23:38:17 CST 2017
;; MSG SIZE  rcvd: 102

在结果中:

(1)."QUESTION SECTION"表示所发起的查询,表示要查询"www.longshuai.com."的A记录。

(2)."ANSWER SECTION"表示对查询的回复。回复的结果是"www.longshuai.com."的A记录值为"172.16.10.16",这正是dig所期望的结果。

(3)."AUTHORITY SECTION"表示该查询是权威服务器给的答案,并给出了权威服务器的ns记录。在此例中,"www.longshuai.com"主机所在的域"longshuai.com"的权威服务器为"dnsserver.longshuai.com."。如果没有该段,表示非权威应答。

(4)."ADDITIONAL SECTION"段是额外的回复,回复的内容是权威服务器的A记录。

还可以测试ns记录、soa记录、cname记录等。

不过需要注意的是soa记录和ns记录查询的对象是域名而不是主机名,而CNAME记录的对象则必须是主机名。

[root@xuexi ~]# dig -t ns longshuai.com
[root@xuexi ~]# dig -t soa longshuai.com
[root@xuexi ~]# dig -t cname www1.longshuai.com

7.7 配置dns转发服务器

配置成了转发服务器,named.conf里所有的zone都将失效(除非配置转发区和空转发区),也就是不会再做任何解析(包括对根的查询),收到的解析请求全都提交给转发选项里指定的机器,转发选项所指定的机器称为转发器。转发器还可以指定给上一层。

例如,新添加一台dns服务器172.16.10.9,设置其为转发者,其转发器为172.16.10.15,如下图。

 配置转发器的方式极其简单,只需在172.16.10.9这台dns服务器上/etc/named.conf中的options中使用一个forwarders指令。其实还需加上forward指令,只不过现在采取其默认值,所以省略它。/etc/named.conf内容如下:

options {
    directory "/var/named";
    forwarders { 172.16.10.15; }; 
};
include /etc/named.rfc1912.zones;

这表示将172.16.10.9收到的所有查询请求都交给172.16.10.15这台转发器,由这台转发器帮忙查询相关请求,然后回复给转发者,由转发者回复给客户端。如果要指定多个转发器,这使用分号分隔各转发器地址,如"forwarders { 172.16.10.15;172.16.10.11; }"。

例如,前文在172.16.10.15上已经配置了longshuai.com域的域数据,例如www.longshuai.com主机的A记录。此时找台客户端,让其dns指向转发者172.16.10.9,然后发起www.longshuai.com的A记录查询请求,如果能返回得到172.16.10.15主机上所配置的域数据,则表明转发成功。

[[email protected] ~]# dig -t a www.longshuai.com @172.16.10.9

; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7 <<>> -t a www.longshuai.com @172.16.10.9
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64375
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.longshuai.com.             IN      A

;; ANSWER SECTION:
www.longshuai.com.      21600   IN      A       172.16.10.16

;; AUTHORITY SECTION:
longshuai.com.          21600   IN      NS      dnsserver.longshuai.com.

;; ADDITIONAL SECTION:
dnsserver.longshuai.com. 21600  IN      A       172.16.10.15

;; Query time: 4 msec
;; SERVER: 172.16.10.9#53(172.16.10.9)
;; WHEN: Sun Aug 13 22:56:32 CST 2017
;; MSG SIZE  rcvd: 102

考虑一种特殊情况,如果转发器无法查询到结果,也就是说转发者获取不到来自转发器的答案,则转发器自己也会去查询。也就是说,如果转发器无法提供答案时,转发者中间会间隔一段等待时间。

当然,还存在一种限制性极大的"仅转发"dns服务器,它只转发,即使获取不到转发器的回复,也不会自己去查询。要配置成"仅转发"dns服务器,只需加上"forward only"指令即可。而前面所说的情况则是"forward first",先转发,转发失败时自行查询,只不过这是默认值,可以省略。

options {
    directory "/var/named";
    forwarders { 172.16.10.15; };
    forward only;
};
include /etc/named.rfc1912.zones;

其实,配置成仅转发dns服务器时,除了forward和forwarder指令,其他的一切指令都可以省略,即使是direcotry指令。因为仅转发dns服务器根本用不上任何区域,所有的查询请求包括localhost这样的请求都会转发。所以上述配置可简化为:

options {
    forwarders { 172.16.10.15; };
    forward only;
};

也许你已经感受到了,几乎不会去配置仅转发dns服务器。实际上,操作系统中设置dns指向的地方,就是在设置仅转发功能,例如/etc/resolv.conf文件中所设置的nameserver,这就是仅转发功能。

需要注意的一点是,转发者转发给转发器的查询是递归查询,转发器必须要亲自回复转发者,也就是说转发者其实就相当于一个客户端。

其实,上述所述的情况是传统的转发功能:配置在options中的转发指令,只能作用于全局,也就是说无论对哪个域的查询,都全部转发出去。在bind 9.1之后,可以配置新的转发功能——转发区,只有指定的区域的查询请求才会转发出去

转发区的配置方式也很简单,不用在options中指定forward,而是在指定的区域内设置其type为forward。例如在172.16.10.9上:

options {
    directory "/var/named";
};

zone "longshuai.com" IN {
    type forward;
    forwarders { 172.16.10.15; };
};

zone "." IN {
    type hint;
    file "named.ca";
};

include /etc/named.rfc1912.zones;

这样,只有查询"longshuai.com"结尾的记录都将转发到172.16.10.15上。但要注意,是longshuai.com结尾,而不是限制其域为"longshuai.com",所以如果发出png.img.longshuai.com的查询请求,也会被转发,但实际上这是longshuai.com的子域img.longshuai.com中的主机。

相对应的,还可以设置"禁转发区",即指定特定的区域的查询不转发,其他所有区的查询请求都转发走。设置方法有点特殊,是在options中设置forwarders和forward指令(该指令可省略),并在想要禁转发的区中设置forwarders目标为空。例如:

options {
    directory "/var/named";
    forwarders { 172.16.10.15 };
};

zone "longshuai.com" IN {
    type master;
    forwarders {};
};

zone "." IN {
    type hint;
    file "named.ca";
};

include /etc/named.rfc1912.zones;

注意,在options中设置了转发目标,在longshuai.com中设置了type master,也接受slave、stub类型的区,最重要的是设置了目标为空的forwarders指令。这样longshai.com结尾的查询请求都不会转发走,包括子域内主机png.img.longshuai.com的查询。

7.5 配置反向查找区域

反向查找是根据ip地址查找其对应的主机名。在/etc/named.conf中,需要定义"zone *.in-addr.arpa",其中"*"是点分十进制ip的反写,可以是反写ip后的任意一段长度,例如127.0.0.1反写后是1.0.0.127,所以zone所定义的可以是"1.0.0.127"、"0.0.127"、"0.127",甚至是"127",长度位数不同,在区域数据文件中需要补全的数值就不同。

另外,反向查找区域的各种缓存时间可以都设置长一点,因为用的不多。

就以127.0.0.1解析为localhost为例。

在/etc/named.rfc1912.zones中已有这样一段:

zone "1.0.0.127.in-addr.arpa" IN {
       type master;
       file "named.loopback";
       allow-update { none; };
};

其区域数据文件/var/named/named.loopback内容如下:

[root@xuexi ~]# cat /var/named/named.loopback 
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        NS      @
        A       127.0.0.1
        AAAA    ::1
        PTR     localhost.

将/etc/named.rfc1912.zones中将1.0.0.127.in-addr.arpa区域的配置注释掉,改为如下内容:

zone "0.127.in-addr.arpa" IN {
        type master;
        file "named.loopback.test";
        allow-update { none; };
};

然后书写其区域数据文件/var/named/named.loopback.test。

$TTL 1D
@    IN    SOA     1.0    rname.invalid. ( 0 1D 1H 1W 3H )  
           NS      1.0.0.127.in-addr.arpa.
1.0        A       127.0.0.1
1.0        PTR     local.

在上述配置中,特意将1.0的ptr记录写成了"local.",这样查询1.0.0.127的主机名时,将得到local而不是localhost。

修改属组、权限后重启named,并使用dig -x测试,dig的"-x"选项专门用于反向查找。

[root@xuexi ~]# chown root:named /var/named/named.loopback.test
[root@xuexi ~]# chmod 640 /var/named/named.loopback.test
[root@xuexi ~]# systemctl restart named

[root@xuexi ~]# dig -x 127.0.0.1

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> -x 127.0.0.1
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51058
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 86400   IN      PTR     local.

;; AUTHORITY SECTION:
0.127.in-addr.arpa.     86400   IN      NS      1.0.0.127.in-addr.arpa.

;; ADDITIONAL SECTION:
1.0.0.127.in-addr.arpa. 86400   IN      A       127.0.0.1

;; Query time: 0 msec
;; SERVER: 172.16.10.15#53(172.16.10.15)
;; WHEN: Sun Aug 13 04:58:47 CST 2017
;; MSG SIZE  rcvd: 100

现在,可以配置longshuai.com中主机的反向解析区域,由于在实验过程中,该域中的主机地址都是172.16.10.0/24网段内的主机,所以只需要配置一个10.16.172.in-addr.arpa反向查找区域即可,如果域内主机跨了多个网段,例如172.16.10.0/24和192.168.100.0/24,则需要配置两个反向查找区域。

以下是配置结果:

[root@xuexi ~]# cat /etc/named.conf
options {
    directory "/var/named";
};

zone "longshuai.com" {
    type master;
    file "db.longshuai.com";
};

zone "10.16.172.in-addr.arpa" in {
    type master;
    file "db.10.16.172";
};

zone "." IN {
    type hint;
    file "named.ca";
};

include "/etc/named.rfc1912.zones";

[root@xuexi ~]# vim /var/named/db.10.16.172
$TTL 1D
@    IN   SOA   15                         xyz.longshuai.com. ( 0 1D 1H 1W 3H )
     IN   NS    dnsserver.longshuai.com.
15   IN   PTR   dnsserver.longshuai.com.
16   IN   PTR   www.longshuai.com.
17   IN   PTR   ftp.longshuai.com.
18   IN   PTR   mydb.longshuai.com.

重启named,然后使用dig -x测试。

[root@xuexi ~]# chown root:named /var/named/db.10.16.172
[root@xuexi ~]# chmod 640 /var/named/db.10.16.172   
[root@xuexi ~]# systemctl restart named

[root@xuexi ~]# dig -x 172.16.10.16

; <<>> DiG 9.9.4-RedHat-9.9.4-50.el7_3.1 <<>> -x 172.16.10.16
;; global options:  cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60502
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;16.10.16.172.in-addr.arpa.     IN      PTR

;; ANSWER SECTION:
16.10.16.172.in-addr.arpa. 86400 IN     PTR     www.longshuai.com.

;; AUTHORITY SECTION:
10.16.172.in-addr.arpa. 86400   IN      NS      dnsserver.longshuai.com.

;; ADDITIONAL SECTION:
dnsserver.longshuai.com. 21600  IN      A       172.16.10.15

;; Query time: 0 msec
;; SERVER: 172.16.10.15#53(172.16.10.15)
;; WHEN: Sun Aug 13 05:18:35 CST 2017
;; MSG SIZE  rcvd: 125

7.8 ACL

DNS配置文件/etc/named.conf中支持使用ACL(access control list),但在引用ACL的时候,必须在其前面已经定义好ACL。

定义ACL的格式为:

acl "acl_name" { 192.253.254/24;172.16.10/24 };

其中acl_name是将来在其他地方引用该acl的名称。大括号中的是ip地址列表,可以是IP、IP前缀或已定义的acl_name。

此外,还有4个预定义的acl值:any、none、localhost(DNS服务器的任一IP地址)、localnets(DNS服务器任一ip地址所在网段)

本文由67677新澳门手机版发布于67677新澳门手机版,转载请注明出处:bind从根底到深刻

关键词: