DNS
DNS简介
域名系统(服务)协议:
(DNS)是一种分布式网络目录服务,主要用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送。
大多数因特网服务依赖于 DNS 而工作,一旦 DNS 出错,就无法连接 Web 站点,电子邮件的发送也会中止。
DNS 有两个独立的方面 :
定义了命名语法和规范,以利于通过名称委派域名权限。基本语法是: local.group.site; 定义了如何实现一个分布式计算机系统,以便有效地将域名转换成 IP 地址
在 DNS 命名方式中,采用了分散和分层的机制来实现域名空间的委派授权以及域名与地址相转换的授权。通过使用 DNS 的命名方式来为遍布全球的网络设备分配域名,而这则是由分散在世界各地的服务器实现的。
理论上, DNS 协议中的域名标准阐述了一种可用任意标签值的分布式的抽象域名空间。任何组织都可以建立域名系统,为其所有分布结构选择标签,但大多数 DNS 协议用户遵循官方因特网域名系统使用的分级标签。
常见的顶级域是: COM 、 EDU 、 GOV 、 NET 、 ORG 、 BIZ ,另外还有一些带国家代码的顶级域。
DNS 的分布式机制支持有效且可靠的名字到 IP 地址的映射。多数名字可以在本地映射,不同站点的服务器相互合作能够解决大网络的名字与 IP 地址的映射问题。单个服务器的故障不会影响 DNS 的正确操作。 DNS 是一种通用协议,它并不仅限于网络设备名称。
域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
域名系统(Domain Name System,DNS)是Internet上解决网上机器命名的一种系统。就像拜访朋友要先知道别人家怎么走一样,Internet上当一台主机要访问另外一台主机时,必须首先获知其地址,TCP/IP中的IP地址是由四段以“.”分开的数字组成,记起来总是不如名字那么方便,所以,就采用了域名系统来管理名字和IP的对应关系。
DNS服务基本概念
在介绍DNS服务器工作原理之前我们先来了解几个DNS相关的概念:
FQDN
FQDN:Full Qualified Domain Name,完全限定域名,即每个域在全球网络都是唯一的;另外值得提到的一点是域并不是指诸如www.google.com这样的域名,而google.com才是域;
域的分类
(1)根域:标识为(.)点 ,全球13组根域名服务器以英文字母A到M依序命名,域名格式为“字母.root-servers.net”。其中有11个是以任播技术在全球多个地点设立镜像站。比如中国大陆在北京有两台编号为L的镜像,编号为F、I、J的镜像各一台,共5台;香港有编号为D、J的镜像各2台,编号为A、F、I、L的镜像各一台,共8台;台湾则有编号为F、I、J各一台,共3台。
(2)顶级域:顶级域(Top Level Domain,简称TLD)分为三类
通用顶级域:诸如 .com(商业机构) .org(非营利性组织) .net(网络服务机构)等
国家顶级域:诸如 .cn(中国) .uk(英国) .us(美国) .jp(日本)
反向域(基础建设顶级域):.arpa,即从IP到FQDN的反向解析
DNS服务器查询的类型
(1)递归:客户端仅发出一次请求,让DNS服务器去查询返回结果;
(2)迭代:要发出多次请求去分别查询不同的DNS服务器;
DNS名称解析方式:
(1)正向解析:即将FQDN转化为IP。
(2)反向解析:即将IP转化为FQDN。
DNS服务器类型:
(1)主DNS服务器:负责解析至少一个域。
(2)辅助(从)DNS服务器:负责解析至少一个,是主DNS服务器的辅助。
(3)缓存DNS服务器:不负责解析域,只是缓存域名解析结果。
DNS返回的结果类型:
(1)肯定答案:查询的域存在,会被缓存下来。
(2)否定答案:不存在查询的域名,因此不存在与其查询的域名对应的IP;会被缓存下来。
(3)权威答案:所查询的域名的结果是由负责解析这个域的DNS服务器所返回的答案。
(4)非权威答案:在缓存中查询的结果。
DNS的监听端口
tcp的53号端口,udp的53号端口。
DNS解析原理
(1)当用户在浏览器中输入www.likai.tech域名访问该网站时,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
(2)如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
(3)如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
(4)如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
(5)如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.tech)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.tech域的服务器收到请求后,如果自己无法解析,它就会找一个管理.tech域的下一级DNS服务器地址(likai.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找likai.tech域服务器,重复上面的动作,进行查询,直至找到www.likai.tech主机。
(6)如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
提示:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间的交互查询就是迭代查询。
DNS配置文件
/etc/named.conf 主配置文件 服务器主要运行参数
/etc/named.rfc1912.zones 区域文件,主要指定要解析哪个域名
/var/named/xxx.xx 数据文件,用来正向和反向的解析
资源记录的类型
A记录
(1)A记录(Address)正向解析
A记录是将一个主机名(全称域名FQDN)和一个IP地址关联起来。这也是大多数客户端程序默认的查询类型。
PTR记录
(2)PTR记录(Pointer)反向解析
PTR记录将一个IP地址对应到主机名(全称域名FQDN)。这些记录保存在in-addr.arpa域中。
CNAME记录
(3)CNAME记录(Canonical Name)别名
别名记录,也称为规范名字(Canonical Name)。这种记录允许您将多个名字映射到同一台计算机。
MX记录
(4)MX记录(Mail eXchange)
MX记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据 收信人的地址后缀来定位邮件服务器。MX记录也叫做邮件路由记录,用户可以将该域名下的邮件服务器指向到自己的mail server上,然后即可自行操控所有的邮箱设置。
当有多个MX记录(即有多个邮件服务器)时,则需要设置数值来确定其优先级。通过设置优先级数字来指明首选服务器,数字越小表示优先级越高。
NS记录
(5)NS记录(Name Server)
NS(Name Server)记录是域名服务器记录,也称为授权服务器,用来指定该域名由哪个DNS服务器来进行解析。
将网站的NS记录指向到目标地址,在设置NS记录的同时还需要设置目标网站的指向,否则NS记录将无法正常解析
NS记录优先于A记录。即,如果一个主机地址同时存在NS记录和A记录,则A记录不生效。
实现Internet 的DNS 服务架构
DNS 服务架构
对于DNS查询来说,其实DNS是一个树状的结构,查询的时候是根据域名从右到左来进行查询,域名每一级由独立的一个或者多个DNS服务器来进行查询
我们看到,当我们在对 www.google.com 这个域名进行查询时,首先是通过 . 这个根DNS服务器去查询 com 这个类型的 DNS 服务器地址,然后再通过 com 对应的多台DNS服务器(每一层都有多个DNS服务器)去查询 google 这个域名的DNS服务器,最后再通过 google的DNS服务器去查询主机名为 www 的这台主机的资源记录,从而得到 www.google.com 的IP地址。我们可以通过 dig +trace www.google.com 这个命令来追踪整个DNS查询的过程
[root@CentOS-7 ~]# dig +trace www.google.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> +trace www.google.com
;; global options: +cmd
. 87141 IN NS a.root-servers.net.
. 87141 IN NS f.root-servers.net.
. 87141 IN NS b.root-servers.net.
. 87141 IN NS h.root-servers.net.
. 87141 IN NS c.root-servers.net.
. 87141 IN NS j.root-servers.net.
. 87141 IN NS e.root-servers.net.
. 87141 IN NS l.root-servers.net.
. 87141 IN NS m.root-servers.net.
. 87141 IN NS i.root-servers.net.
. 87141 IN NS g.root-servers.net.
. 87141 IN NS k.root-servers.net.
. 87141 IN NS d.root-servers.net.
. 87141 IN RRSIG NS 8 0 518400 20200623170000 20200610160000 48903 .
;; Received 525 bytes from 8.8.8.8#53(8.8.8.8) in 59 ms
......
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com. 86400 IN RRSIG DS 8 1 86400 20200624050000 20200611040000 48903 .
......
;; Received 1174 bytes from 193.0.14.129#53(k.root-servers.net) in 52 ms
www.google.com. 121 IN A 208.101.21.43
;; Received 48 bytes from 192.55.83.30#53(m.gtld-servers.net) in 35 ms
我们看到整个DNS查询过程就是上述的根据域名从右到左来一步步查询:
. root DNS -> com DNS -> google DNS -> www
DNS查询类型一共有两种,一种是 迭代查询 (Iterative Query),另一种是 递归查询 (Recursive Query)
迭代查询时本地DNS Server会首先向 . DNS Server发出请求,此时 . DNS Server会返回给本地DNS Server com的 DNS Server,这样依次类推下去,最后将 www.google.com的ip地址返回
递归查询,则只是本地DNS Server向 . DNS Server发出一个请求,然后解析IP是交给了其下属的DNS Server来完成,最后将IP地址返回,由于递归查询在每个DNS Server上会有缓存信息,所以一般我们都是使用两种查询方式相结合的方式来进行DNS查询的
实验
实验架构图以及实验环境
环境要求:
需要8台主机
DNS客户端:192.168.32.6/24
本地DNS服务器(只缓存):192.168.32.8/24
转发目标DNS服务器:192.168.32.18/24
根DNS服务器:192.168.32.28/24
org域DNS服务器:192.168.32.38/24
likai.org域主DNS服务器:192.168.32.48/24
likai.org域从DNS服务器:192.168.32.58/24
www.likai.org的WEB服务器:192.168.32.68/24
前提准备
关闭SE-linux
关闭防火墙
时间同步
实验顺序:做一部分先测试一部分。先把web搭建起来。从下级往上面开始搭建。免得到时候一旦出错,排查错误需要花费时间
配置客户端
先配置 DNS客户端:192.168.32.6/24
根据实验要求,DNS解析指向的是缓存服务器本地DNS服务器(只缓存):192.168.32.8/24
在192.168.32.6机器中配置
[root@client ~]#vim /etc/resolv.conf
配置web服务端
这里简单做一个web界面,直接yum安装一个httpd服务即可
www.likai.org的WEB服务器:192.168.32.68/24
安装httpd
[root@WebServer ~]#yum install httpd -y
安装好之后制作一个web访问页面
[root@WebServer ~]#echo "www.likai.org" > /var/www/html/index.html
启动httpd服务
[root@WebServer ~]#systemctl start httpd
[root@WebServer ~]#systemctl enable httpd #开机自启
[root@WebServer ~]#ss -ntul #查看80端口,httpd服务端口是否打开
访问查看192.168.32.68的80端口,看到web服务效果图如下
访问web页面表示客户端192.168.32.6/24 测试web服务是否搭建成功
在命令行用curl访问命令测试一下:
配置主DNS服务器
likai.org域主DNS服务器:192.168.32.48/24
安装包
[root@MasterDNS ~]#yum install bind -y
安装好之后直接修改对应的配置文件
[root@MasterDNS ~]#vim /etc/named.conf
用”//"注释掉 listen-on port 53 { 127.0.0.1; };以及 allow-query {localhost; };
然后表明只能够让自己的从服务区转发数据。需要补充allow-transfer {192.168.32.58;};
之后修改/etc/named.rfc1912.zones 文件,建立主要数据区域,添加zone的对应配置文件
[root@MasterDNS ~]#vim /etc/named.rfc1912.zones
配置主DNS区域数据库信息
[root@MasterDNS ~]#vim /var/named/likai.org.zone
标识 | 意义 |
---|---|
TTL | time to live 生存时间,默认为秒 |
@ | 表示相应的域名,表示一个域名定义的开始这里代表likai.org |
IN | 表示后面的数据使用的是INTERNET标准 |
SOA | 表示授权开始 |
master | 该域的主域名服务器 |
admin | 管理员邮件地址(这里的邮件地址中的用.来代替常见的邮件地址的@.) |
1 | serial(d. adams)表示配置文件的修改版本,格式是年月日当日修改的次数,每次修改时都应该修改这个数字,要不然所做修改的不会更新到网上的其它DNS服务器的数据库上,即你所做的更新很可能对于不以你你的所配置的DNS服务器数据库上,即你所做的更新很可能对于不以你的所配置的DNS服务器为DNS服务器的客户端来说就不会反映出你的更新,也就对他们来说你更新是没意义的 |
1D | refresh,定义以单位(M分,H时,,D天,W周,默认是秒即不带单位)的刷新频率,即规定从域名服务器多长时间查询一个主服务器,以服务器的数据的是最新的 |
1H | retry,以1小时的时间间隔重试,即当从服务器试图在主服务器上查询更新时,而连接失败了,则这个值规定了从服务器多长时间后重试 |
1W | expire,规定从服务器在向主服务器更新失败之后清除记录的时间 |
3D | minimum TTL,规定缓冲服务器不能与主服务器联系上的清除记录时间 |
NS | net server,表示该主机是域名服务器 |
A | address,定义了一条A记录,表示该主机名到IP地址的对应记录 |
MX | mail exchange,定义一条邮件记录 |
CNAME | 定义了对应主机的一个别名 |
PTR | 指一条反向域名解析PTR记录,类似A记录(PTR指针记录由IP地址提供商提供) |
保存修改之后权限存在的问题,需要进一步修改对应的权限
启动主DNS服务
[root@MasterDNS named]#systemctl start named
客户端192.168.32.6/24 检测主DNS服务器
配置从DNS服务器
likai.org域从DNS服务器:192.168.32.58/24
安装包
[root@SlaveDNS ~]#yum install bind -y
安装好之后修改配置文件
[root@SlaveDNS ~]#vim /etc/named.conf
用”//"注释掉 listen-on port 53 { 127.0.0.1; };以及 allow-query {localhost; };
然后为了安全,不能够让其他服务器转移数据。需要补充allow-transfer {none;};表示拒绝全部。
之后修改/etc/named.rfc1912.zones 文件,建立主要数据区域,添加zone的对应配置文件
[root@SlaveDNS ~]#vim /etc/named.rfc1912.zones
注意指明文件的时候有个相对路径,是在 /var/named/slaves/ 下面
[root@SlaveDNS ~]#ll /var/named/slaves/
total 0
[root@SlaveDNS ~]#systemctl start named
[root@SlaveDNS ~]#ll /var/named/slaves/
total 4
-rw-r--r-- 1 named named 310 Nov 16 19:59 likai.org.slave
刚开始是文件是空的,从DNS服务启动之后文件就有了
在这里不需要建立配置从DNS区域数据库信息,因为开启服务之后会自动同步主服务器的DNS区域数据库信息
客户端192.168.32.6/24 检测主DNS服务器
父域(ORG)DNS服务器搭建
org域DNS服务器:192.168.32.38/24
安装包
[root@OrgDNS ~]#yum install bind -y
安装好之后修改配置文件
[root@OrgDNS ~]#vim /etc/named.conf
用”//"注释掉 listen-on port 53 { 127.0.0.1; };以及 allow-query {localhost; };
之后修改/etc/named.rfc1912.zones 文件,建立主要数据区域,添加zone的对应配置文件
[root@OrgDNS ~]#vim /etc/named.rfc1912.zones
配置父域DNS区域数据库信息
在这里没有web服务信息,不然就会存在www.org这样的域出现,实际上是不存在这样的域名的
[root@OrgDNS ~]#vim /var/named/orz.zone
保存修改之后权限存在的问题,需要进一步修改对应的权限
启动父域DNS服务器
[root@OrgDNS named]#systemctl start named
客户端192.168.32.6/24 检测主DNS服务器
有个标志位flags:qr:表示不是权威DNS解析,因为是分配给到下面的子域。上面的主从flags:aa 。表示为权威DNS解析
根域DNS服务器搭建
根DNS服务器:192.168.32.28/24
安装包
[root@RootDNS ~]#yum install bind -y
安装好之后修改配置文件
[root@RootDNS named]#vim /etc/named.conf
用”//"注释掉 listen-on port 53 { 127.0.0.1; };以及 allow-query {localhost; };
在后面DNS对应的根DNS文件指向全球13个根的改为模拟自己作为根 ,也可以在/etc/named.rfc1912.zones 中修改
[root@RootDNS ~]#vim /var/named/root.zone
配置根DNS区域数据库信息。这里委派的只有org的子域,当然也可以加很多 比如com edu …
保存修改之后权限存在的问题,需要进一步修改对应的权限
启动根域DNS服务器
[root@RootDNS named]#systemctl start named
客户端192.168.32.6/24 检测主DNS服务器
有个标志位flags:qr:表示不是权威DNS解析,因为是分配给到下面的子域。上面的主从flags:aa 。表示为权威DNS解析
被转发目标DNS服务器搭建
被转发目标DNS服务器:192.168.32.18/24
安装包
[root@ForwordDNS ~]#yum install bind -y
安装好之后修改配置文件
[root@ForwordDNS ~]#vim /etc/named.conf
用”//"注释掉 listen-on port 53 { 127.0.0.1; };以及 allow-query {localhost; };
修改/var/named/named.ca 根DNS配置文件,这里可以只留下一条记录,直接指向我们模拟的根DNS服务器地址
192.168.32.28
[root@ForwordDNS ~]#vim /var/named/named.ca
在这里还有一个安全选项需要禁止。只要是转发DNS服务都要把dnssec-enable 和nssec-validation
设置为no。注意不能注释掉,因为注释掉默认是yes。
开启被转发目标DNS服务器
[root@ForwordDNS ~]#systemctl start named
客户端192.168.32.6/24 检测主DNS服务器
本地DNS服务器搭建
本地DNS服务器(只缓存):192.168.32.8/24
安装包
[root@LocalDNS ~]#yum install bind -y
安装好之后修改配置文件
[root@LocalDNS ~]#vim /etc/named.conf
用”//"注释掉 listen-on port 53 { 127.0.0.1; };以及 allow-query {localhost; };
转发的时候需要把转发DNS服务都要把dnssec-enable 和nssec-validation设置为no。注意不能注释掉,因为注释掉默认是yes。
开启本地DNS服务器
[root@LocalDNS ~]#systemctl start named
至此,整个Internet 的DNS 服务架构就以及搭建完成,最后在客户端192.168.32.6测试
DNS客户端测试
DNS客户端192.168.32.6/24本机测试
这里注意测试之前要清除之前的所有缓存,用 rndc flush 命令清除 其中linux本机客户端192.168.32.6上面默认没有缓存,web服务上面也没有缓存。
访问页面
[root@client ~]#curl www.likai.org
www.likai.org
重新清除缓存,把主DNS服务器给down掉,看是否从DNS服务器能否提供服务。
并且打开从服务器的日志功能和跟踪日志
[root@SlaveDNS ~]#rndc querylog
[root@SlaveDNS ~]#tail -f /var/log/messages
[root@MasterDNS ~]#systemctl stop named
继续在客户端192.168.32.6测试
查看从服务器的跟踪日志
很明显看到是代理DNS服务器192.168.32.18访问,访问的是192.168.32.58从DNS服务器。
测试成功能够访问dig www.likai.org 表示已经实现Internet 的DNS 服务架构
虚拟机使用情况
这里一共使用了8台虚拟机,下图为使用的虚拟机展示
实验使用内存不大,基本上每台服务器配置一个1G内存即可完成实验。