第五章:架设 DNS
前面所介绍的伺服器服务大多是用在内部网路环境中的,不过,以现代的情况和未来的趋势来看,每个网路或多或少都需要 Internet 连线以及向 Internet 提供服务。从这一章开始,我们将为大家陆续介绍一些在 Internet 环境中常用到的伺服器之架设技 巧。就算您目前还没真的需要架设 Internet 相关的伺服器,但许多企业的 Intranet 环境中,也需要相类似的伺服器来为企业内 部网路提供服务。
前提条件
在众多 Internet 伺服器当中,有一种服务是所有服务的基础,就是 DNS 服务。DNS 可以说是一个不容易弄清楚的概念,尤其 是其运作原理。如果您看过“学习网路”中的“ DNS 协定”(我强烈建议您看看这篇文章!),相信应该有一定概念了,否 则,您在如下的阅读中可能难以理解,也浪费您的时间。
无论如何,在您进一步阅读下面文章之前,请您先确定能正确回答如下的问题:
什麽是 DNS 的授权模式?是怎样进行的?
请解释 zone 和 domain 的差别。
什麽是 DNS 正解和反解?
什麽是 DNS 的查询模式?查询过程是怎样进行的?
请解释 DNS cache 的作用和它对查询流程的影响。
如果您未能从上面的联结网页找到答案,那我再推荐您多看一篇文章:
http://turtle.ee.ncku.edu.tw/~tung/dns/dnsintro.html
忠告:请不必急著知道怎样设定 DNS,花点时间将 DNS 的原理弄明白非常重要,尤其是授权模式和查询模式的正确理解。在 日後的 DNS 架设和管理中,是否能正确理解这些 DNS 原理,往往是成败的关键所在!
如果您在 NT 或 Win2K 下面设定过 DNS 伺服器,相信您会觉得在 Linux 下面难多了。除了概念上要比较清楚外,另外对档案 的关联也要有清晰的追踪能力,这对於进行 debug 尤为重要。因为在 Windows 系统上面,您的所有设定都透过图形界面进 行,方便是方便,但也因为这个图形界面,限制了您的设定灵活性,同时也阻隔了您对 DNS 系统的深入了解。当您完成了这 章的学习,而且成功在 Linux 架设出复杂的 DNS 环境之後,欢迎您再回到 Win2K 上尝试做同样的事情。或许,您就会认同我 这里的观点了...
好了,闲话休提、言归正传,听百遍不如做一遍,那就让我们开始动手吧! ^_^
探索 NAMED
在 Linux 上面,提供 DNS 服务的套件是叫 bind, 但执行服务程式名称则是 named 。请您确定系统上装有 bind、bind-utils、 以及 caching-nameserver 这几个套件,同时用 ntsysv 确定 named 被选择为开机服务。
首先,让我们设定一个最重要的 dns 设定档,它就是 /etc/named.conf 。我将我自己的设定档案列出来,然後逐部份进行解释:
// generated by named-bootconf.pl
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
先让我们了解这个档案上面用来做注解的符号是“ // ”,而不是一般 shell script 的“#”;另外,“ /* ”与“ */ ”之间则注 解一整段文字。同时,每一个完整的设定都以“ ;”结尾,请不要少了它!(初学者经常会犯这个错误)
上面的部份是在这个档案开头的 options 设定,首先用 directory 指定了 named 的资源记录( RR - Resource Record 
档案目录所 在位置为:“/var/named”;也就是说,它会到这个目录下面寻找 DNS 记录档案。所以,我们在这个档案後面部份所指定的档 案,就无需使用绝对路径了,但它们一定要放在这个目录下面。
接下来,有一段文字,如果您仔细阅读一下,它大致是说:如果您要设定的 DNS 伺服器和 client 之间是隔著火墙的话,要 将“// query-source address * port 53;”前面的注解符号“ // ”拿掉(当然,您也必须要设定好您的火墙啦)。不过,这只对早期 的版本有影响,而在 bind 8.1 之後则无需担心这个设定。
接下来再让我们看下一段句子:
//
// a caching only nameserver config
//
zone "." IN {
type hint;
file "named.ca";
};
透过这几行,我们为 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 後面,您应该还会看到如下这两段:
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};