整个Internet大家庭中连接了数以亿计的服务器,个人主机,其中大部分的网站、邮件服务器都使用了域名形式的地址。很显然这种地址形式要比使用IP地址更加直观,且更容易被用户记住。

在Windows搭建DNS服务,可以参考博客:Windows server 2016搭建DNS服务

如果想要搭建并管理好DNS服务器,那么必须了解的知识点有:

DNS系统在网络中的作用就是维护一个地址数据库,其中记录了各种主机域名和IP地址的对应关系,以方便客户程序提供正向和反向的地址查询服务,即:

正向解析:根据域名查找IP地址,即将指定的域名解析为相对应的IP地址;

反向解析:根据IP地址查域名,即将指定的IP地址解析为相对应的域名。

DNS的组成:
Linux搭建DNS服务_第1张图片
常见的顶级域名、国家域名:
Linux搭建DNS服务_第2张图片
Linux搭建DNS服务_第3张图片

DNS服务的工作原理:
Linux搭建DNS服务_第4张图片

根据所管理的区域地址数据的来源不同,DNS系统可以分为不同的类型,在同一台DNS服务器中,相对于不同的区域来说,也拥有不同的身份,常见的几种类型如下:

缓存域名服务器:只提供域名解析结果的缓存功能,目的在于提高查询速度和效率,但是没有自己控制的区域地址数据。构建缓存域名服务器是,必须设置根域或指定其他DNS服务器作为解析来源;

主域名服务器:维护某一个特定DNS区域的地址数据库,对其中的解析记录具有自主控制权,是指定区域中唯一存在的权威服务器、官方服务器。构建主域名服务器时,需要自行建立所负责区域的地址数据文件;

从域名服务器:与主域名服务器提供完全相同的DNS解析服务,通常用于DNS服务器的热备份。对于客户机来说,无论使用主域名服务器还是从域名服务器,查询的结果都是一样的。区别在于:从域名服务器提供的解析结果不是由自己决定的,而是来自于主域名服务器。构建从域名服务器时,需要指定主域名服务器的位置,以便服务器能自动同步区域的地址数据库。

DNS服务器的角色只是针对某一个特定的区域而言,比如:一个区域的主域名服务器可以同时是另一个区域的从域名服务器。

接下来详细介绍如何在CentOS 7 中搭建DNS服务:
搭建主域名服务器:

[root@localhost ~]# yum -y install bind*
#通过yum的方式安装bind服务

编写主配置文件

[root@localhost ~]# vim /etc/named.conf
#编写bind服务的主配置文件
                                        …………                    #省略部分内容
 12 options {
 13         listen-on port 53 { any; };                   
 # 指定域名服务监听的网络端口,默认是本机,不能对外提供服务,
 #建议改为any ,表示任意主机,也可以删除;
 14         listen-on-v6 port 53 { ::1; };
 15         directory       "/var/named";                 
 # 指定从/var/named目录下读取DNS数据文件;
 16         dump-file       "/var/named/data/cache_dump.db";               
 # 当执行导出命令时将DNS服务器的缓存数据存储到指定的文件中;
 17         statistics-file "/var/named/data/named_stats.txt";
# 指定named服务的统计文件,
#当执行统计命令时会将内存中的统计信息追加到该文件中;
 18         memstatistics-file "/var/named/data/named_mem_stats.txt";
 19         allow-query     { any; };  
 # 允许哪些客户端访问DNS服务,默认是本机,
 #建议改为“any”,表示任意主机,也可以删除;
                                             …………                     #省略部分内容

 56 zone "benet.com" in {                             
 57         type master;     
 #类型为主区域
 58         file "benet.com.zone";
 59 };
# 添加正向解析数据文件的信息 ,服务器类型是主服务器,
#文件名为“benet.com.zone”
 60 zone "10.168.192.in-addr.arpa" in {
 61         type master;
 62         file "192.168.10.arpa";
 63 };
#编写反向区域文件

区域类型:master(主区域);slave(辅助区域);hint(根区域)

编写区域配置文件

[root@localhost ~]# cd /var/named
[root@localhost named]# cp named.localhost benet.com.zone
#复制原本正向区域的模板
[root@localhost named]# cp named.loopback 192.168.10.arpa
#复制原本反向区域的模板
[root@localhost named]# vim benet.com.zone 
#编写正向区域配置文件
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      ns1.benet.com.
ns1     IN      A       192.168.10.1
www     IN      A       192.168.10.10
ftp     IN      CNAME   www
serial:序列号。可以供从服务器判断何时获取新数据的。

refresh:指定多长时间从服务器要与主服务器进行核对,

retry:如果从服务器试图检查主服务器的序列号时,
主服务器没有响应,则经过这个时间后将重新进行检查

expire:将决定从服务器在没有主服务器的情况下权威地持续提供域数据服务的时间长短

minimum:高速缓存否定回答的存活时间                         

配置选项详解:
Linux搭建DNS服务_第5张图片

[root@localhost named]# vim 192.168.10.arpa 
#编写反向区域配置文件
$TTL 1D
@       IN SOA  @ rname.invalid. (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      ns1.benet.com.
1       IN      PTR     ns1.benet.com.
10      IN      PTR     www.benet.com.

编写完成后

[root@localhost named]# named-checkconf -z /etc/named.conf
#检查对应的数据库文件
zone benet.com/IN: loaded serial 0
zone 10.168.192.in-addr.arpa/IN: loaded serial 0
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
[root@localhost named]# named-checkconf /etc/named.conf
#检查主区域配置文件
[root@localhost named]# named-checkzone benet.com benet.com.zone
#检查区域配置文件
zone benet.com/IN: loaded serial 0
OK
[root@localhost named]# systemctl start named
#启动DNS服务
[root@localhost named]# nslookup
> www.benet.com
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   www.benet.com
Address: 192.168.10.10
> ns1.benet.com
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   ns1.benet.com
Address: 192.168.10.1

主域名服务器经过测试没问题!

搭建从域名服务器

[root@localhost ~]# yum -y install bind*
#安装bind服务
[root@localhost ~]# vim /etc/named.conf
#编写主配置文件
                                          ………………               #省略部分内容
 12 options {
 13         listen-on port 53 { any; };
 14         listen-on-v6 port 53 { ::1; };
 15         directory       "/var/named";
 16         dump-file       "/var/named/data/cache_dump.db";
 17         statistics-file "/var/named/data/named_stats.txt";
 18         memstatistics-file "/var/named/data/named_mem_stats.txt";
 19         allow-query     { any; };
 20         forwarders { 192.168.10.1; };
#转发器,本机解析不了转发到192.168.10.1
                                          ………………                  #省略部分内容
 57 zone "benet.com" in {
 58         type slave;
 #区域类型为辅助区域 
 59         masters { 192.168.10.1; };
 #主服务器为192.168.10.1
 60         file "slaves/benet.com.zone";
 #复制下来的文件保存到/var/named/slaves/目录下
 61         allow-transfer { 192.168.10.1; };
 #允许从服务器上下载正向区域配置文件
 62 };
 63 zone "10.168.192.in-addr.arpa" {
 64         type slave;
 65         masters { 192.168.10.1; };
 66         file "slaves/192.168.10.arpa";
 67 };     
 [root@localhost slaves]# named-checkconf -z /etc/named.conf
 #检查named服务数据库配置文件
zone localhost.localdomain/IN: loaded serial 0
zone localhost/IN: loaded serial 0
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0
zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0
zone 0.in-addr.arpa/IN: loaded serial 0
[root@localhost /]# systemctl start named
[root@localhost /]# nslookup
> www.benet.com
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   www.benet.com
Address: 192.168.10.10
> ns1.benet.com
Server:     127.0.0.1
Address:    127.0.0.1#53

Name:   ns1.benet.com
Address: 192.168.10.1
[root@localhost /]# ls /var/named/slaves/
benet.com.zone
#从主域名服务器复制的正向区域文件

做转发器时需要把全局配置中的dnssec-enable ;
dnssec-validation 两个配置项全部改为“no”否则会失败!

从域名服务器验证完成!
在Windows客户机上如果出现错误可使用命令“ipconfig /flushdns”刷新一下本地的DNS缓存!

———————— 本文至此结束,感谢阅读 ————————