千家信息网

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

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,最近和朋友讨论起了当时注册的域名,又想起来了DNS服务器,刚刚好当时学习的时候也不是很精通,就趁着这个时间段再一次回顾了以下。让我们一起看一下DNS服务器吧这篇文章的目录结构如下:什么是 DNS 服务
千家信息网最后更新 2026年11月03日DNS 服务器--从入门到放弃

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


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

  1. 什么是 DNS 服务器?
  2. 什么时候要用 DNS 服务器
  3. 为什么要用 DNS 服务器?
  4. 谁会用 DNS 服务器?
  5. 怎么使用 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/hostsWindows:%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-checkconfnamed-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      mailns1     IN      A       192.168.159.143ns2     IN      A       192.168.159.146www     IN      A       192.168.159.143mail    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服务器相关的东西,不过还是相信自己知道的仅仅是一点点,望自己能够了解到更多的知识。


不忘初心,砥砺前行。

服务 服务器 文件 区域 就是 查询 配置 域名 时候 不同 主机 软件 子域 数据 缓存 时间 命令 目录 全局 客户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 重生之互联网科技帝国 互联网科技开发公司 互联网科技视频 善班互联网科技有限公司 天下捷融互联网科技 上海卓越科技 互联网 无锡溥仪互联网科技有限公司 云创客互联网科技公司 济南华为互联网科技产业总部基地 宁波青枫互联网科技有限公司 崇明区互联网教育科技诚信经营 中国航天科技大学国际工业互联网 未来五年的互联网科技 爱医互联网络科技 合肥互联网科技公司公章图片 智帮互联网科技公司最近动向 张召忠谈中国互联网科技 陕西云淼互联网科技公司 张家口科技产业互联网平台 绵阳真晨互联网科技有限公司 科技互联网政务服务 互联网与科技发展 平安科技 互联网 壕鑫互联网络科技 时间互联网络科技 世界互联网科技公司市值排名 长沙茂晟互联网科技有限公司 长沙渺峰互联网科技有限公司 数字互联网科技有限公司 恒生科技互联网指数十大成分股
0