第十三章 DNS 服务器

13.1 DNS 概论

DNS (Domain Name Service) 是网域名称服务的缩写,其主要目地是在解决机器的网域名称 (Domain name) 与 IP address 的对应问题。 在因特网上,为了要联机到其它计算机,必须经由 IP 地址来判断计算机所在位置,例如 140.115.83.240 就是一个 IP 地址。但是这一长串的 IP 并不好记,因此出现了 Domain Name 来为 IP 取一个比较好记的名字,如 bbs.mgt.ncu.edu.tw。 Domain Name 的架构是一个树状结构,例如上述的 bbs.mgt.ncu.edu.tw 所代表的就是台湾 (tw) 的中央大学 (ncu) 管理学院 (mgt) 所属的电子布告栏服务器 (bbs)。而 DNS 服务器的功用就是将你输入的 Domain Name 转成 IP,或者是将查询 IP 并转回所对映的 Domain Name。

一般而言, DNS 服务器可以分为三种,主要名称服务器 (Primary/master Server),次要名称服务器 (Secondary/slave Server),及快取名称服务器 (Cache only Server)。主要名称服务器是管理所属网域所需名称对映设定的主要服务器,如果您自己有一个网域,必须经由设定主要名称服务器来管理网域中 IP 所对映的名称。而次要名称服务器是取得主要名称服务器的数据,用以在主要服务器过于忙录或停止服务时备用。每个 DNS 服务器都会将所查询过的 Domain Name 建立快取 (cache),以供下次查询时能快速响应。每一个服务器都会设定该 Domain Name 快取的数据要保留多久,以免得到过时的数据。

DNS 有分为正解 (forward) 及反解 (reverse)。正解就是把 Domain Name 转成 IP,而反解是将 IP 转成 Domain Name。 FreeBSD 内建有 DNS 的服务,只要先设定 /etc/namedb/ 下的档案即可打开该服务。

那要如何得到一个 Domain Name 呢?以学校而言,每个学校都有自己的 Domain Name 及 IP 范围,如果你只有一台机器,想要为它申请一个 Domain Name,您并不需要自己架设 DNS。只要向学校计中或是管理该 IP 的单位提出申请正反解即可。如果您想为自己的系所架设 DNS 以管理该系的 IP,必须先向上层 DNS (也就是校方计中) 申请授权,让针对您系所的查询都交有你的 DNS 服务器处理。DNS 的架构是树状结构,以查询 bbs.mgt.ncu.edu.tw 而言,管理 tw 网域的服务器会告诉你管理 ncu.tw 的服务器在哪里,而 ncu.tw 会告诉你管理 mgt.ncu.edu.tw 的服务器在哪里,最后 mgt.ncu.edu.tw 发现自己有 bbs.mgt 的资料,并传回其 IP。

如果您自己要申请一个 Domain Name,你可以到 www.twnic.com.tw 去申请一个 .tw 的名称,如 abc.com.tw;或者到 YAHOO 或register.com 去申请各国的 Domain,如 abc.com。当您去 TWNIC 申请网域名称时,你必须要有自己的 DNS 服务器,并在 TWNIC 设定 DNS 服务器的地址,接着再由您的 DNS 服务器来做解析。如果您是在 www.register.com 申请网域名称,国外的代理申请者会帮你做 DNS 的服务,你只要在他们的网页设定你想要的名称及所对映的 IP 即可,而且不限个数,当然你也可以自行架设 DNS 服务器。
如果只一个固定 IP,您不需要架设 DNS,除非我们管理一个网域中多个 IP 才有必要。再者,如果您是固接式 ADSL 或是其它由 ISP 提供的联机方式,你的 DNS 反解必须要由上层 ISP 授权由您自行管理你的 IP ,这样你的设定才会生效,否则应该请 ISP 帮你作反解的设定,也就是告诉 ISP 你的 IP 要对映那一个 Domain Name。

对于 DNS 有初步概念之后,我们接着说明如何设定 FreeBSD 成为一台 DNS 服务器。我们以下列的数据做为设定的依据:

网域:abc.com
IP:123.44.55.224~123.44.55.231 (八个 IP)
Netmask:255.255.255.248

首先,到 /etc/namedb 的目录下:

