DNS(Domain Name System)域名系统,属于应用层协议,是互联网的一项服务。DNS作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网它是基于C/S架构。
一、DNS服务器原理
一图看懂DNS服务器工作原理:
上图中,假设用户想去查询www.magedu.com这个域名所对应的ip,需要先经过所在区域的DNS服务器:
①如果该区域之前有用户查询过同域名所对应的ip,则DNS服务器中会有缓存,直接将结果返回给客户;
②如果区域DNS服务器没查到,则转向根DNS服务器查询,根DNS服务器如果有缓存记录,返回给区域服务器,区域服务器再将结果返回给用户;
③如果区域服务器也没缓存记录,则会根据.com顶级域名、magedu.com二级域名、www.magedu.com指定主机的顺序去迭代查询,直到查询到ip,并将结果返回给区域DNS服务器,再由区域DNS服务器将结果返回给用户。
其中,用户和区域DNS服务器(即本地DNS服务器)之间属于递归查询,区域DNS服务器未找到缓存转向其他DNS服务器进行查询属于迭代查询。
二、搭建主-从服务器
笔者这边准备三台虚拟机,ip为10.0.0.152-154的分别作为客户端(取名client)、主服务器(取名master)和从服务器(取名slave1),希望实现客户端通过主-从服务器去解析指定域名(www.johnnyfang.com)所对应的ip。
(一) 主服务器配置
- 下载bind
DNS服务器软件包括bind、powerdns、dnsmasq、unbound和coredns等,bind是老牌的DNS软件,笔者这边通过bind来操作,执行 yum install -y bind 命令下载bind软件包(如下图)。
- 修改配置文件
执行 rpm -ql bind 命令可查看bind包详情,bind包配置文件与其他软件的取名不同,而是命名为named.conf,执行 vim /etc/named.conf ,修改配置文件:
①找到“listen-on port 53”一行,在前面加//注释掉,即网段内的所有ip可用,也可将默认的12.0.0.1改为localhost;
②找到“allow-query”一行,这里默认的localhost指的是仅本主机可用,在前面加//注释掉,即任何人可查询,或者将localhost改为any也可。如果是比较私密的东西,也可添加具体的ip或者网段可查询;
③添加“allow-transfer { 10.0.0.154;};”,即指定ip为10.0.0.154的从服务器进行区域传输,防止黑*客获得所有从节点信息后,按照名单去攻*击服务器;
④为了避免实验失败,建议关闭加密验证,将dnssec-enable和dnssec-validation默认的yes改为no。
具体操作如下:
- 设置DNS的区域
主服务器的区域虽然也可直接在配置文件中参照范例添加,不过一般不直接放在配置文件中,而是在推荐的文件中进行设置(如下图)。
执行 vim /etc/named.rfc1912.zones 命令打开推荐的文件,在注释行下面添加如图所示内容:
其中,zone限定了是什么域名需要进行解析,这里的主机是主服务器,故类型为master,file部分指定了存放名称解析服务的区域解析库文件名称。
- 创建区域解析库文件
但是并不存在笔者所填写的“johnnyfang.com.zone”区域解析库文件,也没有指定文件的相对路径。区域解析库文件的相对路径在/etc/named.conf文件中已有设定,在/var/named目录下,进入到该目录下,可以看到有一个名为“named.localhost”的文件,可参考此文件来创建区域解析库文件,执行 cp named.localhost johnnyfang.com.zone -p 命令,拷贝生成指定名为johnnyfang.com.zone的文件,-p选项可保留文件属性(如下图)。
打开并修改johnnyfang.com.zone文件:
①将SOA后面的@改为master,或者改成johnnyfang.com.,注意com后面有点;
②Rname.invalid.部分为邮箱,如果DNS出问题会发到邮箱,注意填写邮箱不能用@,@用.代替,注意邮箱后面也要加.;
③添加NS记录,将主服务器、从服务器和www所对应的ip信息添加进去。
具体操作如下:
区域解析库其他信息说明:
①serial:记录版本号,当名称解析数据库文件内容有所变动时需要加1,不然无法解析,仍旧按之前版本的来;
②refresh:同步拉取时间,默认的为1天。可能会涉及多台DNS服务器,部署主-从服务器时,数据同步有两种机制,一种是主服务器更新后主动将更新内容推给从服务器,一种是从服务器主动从主服务器拉更新数据;
③retry:当从服务器数据拉取失败时的再次拉取时间,默认为1h,即失败了每隔一小时拉取一次;
④expire:过期时间,默认的是一周。指的是如果拉取数据失败,连续一周还没拉取到,则认为从服务器数据过久,不能再对外提供服务;
⑤minimum:默认为3小时。指的是用户想服务器发送请求,但是请求内容不正确,一直寻找会对磁盘造成压力,就直接告诉用户不存在。对这种不存在的请求自动生成缓存,缓存时间为3小时。
修改并保存区域解析库文件后,执行 systemctl enable --now named 命令启动服务,并设为开机启动,如果下载后就开启了服务,执行 rndc reload 命令重启服务即可(用 rndc reload 代替 systemctl testart named,可避免正在访问的用户出现访问中断等情况)。
(二)从服务器配置
搭建从服务器的目的在于提升容错性,当主服务器不能使用的时候,从服务器能够顶上,避免一定时间段的用户无法查询等,并能实现一定程度的负载均衡。
- 下载bind
同主服务器一样,从服务器也需要下载bind软件来进行配置。
- 修改配置文件
修改配置文件部分,从服务器与主服务器类似,也是四部分内容需修改,但是添加的“allow-transfer ”,即允许与自己进行区域传输部分需填写none,以避免黑*客抓取各从节点信息来进行攻*击服务器(如下图)。
- 设置DNS区域
可参照之前主服务器的区域设置来填写,不过此处的类型为slave,即从服务器,同时要指定主服务器的ip(如下图)。
执行 systemctl enable --now named 启动服务。
此时进入到/var/named/slaves目录下,会发现自动生成了一个640权限的区域解析库文件,同时这个文件做了二进制的转化,无法直接查看内容,相对也比较安全。
(三)客户端配置
- 下载bind-utils
客户端无需下载bind,执行 yum list bind* 命令可查看光盘中的bind包有哪些相关包,其中有个名为bind-utils的包是专业的DNS测试工具,能提供dig、host和nslookup等命令,可以下载一个。
- 修改网卡
将客户端的DNS改为主-从服务器ip,修改保存后执行 service network restart 命令让网卡生效,笔者这边客户端使用的是CentOS7,如果是CentOS8,需要先加载网卡,再启动网卡,让网卡生效(如下图)。
- 客户端测试
客户端执行 host www.johnnyfang.com 命令,可解析出对应的ip地址为10.0.0.188,这与主服务器中设定的相符合的,执行 dig www.johnnyfang.com 命令也可解析出对应的ip,并且默认走的是主服务器ip的DNS(如下图)。
返回到主服务器master,执行 rndc stop 命令,停止bind服务,再返回客户端执行 dig www.johnnyfang.com 命令,依旧可以解析出对应ip,此时使用的则是从服务器ip的DNS(如下图)。
- 同步功能测试
主服务器段修改域名所对应的ip,同时将版本号加1,执行 rndc reload 命令重新加载区域解析库文件。此时,返回从服务器,查看/var/named/slaves目录,从时间上看已重新生成了新的解析库文件(如下图)。
客户端执行 dig www.johnnyfang.com 命令,解析到的对应ip已变成修改后的10.0.0.189(如下图)。
通过实验,我们可以发现,搭建主-从服务器后,如果主服务因断网或其他原因等导致用户无法直接使用解析功能时,从服务器可以及时地替补上去供用户使用,从而提升容错性。