环境介绍
运行软件
VMware Workstation Pro 14
系统环境
CentOS-7-x86_64-1810
操作配置
基础知识简介
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
域名空间
- 域和域名
DNS树的每个节点代表一个域,通过这些节点,对整个域名空间进行划分,成为一个层次结构。域名空间的每个域的名字通过域名进行表示。域名通常由一个完全正式域名(FQDN)标识。
- 根域名服务器
根域名服务器(Root Name Server)主要用来管理互联网的主目录,全球共有13台根域名服务器(这13台根域名服务器名字分别为”A”至”M”),1个为主根服务器在美国;其余12个均为辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。
h.root-servers.net.
m.root-servers.net.
l.root-servers.net.
i.root-servers.net.
j.root-servers.net.
b.root-servers.net.
k.root-servers.net.
a.root-servers.net.
g.root-servers.net.
e.root-servers.net.
c.root-servers.net.
f.root-servers.net.
d.root-servers.net.
注1,为什么只有13台根DNS:由于UDP报文可携带的数据包大小限制,导致只能包含13台DNS根服务器,且每个服务器要使用字母表中的单个字母命名。
注2,为什么不使用TCP通信:由于TCP通信比UDP开销大(一次UDP名字服务器交换可以短到两个包:一个查询包、一个响应包;一次TCP交换则至少包含7个包:三次握手初始化TCP会话、一个查询包、一个响应包以及最后一次握手来关闭连接)。
- 顶级域名服务器
DNS根域下面是顶级域,也由Internet域名注册授权机构管理,顶级域名服务器(top-level domains)负责解析本身顶级域名的下一级域名对应的权威DNS服务器地址。共有3种类型的顶级域 (组织域、地址域、反向域)。
域名由两组或两组以上的ASCII或各国语言字符构成,各组字符间由点号分隔开,最右边的字符组称为顶级域名或一级域名、倒数第二组称为二级域名、倒数第三组称为三级域名、以此类推。
顶级域名又分为三类:
一是国家和地区顶级域名(country code top-level domains,简称ccTLDs),200多个国家都按照ISO3166国家代码分配了顶级域名,例如中国是.cn
,日本是.jp
等;
二是通用顶级域名(generic top-level domains,简称gTLDs),例如表示工商企业的.com
,表示网络提供商的 .net
,表示非盈利组织的 .org
等;
三是新顶级域名(New gTLD)如通用的.xyz
、代表”高端”的.top
、代表”红色”的.red
、代表”人”的.ren
等一千多种。
- 区(Zone)
区是DNS名称空间的一个连续部分,其包含了一组存储在DNS服务器上的资源记录。
- 域名解析
首先,根据域名系统域名空间的层次结构将其按子树划分为不同的区域,每个区域可看作是负责层次结构中这一部分节点的可管理的权力实体。例如,整个域的顶层区域由ICANN负责管理,一些国家域名及其下属的那些节点又构成了各自的区域,像.cn
域就由CNNIC负责管理。而.cn
域下又被划分为一些更小的区域,例如.xxx.edu.cn
由xxx大学网络中心负责管理。
其次,每个区域必须有对应的域名服务器,每个区域中包含的信息存储在域名服务器上。一个区域中可有两个或多个域名服务器,这样即使其中一个域名服务器出了故障,另一个域名服务器仍然可以正常提供信息。一个域名服务器也可以同时管辖多个区域。域名服务器在接到用户发出的请求后查询自身的资源记录集合,返回用户想要得到的最终答案,或者当自身的资源记录集合中查不到所需要的答案时,返回指向另外一个域名服务器的指针,用户将继续向那个域名服务器发出请求。所以说,域名服务器不需要记录所有下属域名和主机的信息,对于其中的子域(如果存在),只需要知道子域的域名服务器即可。
资源记录是一个域名到值的绑定,它包括以下字段:域名、值、类型、分类和生命期。域名字段和值字段分别用来表示解析的内容和解析返回的结果。类型字段代表了值的种类:
类型为 A 代表值字段是一个IP地址,即用户所要的最终答案;
类型为 NS 代表值字段是另一个域名服务器的域名,该域名服务器能够知道如何解析域名字段所指定的域名;
类型为 CNAME 代表值字段是由域名所指定的主机的一个别名;
类型为 MX 代表值字段是一个邮件服务器的域名,该邮件服务器接收由域名字段所指定的域的邮件;
类型为 PTR 用于域名反解等。
分类字段允许指定其他的记录类型。生命期字段用于指出该资源记录的有效期是多少。为减少域名解析时间,域名服务器会缓存一些曾经查询过的、来自其他域名服务器的资源记录。由于这些资源记录会因为更改而失效,因此域名服务器设置了生命期,到期的资源记录会被清除出缓存。
根域名服务器知道所有顶级域名的域名服务器,对应于每个顶级域名,它都有两条资源记录:一条是NS资源记录,域名字段是该顶级域名,值字段是该顶级域名解析的域名服务器的域名;另一条是A资源记录,用来指明该域名服务器的域名对应的IP地址。综合使用这两条记录,就可以知道对该域下的某个域名解析,应该继续去哪个IP地址的域名服务器寻找。第二层的域名服务器类似地存放各个第三层域名服务器的指针。第三层的域名服务器会出现A、CNAME、MX等类型的资源记录。每个域名服务器都有根域名服务器的地址记录。
最后,一个需要域名解析的用户先将该解析请求发往本地的域名服务器。如果本地的域名服务器能够解析,则直接得到结果,否则本地的域名服务器将向根域名服务器发送请求。依据根域名服务器返回的指针再查询下一层的域名服务器,依此类推,最后得到所要解析域名的IP地址。
- 域名反解析
域名反解是指给出一个IP地址,找出其对应的域名,这也是利用DNS来实现的。举个例子,假设一个要反解的IP地址为202.120.225.9,系统将其改写为9.225.120.202. in-addr.arpa,然后按域名解析的方式查询。这需要在被查询主机的本地域名服务器上有一条对应于9.225.120.202.in-addr.arpa的资源记录,类型是PTR,值是其域名。
DNS 服务器分类
DNS服务器分为4类:
主DNS服务器(Master或Primary)
辅助DNS服务器(Slave或Secondary)
转发DNS服务器
唯高速缓存DNS服务器(Caching-only DNS server)
DNS 查询模式
- 递归查询
DNS 客户端送出查询要求后,如果DNS服务器内没有需要的数据,则DNS服务器会代替客户端向其他的DNS服务器查询,客户机只需接触一次DNS服务器。
- 迭代查询
DNS 客户端送出查询后,如果DNS服务器内没有需要的数据,则返给客户机另一个DNS服务器地址,将客户机转向另一个DNS服务器。
域名解析过程
注:浏览器和本地Host、本地DNS域名服务器之间为迭代查询;本地DNS域名服务器和根域名服务器、顶级域名服务器、权威域名服务器之间为迭代查询。(若存在路由器,则浏览器和路由器、本地DNS域名服务器之间为递归查询)
这里使用dig
域信息搜索器对www.baidu.com
域名进行查询解析跟踪:实际模拟用户浏览器访问域名后的重要场景
λ Qftm >>>: dig www.baidu.com @114.114.114.114 +trace
1、浏览器访问www.baidu.com
域名,先查询本地host是否有记录,有则直接返回IP地址给浏览器,没有则进一步查询
2、向运营商本地域名服务器(Local DNS,114.114.114.114)发起请求,若本地域名服务器的缓存中有记录,则直接返回给用户,若没有则进行迭代查询
3、本地域名服务器内部记录了全球13台根域名服务器的地址,其会向13台根域名服务器(Root DNS)发起请求,询问.com
的顶级域名服务器地址,这里最先回复的根域名服务器是192.203.230.10#53(e.root-servers.net)
,其返回了13台.com
顶级域名服务器的域名和地址
4、本地域名服务器继续向返回的13台.com
顶级域名服务器请求查询baidu.com
的权威域名服务器地址,最先回复的.com
顶级域名服务器是2001:503:eea3::30#53(g.gtld-servers.net)
,其返回了5台baidu.com
权威域名服务器的域名和地址
5、本地域名服务器继续向返回的5台baidu.com
权威域名服务器请求查询www.baidu.com
的三级域名服务器地址,最先回复的baidu.com
权威域名服务器是14.215.178.80#53(ns4.baidu.com)
,其返回了5台三级域名服务器NS记录和一台www.baidu.com
三级域名的CNAME记录www.a.shifen.com
6、本地域名服务器将查询到包含www.baidu.com
的6台三级域名服务器记录返回给浏览器
7、由于这里查询到的www.baidu.com
域名服务器地址为CNAME记录(存在别名服务器,多用于CDN域名加速服务),所以还需要循环重复以上1 => 6
步的查询操作,直到查询到目标域名服务器的A记录为止(A记录为最终的解析地址=>IP地址)
最后,www.baidu.com
三级域名最终解析的地址为39.156.66.14
或 39.156.66.18
。
8、使用ping进行测试,解析路径为:www.baidu.com => www.a.shifen.com => 39.156.66.14
λ Qftm >>>: ping www.baidu.com
Pinging www.a.shifen.com [39.156.66.14] with 32 bytes of data:
Reply from 39.156.66.14: bytes=32 time=6ms TTL=55
Reply from 39.156.66.14: bytes=32 time=7ms TTL=55
Reply from 39.156.66.14: bytes=32 time=7ms TTL=55
Reply from 39.156.66.14: bytes=32 time=8ms TTL=55
Ping statistics for 39.156.66.14:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 6ms, Maximum = 8ms, Average = 7ms
主 DNS 服务器配置
(0)DNS 服务器IP地址配置
(1)安装 DNS 服务
- 认识 BIND
BIND 是一款实现DNS服务器的开放源码软件。BIND经历了第4版、第8版和最新的第9版,第9版修正了以前版本的许多错误,并提升了执行时的效能,BIND能够运行在当前大多数的操作系统平台之上。目前BIND软件由Internet软件联合会(Internet Software Consortium,ISC)这个非营利性机构负责开发和维护。
- 安装 bind 软件包
使用yum命令安装bind服务
yum clean all //安装前先清除缓存
yum install bind* -y
rpm -qa|grep bind
(2)配置主配置文件 named.conf
[root@localhost ~]# vim /etc/named.conf
(3)配置正向解析区域 qftm.com.zone
[root@localhost ~]# vim /var/named/qftm.com.zone
(4)配置反向解析区域 2.168.192.in-addr.arpa.zone
[root@localhost ~]# vim /var/named/2.168.192.in-addr.arpa.zone
(5)将 /etc/named.comf、正反向区域文件属组有root改为named
[root@localhost ~]# chgrp named /etc/named.conf
[root@localhost ~]# chgrp named /var/named/qftm.com.zone
[root@localhost ~]# chgrp named /var/named/2.168.192.in-addr.arpa.zone
(6)检查各个配置文件是否正确
- 检查主配置文件 named.conf
[root@localhost ~]# named-checkconf
- 检查正向解析区域 qftm.com.zone
[root@localhost ~]# named-checkzone "qftm.com" /var/named/qftm.com.zone
- 检查反向解析区域 2.168.192.in-addr.arpa.zone
(7)重启 DNS 服务
[root@localhost ~]# systemctl restart named
(8)在Linux客户端测试配置效果
[root@localhost ~]# nslookup
> server //查询DNS服务器地址
Default server: 192.168.2.129
Address: 192.168.2.129#53
> dns.qftm.com //解析dns.qftm.com
Server: 192.168.2.129
Address: 192.168.2.129#53
Name: dns.qftm.com
Address: 192.168.2.129
> blog.qftm.com //解析blog.qftm.com
Server: 192.168.2.129
Address: 192.168.2.129#53
Name: blog.qftm.com
Address: 192.168.2.111
> 192.168.2.129 //反向解析192.168.2.129
Server: 192.168.2.129
Address: 192.168.2.129#53
129.2.168.192.in-addr.arpa name = dns.qftm.com.
> 192.168.2.111 //反向解析192.168.2.111
Server: 192.168.2.129
Address: 192.168.2.129#53
111.2.168.192.in-addr.arpa name = blog.qftm.com.
> exit //退出测试
[root@localhost ~]#
辅助 DNS 服务器配置
(1)辅助域名服务器
DNS划分若干区域进行管理,每个区域由一个或多个域名服务器负责解析。对于存在多个域名服务器的区域,必须选择一台主域名服务器(master),保存并管理整个区域的信息,其他服务器称为辅助域名服务器(slave)。
管理区域时,使用辅助域名服务器有如下几点好处:
1、辅助DNS服务器提供区域冗余,能够在该区域的主服务器停止响应时为客户端解析该区域的DNS名称。
2、创建辅助DNS服务器可以减少DNS网络通信量。采用分布式结构,在低速广域网链路中添加DNS服务器能有效地管理和减少网络通信量。
3、辅助服务器可以用于减少区域的主服务器的负载。
(2)区域传输
为了保证DNS数据相同,所有服务器必须进行数据同步,辅助域名服务器从主域名服务器获得区域副本,这个过程称为区域传输。
区域传输存在两种方式:完全区域传输(AXFR)和增量区域传输(IXFR)。
满足发生区域传输的条件时,辅助域名服务器向主服务器发送查询请求,更新其区域文件。
- 区域传输过程
① 区域传输初始阶段,辅助服务器向主DNS服务器发送完全区域传输(AXFR)请求。
② 主服务器做出响应,并将此区域完全传输到辅助服务器。该区域传输时会一并发送SOA资源记录。SOA中“序列号”(serial) 字段表示区域数据的版本,“刷新时间”(refresh)指出辅助服务器下一次发送查询请求的时间间隔。
③ 刷新间隔到期时,辅助服务器使用SOA查询来请求从主服务器续订此区域。
④ 主域名服务器应答其SOA记录的查询。该响应包括主服务器中该区域的当前序列号版本。
⑤ 辅助服务器检查响应中的SOA记录的序列号,并确定续订该区域的方法,如果辅助服务器确认区域文件已经更改,则它会把IXFR查询发送到主服务器。若SOA响应中的序列号等于其当前的本地序列号,那么两个服务器区域数据都相同,并且不需要区域传输。然后,辅助服务器根据主服务器SOA响应中的该字段值重新设置其刷新时间,续订该区域。如果SOA响应中的序列号值比其当前本地序列号要高,则可以确定此区域己更新并需要传输。
⑥ 主服务器通过区域的增量传输或完全传输做出响应。如果主服务器可以保存修改的资源记录的历史记录,则它可以通过增量区域传输(IXFR) 做出应答。如果主服务器不支持增量传输或没有区域变化的历史记录,则它可以通过完全区域传输(AXFR)做出应答。
(3)配置辅助域名服务器
- DNS 服务器IP地址配置
- 安装 bind 软件包
使用yum命令安装bind服务
yum clean all //安装前先清除缓存
yum install bind* -y
rpm -qa|grep bind
- 配置主配置文件 named.conf
[root@localhost ~]# vim /etc/named.conf
PS:辅助DNS服务器只需要设置主配置文件,正反向区域解析文件会在辅助DNS服务器设置完成主配置文件重启DNS服务时又主DNS服务器同步到辅助DNS服务器。只不过路径是/var/named/slaves而已。
- 数据同步测试
① 重启辅助服务器named服务,使其与主域名服务器数据同步,然后我们在主域名服务器上执行tail命令查看系统日志,辅助域名服务器通过完整无缺区域复制(AXFR)获取qftm.com区域数据。
② 通过ls命令查看辅助域名服务器/var/named/slaves目录下是否存在qftm.com区域文件,若存在说明复制成功。
PS:配置区域复制时主DNS服务器和辅助DNS服务器一定要关闭防火墙
③ 在客户端测试辅助DNS服务器
[root@localhost ~]# nslookup
> server
Default server: 192.168.2.128
Address: 192.168.2.128#53
> www.qftm.com
Server: 192.168.2.128
Address: 192.168.2.128#53
Name: www.qftm.com
Address: 192.168.2.100
> dns.qftm.com
Server: 192.168.2.128
Address: 192.168.2.128#53
Name: dns.qftm.com
Address: 192.168.2.129
> 192.168.2.100
Server: 192.168.2.128
Address: 192.168.2.128#53
100.2.168.192.in-addr.arpa name = www.qftm.com.
> 192.168.2.129
Server: 192.168.2.128
Address: 192.168.2.128#53
129.2.168.192.in-addr.arpa name = dns.qftm.com.
> exit
[root@localhost ~]#