# cd /etc/namedb
# sh ./make-localhost

这个指令将产生一个名为 localhost.rev 的档案,该档案是用来反解 localhost 的设定档。接着请编辑 named.conf 来定义我们要设定的数据。我们将在后面几个小节做更详细的介绍。

13.2 named.conf

我们先在原本 /etc/named.conf 文件的最下方加入下列设定,该档中行首以 // 开头者为批注:

// 设定要正解的网域是 abc.com,DNS 服务器是 master server
// 并到 abc.fwd 这一个档案中去找 abc.com 的设定。
zone "abc.com" {
    type master;
    file "abc.fwd";
};

// 下面是反解的数据,设定要反解的 IP 为 123.44.55.224 到 123.44.55.231
// 设定关于该 IP 范围反解的设定档为 abc.rev
zone "224-29.55.44.123.in-addr.arpa" {
    type master;
    file "abc.rev";
};

接下来就可以新增并编辑 abc.fwd 这个正解档及 abc.rev 反解檔。

如果你的 IP 的范围是整个 Class C,子网掩码 (Netmask) 为 255.255.255.0,或是其它经由切割过的 IP,关于上面反解数据 zone 那一行的设定会有点不同。

以 123.44.55.0 为例,假设我们具有完整 Class C ,也就是 123.44.55.*:

zone "55.44.123.in-addr.arpa"
NetMask:255.255.255.0

若是 Class C 分成2份,每一段有128个IP

zone "0-25.55.44.123.in-addr.arpa" ; 0-25 是第 1段
zone "128-25.55.44.123.in-addr.arpa" ;128-25 是第 2段
NetMask:255.255.255.128

若是 Class C 分成4份,每一段有64个IP

zone "0-26.55.44.123.in-addr.arpa" ; 0-26 是第 1段
zone "64-26.55.44.123.in-addr.arpa" ; 64-26 是第 2段
zone "128-26.55.44.123.in-addr.arpa" ;128-26 是第 3段
zone "192-26.55.44.123.in-addr.arpa" ;192-26 是第 4段
NetMask:255.255.255.192

13.3 正解档设定

我们可以复制 localhost.rev 来加以修改,以下是 abc.fwd 的内容,档案中 ";" 之后为批注:

$TTL	172800

@	IN	SOA	abc.com. root.abc.com.  (
				2004040301  ; Serial
				172800	; Refresh
				900	; Retry
				3600000	; Expire
				3600 )	; Minimum
	IN		NS		abc.com.
	IN		A		123.44.55.225
www	IN		A		123.44.55.226
ftp	IN		CNAME	www
mail	IN		A		123.44.55.227
mail	IN		MX		10 www.abc.com
	IN		MX		20 mail.def.net

接着我们针对档案中的每一行加以解释,您可以依自己的需要来增删数据,请不要直接使用这里的设定。为了说明的需要,有的设定有点重复,例如 mail.abc.com 我们设定了三个项目,在真实生活中,并不会有这种情形。

让我们先看到第一行 $TTL 的部份,$TTL 代表这设定的数据要存多久,其后所接的值是以秒数计算。我们这里的设定是 172800,表示二天。

正解档中的内容中除了第一行外,每一行的格式为 [name] [ttl] [class] [type] [data]。以下是每个字段的说明:

以下让我们针对每一行来做说明。首先请看到 @ IN SOA abc.com. root.abc.com. (…) 的部份,这个部份虽然跨过很多行,但实际上是一个设定项目,只是二个括号中间的设定可以被分为很多行以利阅读。这一行的设定是最基本的,也是最详尽的,在该行中,开头的 @ 代表网域名称 abc.com,IN 表示为 internet 的数据型态。SOA 后面接的是 abc.com,表示这台 abc.com 机器是 abc.com 网域中的主要名称服务器。而 root.abc.com 表示管理者的Email 是 root@abc.com。接下来让我们看一下括号中的设定所代表的意义:

接下来的 IN NS abc.com. 表示将 abc.com 这个网域的 DNS 服务器是 abc.com 这台机器。这一行中,省略了 name 及 ttl 的字段,直接指定了 class、type、及 data。

