Centos7 搭建DNS服务器与原理配置详解
Posted 小四郎的代码园
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Centos7 搭建DNS服务器与原理配置详解相关的知识,希望对你有一定的参考价值。
在搭建我们自己DNS服务器之前,先必须了解下DNS服务器的作用和原理。
DNS是在互联网上进行域名解析到对应IP地址的服务器,保存互联网上所有的IP与域名的对应信息,然后将我们对网址的访问,解析成IP地址并返回,然后电脑再去通过IP地址去访问服务器,获得数据。
首先就要讲一下域名,这里我拿百度的地址来进行讲解:
www.baidu.com.
完整的域名,后面都是有一个“.”的,但是一般使用中都是默认省略点了,这是一个完整的域名。通过 "." 来进行分割成三个部分:
www: www是 主机名
baidu: baidu是 域名
com: com是 类型
但是平时,我们习惯将整 域名+类型合起来成为域名,主机名,称之为子域名。 而实际上并不是这样的。严格来说就是 主机名,域名,类型。
然后,当我们访问 www.baidu.com 时,电脑会先去dns服务器上查找与这个网址对应的 ip并返回。这个过程就是DNS解析。而DNS服务器又分为下面几种:
某些网络连接不鼓励向本地以外发送很大的数据流量,这要么是因为网络连接是按流量计费的,或网络连接本身是带宽不足。在这样的情况下,如果想将发往外部的 DNS 流量限制到尽可能的小,就需要使用 BIND 的转发机制。或者你的网络中只有一台机器能连接到 Internet ,而你在这台机器上运行了 BIND ,那么你可以将这台 BIND 作为内部网络中的其他 BIND 的转发器,使得其他 DNS 也能查找 Internet 域名。
转发机制的这样的:当你设置了转发器后,所有非本域的和在缓存中无法找到的域名查询都将转发到设置的 DNS 转发器上,由这台 DNS 来完成解析工作并做缓存,因此这台转发器的缓存中记录了丰富的域名信息。因而对非本域的查询,很可能转发器就可以在缓存中找到答案,避免了再次向外部发送查询,减少了流量。
转发器的配置格式是:
options {
forwarders { 192.168.24.35; 192.168.24.36; };
};
这里要注意,转发器本身不用做任何设置,而是对需要转发器的其他 DNS server 做以上配置。还有,如果该 DNS Server 无法联系到转发器,那么 BIND 会自己尝试解析。
如果你要禁止 BIND 在无法联系到转发器时不做任何操作,那么你还可以使用 forward only 命令,这样 BIND 只能使用区的权威数据和缓存来响应查询了( 在连接不到转发器的情况下 )。
options {
forward first;
forwarders { 192.168.24.35; 192.168.24.36; };
forward only;
};
其中forward first说明先把dns请求转发出去然后再查本机的dns记录,
在 BIND 8.2 以后引入了一个新的特性:转发区( forward zone ),它允许你把 DNS 配置成只有查找特定域名的时候才使用转发器。( BIND 9 从9.1.0 才开始有转发区功能 )例如,你可以使你的服务器将所有对 xmgd.com 结尾的域名查询都转发给 xmgd.com 的两台名字服务器:
zone "xmgd.com" {
type forward;
forwarders { 210.52.83.228; 210.52.83.229; };
};
这样的功能有什么用呢?假设 xmgd.com 和你的网络有一个私有的连接,而 xmgd.com 又没有连接上 Internet ,那么你从 Internet 是无法查到 xmgd.com 后缀的域名的,这时你就要使用转发区的功能了。
还有一种转发区设置和刚才的设置刚好相反,它允许你设置什么样的查询将不被转发,当然这只适用于在 options 语句中指定了转发器的 DNS 。配置如下:
options {
directory "/var/named";
forwarders { 192.168.24.35; 192.168.24.36; };
};
zone "xmgd.com" {
type master;
file "zone.xmgd.com";
forwarders {};
};
这样写你可能会问为什么你要在自己的权威区里禁止转发?难道不是自己回答查询而不使用转发器吗?
有这样一种情况,在 xmgd.com 这个区中,你授权了几个子域,例如:zx.xmgd.com、lab.xmgd.com 等,那么在 xmgd.com 的权威服务器上设置转发后,因为对 zx.xmgd.com、lab.xmgd.com 这几个子域不是权威,那么如果有对 www.zx.xmgd.com 这样的子域的域名查询,服务器也将转发。这完全是没有必要的,因为服务器上就有 zx.xmgd.com 子域的 NS 记录,何须再转发。
"." :完整网址中最后的那个“.” 就代表DNS的根服务器,根服务器是DNS服务器中最上层的服务器,分布在全球各地。其中保存着该区域的所有 的类型DNS服务器的IP地址
com : com是一个DNS类型,像常见的com,net,org,edu,gov是政府的规定的正式类型,还有常见的商用类型等。里面保存着的都是类型为 com 的域名服务器的IP地址。
baidu.com : baidu为域名,是com的下级dns服务器,里面保存着域名为 baidu.com 的所有主机对应的IP地址
当我们访问 www.baidu.com 时,会先去 根服务器中 查找所有的 com类型服务器的地址,然后再去com类型的服务器上查找所有 baidu.com 域名的服务器地址,最后再去 所有baidu.com的域名服务器上找到 www.baidu.com 这个网址对应的IP地址,然后返回给访问www.baidu.com的电脑主机。 然后主机就用这个IP与服务器建立连接。
另外,所有这些不同层级DNS服务器都一般是由多台服务器同时提供服务,做一个冗余好可用,负载均衡。 在这上面分为:
主服务器: 又名master服务器,所有其他从服务器和缓存服务器的域名解析信息都是由master服务器上抓取下来的,所有的修改都直接在master上修改就行了,别的自动同步
从服务器: 又名salve服务器,是作为master服务器的冗余备份,让master故障后,salve还能继续提供服务。
缓存服务器: 主要作用就是缓存DNS信息,提供服务给用户查询,并不能自定义域名配置进行解析。
然后再DNS服务器上进行查询的时候,分为两种查询模式,递归查询和循环查询:
递归查询 :就时去去到一个dns服务器查询到结果后,就将结果返回给查询者,查询者再去查询别的DNS服务器,这样一次一次的进行查询返回,直到找到数据。
循环查询: 循环查询就是查询者像一个DNS服务器发起查询后,由这个DNS服务器去查询别的服务器A,A又去查询别的服务器B,直到找到结果,然后返回B,B返回给A,A 再返回给查询者。
一般情况下,是我们个人主机,向我们网络配置中配置的DNS服务器进行查询,使用循环查询,由指定的DNS服务器代替我们用递归查询去网络上查询得到结果。然后返回给个人用户主机。 这就是DNS服务器的工作原理。
而现在我们就是要搭建自己DNS服务器,让公司内所有员工的DNS服务器地址都指向到这台服务器上。通过这个本地的DNS服务器来进行解析,代替常用的DNS服务器,如果各大运行商的,114的,阿里云的等等。
这样做就可以自定义自己内部的域名,通过域名来访问内网的服务器,像公司内网的论坛,内网的网站等等,都可以直接输入网址进行访问。
下面进行安装: 环境:centos7.2
首先:
yum install bind bind-utils bind-chroot -y<span style="white-space:pre"> </span>(bind-utils和bind-chroot dns的常用工具,不下也可以,不影响服务)
配置文件:
/etc/named.conf主配置文件
/etc/named/zone文件
如过你安装了bind-chroot,则bind-chroot会将bind服务放置于一个伪根目录下,这样如何黑客攻破了你的服务器,进到来的就是在伪根目录下,不会危害到你真正的根目录,是一个安全的措施。
伪根目录:
/var/named/chroot/etc/named.conf 红色就是伪根目录。
这个就是bind-chroot生成的伪根目录。在这个目录下,会生产完整的bind服务的结构,进到这个目录下,会发现里面基本没有文件,只有目录文件夹,这就需要你将真实的根目录下的bind的配置文件和一些需要的文件都复制一份到这个伪根下,或创建一些基础文件,给与权限啊等操作:
$ cp -R /usr/share/doc/bind-9.9.4/sample/var/named/* /var/named/chroot/var/named/
$ touch /var/named/chroot/var/named/data/cache_dump.db
$ touch /var/named/chroot/var/named/data/named_stats.txt
$ touch /var/named/chroot/var/named/data/named_mem_stats.txt
$ touch /var/named/chroot/var/named/data/named.run
$ mkdir /var/named/chroot/var/named/dynamic
$ touch /var/named/chroot/var/named/dynamic/managed-keys.bind
$ chmod -R 777 /var/named/chroot/var/named/data
$ chmod -R 777 /var/named/chroot/var/named/dynamic
$ cp -R /etc/named* /var/named/chroot/etc/
$ chown -R root.named /var/named/chroot/<span style="white-space:pre"> </span>##直接将伪根目录下的所有文件都给named用户,让其能够修改。避免权限问题报错。
如果不不使用 bind-chroot 的话,就不需要上面的操作。直接进行下面的配置文件修改,修改的目录也不是伪根目录了,直接修改真实的目录就行
好的,剩下的就是编辑配置文件,自定义DNS服务了。
vim /var/named/chroot/etc/named.conf
options {
listen-on port 53 { any; };<span style="white-space:pre"> </span>## 修改成any
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };<span style="white-space:pre"> </span>## 修改成any
/*
- If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
- If you are building a RECURSIVE (caching) DNS server, you need to enable
recursion.
- If your recursive DNS server has a public IP address, you MUST enable access
control to limit queries to your legitimate users. Failing to do so will
cause your server to become part of large scale DNS amplification
attacks. Implementing BCP38 within your network would greatly
reduce such attack surface
*/
recursion yes;<span style="white-space:pre"> </span>## 不用修改,启动递归服务
dnssec-enable yes;<span style="white-space:pre"> </span>## 不用修改
dnssec-validation yes;<span style="white-space:pre"> </span>## 不用修改,下面的没贴出来的也不用修改,保持默认就行
然后修改域空间配置文件
vim /var/named/chroot/etc/named.rfc1912.zones
zone "amos.com" IN {<!-- --><span style="white-space:pre"> </span>## amos为我设置的域名。可自定义修改为自己的域名
type master;<span style="white-space:pre"> </span>## DNS服务类型,默认为master,这里我们是搭建的第一个DNS服务器,则就定为主服务器,即默认的master
file "creatson.com.zone";<span style="white-space:pre"> </span>## 域名配置文件名 ,这个文件名会在 /var/named/chroot/var/named/ 这个目录下去寻找
};
配置了域的配置文件路径后,就需要创建这个域的配置文件:
cp /var/named/chroot/var/named/named.localhost /var/named/chroot/var/named/amos.com.zone<span style="white-space:pre"> </span>## 已named.localhost为基础模板,复制一份并改为上一步配置的名称
vim /var/named/chroot/var/named/amos.com.zone<span style="white-space:pre"> </span>## 编辑
-------------------------------------------以下为内容-------------------------------------------------
$TTL 1D<span style="white-space:pre"> </span>## TTL 就是修改配置的生效时间,本质上就是这个域的DNS信息在别的DNS服务器的缓存中存在多久,默认为一天
@ IN SOA @ rname.invalid. (
0 ; serial<span style="white-space:pre"> </span>## 这个是配置的编号,每次修改完配置后这个编号变化一下,通常是直接+1,这样从服务器就能知道有修改并更新配置
1D ; refresh<span style="white-space:pre"> </span>## 从服务器刷新时间,默认一天刷新一次<span style="white-space:pre"> </span>
1H ; retry<span style="white-space:pre"> </span>## 如果刷新失败,默认1小时重试一次
1W ; expire<span style="white-space:pre"> </span>## 缓存过期时间,一周<span style="white-space:pre"> </span>
3H ) ; minimum<span style="white-space:pre"> </span>## 这个不知道干嘛的,默认就行
NS @
A 127.0.0.1
AAAA ::1
eip IN A 192.168.9.89<span style="white-space:pre"> </span>## 配置子域名,也就是主机名,对应的IP地址,A记录就是对应 IPV4 地址。 IN 表示 internel 网络
jenkins IN A 192.168.9.90<span style="white-space:pre"> </span>
gitlab IN A 192.168.9.55
这里要说一下,TTL这个东西。不管是你自己搭建DNS服务器还是,你买的域名,比如万网上,在配置域名解析的时候,后面都有一个TTL值,在万网上默认是10分钟。这个TTL值就表示你的域名与IP的对应关系这个信息,在别的DNS服务器缓存中的过期时间,因为别的DNS服务器,比如电信服务商,比如114,阿里巴巴的DNS等,用户的DNS配置指向这些服务器,这些服务器去查询出结果并缓存在本地,下次再有人查询就直接返回,不会去查询。 所以,当这些域名与IP的对应信息有修改,但是DNS缓存的信息还是以前的,用户就会访问到旧的服务器IP地址,必须得等这个信息的缓存时间到期了,然后再次去查询得到新的数据并缓存,这样才能正常访问新的IP。 而决定域名信息在DNS服务器上缓存多久的就是 TTL值与 DNS服务器默认的缓存时间 两个值的最小方。 DNS默认的缓存时间,像Bind,默认是一周。 而TTL一般不会 这么长,所以,基本缓存更新的时间,就由 TTL值来决定。 这个值越大,则保存的越久,速度更快,不会平凡的去查询更新域名信息。 但是如果有修改,那么久需要 更长的时间才能在全国甚至全球生效。 TTL值越短,那么生效时间就越短。相对的就会平凡查询域名信息。影响速度。
那么这个值要设置多少合适呢,就看自己的实际情况和需求。没有统一的,对灵活性要求高,则低一点。 灵活性不高,几年不变一次,就可以设置高一点。
OK,修改完成后,就可以启动DNS服务:
systemctl statr named-chroot<span style="white-space:pre"> </span>## 启动服务,如何使用了bind-chroot 则启动 named-chroot 否则启动 named
systemctl enable named-chroot<span style="white-space:pre"> </span>## 设为开机启动
然后将服务,在防火墙上放行:
firewall-cmd --add-service=dns --permanent
firewall-cmd --reload
好的。到此,DNS服务器就搭建完成。将内网的电脑的DNS指向DNS服务器试试,就能正常的使用域名访问内网,也能正常的访问外网。
上面只是搭建了一个主DNS服务器,master服务器。如果在大的公司,公司内网很大,人很多。一台主DNS服务器不够用,或者害怕其挂掉会影响公司网络。那么就可以部署一台或多台从服务器来进行冗余备份。下面讲解以下 从服务器 的搭建与配置:
从服务器的搭建,前面与主服务器的相同,在世配置文件不同,因为从服务器不能自己修改域配置,所有的域配置信息都是从主服务器上拉取过来的。
/var/named/chroot/etc/named.conf ##主配置文件 与 主服务器的相同
vim /var/named/chroot/etc/named.rfc1912.zones
zone "amos.com" IN {
type slave;<span style="white-space:pre"> </span>## 类型改为 salve 从
masters { 192.168.9.57; };<span style="white-space:pre"> </span>## 配置 master服务器 地址
file "salve/amos.com";<span style="white-space:pre"> </span>## 配置拉取后的存放路径 同样是在 /var/named/chroot/var/named/ 下的路径 ,这个slave文件夹是需要自己创建并赋予权限的
};
OK,就这样就可以了,将域名写上,设为从服务器,配置master地址就可以了,然后其他的与 主服务器相同,正常启动服务就可以了,然后可以去 salve/目录下查看是否正常拉取了主服务器的配置文件
OK,除了从服务器,还有缓存服务器,就更简单了,同样是所有的安装步骤都和主服务器相同。只在配置文件上不一样。缓存服务器只要不自己设置任何的域配置文件,则可以正常作为一个递归的DNS服务器,缓存网络上的DNS信息给内网用户提供,加快响应速度。
vim /var/named/chroot/etc/named.conf<span style="white-space:pre"> </span>## 修改主配置文件
forwarders { 114.114.114.114; };<span style="white-space:pre"> </span>## 添加DNS代理查询的地址,就是本地找不到缓存就去这个地址找
OK,就这样就是可以作为一个DNS缓存服务器,给内网用户提供DNS解析服务。减少去访问外网DNS服务器的流量和时间。
————————————————
版权声明:本文为CSDN博主「Amos_x」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41004350/article/details/79107732
以上是关于Centos7 搭建DNS服务器与原理配置详解的主要内容,如果未能解决你的问题,请参考以下文章
企业dns服务器部署详解(上)—高速缓存dns搭建/dns正反向解析
小型实验:基于GNS3与VMware用Linux CentOS7搭建DHCP中继服务(原理+实验)