[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

转自:http://blog.it985.com/8958.html

DNS 数据库的记录:正解,反解, Zone 的意义

通过DNS解析过程详解这篇文章,我们知道了要想访问www.zmit.cn,最重要的就是 .zmit.cn这部DNS服务器内记录的信息了。这些记录的文件,我们可以称之为数据库,而在数据库里面针对每个要解析的领域(domain,如 .com, .cn, .org, .com.cn),就称为一个区域(zone)。有从主机名查询到IP的方式,也有从IP反查到主机名的方式,因此:

  • 从主机名查询到IP和方式,称为:正解
  • 从IP反解析到主机名的方式,称为:反解
  • 不管是正解还是反解,每个领域的记录就是一个zone(区域)

正解的设定权以及 DNS 正解 zone 记录的标志

谁可以申请正解的 DNS 服务器架设权呢?答案是:都可以!只要该领域没有人使用, 你先抢到, 就能够使用了。 不过, 因为国际 INTERNIC 已经定义出 gTLD 以及 ccTLD 了,所以你不能自定义例如 sun.zmit这种网域的!还是要符合上层DNS 所给予的领域范围才行。像比较新的 *.xyz,和 *.我爱你 这样的领域名。

正解文件的zone里主要记录了哪些信息,因为正解的重点在于由主机名查询到IP,而且每部 DNS 服务器还是得要定义清楚,同时,你可能还需要架设master/slave 架构的 DNS 环境,因此,正解 zone 通常具有以下几种标志:

  • SOA:开始验证 (Start of Authority);
  • NS:名称服务器 (NameServer),后面记录的数据是 DNS 服务器的意思;
  • A:地址 (Address),后面记录的是 IP 的对应 (最重要)。

反解的设定权以及 DNS 反解 zone 记录的标志

正解的领域名只要符合 INTERNIC 及你的 ISP 规范即可,取得授权较为简单,自己取名字。那反解呢?反解主要是由 IP 找到主机名,因此重点是 IP 的所有人是谁。因为 IP 都是 INTERNIC 发放给各家 ISP 的,而且因路由问题,IP不能乱设定,所以,能够设定反解的就只有 IP 的拥有人,亦即你的 ISP 才有权力设定反解的。那你向 ISP 取得的 IP 能不能自己设定反解呢?答案是不行!除非你取
得的是整个 class C 以上等级的 IP 网段,那你的 ISP 才有可能给你 IP 反解授权。否则,若有反解的需求,就得要向你的直属上层 ISP 申请才行!

那么反解的 zone 主要记录的信息有哪些呢,除了服务器必备的 NS 以及 SOA 之外,最重要的就是:

  • PTR:指向 (PoinTeR) ,后面记录的数据就是反解到主机名

每部 DNS 都需要的正解 zone: hint

现在我们知道一个正解或一个反解就可以称为一个 zone 了,那么有没有哪个 zone是特别重要的呢?有的,那就是 .  ,当 DNS 服务
器在自己的数据库找不到所需的信息时, 一定会去找 . ,那 . 在什么地方呢,所以就得要有记录 . 位置的 zone 才行,这个记录 .的 zone 的类型,就被我们称为hint 类型,这几乎是每个 DNS 服务器都得要知道的 zone。

一部简单的正解 DNS 服务器,基本上就要有两个 zone 才行,一个是hint ,一个是关于自己领域的正解 zone。以zmit.cn为例,DNS 服务器内,至少就要有这两个 zone:

  • hint (root):记录 . 的 zone;
  • zmit.cn:记录 .zmit.cn这个正解的zone。

Client 端的配置

DNS解析过程详解的文章中,我们了解到主机名对应到IP有两种方法, 早期的方法是直接写在档案里面来对应, 后来比较新的方法则是透过 DNS 架构。下面来分析两种方法和对应的配置文件:

  • /etc/hosts :这个是最早的 hostname 对应 IP 的档案;
  • /etc/resolv.conf :这个就是 ISP 的 DNS 服务器 IP 记录处;
  • /etc/nsswitch.conf:这个档案则是决定先要使用 /etc/hosts ,还是/etc/resolv.conf 的设定。

一般而言, Linux 的预设主机名与 IP 的对应搜寻都以 /etc/hosts 为优先。查看 /etc/nsswitch.conf ,并找到 hosts 的项目:

1
[Sun@localhost ~]$ sudo vim /etc/nsswitch.conf

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

上面那个 files 就是使用 /etc/hosts,而最后的 dns 则是使用 /etc/resolv.conf 的 DNS 服务器来进行搜寻。因此,会先以/etc/hosts 来设定 IP 对应,当然,你也可以将他调换过来,不过,总是 /etc/hosts 比较简单,所以将他摆在前面比较好。

配置/etc/resolv.conf

1
[Sun@localhost ~]$ sudo vim /etc/resolv.conf

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

DNS 服务器的 IP 可以设定多个, 因为,照设定的顺序,当第一部 DNS 114.114.114.114(国内)挂点时,我们客户端可以使用第二部 8.8.8.8(国外)来进行查询。 通常建议至少填写两部 DNS 服务器的 IP,不过在网络正常使用的情况下,永远只有第一部 DNS 服务器会被使用来查询,其他的设定值只是在第一部出问题时才会被使用。

注意:

1.尽量不要设定超过 3 部以上的 DNS IP 在 /etc/resolv.conf 中,因为如果是你的区网出问题, 导致无法联机到 DNS 服务器, 那么你的主机还是会向每部 DNS 服务器发出联机要求,每次联机都有timeout 时间的等待,会导致浪费非常多的时间。

2.如果使用 DHCP 取得 IP,当我们修改过 /etc/resolv.conf之后,隔不多久这个档案又会恢复成原本的样子。因为在使用DHCP 时, 系统会主动的使用 DHCP 服务器传来的数据进行系统配置文件的修订。因此,必须告知系统,不要使用 DHCP 传来的服务器设定值。此时,我们要在 /etc/sysconfig/network-scripts/ifcfg-eth0 文档内增加一行:PEERDNS=no,然后重新启动网络即可。

DNS 服务器的软件、种类与 cache only DNS 服务器搭建设定

安装搭建DNS服务器所需软件

搭建DNS服务器,就需要柏克莱大学发展出来的BIND (Berkeley Internet Name Domain)软件。可通过yum来安装:

1
[Sun@localhost ~]$ sudo yum install bind bind-libs bind-utils bind-chroot

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

上面比较重要的是那个 bind-chroot ,所谓的 chroot 代表的是“change toroot(根目录) ”的意思,root 代表的是根目录。早期的 bind 默认将程序启动在/var/named 当中,但是该程序可以在根目录下的其他目录到处转移,因此若 bind 的程序有问题时,则该程序会造成整个系统的危害。为避免这个问题, 所以我们将某个目录指定为 bind 程序的根目录,由于已经是根目录,所以 bind 便不能离开该目录,所以若该程序被攻击,最多也是在某个特定目录底下被破坏而已。 CentOS 6.x 默认将 bind 锁在 /var/named/chroot 目录中。

我们主程序是由 bind, bind-chroot 所提供,每部 DNS 服务器都要有的 . (root) 这个 zone 文件也是由 bind 所提供的。 CentOS4.x, 5.x 所提供的 caching-nameserver 软件并不存在 CentOS 6.x 当中了,已经被涵盖于 bind 软件内。

BIND 的默认路径设定与 chroot

要架设好 BIND 基本有两个主要的数据要处理:

  • BIND 本身的配置文件:主要规范主机的设定、zone 文档的所在、权限的设定等;
  • 正反解数据库档案 (zone file):记录主机名与 IP 对应的等。

BIND 的配置文件为 /etc/named.conf,在这个档案里面可以规范 zone file 的完整档名,你的 zone file 其实是由 /etc/named.conf 所指定的,所以zone file 档名可以随便取,只要 /etc/named.conf 内规范为正确即可。 一般来说,CentOS 6.x 的默认目录是这样的:

  • /etc/named.conf :是我们的主配置文件
  • /etc/sysconfig/named :是否启动 chroot 及额外的参数,就由这个档案控制;
  • /var/named/ :数据库档案默认放置在这个目录
  • /var/run/named : named 这支程序执行时默认放置 pid-file 在此目录内。

/etc/sysconfig/named 与 chroot 环境

为了系统的安全性考虑,一般来说目前各主要发行版本都已经自动的将你的 bind 相关程序给他 chroot, chroot 所指定的目录记录在 /etc/sysconfig/named 里面。

1
[Sun@localhost ~]$ sudo vim /etc/sysconfig/named

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

这一行,意思是说:”我要将 named 给他chroot ,并且变更的根目录为 /var/named/chroot”,由于根目录已经被变更到/var/named/chroot 了,但 bind 的相关程序是需要 /etc, /var/named, /var/run …等目录的,所以实际上咱们 bind 的相关程序所需要的所有数据会是在:

  • /var/named/chroot/etc/named.conf
  • /var/named/chroot/var/named/zone_file1
  • /var/named/chroot/var/named/zone_file…..
  • /var/named/chroot/var/run/named/…

因为新版本的 CentOS 6.x 已经将 chroot 所需要使用到的目录,透过 mount –bind 的功能进行目录链接了。比如,我们需要的 /var/named 在启动脚本中透过mount –bind /var/named /var/named/chroot/var/named 进行目录绑定了。所以,在CentOS 6.x 当中,我们根本无须切换至 /var/named/chroot/ ,使用正规的目录即可。

cache only DNS 服务器与 forwarding 功能

有个只需要 . 这个 zone file 的简单 DNS 服务器,我们称这种没有自己公开的DNS 数据库的服务器为 cache only DNS server。顾名思义,这个 DNS server只有cache搜寻结果的功能,也就是说,他本身并没有主机名与 IP 正反解的配置文件,完全是由对外的查询来提供他的数据源。

那如果连 . 都不要,那就得要指定一个上层 DNS 服务器作为你的forwarding (转递) 目标,将原本自己要往 . 查询的任务,丢给上层 DNS 服务器去烦恼即可。这样,我们这部具有 forwarding 功能的 DNS 服务器,甚至连 . 都不需要了。因为, . 有记录在上层 DNS 里。

如同刚刚提到的,cache only 的 DNS 并不存在数据库, 因此不论是谁来查询数据,这部 DNS 一律开始从自己的cache以及 . 找起,整个流程与DNS解析过程详解这篇文章所描述的相同。那如果具有 forwarding 功能呢?那即使你的 DNS 具有 . 这个 zone file,这部 DNS 还是会将查询权请上层 DNS 查询的,这部 DNS 服务器当场变成客户端。查询流程会变这样:

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

通过上图我们了解到,具有 forwarding 机制时,查询权会委请上层DNS 服务器来处理,所以根本也不需要 . 这个位置所在的 zone 。一般来说,如果你的环境需要架设一个 cache only 的 DNS 服务器时, 其实可以直接加上 forwarding的机制,让查询权指向上层或者是流量较大的上层 DNS 服务器即可。

本文永久地址:http://blog.it985.com/8958.html
本文出自 IT985博客 ,转载时请注明出处及相应链接。

正式搭建cache only DNS server

不需要设定正反解的 zone ,只需要 . 的 zone 支持,所以只要设定一个档案 ,就是 named.conf 主配置文件。另外,cache only 只要加上个 forwarders 的设定即可指定 forwarding 的数据。

1.编辑主要配置文件: /etc/named.conf

虽然我们具有 chroot 的环境,不过由于 CentOS 6.x 已经透过启动脚本帮我们进行档案与目录的挂载链接,所以直接修改 /etc/named.conf ,不用再去 /var/named/chroot/etc/named.conf 修改。在这个档案中,主要是定义跟服务器环境有关的设定, 以及各个 zone 的领域及数据库所在文件名。 因为使用了 forwarding 的机制,所以这个 cache only DNS 服务器并没有 zone,所以我们只要设定好跟服务器有关的设定即可。

1
[root@localhost ~]# vim /etc/named.conf

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

  • listen-on port 53 { any; };

监听在这部主机系统上面的哪个网络接口。预设是监听在 localhost, 亦即只有本机可以对 DNS 服务进行查询,那当然是很不合理。 所以这里要将大括号内的数据改写成 any。 记得, 因为可以监听多个接口, 因此 any后面得要加上分号才算结束。另外, 这个项目如果忘记写也没有关系,因为默认是对整个主机系统的所有接口进行监听的。

  • directory “/var/named”;

意思是说,如果此档案底下有规范到正、反解的 zone file 档名时,该档名预设应该放置在哪个目录底下的意思。预设放置到 /var/named/ 底下。由于 chroot 的关系,最终这些数据库档案会被主动链接到/var/named/chroot/var/named/ 这个目录。

  • dump-file, statistics-file, memstatistics-file

与 named 这个服务有关的许多统计信息,如果想要输出成为档案的话,预设的档名就如上所述。

  • allow-query { any; };

这个是针对客户端的设定,到底谁可以对我的 DNS 服务提出查询请求的意思。原本的档案内容预设是针对 localhost 开放而已, 我们这里改成对所有的用户开放,防火墙也得放行才行。不过,默认 DNS 就是对所有用户放行,所以这个设定值也可以不用写。

  • forward only ;

这个设定可以让我们的 DNS 服务器仅进行 forward,即使有 . 这个 zone file 的设定,也不会使用 . 的数据, 只会将查询权交给上层 DNS 服务器而已,是 cache only DNS 最常见的设定。

  • forwarders { 114.114.114.114; } ;

既然有 forward only,就要指定哪部上层 DNS 服务器进行转递,这就是 forwarders 设定值的重要性。

这样就已经设定完成了最简单的 cache only DNS server 了。

2.启动 named

1
2
[root@localhost ~]# service named start
[root@localhost ~]# chkconfig named on

 3.测试

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

在这个DNS服务器里,如果通过dig指令,输出数据的最底下显示 SERVER: 127.0.0.1#53(127.0.0.1)  的字样 (因为在DNS服务器的本地测试,所以dig指令后加上 @127.0.0.1,显示的地址也是127.0.0.1), 代表成功。

我们还可以开启另一个客户端机来测试,配置 /etc/resolv.conf文件

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器nameserver为DNS服务器的地址

然后再次通过dig指令查看

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器

输出数据的最底下显示 SERVER: 192.168.1.78#53(192.168.1.78) ,两次测试都说明我们的DNS服务器搭建成功。

上一篇:AndroidTips:selector的disable状态为什么无效?


下一篇:(转)DNS解析过程详解