DNS 服务器--从入门到放弃

  • 来源:网络
  • 更新日期:2020-06-30

摘要:建站服务器 最近和朋友讨论起了当时注册的域名,又想起来了dns服务器,刚刚好当时学习的时候也不是很精通,就趁着这个时间段再一次回顾了以下

建站服务器

最近和朋友讨论起了当时注册的域名,又想起来了dns服务器,刚刚好当时学习的时候也不是很精通,就趁着这个时间段再一次回顾了以下。让我们一起看一下DNS服务器吧


这篇文章的目录结构如下:

什么是 DNS 服务器? 什么时候要用 DNS 服务器 为什么要用 DNS 服务器? 谁会用 DNS 服务器? 怎么使用 DNS 服务器?
1.什么是 DNS 服务器?

DNS(Domain Name Server ,域名服务器)是将域名(Domain name)和对应的IP地址(IP address)进行转换的服务器。那么什么又是域名尼?
域名:
通俗点说就是每次上网的时候输入的网址也可以理解为域名,而百度给的定义是域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。

2.什么时候要用 DNS 服务器?

因为我们记忆的原因,现在当我们要去上网的时候,总会记住几个域名,然而并不会去记住一个个服务器对应的IP。因此当我们在用域名访问别人主机的时候,DNS 服务器就已经默默的起到了作用,DNS 服务器会将我们输入的域名一 一的转换为对应的IP然后再去访问别人的主机。
因此当在一个企业的内部,要想在企业内部让诸多个主机通过主机名访问彼此,就要构建自己的 DNS 服务器了。

3.为什么要用 DNS 服务器?

在刚刚开始拥有网络的时候,全球仅仅只有几个大学的实验室加入网络,因此大家可以凭借记住很少的IP地址来进行彼此之间的联系,并且在当时的每个主机上都会拥有一个为hosts的文件用来本地解析,如今依旧拥有这个文件来进行本地的域名解析。在这两个系统下其文件所在的地方。

linux系统:/etc/hosts
Windows:%windir%\\System32\\drivers\\etc\\hosts

但是随着信息化的发展,越来越多的用户加入到网络中,大家的记忆并不能全部都记住彼此之间的ip地址,并且如果继续使用原来的办法(使用hosts文件)的话,hosts文件的条目越来越多,每一次的查询越来越繁琐,因此就出现了一个组织 IANA(The Internet Assigned Numbers Authority,互联网数字分配机构),IANA 来保存每一个用户的主机名与IP条目的关系。因此大家就不用再纷纷写入自己的hosts文件,仅仅需要定下一个计划任务(crontab)让其隔一段的时间就从 IANA 的服务器去下载hosts文件到本地,虽然这样拥有一定的可行性,但是互联网的发展是爆炸性,用户的增长是几何的倍数增加,因此当用户数量再一次增加的时候,就是 IANA 的策略也已经行不通了,因此就开发出了 BIND(Berkeley Internet Name Domain,伯克利Internet名字域)使用BIND软件来构建域名服务器。而其构建的方法和Linux的目录结构非常的相似,使用一种倒置的树状结构,如下图:

当然顶级域还有很多我就不一 一列举了,因此现在使用 BIND 就对每一个的域名划分到了不同的分支下面了,这样不仅减轻了根服务器的压力而且非常的容易寻找并且管理,并且根(.)依旧会能够管理到每一个域名,但是其仅仅管理一级域就可以了,这样可以极大的减轻根服务器的压力。然后通过不断的逐个查找就能够找寻到我们所需要的信息。并且 IANA 也不再提供原本的 hosts文件了,变为一个全球范围的域名供应商,管理 DNS 域名根和.int,.arpa等资源。相关的13个根服务器,1个为主根服务器在美国。其余12个均为辅根服务器,其中9个在美国,欧洲2个,位于英国和瑞典,亚洲1个位于日本。

4.谁会用 DNS 服务器?

对于这个问题,很不好回答,但是我觉得如果大家感兴趣,或者想要了解的都可以去接触 DNS 服务器。

要开始真正深入了解并配置 DNS 服务器了。

5.如何使用 DNS 服务器?

对于如何使用 DNS服务器来说是一个比较复杂的问题,因此我们通过下面一些步骤来慢慢进一步的了解DNS服务器


