背景介绍
DNS服务作为互联网上一个基础服务承担着将用户请求的名称转换成对应的IP或将IP转换为名称的功能。DNS实际上是将互联网上所有主机的FQDN以“.”分割成若干个区域,每一个区域都有特定的主机来进行管理。以正向解析为例:当用户发起对www.contoso.com名称的解析请求时,本地DNS服务器会先查询缓存内是否有该名称的IP,如果没有此时就分为两种情况:
当客户端向本地的DNS服务器发起请求时(1),如果本地DNS服务器不允许递归查询,他会立即向客户端反馈找不到该名称对应的IP(2),此时的查询过程称为递归查询;如果本地DNS服务器允许递归查询,当他在缓存及本地的区域解析库文件中找不到该名称对应的IP时,首先会去根域进行查询(3),根域会告诉本地DNS服务器.com域的IP(4),本地DNS服务器再去找.com域进行查询(5),以此类推直到获得到www.contoso.com主机的IP后(10),本地DNS服务器才会将该地址告诉客户端(2),客户端再次使用得到的IP去访问www.contoso.com主机(11),本地DNS服务器同时将该名称和IP的对应信息记录在自己的缓存中。
通过上述得知,除了(2)是递归查询外,(3)-(10)都是迭代查询,由于允许递归会大量消耗服务器资源,所以很多大型的DNS服务器比如根域服务器就不允许做递归查询,打开或关闭的方法是在bind的配置文件/etc/named.conf中定义。
当用户输入一个地址后,例如www.contoso.com,如果本地DNS服务器没有该地址的记录它会去找根区域解析,通过前文得知区域是以“.”来进行划分的,每一个FQDN的结尾处其实都有一个用于结尾的“.”,只是该“.”可以省略,而结尾处的“.”就代表根区域的意思,www.contoso.com完整的FQDN为www.contoso.com.,DNS在解析时采用从后往前的方式逐一进行区域查找,全球一共有13个根域名解析服务器,而根区域“.”默认在安装DNS服务时就已经自带,在bind的配置文件/etc/named.conf中可以查看到记录根区域的文件。
创建正向解析DNS服务器
1.使用yum install bind -y 安装DNS服务。DNS的配置文件采取分段的方式除了主配置文件/etc/named.conf外,也可以在/etc/named.rfc912.zones文件中定义,默认情况下DNS服务安装完成后只侦听在自己的127.0.0.1:53套接字上,不对外提供任何服务,如果需要对外提供服务,需要将自己的IP地址添加到侦听列表中,并设置allow-query为any,允许任何人访问。dnssec是一种防止DNS被污染的机制,初学者或者测试阶段建议关闭该选项,bind配置文件中以//作为注释符。directory定义了区域解析库文件的存放目录,一般情况下区域解析库文件在/var/name目录下以XXXX.zone的名称存在。
完成上述修改后,可以重启named服务或者使用rndc reload命令通知named服务重读配置文件,如果该服务器能访问互联网此时就是一个缓存DNS服务器。
2.创建解析区域。在/etc/named.rfc912.zones文件中添加要解析的区域,type定义了这台DNS服务器在contoso.com区域所扮演的角色,此处定义为主服务器,file指明了区域解析库文件的位置,由于在/etc/named.conf配置文件中设置了directory的值,所以此处可以使用相对路径,contoso.com.zone文件的绝对路径为/var/named/contoso.com.zone。
3.创建区域解析库文件。区域解析库文件是由众多RR(Resource Record)值组成,资源记录的格式为:
domain_name [TTL] IN rr_type value
domain_name:当前区域的名字,如contoso.com.(结尾的“.”不能省略),因为在/etc/named.rfc912.zones配置文件中已经定义的当前区域名称,所以此处可以使用@来简写
TTL:可以从全局继承,即在区域解析库文件的首部使用$TTL来定义;
rr_type:SOA、A、CNAME、MX、NS等。一个区域解析库有且仅能有一个SOA(Start Of Authority)记录,而必须为解析库的第一条记录;
value:有多个部分组成。(1)当前区域主DNS服务器的FQDN,也可以是当前区域的名字(简写为@) (2)当前区域管理员的邮箱地址,因为@在该文件中有特殊用法,所以邮箱中出现@的地方都已“.”来代替。
在该文件中如果下一行的相同位置与上一行一致,可以省略,他会继承上一行对应位置的值,如:NS的资源记录类型;另外在该文件中如果不是以“.”结尾的值它会自动补上区域名称,所以此处可以是ns2,也可以是ns2.contoso.com. ,但如果是ns2.的话就是错误的数值,他会认为这是ns2.与contoso.com.两个不同的区域。
创建完区域解析库文件后,可以使用named-checkcong和named-checkzone两条命令来检查配置文件和区域解析库文件是否存在语法错误
检查无误后使用dig命令进行测试,其中aa(authority answer)表示这是一个权威回答,只有本负责本区域的DNS服务器的回答才称为权威回答,除此之外的回答全部都是非权威回答,如:递归过程中由其他DNS服务器缓存给出的回答。
需要注意的一点是:使用管理员创建完的区域解析库文件任何人都可以读取,在安全上会有风险,建议将权限改为640并且将属组改为named。
创建反向解析DNS服务器
首先需要说明的是:反向解析区域与正向解析区域是两个不同的区域,每个区域都有各自的区域解析库文件,并且这两个区域可以不在同一台服务器上,大多数场景是将正反解析区域部署在同一台服务器,此处也在同一台服务器上部署正反解析区域。
1.创建解析区域。反向解析域的解析区域名称为:网络地址反写.in-addr.arpa,在/etc/named.rfc1912.zone配置文件中添加一个反向解析区域。对于解析区域(zone)其结尾的“.”可以省略,而区域解析库文件(file)的名称是可以随意命名的。
2.在/var/named/目录下创建一个名为172.16.10.zone的反向区域解析库文件,反向区域解析库文件不需要MX和A,以及AAAA记录;以PTR记录为主。$ORIGIN的作用是将名称补全,如:10会补全为10.10.16.172.in-addr.arpa.(这个变量可以不用设置,因为在创建解析区域zone时就已经定义过区域名称),需要注意的是此处的value值不能简写,否则他会使用10.16.172.in-addr.arpa.补全。
3.同样使用chmod和chown命令更改创建的/etc/72.16.10.zone区域解析库文件权限和属组,使用named-checkcong和named-checkzone检查无误后,使用dig -x 172.16.10.20 @172.16.10.10或者host命令验证,此处以host为例
补充说明
dig命令不会查询本地host文件;
rndc: remote name domain controller,默认与bind安装在同一主机,且只能通过127.0.0.1来连接named进程;提供辅助性的管理功能,侦听在TCP的953端口