IN A 123.44.55.225 表示将 abc.com 这台机器的 IP 设为 123.44.55.225。前面省略了主机名称,表示设定的是 @ 的主机。A 代表的就是指定 address,就是将 abc.com 这台机器的 IP 地址设定为 123.44.55.225。

www IN A 123.44.55.226 表示将 www.abc.com 的 IP 设定为 123.44.55.226。你可以看到这里使用了字段 name class type data。
接着一行使用了 type CNAME,表示将 ftp.abc.com 这台机器设定为和 www.abc.com 同一个 IP。也就是这二个名字会对映到同一台机器。

另外,mail IN MX 10 www.abc.com及下一行 MX 的设定表示将 mail.abc.com 的信件交由 www.abc.com 或 mail.def.net 来处理,数字 10 及 20 表示优先级,数字小者优先。这里的设定是将给 mail.abc.com 的信件交给 www.abc.com 来处理,如果 www.abc.com 没有回应则交由 mail.def.net 来处理。

13.4 反解档设定

如果您要设定 DNS 反解,则需要再新增并编辑 abc.rev 的档案来设定,也就是设定某一个 Domain Name 要对应到哪个 IP:

$TTL	172800
@	IN	SOA	abc.com. root.abc.com.  (
				2001080301  ; Serial
				172800	; Refresh
				900	; Retry
				3600000	; Expire
				3600 )	; Minimum
		IN	NS	abc.com.
225      IN       PTR       abc.com.
226      IN       PTR       www.abc.com.
227      IN       PTR       mail.abc.com.
228      IN       PTR       UNKNOW.def.net.
226      IN       PTR       UNKNOW.abc.com.
227      IN       PTR       UNKNOW.abc.com.
228      IN       PTR       UNKNOW.def.net.

和正解档重复的地方此略过,我们来看 PTR 的部份。PTR 就是将 IP 指向 Domain Name,如 225 IN PTR abc.com. 就是将 123.44.55.225 指向 abc.com 这台机器。而接下来的 226 IN PTR www.abc.com. 表示将 123.44.55.225 指向 www.abc.com

13.5 最后的设定

当您修改好正解档和反解档之后,请先编辑 /etc/resolv.conf,在 nameserver 部份的第一行加入:

nameserver  127.0.0.1

接着我们就可以使用下列指令来启动 DNS 服务了:

# /usr/sbin/named

在执行完上述指令之后,您应该可以进行 DNS 查询了,但建议您先使用下列指令查看系统日志中是否有错误讯息。如果有错误讯息,您必须先手动排除。

# tail /var/log/messages

如果您不是第一次执行 named 就以 kill -1 来将它重跑。接着就可以用 nslookup 来试试看我们所做的设定。

# nslookup www.abc.com
# nslookup 123.44.55.225

如果你没有设定 /etc/resolv.conf 的话,上面的指令并不会以你的机器为预设 DNS 服务器,这时你可以使用下列指令来以 127.0.0.1 这台机器为服务器,查询 www.abc.com 的设定:

# nslookup www.abc.com 127.0.0.1

如果您要查询 MX、NS、SOA 等记录,也可以使用 nslookup 来查询,只要在查询先 set type 即可:

# nslookup
Default Server: localhost.abc.com
Address: 127.0.0.1
> set type=MX
> mail.abc.com
Server: localhost.abc.com
Address: 127.0.0.1
mail.abc.com preference = 10, mail exchanger = www.abc.com
abc.com nameserver = abc.com
www.abc.com internet address = 123.44.55.225
abc.com internet address = 123.44.55.225
> set type=NS
> abc.com
Server: localhost.abc.com
Address: 127.0.0.1

abc.com nameserver = abc.com
abc.com internet address = 123.44.55.225
> set type=SOA
> abc.com
Server: localhost.abc.com
Address: 127.0.0.1
abc.com
origin =abc.com
mail addr = root.abc.com
serial = 2002080301
refresh = 3600 (1H)
retry = 900 (15M)
expire = 3600000 (5w6d16h)
minimum ttl = 3600 (1H)
abc.com nameserver = abc.com
abc.com internet address = 123.44.55.2.225
> exit

当我们检查过所有设定都没有问题之后,如果要在开机时就启动 DNS 服务,请在 /etc/rc.conf 中加入:

named_enable="YES"