首先我们需要知道,DNS 服务器所使用的端口是(53/UDP,53/TCP;)使用BIND软件来进行使用的并且是在应用层的一个协议,使用 C/S 架构。并且当我们安装 BIND 之后就能通过 named 服务来进行启动 DNS 服务了,当然对于真正的了解到 DNS 服务器还是需要首先知道一些名词的,随后遇到的再慢慢说起来。

FQDN:Fully Qualified Domain Name,也就是上文所说的域名。
正向解析:FQDN ==> IP 表示通过DNS服务器FQDN解析为IP的过程
反向解析:IP==>FQDN 表示通过DNS服务器由IP查询到FQDN
domain:逻辑概念,域
zone:物理概念,区域
DNS的服务器类型:1主 DNS服务器(master)2辅助DNS服务器(slave)3缓存服务器4转发器(forward)

下面这个图能够帮助我们知道什么是 domain 与 zone。

可以看到每一个zone下面都会有很多的资源,当我们访问其下面的资源时,其对应的主机就给我们回答,并且每个区都有自己的授权服务器,当我们要在DNS服务器查询FQDN的时候会给我们返回两种类型的答案,即权威答案(Authority Answer,AA)和非权威答案。

一、安装 BIND 软件
BIND软件可以运行在大部分的Linux主机上,并且在RHEL6.5及以后,在系统的光盘自带了BIND服务的安装文件。
而我们首先使用简单的方法进行安装(yum),首先查看与 bind相关的软件包。

$ yum list | grep bind


一些主要软件的作用如下:

bind :提供了 DNS 服务的主要程序及相关文件
bind-libs :提供了bind、bind-utils需要使用的函数库
bind-utils :提供了对 DNS 服务器的测试工具,如 nslookup等

接下来我们就安装bind

$ yum install -y bind

二、配置 BIND 软件
bind软件的安装之后会出现两个很重要的路径,一个是主配置文件/etc/named.conf 另一个是工作目录/var/named ,我们分别来进行一 一探索。
1.简单DNS服务器的主要配置
这是用于启动 named 服务的主要配置文件,对于简单的DNS服务器来讲其中主要分为两个部分的定义,全局定义和区域定义。
对于全局定义的段使用如下的定义。

options {
                directory /var/named; 
};
注:named.conf 配置文件要求每一行的结束都需要一个分号结束

配置的含义就是将每个区域的资源记录(Resource Record,简称RR)文件放在了/var/named/的目录之下。
那么RR到底什么东西尼?

懵。。。,先记住向下看看

三.配置文件
在/etc/named.conf配置文件中除了刚刚定义的全局定义之外,就是各个区域(zone)的定义了。

通常对于每一个区域(zone)的简单定义就是如下的格式。
zone ZONE_NAME IN {
                type master|slave|hint|forward;
                file ZONE_NAME.zone
};
注:type 就表明了区域的 DNS服务器类型。
                file就是将这个区域的RR放在什么地方,相对路径。
比较特别的是下面这个区域的定义,表示这是一个根域的dns服务器。
zone . IN {
                type hint;
                file named.ca
};

当然,DNS的配置文件也支持使用acl来自定义,访问控制列表。并且默认就存在这样四个列表,none,any(任何主机),local(本机),以及localnet(本地网络)。定义就如下:

    acl acl_name{
        statement;
    };

如果安装时候在/var/named/目录下并没有named.ca 的文件话可以使用dig 命令来生成named.ca文件,需要能够访问互联网,否则查询不到根服务器。

[root@rs1 named]# dig -t NS . >/var/naemd/named.ca

首先构建一个最简单的 DNS服务器,也就是缓存 DNS 服务器。任何一个复杂的 DNS 服务器都是由简单的缓存服务器一步步变难的,觉得学习也是这个道理哈。

缓存 DNS 服务器:不负责解析任何区域(除了(本机)localhost)

/etc/named.conf 配置如下

options {
        directory /var/named;
};
//正向解析本机
zone localhost IN{
                type     master;
                file named.localhost;

};
//反向解析本机
zone 0.0.127.in-addr.arpa IN{
                type master;
                file named.local;
};

反向解析比正相解析要复杂许多,区域名是比较特殊,为网断名+in-addr.arpa
接下来的就是上面都提到过的各个区域的 RR 文件了,在里面会有下面几个特殊的定义 。

TTL:Time-To-Live 每一个记录的生存时间
SOA:Start Of Authority,起始授权记录
A:Address IPV4的地址记录
AAAA:IPV6的地址记录
PTR:Pointer反向解析记录,一般不能和A记录出现在一起
NS:Name Server dns服务器的定义
MX:Mail eXchange 邮件的定义
CNAME:规范名字

对每一个资源记录文件来说,首先定义的都应该是这样的一行

ZONE_NAME     [TTL]       IN SOA  localhost.(ZONE_NAME的 DNS服务器名)  admin.localhost.(管理员的邮箱)
(
                          2018091501 ; (版本号)serial
                           1H         ; (刷新时间)refresh
                            5M          ; (重试时间,应当小于刷新时间)retry
                            1D       ; (超时时间,设置尝试几天之后认为主 DNS 服务器宕机了)expire 
                            1H      ; (否定回答,对方缓存多长时间)minimum

)   

如果一开始在/var/named/下有一些文件,则可以看到有以下相应的符号

$TTL 600 :设置全局的TTL时间,定义后可以不再使用TTL
$ORIGIN :默认补充的字段,如果在一些地方使用的并非完整的FQDN则在后面补充上ORIGIN定义的字段,默认就是/etc/named.conf中定义的区域名字(ZONE_NAME)
@:本文件在/etc/named.conf 配置文件中定义的区域

因此/var/named/named.localhost 的定义如下:

$TTL 600

@       IN      SOA     localhost.      admin.localhost.        (
                                20180913
                                1H
                                5M
                                1D
                                1H )
                                IN      NS      localhost.
localhost.      IN      A       127.0.0.1

对于每一行的定义如果和上一行的第一列相同,则可以省略

相应的反向解析的配置文件

$TTL 600

@       IN      SOA     localhost.      admin.localhost.        (
                                20180913
                                1H
                                5M
                                1D
                                1H )
                IN      NS      localhost.
1       IN      PTR     localhost.

注:1 表示的主机名,如上面我们所说的如果没有写全就会默认补充上ORIGIN,所以其的全部就是1.0.0.127.in-addr.arpa

至此我们就构建了一个最简单的缓存 DNS 服务器。可以使用bind带有的命令来查看配置文件是否有错。

named-checkconf
named-checkzone zone zone_file 

然后我们使用 dig 命令来测试一下

@后面指定为我本地的服务器ip,因此对于不同的host 指定不同的ip,其他详细的介绍查询帮助文档。
接下来我们就讨论一个较为复杂的问题,一个 FQDN==> IP 到底发生了什么?

迭代查询:和普通的迭代算法一样,就是一次次不断的去请求。
递归查询:仅发出一次请求,一次应答

对于发起查询请求的客户端,仅触发了一次查询并获得了一次结果这就是递归查询,而对于当前域内的dns服务器,通过一次次不断的迭代查找才获得结果,因此就是迭代查询。

这样是一个能够查询到的一个过程,如果dns查询不到我们要查询的记录会发什么?
对于这样,就在SOA记录的minimum给出了解释,例如我们查询ftp.a.com,但是当dns再一次从根查询到a.com的域内发现并没有ftp.a.com的这个子域,因此a.com.域就会给dns服务器一个否定回答,然后再由dns服务器将否定回答给客户端。
以下就是一个dns服务接受到请求然后进行查询的主要流程。

dns 服务器查询的详细介绍

1.如果查询请求是本机所负责的区域中的数据的话,要通过查询区域数据文件返回结果
2.如果查询请求不是本机所负责区域中的数据的话,就查询缓存
3.如果缓存中没有答案,则向根发起查询请求,并不断迭代

那么让我们更深一步的去探索dns的功能吧
在上面我们搭建了一个简单的 DNS缓存服务器,现在让我们来将他变成一个主DNS服务器,步骤很简单,

1.将主配置文件中,加入我们的正向解析域名以及反向解析域名。
2.在工作目录下,添加相应的数据文件。
3.重启服务,重新载入也可以的。

是不是很简单,首先是主配置文件,我的dns服务器的网络是192.168.159.143.

zone athlete.run IN {
                type master;
                file athlete.run.zone;
};
zone 159.168.192.in-addr.arpa IN {
                type master;
                file athlete.reverse;
};

然后是工作目录文件,我定义的是athlete.run.zone和athlete.reverse所以编辑两个文件。
这个是athlete.run.zone文件

