Linux DNS原理--配置详解
这是来自鸟哥的 Linux 私房菜(http://vbird.dic.ksu.edu.tw/) 请大家不要再次转载DNS 服务器1. 本章的行前准备工作 2. 甚么是 DNS : 2.1 什么是
这是来自鸟哥的 Linux 私房菜(http://vbird.dic.ksu.edu.tw/) 请大家不要再次转载
DNS 服务器

1. 本章的行前准备工作 2. 甚么是 DNS : 2.1 什么是 Domain Name System 2.2 DNS 的查询过程
2.3 关于『授权』的意义
2.4 网站代管还是自己设定 DNS
2.5 正解与反解的 Zone 意义
3. DNS 服务器的套件、种类与 cache only 主机设定:
3.1 架设 DNS 所需要的套件
3.2 BIND 的默认路径设定与 chroot, /etc/sysconfig/named
3.3 DNS 的 master/slave 架构
3.3 单纯的 cache-only 与 forwarding DNS 主机设定
4. DNS Master 服务器机的详细设定
4.1 一个简单案例说明
4.2 /etc/named.conf 配置文件
4.3 最上层 DNS (root) 数据库档案的设定
4.4 正解数据库档案的设定: 领域 RR, master/slave RR, 领域解析 NS, 正解标志
4.5 反解数据库档案的设定: 反解 RR
4.6 DNS 的启动与观察
4.7 数据库的更新
4.8 测试
5. Master/Slave 架构的详细设定
5.1 master DNS 权限的开放
5.2 slave DNS 的设定
6. Client 端的设定:
,6.1 相关配置文件: /etc/hosts, /etc/resolv.conf, /etc/nsswitch.conf
6.2 DNS 的查询指令: host , nslookup , dig
6.3 Domain 的信息查询: whois
7. DNS 服务器的进阶设定:
7.1 子域授权问题
7.2 架设一个合法授权的 DNS 主机
7.3 LAME Server 的问题
7.4 利用 RNDC 指令管理 DNS 服务器
7.5 架设动态 DNS 主机:让你成为 ISP 啦!
8. 重点回顾
9. 课后练习
10. 参考数据
11. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?p=115692

本章的行前准备工作
人类的脑袋对于数字毕竟不比文字来的敏感,偏偏计算机的世界仅认识 0/1 而已。 为了将两者兜在一起于是有了主机名与 IP 的对应啊~而这个对应的协定就是 DNS 了。 学习 DNS 你必需要对网络有一定的概念,尤其是主机名的说明喔!
了解网络基础,防火墙与关闭 SELinux 模块等等。
∙ 由于你可能会手动修改 /etc/init.d/named ,所以 shell script 也要了解!

∙
什么是 DNS
目前的 Internet 世界最常用的还是所谓的 TCP/IP 协议,其中 IP 协定为第四版的 IPv4 。 不过,这个 IPv4 是由 32 个位 (32 bits) 所组成,为了人脑已经转成四组十进制的数字了, 例如 123.234.56.78 这样的格式。当我们利用 Internet 传送数据的时候, 就需要这个 IP ,否则数据怎么知道要被送到哪里去?
Tips:
传送数据的方法有很多,不见得全部都是透过 IPv4 这个协议,例如在 LAN
里面常用的 NetBIOS 就是一例。 不过,在这里,我们不讨论其他的传输方
法,专门探讨 IPv4 这个协议喔!
然而人脑对于 IP 这种数字的玩意儿,记忆力实在是不怎么样。但是如上所说, 当我们需要数据传输时,又很需要对方的 IP ,怎么办?为了应付这个问题, 早期的朋友想到一个方法,那就是利用某些特定的档案将主机名与 IP 作一个对应, 让主机名与 IP 有关连性,如此一来,我们就可以透过主机名来取得该主机的 IP 了! 真是个好主意,因为人类对于名字的记忆力可就好多了! ^_^y。
可惜的是,该方法还是有缺憾的,那就是主机名与 IP 的对应无法自动于所有的计算机内更新, 且要加入该对应仅能向 INTERNIC 注册,若 IP 数量太多时,该档案会大到不象话,也就不利于
,主机同步化了。 而为了填补这个缺憾,柏克莱大学发展出另外一套阶层式管理主机名对应 IP 的系统, 我们称他为 Berkeley Internet Name Domain, BIND ,这个系统可就优秀的多了~ 透过阶层式管理,可以轻松的进行维护的工作~太棒了! 这也是目前全世界使用最广泛的领域名系统(Domain Name System, DNS)哩~ 透过 DNS ,我们不需要知道主机的 IP ,只要知道该主机的名称,就能够轻易的连上该主机了!
Tips:
在底下的说明当中,我们有时会提到 DNS 有时会提到 BIND ,这有什么不
同? 由上面的说明里面,您可以了解到, DNS 是一种因特网的通讯协议名
称, 至于 Bind 则是提供这个 DNS 服务的套件~这样您了解了吗?!

那么要立刻来架设 DNS 主机吗?当然不是~如同上面说的,因特网上面, 数据的传输最重要的就是得要知道对方的 IP,如此才能达成联机。因此, 架设 DNS 就必须要了解整体因特网的领域名架构,否则,一旦 DNS 架设错误, 可能会造成您所管辖的主机无法正确的在 Internet 上头传输数据的问题!
所以,要设定 DNS 之前,您必须要就领域名系统里面惯用的 FQDN、Hostname 与 IP 的查询流程, 正解与反解、合法授权的 DNS 主机之意义,以及 Zone 等等的知识作一个认识才行! 这可是很重要的,不要轻忽他了!
Tips:
事实上,由于 IPv4 的 IP 数量已经不足了,为了应付未来的网络架构而开
发了 IPv6 出来。 但是 IPv6 的『数字数量』是比 IPv4 要多出好多好多的!
可想象的到的是,那时 DNS 可就更重要了!@_@

什么是 Domain Name System:
DNS 的全名是『 Domain name system 』, 中文译名为『领域名系统』, 这个咚咚的用途是什么哇!为什么我们的计算机或者是 Internet 一定需要他 (尤其是以 WWW 的方式来上网时) ?呵呵! 他最大的用途就是『造福懒惰与记忆性薄弱的人类~』 哈哈!没错!为什么说他是造福人类呢?且听鸟哥娓娓道来:
/etc/hosts 的历史:
如同前面以及网络基础章节当中谈到的,IPv4 的 IP 是由 32bits 所组成,转成十进制的话则是四组 0-255 的数字所组成的。 由于不容易记忆,因此就有了主机名与 IP 对应的想法出来。也就是说, 只要输入一个『计算机的名字』而我们的系统就会自动的将这个名字转成计算机了解的 IP !嘿嘿!如此一来,我要记得『名字』总是比 IP 容易的多了!
依据这个想法而有了 /etc/hosts 这个档案!例如,只要您输入 『 ping -c 5 localhost 』 您的 Linux 马上可以印出 127.0.0.1 这个 IP , Why ?您去看一下 /etc/hosts 就知道为什么了!所以啰,只要将您常常上网的『网址对应的 IP 』写到这个 /etc/hosts 底下,您的 IP 搜寻速度就会快上很多~
,Tips:
再次强调,在您的私有网域内部,最好将所有的 IP 都写入这个档案中啦!

∙ DNS 的历史:
早期(大约20~30年前) 的计算机可是贵重物资,一般人是可望而不可及的,因为计算机数量太少, 所以使用 /etc/hosts 来记忆这些 IP 与名称的对应还尚可应付。但是在现代, Internet 上面这么多主机,并且常常会突然的『噗通』又多出一部主机来服务, 那么我们总不能一个一个的将他输入在 /etc/hosts 里面吧?对呀!真不聪明! 而且也无法立刻让全世界的计算机都同步更新他们自己的 /etc/hosts 档案啊! 所以后来的这个时候就有所谓的『领域名解析系统, DNS 』出现啦!
DNS 服务利用类似树状目录的型态,将主机名的管理分配在不同层级的 DNS 服务器当中,经由分层管理,所以每一部主机记忆的信息就不会很多, 而且若有 IP 异动时也相当容易修改!那么这个 DNS 的功能您知道了吗?对啦!就是『将计算机主机的名称转译成 IP 』就是了!当然啰,他的额外功能还很多!总之,他的最大功能就是『 让有意义的,人类较容易记忆的主机名(英文字母) ,转译成为计算机所熟悉的 IP 地址! 』
举个例子来说好了,奇摩雅虎的网站的 IP 是 202.43.195.52 ,所以您可以在您的浏览器上面输入『 http://202.43.195.52 』来连上奇摩雅虎! 不过,我想没有几个人能够将这个 IP 背的起来的吧?反之,我们却都知道奇摩雅虎的网址为 tw.yahoo.com ,那么您只要输入

在提到名称与 IP 的解析流程之前,我们还必需来讨论一下『什么是 domain name 与 host name ?』也就是领域名与主机名。

在讨论这个主题之前,我们来聊一聊比较生活化的话题:
∙ 网络世界其实有很多人自称为『鸟哥』的,包括敝人在下小生我啦!那么你怎么知道此鸟
哥非彼鸟哥呢? 这个时候你可以利用每个鸟哥的所在地来作为区分啊,比如说台南的鸟哥与台北的鸟哥等。 那万一台南还有两个人自称鸟哥怎么办?没关系,你还可以依照乡镇来区分呢!比如说台南北区的鸟哥及台南中区的鸟哥。 如果将这个咚咚列出来,就有点像这样:
,是否就可以分辨他的不同点了呢?呵呵!没错!就是这样!
∙ 另外一个例子可以使用电话号码来看,假如高雄有个 1234567 而台南也有个 1234567 ,
那么(1)您在高雄直接拨接 1234567 时,他会直接挂入高雄的 1234567 电话中, (2)但如果您要拨到台南去,就得加入(06)这个区码才行!我们就是使用区码来做为辨识之用的! ∙ 是否还不清楚鸟哥要说什么?我们常常会发现主机名都是 www 的网站,例如 www.gov.tw,
www.seednet.net, www.hinet.net 等等,那么我们怎么知道这些 www 名称的主机在不同的地方呢?就需要给他领域名啰!也就是 gov.tw, seednet.net, hinet.net 等等的不同,所以即使您的主机名相同,但是只要不是在同一个领域内, 那么就可以被接受啰!
基本上,我们知道 DNS 是有层级之分的,那么每个层级的 Hostname 与 Domain name 可是不一样的咚咚ㄋㄟ~鸟哥使用我们的主机来加以说明,如下图所示:

图一、分层次的 DNS 架构 ( Hostname 与 Domain name )
在上面的例子当中,由上向下数的第二层里面,那个 .tw 是 domain name ,而 com, edu, gov 则是主机的名称,而在这个主机的名称之管理下,还有其他更小网域的主机, 所以在第三层的时候,基本上,那个 edu.tw 就变成了 domain name 了!而成大与中山的 ncku, nsysu 则成为了 hostname 啰!
呵呵!以此类推,最后得到我们的主机那个 aerosol 是主机名,而 domain name 是由 ev.ncku.edu.tw 那个名字所决定的!自然,我们的主机就是让管理 ev.ncku.edu.tw 这个
domain name 的 DNS 服务器所管理的啰!这样是否了解了 domain name 与 hostname 的不同了呢?

DNS 的查询过程:
接下来我们要谈一谈,那么 DNS 的 (1)架构是怎样? (2)查询原理是怎样?总是要先知道架构才能知道如何查询的吶!所以底下我们先来介绍一下整体的架构。
,∙ DNS 的架构:

图二、DNS 层阶概念示意图
上面就是一个简单的 DNS 阶层架构啰,在整个 DNS 系统的最上方一定是 . (小数点) 这个 root 的 DNS 主机,他底下管理的就只有 com, edu, gov, mil, org 与以国家为分类的第二层的主机名了!这两者称为 Top Level Domains (TLDs) 喔!
一般最上层领域名 (Generic TLDs):例如 .com, .org, .gov 等等;
∙ 国码最上层领域名 (Country code TLDs):例如 .tw, .uk, .jp 等 ∙
例如台湾地区最上层的领域名是以 .tw 为开头,管理这个领域名的这部机器的 IP 是在台湾,但是他的记录则是记录在 . (root)那部机器里面的!还有其他的国家的最上层如 .cn 指的是大陆, .de 指的是德国一样!那么每个国家之下记录的主要的下层有哪些领域呢? 呵呵!主要就是有这六大类:

其实最早之前在 . (root)之下只有这六大类的 domain name ,但是网络成长的速度太快了,因此后来又多出这些以国码来分的 domain name ,如此一来,在该国家之内,只要向该国家申请 domain name 即可,不需要再到最上层去申请啰!也因此,在这些国码之下,还是有这六大类的 domain name 为主的哩!当然啦,在目前,由于因特网持续的发烧,说实在的 domain name 实
,在是有点不太够用,所以又有相当多的领域名被设计出来,例如目前台湾 ISP 提供的 .idv.tw 的个人网站啦!
好了,再强调一次, DNS 系统是以所谓的阶层式的管理,所以,请注意喔!那个 .tw 只记录底下那一层的这数个主要的 domain 的主机而已!至于例如 edu.tw 底下还有个 ncku.edu.tw 这部机器,那就直接授权交给 edu.tw 那部机器去管理了!也就是说『 每个上一层的 DNS 主机,所记录的信息,其实只有其下一层的主机名而已! 』至于再下一层,则直接『授权』给下层的某部主机来管理啰!呵呵!所以您就应该会知道 DNS 到底是如何管理的吧! ^_^
会这样设定的原因不是没有道理的! 这样设计的好处就是:每部机器管理的只有下一层的 hostname 对应 IP 而已,所以减少了管理上的困扰!而下层 Client 端如果有问题,只要询问上一层的 DNS server 即可!不需要跨越上层,除错上面也会比较简单呢!
DNS 的搜寻流程:
刚刚说过 DNS 是以类似『树状目录』 的型态来进行名称的管理的!所以每一部 DNS 主机都『仅管理下一层 DNS 主机的名称转译』而已, 至于下层的下层,则『授权』给下层的 DNS 主机来管理啦!这样说好像很绕口,好吧!我们就以下图来说一说原理啰:

图三、DNS 主机查询流程示意图
首先,当您在浏览器的网址列输入 http://aerosol.ev.ncku.edu.tw 时,您的计算机就会依据相关设定( 在 Linux 底下就是利用 /etc/resolv.conf 这个档案 ) 所提供的 DNS 的 IP 去进行联机查询,好了,由于目前最常见的 DNS 主机就属 Hinet 的 168.95.1.1 这个 DNS 了,所以我们就拿他来做例子吧!嗯!这个时候, hinet 的这部主机会这样工作:
1. 先查看本身有没有纪录:
刚刚说过啦,由于 DNS 是层阶式的架构,任何一部 DNS 都仅记录下一层里面的主机名对应的 IP 而已,由于 hinet 并非学术网络里面的主机,所以自然也就没有办法直接提供给 client 端关于 aerosol.ev.ncku.edu.tw 这部机器的 IP 了,所以啦,一般而言,这个时候 168.95.1.1 就会向最顶层,也就是 . (root) 的主机查询 .tw 这部机器的地址;
,2. 向最顶层 ( root )查询:
由于 168.95.1.1 没有纪录我们主机的 IP ,这个时候他就会向『最顶层』的 . (root) 这部主机来查询 . (root) 的下一层,也就是 .tw 这部机器的数据了!这个时候, . (root) 就会告诉 168.95.1.1 说『嘿!您要查 .tw 这个网域的管理者呀?我这里有 .tw 这个网域的管理的主机之 IP 信息,您可以直接去找他!』;
3. 向第二层查询:
168.95.1.1 接着又到 .tw 去查询,而该部机器管理的又仅有 .edu.tw, .com.tw,
gov.tw... 那几部主机,经过比对后发现我们要的是 .edu.tw 的网域,所以这个时候 .tw 又告诉 168.95.1.1 说:『您要去管理 .edu.tw 这个网域的主机那里查询,我有他的 IP !』;
4. 向下层持续查询:
好了,一步一步下来, .edu.tw 可以查到管理 .ncku.edu.tw 的主机 IP ; .ncku.edu.tw 可以查到管理 .ev.ncku.edu.tw 的主机 IP ,而最后我们 aerosol.ev.ncku.edu.tw 就可在管理 .ev.ncku.edu.tw 网域的那部主机的设定纪录当中查询到啦!
5. 记录暂存内存:
查到了 IP 之后,这部 168.95.1.1 的 DNS 机器总不会在下次有人查询
aerosol.ev.ncku.edu.tw 的时候再跑一次这样的流程吧!粉远粉累的吶!而且也很耗系统的资源与网络的带宽,所以呢, 168.95.1.1 这个 DNS 很聪明的会先记录一份
aerosol.ev.ncku.edu.tw 对应 IP 的信息在自己的暂存内存当中,以方便下一次又有人对同一个主机名的要求之查询!最后则将结果回报给 client 端!当然啦,那个记忆在 cache 当中的数据,其实是有时间性的,当过了 DNS 设定记忆的时间(通常可能是 24 小时) ,那么该记录就会被释放喔!
由这样的分层负责您发现了什么?嗯!那就是:
当一个『合法』的 DNS 主机里面的设定修改了之后,来自世界各地任何一个 DNS 的要求,都会正确无误的显示正确的主机名对应 IP 的信息,因为他们会一层一层的寻找下来,所以,要找您的主机名对应的 IP 就一定得要透过您的上层 DNS 主机的纪录才行!所以只要您的主机名字是经过上层『合法的 DNS』主机的设定的,那么就可以在 Internet 上面被查询到啦!呵呵!很简单维护吧,机动性也很高。
∙ 在主机的暂存内存记录当中,由于是有时间性的,所以当您的主机名在 DNS 当中被修改
了之后,但是由于之前的旧信息还记忆在其他的 DNS 主机的暂存内存里面,所以啦,可能在别人以非您的 DNS 主机来查询您的主机名时,就会得到先前的旧信息,这个时间差不多可能是 10 分钟到 2 天左右,这也是为什么我们常说当您修改了一个 domain name 之后,可能要 2 ~ 3 天后才能全面的启用的缘故啦!
∙ 每一部可以记录主机名与 IP 对应的 DNS 服务器都可以随意更动他自己的数据库对应,
因此主机名与域名在各个主机底下都不相同。举例来说, idv.tw 是仅有台湾才有这个 idv 的网域~ 因为这个 idv 是由 .tw 所管理的,所以只要台湾 .tw 维护小组同意,就能够建立该网域喔! ∙
好啦!既然 DNS 这么棒,然后我们又需要架站,所以需要一个主机的名称,因此, 那么我们需要架设 DNS 了吗?当然不是,为什么呢? 刚刚鸟哥提到了很多次的『合法』的字眼,因为他就牵涉到『授权』的问题了! 我们在前面的『申请合法的主机名』当中也提到, 只要主机名合法即可,不见得需要架设 DNS 的啦!
,DNS 使用的 port number :
好了,既然 DNS 系统使用的是网络的查询,那么自然需要有开 Listen 的 port 啰 ( 监听的埠号 )!没错!很合理!那么 DNS 使用的是那一个 port 呢?那就是 53 这个 port 啦!您可以到您的 Linux 底下的 /etc/services 这个档案看看!搜寻一下 domain 这个关键词,就可以查到 53 这个 port 啦!
但是这里需要跟大家报告的是,通常, DNS 查询的时候,是以 udp 这个较快速的数据传输协议 (protocol) 来查询的,但是万一没有办法查询到完整的信息时,就会再次的以 TCP 这个协定来重新查询的!所以启动 DNS 的 daemon (就是 named 啦) 时,会同时启动 TCP 及 udp 的 53 这个 port number 喔!

关于『授权』的意义:
很多朋友都认为『 架设 DNS 可以设定主机的名称,而我要架站需要主机有名字,因此一定需要架设 DNS ,只要有 DNS,我的主机就可以有名字了! 』是这样吗?当然不是!这是错误的观念!怎么说呢?
从上面图三的图示当中,您应该不难发现,当我要搜寻 aerosol.ev.ncku.edu.tw 主机时,就需要向管理 .ev.ncku.edu.tw 这个网域的那部机器查询才行,而要查询 .ev.ncku.edu.tw 则需要在 .ncku.edu.tw 上面询问才可以!这是因为『上层 DNS 主机 .ncku.edu.tw 已经
将 .ev.ncku.edu.tw 这个网域的管理权 "授权" 给 green.ev.ncku.edu.tw 这部机器,当有人要查询 .ev.ncku.edu.tw 这个网域的主机 IP 时, .ncku.edu.tw 将会把查询的任务直接转给 green.ev.ncku.edu.tw 去管理了!从此, .ncku.edu.tw 这个网域的管理主机,将不会再接管 ev.ncku.edu.tw 这个网域的名称管理! 』是否很像人类社会的『授权』的概念?
也就是说,当您老板充分的『授权』给您某项工作的时候,从此, 要进行该项工作的任何人,从老板那边知道您才是真正『有权』的人之后,都必须要向您请示一样! ^_^!所以啰,如果您要架设 DNS ,而且是可以连上 Internet 上面的 DNS 时,您就必须要透过『上层 DNS 主机的授权』才行!这是很重要的观念喔!等一下我们在底下会介绍一个如何架设一个 『经过合法授权的 DNS 主机』哩!
其实,如果将上面的话改换成:『 我要架站,所以我要让我的主机有一个合法的名字! 』那样就合理了!怎么说呢?因为我可以请上层 DNS 帮我设定主机名对应 IP 就可以啦!如此一来,要找我的 hostname 对应 IP 的人,都可以直接在我的上层 DNS 里面找到,根本不需要透过我的 Linux 主机吶!例如鸟哥研究室的 aerosol.ev.ncku.edu.tw 就可以在
green.ev.ncku.edu.tw 这部管理 DNS 的 server 上面找到ㄋㄟ~不必亲自来我的
aerosol.ev.ncku.edu.tw 上面找!
也就是说,藉由 DNS 系统最大的功能『主机名转译成 IP 』 这个动作,那么您只要向任何一个合法的 DNS 主机申请一个『主机名, hostname 』给您的 Linux 主机,让大家都可以藉由该 DNS 主机来查询到您的 Linux 之 IP ,就可以使用该主机名来架站啦!就是这么简单!
好了,那么您就应该知道了,要让您的主机名对应 IP 且让 Internet 上面的计算机都可以查询的到,就需要:
,1. 上层 DNS 的授权让您设定 DNS 主机,或者是;
2. 直接请上层 DNS 主机来帮您设定!
这两种模式。举例来说,鸟哥的 Linux 教学网站主机名为 linux.vbird.org ,鸟哥是向上层 .org 的 ISP 注册了 vbird.org 的领域名,但鸟哥申请的是自己管理 DNS 服务器,所以我网站的数据库放在哪里呢?

图四、授权与数据库的差异
看到了吗?vbird.org 是向上层 ISP 注册的,而 ISP 则是提供授权给鸟哥 (NS 的标志) , 至于鸟哥的 linux.vbird.org 则是直接记录在鸟哥的 DNS 服务器上面。所以,万一鸟哥的 DNS 服务器挂点, 那么虽然 ISP 有纪录 dns.vbird.org 这一部主机的 IP ,但是大家都无法查到 dns.vbird.org 的 IP 喔! 为什么呢?瞧一瞧图三啊!因为授权的关系嘛!对于 NS 及 A 标志不熟没关系, 后面就会立刻讲到这个咚咚啰!
那么哪种模式比较好呢?这没有一定的答案, 底下我们来谈一谈,您比较适合哪一种模式的设定呢?

网站代管还是自己设定 DNS:
如果您曾经申请过 domain name 的话,例如向 Hinet 或 Seednet 等台湾各大主要 ISP 申请 domain name 的话,应该都会知道有两种主要的模式,就是刚刚上头提到的 DNS 授权,或者是直接交给 ISP 来管理。交给 ISP 管理的, 就可以称作是域名代管啦!当然啦,如果您是学校单位的话,或者是企业内部的小单位,那么就得请您向上层 DNS 主机的负责人要求啰!无论如何,您只能有两个选择就是了,要不就是请他帮忙您设定好 hostname 对应 IP ,要嘛就是请他直接将某个 domain name 段授权给您做为 DNS 的主要管理网域。
那么我怎么知道那个方式对我比较好呢?请注意,由于 DNS 架设之后,会多出一个监听的 port ,所以理论上,是比较不安全的!因此,能不设当然就不要设定比较好啰!所以,这里的建议如下: