转自: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

上面那个 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 服务器的 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

上面比较重要的是那个 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

这一行,意思是说:”我要将 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 服务器当场变成客户端。查询流程会变这样:

通过上图我们了解到,具有 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

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

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

nameserver为DNS服务器的地址

然后再次通过dig指令查看

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

[转]DNS服务器原理详解与Centos6.x下搭建DNS服务器的更多相关文章

  1. Centos6.8下搭建SVN服务器

    1.Centos6.8下搭建SVN服务器 Subversion是一个自由,开源的版本控制系统.Subversion将文件存放在中心版本库里.这个版本库很像一个普通的文件服务器,不同的是,它可以记录每一 ...

  2. centos6环境下搭建irc服务器

    问题描述 有时候逛技术社区,经常会发现有个叫IRC的东西存在,想搭建下看看到底是个什么东西 说明: 操作系统环境为CentOS6.5_64 安装irc服务器 通过yum进行安装,命令如下: yum i ...

  3. CentOS6.5下搭建ftp服务器(三种认证模式:匿名用户、本地用户、虚拟用户)

    CentOS 6.5下搭建ftp服务器 vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此 ...

  4. Tomcat服务器原理详解

    [目录]本文主要讲解Tomcat启动和部署webapp时的原理和过程,以及其使用的配置文件的详解.主要有三大部分: 第一部分.Tomcat的简介和启动过程 第二部分.Tomcat部署webapp 第三 ...

  5. CentOS6.5下搭建SVN服务器

    1.检查是否已安装 rpm -qa | grep subversion 如果要卸载旧版本: yum remove subversion 2.安装 yum install subversion PS:y ...

  6. CentOS6.5下搭建VNC服务器

    VNC(Virtual Network Computing,虚拟网络计算机)是一款由AT&T欧洲研究实验室开发的远程控制软件,允许用户在网络的任何地方使用简单的程序来和一个特定的计算机进行交互 ...

  7. centos6.2下搭建Web服务器

    1.安装Apache2 yum install httpd 2.启动 方法一:service httpd start 方法二:/etc/init.d/httpd start //浏览http://ip ...

  8. windows 下搭建git服务器,及问题处理。

    最近要做一个源码管理服务器,权衡了一下还是git最适合,搭建服务器前看了网上一些windows下搭建git服务器的帖子,感觉还比较简单,没有太多需要配置的地方,于是开始动手. 我选择的是 gitfor ...

  9. centos6.4安装配置vpn服务器步骤详解

      centos6.4安装配置vpn服务器步骤详解,从安装VPN到配置VPN服务器.配置VPN服务器的路由转发功能,每一步都很详细   一.VPN服务器环境说明 操作系统:CentOS release ...

随机推荐

  1. 利用WM_COPYDATA消息实现进程间通信

    进程间通信最简单的方式就是发送WM_COPYDATA消息,下面通过例子来实现. 发送WM_COPYDATA消息: SendMessage(hRecvWnd, WM_COPYDATA, (WPARAM) ...

  2. hdu 1813(IDA*)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1813 思路:首先bfs预处理出‘0’到边界点最短距离,然后构造 h() 为所’0‘点逃离迷宫的最少步数 ...

  3. django头像上传详解

    使用form组件上传头像 实现的效果如下: 将默认的上传文件框隐藏起来变成了一个默认的头像 而且可以点击上传 处理步骤 avatar = forms.FileField( widget = widge ...

  4. Linux环境下Apache配置多个虚拟主机挂载多站点同时运行

    博客地址: http://blog.csdn.net/ClydeKuo/article/details/69569474 这篇博客讲的很详细,很详细.

  5. poj_2559 单调栈

    题目大意 给出一个柱形图中柱子的高度,每个柱子的宽度为1,柱子相邻.求出柱形图中可能形成的矩形的最大面积. 题目分析 以每个柱子(高度为h[i])为中心,向两边延展求出以该h[i]为高度的矩形的最大宽 ...

  6. Django学习笔记第六篇--实战练习二--简易实现登录注册功能demo

    一.绪论: 简易实现登录功能demo,并没有使用默认身份验证模块,所以做的也很差,关闭了csrf保护,没有认证处理cookie和session,只是简单实现了功能.另外所谓的验证码功能是伪的. 二. ...

  7. Hibernate传递list参数的例子

    public Map<String, String> getAllFeedBack(Object[] obj){ Map<String, String> map = new H ...

  8. [Jenkins] 解决 Gradle 编译包含 SVG Drawable 出现异常

    异常信息 java.awt.AWTError: Can't connect to X11 window server using 'localhost:10.0' as the value of th ...

  9. Python全栈day18(三元运算,列表解析,生成器表达式)

    一,什么是生成器 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__方法),所以生成器是可迭代对象. 二,生成器分类在python中的表现形式 1 ...

  10. linux 定时备份mysql数据库

    首先要先搞清楚两个概念: ①.mysqldump,mysqldump是mysql的逻辑备份工具,它不是linux的命令,工作原理类似产生一些列sql语句,对数据库进行指定的逻辑备份. 最简洁的形式是: ...