$TTL 60
@       IN      SOA     ns1     admin (
                    2018091401
                    1M
                    5S
                    1H
                    1D )
    IN      NS      ns1
    IN      NS      ns2
    IN      MX      10      mail
ns1     IN      A       192.168.159.143
ns2     IN      A       192.168.159.146
www     IN      A       192.168.159.143
mail    IN      A       192.168.159.143

剩下这个就是athlete.reverse文件了

$TTL 600
@       IN      SOA     ns1.athlete.run admin.athlete.run (
                    2018091403
                    1D
                    5M
                    7D
                    1D )
    IN      NS      ns1.athlete.run.
143     IN      PTR     ns1.athlete.run.
143     IN      PTR     www.athlete.run.

最后

# systemctl reload named 或者 # systemctl restart named 

最后用dig工具测试一下就可以了,当然我这两个文件可能写的比较简单,但是能使用的。

介绍了这么多 DNS的配置,让我们换个话题发现一下。
如果是通过YUM安装bind的话,会默认给你安装另一个工具叫做:rndc。

rndc:remote name domain controller,远程名称域控制器

通过名字就可以了解到,这个工作的特性了,所以为了安全使用的是tcp的953端口953/TCP,接下来让我们使用这个工件吧。
首先rndc的使用也是有配置文件的,在哪里尼?

# rpm -ql bind | grep rndc

但是,一开始/etc/rndc.conf这个目录的文件是不存在,所以需要我们手动通过rndc 命令来实现
值得一提的就是如果两文件都存在的话,每次执行命令就会给你警告,挺烦的,所以自己把握。

rndc-confgen >/etc/rndc.conf 就可以了

需要一提的是,这个文件里面的后几行是需要拷贝的/etc/named.conf中的,因此,相应的 vim 操作自己查询一下吧。如果一切都完成的话,就可以通过一下命令来重新读取了,当然也可以重启,但是在大型工作中,服务器某个应用重启会造成太多的损失,因此就需要我们通过重读配置文件来重新应用。

# rndc reload


出现这个标志就是成功了,如果失败了,那么就详细的查看日志文件查看把!

# cat /var/log/message

对于rndc的其他主要使用的命令,我也总结在下面:

stop :停止 DNS服务器
reload:重新载入配置文件和区域文件
reload zone:重新载入某区域文件
reconfig:重新载入配置文件和发生过更新的区域文件
status:查看dns的详细情况
querylog:使用查询日志(不推荐使用)
flush:清空缓存

还有一些其他使用帮助文档,查看把。


到这里对一个DNS服务器应该就有了一个中级的认识了,接下了讨论就是我们的更深一步的话题了。
子域授权,我们可以通过自己来申请一个子域,例如 a.org 那么对这个子域来说我们可以添加至多127个子域,也就是说这个树的深度最多到127层。而在每一个不同深层次的域,其的授权都是在上一级子域中授权的。比如上面图片的例子,d.org 的子域www.d.org和ftp.d.org分别就是d.org的子域,并且www.d.org 子域的dns服务器授权是由d.org进行。 在下一步的话就是edu.www.d.org 也可以使www.d.org授权的子域。 相应授权的子域的dns配置文件就是在子域自己的区域中定义。
转发 DNS服务器
这个的理解也比较简单,就是在主配置文件中加入 forwarders { IP; };,比较特殊的就是分号的左右两边均需要空格,分号内可以写多项,不过需要分号隔开。这样就能实现在本地的查询请求,本机会转发至指定IP的DNS服务器去查询。值得一提的就是对于转发也是有类别的。

first:如果DNS1去找DNS2请求解析,DNS2并未响应,则DNS1自己去解析
only:如果DNS1去找DNS2请求解析,DNS2未响应,则无查询结果(希望全给了别人。。。)

所以我们定义转发的话再加入一行转发类型,结果就是这样,就能实现转发。

forward first|only;
forwarders { IP };

当然如果放在全局option段就是全局转发,特定的区域就是在查询到这个区域的时候再转发。

主从DNS服务器
对于每一个时常在线服务器来说,都应该做出相应的冗余,以免突然时刻主服务器宕机了,或者是数据丢失了,但是DNS服务器比较奇特的就是,当主DNS服务器宕机之后,辅助的DNS服务器多次尝试重连主DNS服务器如果没有响应的话,从DNS服务器会跟着主DNS服务器一起宕机。(双宿双飞。。。)
因此我们就要做好辅助的DNS服务器时刻保存主DNS服务器的数据文件,以免主DNS服务器宕机造成数据丢失。
因此说到传送,对于DNS服务器来说有着两种区域传送:

