|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
前面所介绍的伺服器服务大多是用在内部网路环境中的,不过,以现代的情况和未来的趋势来看,每个网路或多或少都需要 Internet 连线以及向 Internet 提供服务。从这一章开始,我们将为大家陆续介绍一些在 Internet 环境中常用到的伺服器之架设技巧。就算您目前还没真的需要架设 Internet 相关的伺服器,但许多企业的 Intranet 环境中,也需要相类似的伺服器来为企业内部网路提供服务。 在众多 Internet 伺服器当中,有一种服务是所有服务的基础,就是 DNS 服务。DNS 可以说是一个不容易弄清楚的概念,尤其是其运作原理。如果您看过“学习网路”中的“ DNS 协定”(我强烈建议您看看这篇文章!),相信应该有一定概念了,否则,您在如下的阅读中可能难以理解,也浪费您的时间。 无论如何,在您进一步阅读下面文章之前,请您先确定能正确回答如下的问题:
如果您未能从上面的联结网页找到答案,那我再推荐您多看一篇文章: 忠告:请不必急著知道怎样设定 DNS,花点时间将 DNS 的原理弄明白非常重要,尤其是授权模式和查询模式的正确理解。在日後的 DNS 架设和管理中,是否能正确理解这些 DNS 原理,往往是成败的关键所在! 如果您在 NT 或 Win2K 下面设定过 DNS 伺服器,相信您会觉得在 Linux 下面难多了。除了概念上要比较清楚外,另外对档案的关联也要有清晰的追踪能力,这对於进行 debug 尤为重要。因为在 Windows 系统上面,您的所有设定都透过图形界面进行,方便是方便,但也因为这个图形界面,限制了您的设定灵活性,同时也阻隔了您对 DNS 系统的深入了解。当您完成了这章的学习,而且成功在 Linux 架设出复杂的 DNS 环境之後,欢迎您再回到 Win2K 上尝试做同样的事情。或许,您就会认同我这里的观点了... 好了,闲话休提、言归正传,听百遍不如做一遍,那就让我们开始动手吧! ^_^ 在 Linux 上面,提供 DNS 服务的套件是叫 bind, 但执行服务程式名称则是 named 。请您确定系统上装有 bind、bind-utils、以及 caching-nameserver 这几个套件,同时用 ntsysv 确定 named 被选择为开机服务。 首先,让我们设定一个最重要的 dns 设定档,它就是 /etc/named.conf 。我将我自己的设定档案列出来,然後逐部份进行解释:
先让我们了解这个档案上面用来做注解的符号是“ // ”,而不是一般 shell script 的“#”;另外,“ /* ”与“ */ ”之间则注解一整段文字。同时,每一个完整的设定都以“ ;”结尾,请不要少了它!(初学者经常会犯这个错误) 上面的部份是在这个档案开头的 options 设定,首先用 directory 指定了 named 的资源记录( RR - Resource Record )档案目录所在位置为:“/var/named”;也就是说,它会到这个目录下面寻找 DNS 记录档案。所以,我们在这个档案後面部份所指定的档案,就无需使用绝对路径了,但它们一定要放在这个目录下面。 接下来,有一段文字,如果您仔细阅读一下,它大致是说:如果您要设定的 DNS 伺服器和 client 之间是隔著火墙的话,要将“// query-source address * port 53;”前面的注解符号“ // ”拿掉(当然,您也必须要设定好您的火墙啦)。不过,这只对早期的版本有影响,而在 bind 8.1 之後则无需担心这个设定。 接下来再让我们看下一段句子:
透过这几行,我们为 named 定义了 DNS 系统中的根区域“ . ”(root zone) 的设定,同时它是一个 internet ( IN ) 的区域类别( class )。这里还指定了root zone 的伺服器种类( type ) 为“hint”(也只有这个 zone 会使用这样的种类)。最後,用 file 指定这个区域记录档为:“named.ca”,也就是“/var/named/named.ca”档案。虽然 named.ca 这个档案中的‘ca’是 cache 的意思;但如果您了解 DNS 的运作,就应该知道这个暂存档的作用,同时,为什麽我们会把 root zone 放在这里。(嗯?想想看?尤其是查询非本机区域的时候?) 在 root zone 後面,您应该还会看到如下这两段:
这里是定义出关於本机名称的 DNS 解释:第一个 zone 是 localhost 的正解 zone,其伺服器种类是 master,记录档名称是 localhost.zone (在 /var/named 目录下面),但这个 zone 不允许客户主机(或伺服器)自行更新 DNS 的记录(当然,client 主机必须能支援 DNS submit 功能才行)。 而第二个 zone 则是本机区域的反解 zone ,不过,这部份的解释我想留到後面的真实例子中再作说明,请您留意就是了。 上面的句子,当您安装好 caching-nameserver 套件之後就被建立起来的,相信您不用劳什麽心力。在档案最後,您或许还看到下面这段设定:
这是 bind 9.x 版本的新功能,用来进行区域转移或 DNS 更新所用的加密处理。这个我们暂时不必理会,除非您有兴趣进行这个研究。 现在,我们暂时不要修改 named.conf 设定档,请退出它,然後转到 /var/named 目录,看看里面有些什麽东东?最起码,您会看到如下三个档案: localhost.zone named.local 不知道您是否有灵感了?没错:刚才在 named.conf 里面,每一个 zone 所指定的 file 都出现在这里!先让我们看看 root zone 的档案内容吧:
在 /var/named 中的 RR 记录档里面的注解符号,和 /etc/named.conf 的注解符号不一样哦:在 named.conf 中是用双斜线“ // ”;而在这里则使用 “ ;”符号。无论如何,您都不能用 “ # ”来做注解符号就是了。(好混乱哦~~~ 这就是电脑!^_^ ) 在上面这个 named.ca 档案里面,您如果将所有的注解行拿掉,您会发现一共有 13 行是以‘ . ’开头的,那就是所谓的 root zone 了!然後,第二栏都是‘ 3600000 ’,这是 TTL (Time To Live) 设定,也就是在 cache 中保留的时间,以秒为单位(所以这里是 100 小时)。其後的‘ NS ’是“Name Server”的意思,是 DNS 记录名称之一,也就是负责这个记录的 name server 是哪一台主机(这里一共由 13 台主机共同负责 root zone 的 NS 服务)。 虽然我们这里用 NS 指定了 name server 的主机名称,但对电脑系统来说,这些名称必须能解释为 IP 位址才有用(呵~~ 这个正是 DNS 系统的功能),所以,这里分别用 13 个‘ A ’记录,也就是 Address 的意思,解释 [A-M].ROOT-SERVER.NET. 这些主机各自的 IP 位址所在。 如果您了解 DNS 的查询模式,您会知道 DNS 伺服器在查询非自己管辖的 zone 的时候,首先会向 root 查询下一级的 zone 在哪里,然後逐级查询下去。但问题是:当 named 刚启动的时候,在 cache 里面一片空白,它怎麽知道 root zone 的 servers 在哪里呢?这不是一个矛盾吗?所以,就必须靠这个档案告诉 named 关於 root zone 的 servers 有哪些?以及在哪里? --- 明白了吗? 因为这个档是以静态的方式维护的,很难保证这个档的内容永远都正确,如果 root zone 的记录发生改变了怎麽办(虽然这机会不大)?或许,您已经在档案的开头注解那里得知,您可以在任何时候透过 ftp 或 gopher 取得这个档案的最新版本。如果您还没读过那些注解,那就请带著字典读一下吧。如果您真的有需要更新这个 named.ca 档,那可以按如下步骤进行:
除了刚才的 named.ca 之外,第二个 zone 的记录档是 localhost.zone ,从 named.conf 中您应该知道它是 zone "localhost" 的记录档,它的内容如下:
内容很简单,但您是否真的了解每一行的设定意思呢?如果不清楚或不确定,那就让我们一起探讨探讨吧。 首先,第一行是一个 TTL 设定,目前是定义出这个记录档里面的各项记录的预设 TTL 值为 86400 秒(刚好是一天)。您的记录档或许没有这行,事实上没什麽关系,您可以自己补上,否则,在启动 named 的时候会碰到一些警告,无伤大雅的;但如果您的确在意那些警告,那就加上这行。您要知道,在记录档中宣告的所有资源记录(RR - Resource Record),都一定有一个 TTL 设定,如果没有,则使用这里预设的值。 第二行是一个 ORIGIN 设定,说明下面的记录源出何处(这里是源出 localhost. 的记录)。请您加倍留意最後的一个小数点“ .”,少了它或多了它,记录名称完全不一样!在 DNS 记录中,我们称这样以小数点结尾的名称为“ 全域名称 ”即 FQDN ( Fully Qualified Domain Name ) 。如果缺少了这个点会怎样呢?就会将所属的 ORIGIN ( @ ) 附加在记录名称後面;而这 ORIGIN 就是上一个 $ORIGIN 宣告之後的名称,如果在前面找不到 $ORIGIN 宣告,那就以 /etc/named.conf 中定义的 zone 名称为基准。以目前的例子来说,如果没有这个小数点的话,“localhost”会变成“localhost.localhost”;但如果有小数点的话“localhost.”就只能是“localhost.”。所以,这个小点“.”非常重要,在以後设定中一定要非常留神!!(这也初学者最常犯的错误之一) 然後,第三行,是一个 SOA 记录的设定,在这里我们看到一个特殊字符“ @ ”,它就是 ORIGIN 的意思,也就是刚才所定义的 $ORIGIN localhost. 内容,您可以写成 localhost. 也可以用 @ 来代替。假如这个档前面没有定义 $ORIGIN 的话,那这个 @ 的值就以 named.conf 里的 zone 为准。既然这样,当然是使用“@”啦,尤其对於像我这样的懒惰鬼来说,巴不得少打一串字,同时还能避免因打字不准所造成的失误,何乐不为? 在 @ 之後,是 TTL 的设定,这里是 1D,也就是一天的意思,如果您喜欢,可以用 86400 (秒) 来设定,如果这里的 TTL 没有设定,则参考前面的 $TTL 值,如果前面没有定义 $TTL,那就参考其後介绍的 minium ttl 设定。
在 TTL 之後是一个 IN,定义出目前的记录类型是属於 internet class 的 (奇怪,目前的 DNS 还有其它 class 吗?)。 在 IN 之後就是这行 RR 的记录类别名称,这里是 SOA ,也就是“Start Of Authority”的意思,表示目前区域的授权记录开始。每一个记录档只能有一个 SOA ,不得重复,而且必须是所负责的 zone 中第一个“记录”。 紧接 SOA 後面,指定了这个区域的授权主机和管理者的信箱,这里分别是“ @ ”和“ root ”,也就是 localhost. 主机和 root 信箱。这里要注意的是:SOA 的主机名称必须能够在 DNS 系统中找到一个 A 记录 (以後会提到);另外,我们平时使用的信箱通常是“user@host”这样的格式,但因为“@”在 DNS 记录中是个保留字符(刚才已经提过),所以在 SOA 中就用“.”来代替了“ @ ”。目前这个信箱是 root (并没有主机位址),也就是本机,您可以写成 “root.localhost.”但不能写成“root@localhost.”。 接下来的 SOA 设定,是被括在“( )”之间的 5 组数字,主要作为和 slave 伺服器同步 DNS 资料所使用的数据:
以上的数字都是以秒为单位,但您也可以用 H(小时)、D(天)、W(星期)来做单位,如:3H 和 259200 是一样的。但要值得一提的是:我在 RH6.2 版本中曾测试过使用 netconf 这工具来设定 DNS ,发现只能使用“秒”来设定。否则 netconf 会自动的把英文字母删除掉,那就不是我所预期的设定值了。无论您用什麽单位来设定,都要遵守下面的规则: expire >= 10 * retry
设定 DNS 的 RR 记录档,其格式要求非常严格,我们丝毫不能掉以轻心。比方说:如果句子不是以空白键、Tab 键、 或注解符号 ( ; )开头,也不在 SOA 的 “ ( ) ”之内, 则表示要定义一个“新记录项 (Entry) ”;如果句子是以空白键或 tab 键开始的话,其设定被视为上一个“记录项”的内容。所以,如果您要为“同一个记录项”定义多个记录设定,而不想重复打字,您倒可以偷懒:在接著它的後面几行用空白或 Tab 来缩排就可以了。所以,最後这两行还是关於 localhost. 的设定,因为上一个“资料项”为 “ @ ”,也就是 localhost. 。当然,您如不喜欢,这两行句子也可以这样写:
这两行的意思是说:负责 localhost. 这个记录的 name server ( NS ) 是 localhost. 这台机器;而 localhost. 的 IP Address ( A ) 是 127.0.0.1 。DNS 里面的 A 记录应该是最常见的记录类型之一,如果在 IPv6 版本中,位址记录名称则改为 AAAA 。
最後,让我们检查剩下的 named.local 档案吧。如果您还没忘记 /etc/named.conf 的内容的话,应知道这个档案是 zone "0.0.127.in-addr.arpa" 的‘反解’记录档,它的内容也很简单:
前面的部份应该不用多解释了(如果您还不清楚,那就必须重读前面的文章)。最後一行我们看到一个“ PTR ”记录,它是“Pointer”的意思。 PTR 通常用於反记录当中,将 IP 指向主机名称(刚好和 A 记录相反)。您或许还不是很清楚这个句子为什麽是这样设定的吧?或许您会这样问:您不是说 PTR 是从 IP 反查询主机名称的吗?为什麽这里是 1 而不是 127.0.0.1 ? 哦,如果您有这样的问题,那证明您对 DNS 的查询模式还不是了解得很透彻,不过也不用紧张,在後面的实作例子中,您将获得更进一步的感性认识。这里,我暂时简单解释上面这行就是了: 我们知道 127.0.0.1 所对应的主机名称就是 localhost ,因为这里是反向查询,所以 IP 顺序是掉过来写的,於是这个反查询 IP 就是:“ 1.0.0.127.in-addr.arpa. ”,由於我们这里的 ORIGIN ( @ ) 是“ 0.0.127.in-addr.arpa." ”,因为在记录档中,如果名称不带小数点,则被补上 $ORIGIN 或 zone 的名称,所以这个 “ 1 ”就成了 1.0.0.127.in-addr.arpa. ”。同样道理,後面的“ localhost. ”如果漏了最後的小点的话,则会成为“ localhost.0.0.127.in-addr.arpa. ”,这显然是不对的。假如您喜欢,可以将这行句子修改成为下面的样子:
嗯~~ DNS 的设定看起来真的蛮伤脑筋的,或许您到这里已经被搞得乱七八糟了。假如真的如此,我建议您先休息一下,然後回来重读上面的内容,直到您能理解之後,才继续下面的。否则,越往後,您的问题越像滚雪球那样越来越大,这更浪费时间啦~~~ Okay? Take it easy ... ^_^ 前面所看到的设定,事实上已经足够让您的 DNS 主机跑起来了!因为它能够透过 root 查询其他 DNS 的缘故,您无须在再加设任何设定,您就可以利用这台主机为大家提供 Internet 的 DNS 查询服务。只是,这样的 DNS 主机,我们称之为 cache only name server 而已。如果您了解 DNS 的查询流程,您应该知道 DNS 的 cache 作用和它的效益。所以,就算您不打算设定自己的 domain name 服务 ,我也建议您至少可以将 cache only NS 跑起来。 当您对 /etc/named.conf 档案和 /var/named 目录的设定有初步了解之後,下面,让我们用一个实际例子来看看如何设定自己的 domain name 服务吧。我个人的习惯是先将网域和主机的资料整理出来,并列成一个表格:
当所有的主机名称和 IP 整理出来之後,再看看我们这里需要设定哪些 domain ? 从上面的资料中,我们不难发现有两个正解 zone 和两个反解 zone 需要设定,分别是:
因为这些 IP 和 domain 都在内部网路使用,所以我们省却了注册这关,同时也不必担心授权的问题。但这些资讯也只能在内部网路使用,无论如何是不能设定在对外的 DNS 上面的 (为什麽?除了安全的考量之外,private IP 的使用本来就有这样的规定,就算您真的对外散布这些 DNS 资讯,在 IP 的路由上还是有问题,所以,内部的资讯,只能内部使用)。 一般来说,我会先设定“反查询区域(revers zone)”,当然,这是个人习惯而已。所以,我首先在 /etc/named.conf 上面补上两个反解 zone 的设定:
注意哦:如果您要设定外部 DNS 的反解,那就先获得 ISP 的授权才能自己设定;否则反解部份就不用自己担心了,但一定要请 ISP 帮忙。
其它 ISP 的用户,请自行接洽 ISP 的客服部门。无论如何,如果没有取得授权,那就不要自己设! 这里,我们再一次碰到反解区域的识别标:“ .in-addr.arpa ”,同时,我们解释一下上次关於本机反解还没说明的地方:如果您了解 DNS 的授权和查询过程(这章一开始的时候,我就已要求您一定要学习的),您会知道反解查询是先从 root 开始(正解也是一样),然後到 arpa 、到 in-addr 、到第一组 IP 、到第二组 IP 、...... 这样查询下来的。所以,在设定反区域的时候,您一定要将您的 net ID 部份反过来写,例如:我的网路为 192.168.100.0/24,它的反查询区域名则是:“100.168.192.in-addr.arpa”;假如我将 netmask 改为 16 bit ,即变成 192.168.0.0/16,它的反解区域名就会变成:“168.192.in-addr.arpa”。如果您还搞不懂如何区分 Net ID 和 Host ID,请立即去看一看“学习网路”中的“IP 基础”。 同时,我将这些 zone 都设定为“主 DNS 伺服器”(即:master,也有人称之为 primary dns )。 在每个 zone 的最後部份,我分别指定了它们各自的记录档名称。它们都存放在 /var/named 这个目录下面(也就是前面 options 指定的 directory 啦)。档案的名称随您喜欢,不致做成混乱则可。 完成上面的设定之後,我们就可以到 /var/named 目录去建立相应的记录档案了。说实在,在 named.conf 里面如何定义档案名称没一定的标准,只要您能正确指定哪个记录档给哪个 zone 使用,而且档案名称能够一致就行。首先,根据第一个 zone 的 file 设定,我要建立一个 /var/named/192.168.100.rev 档案,其内容如下:
而另外一个反解设定档是 /var/named/10.0.1.rev ,我们依样画葫芦就行了:
就这样,反解 DNS 就设定完成了!是否很简单呢?如果您回答“ Yes ”的话,那就让我们继续正解区域的设定吧。同样的,先在 /etc/named.conf 里面加上两个 zone:
完成後,再建立 /var/named/siyongc.domain 这个档案:
这里,我们在正解记录档里面看到几个新的记录类别,或许需要进一步讲解一下的: 因为我这个区域的记录分别由两台主机负责,所以我这里指定了两个 NS 记录。这里,如果您确定上一个 ORIGIN 是正确的话,那也可以偷懒:正如我上面解释过,如果名称後面不是以“.”结尾的话,它所属的 ORIGIN ( @ ) 就会自动的加在该记录名称後面;所以,您可以只写“ rh71 ”而不带小数点结尾,就会变成“rh71.siyongc.domain.”了,这个名称实际就是我所要的。不过,我建议您在设定 NS 的时候还是尽量使用 FQDN 为好。 接下来的 ‘ MX ’ 记录恐怕要花些时间解析:
在邮件系统中,只要邮件伺服器双方都知道对方的 IP 就可以进行邮件交换了。我们用 /etc/hosts 也可以做到名称查询的目的,但正如我们可以想像的:ineternet 有那麽多邮件伺服器,我们不可能一一为它们建立好 IP 对应。就算,我们可以这样做,如果对方要更换邮件伺服器呢?要维护这样一个对应殊非易事。既然,我们可以用 DNS 来查询主机和 IP,为什麽不使用这麽便利的系统呢?这也是 DNS 系统的应用原因啊~~~ 但问题是,各区域的邮件伺服器名称都不一样,我们不可能知道对方的邮件伺服器主机名称是什麽?就算知道,如果对方以後更换名称呢? 您看,即使我们使用了 DNS 系统来进行邮件路由,也不是这麽简单的事情。但是,使用 MX 记录就大大发挥了 DNS 系统的功能了:我们只要为每一个区域建立起 MX 记录,利用 DNS 查询得到的邮件伺服器名称(邮件路由查询中,DNS 只是其中一种方法),这样,当邮件伺服器要和对方的区域进行邮件传递的时候,就可以通过 MX 记录得到对方的邮件伺服器名称,而不需预先知道要和哪台邮件主机沟通。在日後,就算对方更换名称,将 DNS 记录改改就可以,完全无需知会其它邮件主机;而外面的邮件伺服器也根本无需认知到这个改变。 这样的设计,无疑是非常灵活便利的!另外,使用 MX 还有一个功能:您可以用多个 MX 同时指定好几台邮件伺服器名称,从而提供备援或平行处理服务。在我这个例子中,我就分别为‘siyongc.domain’这个区域指定了两个 MX 记录:‘rh71.siyongc.domain.’和‘lp64.dmz.domain.’。但您有没有发现它们前面都有一个数字呢?这数字有什麽作用啊? 问得好!当外面的邮件伺服器通过 DNS 查询到我们的邮件伺服器,如果发现超过一台主机负责邮件交换的话,数值越低的就越先被查询。但有时候该主机没有回应呢?那麽就由下一个数值的主机负责了。这样有一个好处就是:就算第一台邮件伺服器出现故障,也不至於导致邮件交换功能瘫痪掉。我们通常会将各自的 MX 主机尽量分布在不同的位置上(例如别的城市或国家的分公司主机),假如万一发生专线、甚至 ISP 的问题,我们还能将邮件转往下一台 MX 主机。然而,在设计上,由於帐号和 client 端的设定因素,我们的邮件并非真的完全转到下一个 MX 主机接收,而是先将邮件暂时伫列( queue ) 在那台机器上,当原来的 MX 主机恢复连线之後,邮件会自动的从伫列主机那边送回来,这样就能避免邮件丢失或被退信。 补充说明一下:上面这段说明单纯只就 DNS 的设定而言的,事实上,还需要在 MX 指定的 ip 上面进行相关设定才有用。我们将会在“架设 MAIL”的文章为大家作进一步的说明。但您要知道:DNS 的功能只负责名称解释,至於解释出来的结果是如何运用的,则与 DNS 无关。只是,在 mail system 设定中,需要 DNS 配合的地方有很多,尤其是 MX 相关的记录。假如您心急想知道目前所谈的功能,或许可以参考如下讨论:
现在很多大型邮件系统,都可以同时使用多台邮件主机来提供邮件交换服务,这时候您可以将 MX 的 preference 设为相同,然後利用 NIS 和 NFS 服务,将邮件同步到相同的帐号去。您已经在前面的章节里面学会了 NIS 和 NFS,等日後学习邮件主机架设的时候,不妨玩玩看! 或许,您还发现我这里为所有主机指定了 MX 记录,有些直接指向自己(如 rh71、mdk 等),而有些则指向别的机器(如 lp64、acer 等)。在 Linux 机器上面,各主机本身就具备邮件交换功能(除非您将之移除了),而 Windows 则除非额外加装,否则本身是没有邮件交换功能的。这里的设定是,从外面通过 DNS 查询而寄往那些主机的邮件,都会转到 MX 上面指定的邮件伺服器。这在实际的网路环境中很常见,尤其您接触过“ mail hub ”这个概念。无论如何,我建议您应该帮负责 domain 的邮件伺服器本身设定一个偏好值最低的 MX 记录指向自己(但这不是硬性必须如此的)。
在过去,有些人并不知道如何正确的运用 MX 记录,但相对的,他们会为 domain 名称本身设定一个 A 记录 (@ IN A 192.168.100.23 )。这样的做法虽然不是正统的,但也行之有年了。而且,在许多网站的 URL 上,这样的设定,也能让您少输入“ www. ”这四个键~~~ ^_^ 另外,在这个档里面,您或许还发现‘ TXT ’这样的记录类别,它是‘Text Information’的意思,它实际上不牵涉任何设定,只记录一些环境说明而已;这和‘ HINFO(Host Information) ’差不多,但 HINFO 一定要有两项记录(分别用引号分开),其中第一项是关於 CPU 的讯息,第二项则是作业系统。然而,TXT 和 HINFO 这些资讯仅能在一个信任的环境中提供,如果您架设的 DNS 是对外提供服务的,那麽,就不要设定这些资讯了。要不然,入侵者可非常感谢您哦,因为您帮他们省却了很多主机系统的探测手续~~~ 所以,这里仅做范例,供您参考而已。 而最後您所看到的‘CNAME’记录又是怎样的呢?CNAME 也是一个常见的记录类别,它是一个别名记录( Canonical Name )。当 DNS 系统在查询 CNAME 左面的名称的时候,都会转向 CNAME 右面的名称再进行查询,一直追踪到最後的 PTR 或 A 名称,成功查询後才会做出回应,否则失败。例如,在正解查询中,一个 IP 通常(当然也有例外),只会对应一个 A 记录,但我们可以使用 CNAME 在 A 名称之上赋予该 IP 更多的名称。也就是说:所有关於‘www.siyongc.domain’、‘ftp.siyongc.domain’、‘mail.siyongc.domain’这些名称的查询,实际上都会再查询一次‘rh71.siyongc.domain.’这个记录,直到找到它的 IP 位址为止。有些朋友或许会设定多层的 CNAME 查询,例如:
B CNAME A 这样的话,会一层一层的逐级 CNAME 下去... 但是,这很浪费 DNS 资源!因为每一个 CNAME 都一定会产生另外一个查询动作,如果层级越多,那就产生越多的重复查询。所以,精明的 DNS 管理员,都会尽量的减少查询次数的发生,他会将 CNAME 变成这样子:
B CNAME A 这样就用心多了! 基本上,我们在正解设定上所使用到的记录大概就前面所看到的。哦,对了~~ 还有另外一个 /var/named/dmz.domain 档案也不要忘记了:
您看!就这样,我们的 DNS 就已经设定好了,包括反解和正解哦~~~ ^_^ 当您以为所有设定档都设定好之後,最想做的事情莫过於要测试一下啦。但在测试之前,我们还要重新启动 named ,否则,您查询出来的还是旧资料。聪明的您或许已经知道使用如下命令来重新启动DNS 服务了吧:
然而,作为一个有经验的 DNS 管理员,在重新启动 named 服务之後,他一定会检查一个档案,就是 /var/log/messages 。因为,许多时候,当您执行 service named restart 之後您看到的都是绿色的 OK ,但事实上是否真的 OK 呢?谁也不敢保证,除非您在 log 档中没发现错误信息。所以,我也强烈建议您每次重新启动 named 之後,一定一定要做如下动作:
然後按“G”键(大写)跳到档案末尾部份(事实上,您也可以用 tail 命令)。您或许会看到如下这样的记录:
上面虽然有 'auth-nxdomain' 和 IPV6 的提示,但那是正常的(除非您有设定相关的功能)。如果没有其它错误信息的话,那真要恭喜您了! 但有时候您或许会看到有其他错误信息的,例如:
这个错误信息明显指出了是 /etc/named.conf 的问题,而且很可能在 41 行附近。根据我个人的经验,这通常是您漏了 “ ;”符号的原因而已。 如果您碰到如下信息,那是没有为所有 RR 记录项设定 TTL 而已,您可以为每一个记录项补上 TTL (在 IN 前面),也可以在记录档的前面用 $TTL 来设定:
如果您碰到下面这样的信息,那多是因为您打字错误的关系,输入了 named 不认识的记录类别名称(例如漏了记录名称或打错了):
如下的问题,那可能是您没有定义 SOA 记录,或设定有错误:
下面的问题可能是您的 SOA 记录中多输入了一组数字,或少输入了一组数字,或数字格式有错误:
以下问题可能是 SOA 的 “ ( ) ”符号有问题,要麽是“ ( ” 给断到下一行了,要麽是“ ) ”给注解掉了:
以下是您没有设定 NS 记录或 NS 记录设定有错误:
下面的错误可能是您设定了一个记录项超出了当前 ORIGIN 的范围,例如 localhost. 或 siyongc. (也就是错误使用 FQDN );或是错误的使用了 $ORIGIN 设定;或是在 named.conf 中有多个 zone 在分享同一份记录档:
下面的错误,有可能您在设定多个 $ORIGIN 并同时尝试设定多个 SOA 时出现的错误:
许多许多问题,事实上您都可以在 /var/log/messages 中找到,当您发现这些错误信息之後,看看是关於什麽记录的,然後顺藤摸瓜,留心一下档案内容,就比较容易找到错误的原因了。 有时候,您想简化您的 DNS 设定工作,您可以使用 netconf 来做。不过,根据我的经验是:netconf 未必能够完全帮您正确的设定起来。当您重新启动 named 之後,别忘了看一下 /var/log/messages ,确定没有错误发生。如果您使用工具来设定 DNS 而碰到问题,这就需要您有手工设定的能力了。 DNS 系统是一个典型的 Client/Server 架构,前面介绍的动作仅是确保 DNS 的 server 成功启动起来而已,如果您要测试它,还必须设定好 client 端才行。 不知道您会不会设定 linux 的 dns client 呢?如果忘记了要打屁屁了哦~~~ 事实上我们在第一章的“网路设定”那里就设定过了,也就是修改 /etc/resolv.conf 这个档案,将您刚设定好的 DNS 主机 IP 放在档案的前排位置,如:
假如您的 client 和 server 在同一台机器上,那可以将第一个 name server 设定为 0.0.0.0 或 127.0.0.1 。 要是您使用 Windows ,但不是透过 DHCP 来指定 DNS 的话,那您或许需要手工设定了:控制台 --> 网路 --> TCP/IP (-> 网路卡) --> 内容 --> DNS 组态 : ![]() 请注意:如果您修改了这里的设定,就算您的 Windows 是透过 DHCP 取得 IP 设定的话,也会以这里的设定为准。如果您想使用 DHCP 的设定,那就选择“关闭 DNS”吧。 要测试我们的设定是否生效,我们可以使用的方法有很多,其中最简单的莫过於 ping 命令了。直接 ping 一下您所预期的 dns 名称就知道结果了。 不过,ping 毕竟很有限,例如:您不能查询 MX 和 NS 等记录。实作上,我们最最常使用的 DNS 查询工具是 nslookup 命令。关於 nslookup ,在“学习网路”的“DNS 协定”文章中有很详细的例子,这里不再重复。如果我们在测试中失败,例如 nslookup 回应说:
这通常是反解记录没设定好的缘故,请确定 DNS 主机本身的反解有设定起来,而且可以被 DNS 追查得到。如果反解没有授权下来,那就请上游 ISP 帮忙设定。不过,我发现这个错误信息似乎在新版的 nslookup 中不会出现,anyway ,请您自己留意吧。 有时候 nslookup 会停在某处一动也不动,其实它不是当掉了,而是在查询没结果之後等 time out 而已。您可以按 Ctrl + C 终止查询,再打 exit 跳出来。不过,如果您在按了 Ctrl + C 之後接著再输入一个无结果的查询,那就好可能将 nslookup 当掉。这样您可能要登录进另外一个 terminal ,然後用 kill 将 PID 杀掉。同上,新版的 nslookup 没有这个困绕,但如果按 Ctrl + C 的话,则会直接跳离 nslookup 程式。 然而,nslookup 似乎在以後的版本中不再维护了,取而代之的,就是 dig 命令,所以,当您在 Redhat 7.1 上输入 nslookup,您会看到如下这样的信息:
这段文字不用解释了吧?真的不知道说什麽就查字典吧~~ ^_^ 这里,我们不妨学习一下如何用 dig 来查询和测试 DNS 服务。 基本上,dig 命令的语法如下: dig [@server] domain [<query-type>] [<query-class>] [+<query-option>]
[-<dig-option>] [%comment]看起来蛮复杂的,恐怕要 man dig 才知道怎麽使用。不过,我们平时只用它来查询 dns 资料的话,要使用到的选项也不会太多啦,如果您会得在 nslookup 中设定 type=XXX 的话,那您也可以用 dig 来查询不同的记录类别资料。例如:
上面是的命令是使用预设的 name server 来查询 siyongc.domain 的 mx 记录。当然,您也可以用 @ 来指定用某一台 name server 来查询其它的资讯。例如,我要用 hinet 的 dns 来查询负责 com.tw 的 NS 有哪些:
除了用 nslookup 和 dig 之外,如果您只想简单的查询 dns 资讯的话,那您可以用 host 命令。例如:
上面的命令就是用本机 name server 来查询 siyongc.domain 的 any 资讯。至於 host 命令的格式如下: host [-aCdlnrTwv] [-c class] [-N ndots] [-R number] [-t type] [-W wait]
name [server]老话啦,看 man host 以了解那些参数和选项的用法吧。 您可以发现:透过 nslookup 、 dig 、与 host 命令,事实上可以查询到许多 dns 上面的设定资讯。所以,如果您的 DNS 是对外提供服务的话,请尽量尽量控制 DNS 资讯量,如果您觉得没必要对外提供的,那就拿掉它。无论如何,关於内部网路的 DNS 资讯,是绝对不能对外散布的。如果查询的结果未如您所预期的,您就要进行 debug 工作了。 Okay,相信到此为止,您已经能够在单一的 dns 上面设定一个或多个 domain 的正解和反解服务了。这时候,您或许早已迫不及待想注册一个属於自己的 domain 来玩玩看吧? 呵呵~~ 有此冲动绝对正常,尤其现在的 domain 注册那麽方便和便宜,前几天在‘讨论园地’得知原来现在注册一个 .com 或 .org 的网站,一年都不用 $10 块美金!实在是便宜得令人难以至信~~~ 如果您贪图方便的话,可以请任何一家网路公司代您申请 domain (当然需额外的服务费);要不然呢,也可以直接到网路上完成自己的 domain 注册。 不过,要注册自己的 domain 之前,有些条件您还是要准备好的:
当您这些条件都符号之後,可以连线到网路上的著名 domain 服务网站,例如: http://www.dotster.com http://www.godaddy.com http://www.twnic.net 当然,还有很多很多~~~ 而最後一个网站是负责台湾的 domain 注册的机构,您可以到那里注册所有以 tw 结尾的 domain,除了 twnic 之外,很多 ISP (例如 seednet )也有提供 tw domain 的注册服务。 各网站的注册手续和表格或许不尽相同,但基本上您需要提供的资讯还是大同小异的,我这里就不介绍如何进行了,只要您身边有字典都没问题啦~~~ ^_^ 在您所提供的资讯中,其中有一项比较伤脑筋的,就是 ns 主机要指向哪里?(注册时需要最少两台) 以正规的手续来说,如果您要用一个 IP 来作为您的 name server,您必须先要将这个 IP 在 whois 资料库中注册为 NS 记录才能使用,假如该 IP 或是该 NS 已经注册过了,您就不能按您的意思来注册了,但您可以使用它(当然您要确定您能管理那台注册主机,或是获得对方的管理员同意)。但我这里告诉您一个秘诀:第一次注册 domain 的时候,随便设定都可以!(哦,这是我在 dotster 上面的经验啦,其它网站是否如此我就不清楚了~~) 然後您在完成注册後,用您的帐号进去修改 name server 的 IP 就可以了(当然,您要设定的 IP 必须还没被注册过,或已经从 whois 资料库中注销)。 然而,如果您日後要变更您的 NS 和 IP 的话,是很麻烦的一件事情!而根据我以往的经验,您最好用 email 和网站的支援人员取得联络,才能顺利完成修改。嗯,这种工作实际上一点也不好玩啦,而且各网站有各自的方法和表格。比方说,如果您透过 networksolution 注册的话,日後您要修改 name server,必须填写 host forms,然後会根据您提供的确认方式确认之後才能完成,他们的确认方式有三种:
不过,在实作流程上非常复杂,比方说,如果原本采用 MAIL FROM 方式,但後来您的 email 信箱却变更了,那就很麻烦了,因为对方不能根据您的新 email 信箱来作为确认依据的。我曾经为所服务的公司修改过 NS 记录,到最後,只能以 fax 的方式来解决。 而像 dotster 网站,则只能透过帐号进行线上修改。这原本很方便,但最不好的地方是:他们不提供确认信息!往往,您以为已经修改完毕,但等了一个星期还没生效,去信问他们,才知道原来要修改的那个 IP 并没有注册为 ns 主机,或已经注册在别的名称下面了。我曾经数次写信给 doster 的 support 信箱,要求他们在线上修改後要向用户提供确认资讯(不管成功与否),但不知道他们现在是否有改善了呢?(如果还没改变的话,请大家多作投诉,直到他们提供确认服务为止。)
但我也曾经试过到 networksolution 上面注册一个 new host,然後到 dotster 那边修改,也能顺利完成!但这个後门,不知道现在是否还行得通呢? 说实在,就算您注册了 domain,如果您没有固定 IP 的话,最好不要自己管 DNS ,请别的有固定 IP 的朋友帮忙,或是付费请人代管就是了。而上面提到的 domain 网站,大都提供这样的服务。 另外,还有一个概念或许是许多 DNS 新手容易搞混乱的:我们这里所说的 domain 注册,在整个 DNS 系统中,仅属於“正解”方面的注册和授权而已;这和“反解”的授权毫不相关。而反解的授权,因为是跟据 IP 授权的,所以必须透过您的 IP 发放机构进行。换句话说:反解的授权,只能透过 ISP 进行。请您一定要区分这两种授权模式。 如果您还没有固定 IP 而又想让别人能够透过 DNS 来查询主机的话,您可以到网路上申请所谓的‘动态 DNS ’服务,大部份都是免费的,而且也有多种平台的 client 程式提供。如果您有兴趣,可以找到很多这类网站,下面只是其中两个: http://dns2go.deerfield.com/ http://www.adsldns.org (中文) 如果您不知道如何申请和安装这类动态 DNS 的话,您可以参考如下网页: 鸟哥的 Linux 与 ADSL 文件 之 “动态 DNS 申请 ” Tips:如果您使用拨接式 ADSL (PPPoE) 并在 adsldns.org 上面完成注册之後,您只需在 /etc/ppp 目录下面修改一个 ip-up.local 档(如果没有请自行建立),增加如下内容:
(注意:请将 XXXXX 修改为您的正确资料。同时,首两行结尾的 \ 符号不要漏了,其左右没空白;要不然,拿掉 \ 符号并将前面三行写成一行。) 然後,只要您完成 ADSL 拨接之後,就能‘自动’的帮您修改 IP 记录了! 关於动态 DNS 的应用,除了上述的环境之外,在 DHCP 分配的网路中设定 DNS 也可以应用得上。但前提条件是:您的 named 必须是 bind 9.x 或以後,以及 dhcpd 必须是 3.x 或以後的版本。然而,RedHat7.1 上面预装的 dhcpd 是 2.0p15-4 这个版本,您必须自行升级才能使用这个非常棒的功能。 下面,我将 dhcp 服务转移到 mandrake 8.1 (其预装的 dhcpd 版本是 3.0-0.rc12.1),然後保留 named 在 rh71 上面,再透过 ddns 技术更新和维护 dhcp 所发放的 DNS 资料。我初步整理出来的步骤如下:
老实说,我原本写这篇文章的时候并没有打算将 dhcp + dns 的动态更新写进来的,因为还没实作过。幸得在新闻组上得到 小州兄 的指点,才装了个 Mandrak8.1 ,并按 man page 的步骤设定起来的。我觉得在本机上更新,也就是 dhcpd 和 named 都在同一台机器上,会比较容易成功。如果跨网路进行的话,那您得要首先解决网路想过的问题,例如路由和防火墙这些设定。 Anyway,我不敢保证您能按照上面的步骤实作出来,总要自己多尝试尝试吧。如果您想更进一步了解 DNS 的动态更新,您可以研究一下 nsupdate 这个命令。它可以让您以交谈模式来更新 named 的记录设定。
除此之外,如果您还有兴趣研究动态 DNS 技术的话,不妨到网路上找找 IXFR 的技术,也可以参考如下这些 RFC:1034,1995,1996,2136,2535,2694。 不管您是否有打算注册自己的 domain 和管理自己的 DNS 主机,在您真正架设对外服务的 dns 伺服器之前,请先行在内部网路架设看看,直到您有信心之後才架设直接向 Internet 提供服务的 DNS 。而您需要练习的这些前置功夫中,其一就是 master 与 slave DNS 的设置。 假如您真的到网路上注册过 domain,他们通常需要您提供最少两台 NS 主机。为什麽呢?这是基 |