完全增量传送:axfr 一开始进行传送的文件
增量传送:ixfr 当从服务器有了区域传送文件后,以后的传送都将是增量传送
因此我们可以使用dig命令来查看我定义的区域的信息

可以看到这么多比较重要的信息,肯定不能白白的暴露给其他人,因此我们只能给特定的主机进行区域传送,这样就需要在主配置文件中加入

 allow-transfer { IP;  };

要定义一个主从的DNS,主的服务器就是刚刚我们一直使用,从服务器的配置很简单,就另外启动一台电脑或虚拟机,然后使用yum安装bind,并在配置文件中增加这样一个区域。

zone athlete.run IN {
                type slave;
                masters { IP; };
                file slaves/athlete.run.zone;

当然slaves是安装bind的时候自动给我们创建的,因此我们可以它,当然也可以自己定义地方,不过需要注意的是,DNS服务器启动的进程属主属组均是named所以我们创建的文件也应该均是named并且权限为640。对于这样的文件可以一开始不存在,然后启动从服务器,就可以看到相应的文件生成。当然在我做实验的时候,遇到了好多次这样的现象,从主服务器传送来的文件在从服务器看到的格式是data,然而其本身是一个ASCII TEXT的文件,所以我们就需要在从服务器的主配置文件中加入这样一个定义

    masterfile-format  text;

这样就一切完成了,当我们更改了主DNS服务器的数据文件,并增加了版本号之后,主DNS服务器就会主动的提醒从DNS服务器来更新文件。当然这样还是需要一些额外配置的。

主从同步:
主服务器:授权允许同步,有从DNS服务器的NS记录,并且授权允许区域传送
从服务器:定义区域

这样就能完成主从复制了。
最后一个也就是DNS服务器至今最流行的一个应用,CDN

CDN:Content Delivery Network ,内容分发网络

简单的说CDN就是将各个大型的域名进行解析到不同的IP,使不同的人来访问就进入到不同的网段,但是网页的页面却完全是一样的


就像这样,本来是一个DNS服务器,但是强行将其拆分成为两个不同的DNS服务器域,左边的人访问这个DNS服务器,会根据一些判断然后让其访问左边的DNS服务器,而右边的人是相同的,因此这也能够叫做智能DNS,也称之为DNS的脑裂。这样到底有什么用尼?

这个图就介绍了,当不同区域的用户去请求同一个页面的时候,DNS服务器就会根据客户端的地理位置进行检测,然后将其本地的数据文件存放的IP地址返回,这样就减少了访问延迟,并且相当与将数据推送到了每一个互联网用户的家门口。
介绍了这么多,那么到底怎么定义不同的区域尼?
其实定义很简单,就是除了全局段之外,再使用view来定义每一个视图。

view VIEW_NAEM {
    match-clients {I网段/掩码;};
    //一些区域的定义
}

那么匹配到的客户端就会进入到相应的视图之中进行解析。
使用了视图也有需要注意的地方:

1多个view内可能需要对同一个区域进行解析,但使用不同的区域解析库文件。
2.一旦使用了视图,所有的zone都只能定义在view中
3.仅有必要在匹配到允许递归请求的客户端所在view中定义根区域
4.客户端请求到达后,自上而下检查每个view所服务的客户端列表

最后的最后 - -,这其实和一般使用的DNS作用不大,但是还是有一些相关关系的,编译安装BIND
首先就去bind的官网下载bind的软件包
将其解压到我们本地,然后进入和普通的应用软件一样,configure make && make install
主要是我们手动安装的话什么都不会给我们提供,远远没有yum简洁,但是可以使用自己的定制软件,主要需要我们做到以下这些步骤

1.修改PATH环境变量,输出二进制程序的搜索路径新路径
2.导出库文件搜索路径
3.导出头文件搜索路径
4.导出帮助文件手册搜索路径
5.创建配置文件

到此我们终于聊完了DNS服务器相关的东西,不过还是相信自己知道的仅仅是一点点,望自己能够了解到更多的知识。


不忘初心,砥砺前行。

新网虚拟主机