下一步 上一步 目录

3. 一个解析和缓存域名服务器。

初次尝试 DNS 配置,对于拨号、有线调制解调器、ADSL 和类似用户非常有用。

在 Red Hat 和 Red Hat 相关发行版上,您可以通过安装 bindbind-utilscaching-nameserver 软件包来实现与本 HOWTO 第一节相同的实际效果。如果您使用 Debian,只需安装 bind(或 bind9,在撰写本文时,Debian Stable (potato) 不支持 BIND 9)和 bind-doc。当然,仅仅安装这些软件包并不能像阅读本 HOWTO 那样教您那么多。所以,安装这些软件包,然后边阅读边验证它们安装的文件。

一个仅缓存的域名服务器将找到名称查询的答案,并在您下次需要时记住答案。这将显着缩短下次的等待时间,特别是如果您使用慢速连接。

首先,您需要一个名为 /etc/named.conf 的文件(Debian:/etc/bind/named.conf)。这在 named 启动时读取。目前它应该只包含


// Config file for caching only name server
//
// The version of the HOWTO you read may contain leading spaces
// (spaces in front of the characters on these lines ) in this and
// other files.  You must remove them for things to work.
//
// Note that the filenames and directory names may differ, the
// ultimate contents of should be quite similar though.

options {
        directory "/var/named";

        // Uncommenting this might help if you have to go through a
        // firewall and things are not working out.  But you probably
        // need to talk to your firewall admin.

        // query-source port 53;
};

controls {
        inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
};

key "rndc_key" {
        algorithm hmac-md5;
        secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};

zone "." {
        type hint;
        file "root.hints";
};

zone "0.0.127.in-addr.arpa" {
        type master;
        file "pz/127.0.0";
};

Linux 发行版软件包可能会为此处提到的每种文件使用不同的文件名;它们仍然会包含大致相同的内容。

`directory' 行告诉 named 在哪里查找文件。随后命名的所有文件都将相对于此目录。因此 pz/var/named 下的一个目录,即 /var/named/pz。根据Linux 文件系统标准/var/named 是正确的目录。

名为 /var/named/root.hints 的文件在此处被命名。/var/named/root.hints 应该包含这个


;
; There might be opening comments here if you already have this file.
; If not don't worry.
;
; About any leading spaces in front of the lines here: remove them!
; Lines should start in a ;, . or character, not blanks.
;
.                       6D  IN      NS      A.ROOT-SERVERS.NET.
.                       6D  IN      NS      B.ROOT-SERVERS.NET.
.                       6D  IN      NS      C.ROOT-SERVERS.NET.
.                       6D  IN      NS      D.ROOT-SERVERS.NET.
.                       6D  IN      NS      E.ROOT-SERVERS.NET.
.                       6D  IN      NS      F.ROOT-SERVERS.NET.
.                       6D  IN      NS      G.ROOT-SERVERS.NET.
.                       6D  IN      NS      H.ROOT-SERVERS.NET.
.                       6D  IN      NS      I.ROOT-SERVERS.NET.
.                       6D  IN      NS      J.ROOT-SERVERS.NET.
.                       6D  IN      NS      K.ROOT-SERVERS.NET.
.                       6D  IN      NS      L.ROOT-SERVERS.NET.
.                       6D  IN      NS      M.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.     6D  IN      A       198.41.0.4
B.ROOT-SERVERS.NET.     6D  IN      A       128.9.0.107
C.ROOT-SERVERS.NET.     6D  IN      A       192.33.4.12
D.ROOT-SERVERS.NET.     6D  IN      A       128.8.10.90
E.ROOT-SERVERS.NET.     6D  IN      A       192.203.230.10
F.ROOT-SERVERS.NET.     6D  IN      A       192.5.5.241
G.ROOT-SERVERS.NET.     6D  IN      A       192.112.36.4
H.ROOT-SERVERS.NET.     6D  IN      A       128.63.2.53
I.ROOT-SERVERS.NET.     6D  IN      A       192.36.148.17
J.ROOT-SERVERS.NET.     6D  IN      A       198.41.0.10
K.ROOT-SERVERS.NET.     6D  IN      A       193.0.14.129
L.ROOT-SERVERS.NET.     6D  IN      A       198.32.64.12
M.ROOT-SERVERS.NET.     6D  IN      A       202.12.27.33

该文件描述了世界上的根域名服务器。这些服务器会随着时间的推移而变化,必须不时进行维护。请参阅维护部分,了解如何保持其最新状态。

named.conf 中的下一节是最后一个 zone。我将在后面的章节中解释它的用途;现在只需在子目录 pz 中创建一个名为 127.0.0 的文件:(同样,如果您复制粘贴此内容,请删除前导空格


$TTL 3D
@               IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
                                1       ; Serial
                                8H      ; Refresh
                                2H      ; Retry
                                4W      ; Expire
                                1D)     ; Minimum TTL
                        NS      ns.linux.bogus.
1                       PTR     localhost.

名为 keycontrols 的部分一起指定您的 named 可以被一个名为 rndc 的程序远程控制,如果它从本地主机连接,并使用编码的密钥标识自己。这个密钥就像密码。为了使 rndc 工作,您需要 /etc/rndc.conf 与此匹配


key rndc_key {
    algorithm "hmac-md5";
    secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};

options {
    default-server localhost;
    default-key    rndc_key;
};

正如您所见,密钥是相同的。如果您想从其他机器使用 rndc,它们的时钟需要彼此相差在 5 分钟之内。我建议使用 ntp (xntpdntpdate) 软件来做到这一点。

接下来,您需要一个看起来像这样的 /etc/resolv.conf:(再次:删除空格!


search subdomain.your-domain.edu your-domain.edu
nameserver 127.0.0.1

`search' 行指定应该搜索哪些域以查找您要连接的任何主机名。`nameserver' 行指定您的域名服务器的地址,在本例中是您自己的机器,因为那是您的 named 运行的地方(127.0.0.1 是正确的,无论您的机器是否有其他地址)。如果您想列出多个域名服务器,请为每个服务器添加一个 `nameserver' 行。(注意:Named 从不读取此文件,使用 named 的解析器会读取。注意 2:在某些 resolv.conf 文件中,您会找到一行写着 "domain"。这没关系,但不要同时使用 "search" 和 "domain",只有一个会起作用)。

为了说明此文件的作用:如果客户端尝试查找 foo,则首先尝试 foo.subdomain.your-domain.edu,然后是 foo.your-domain.edu,最后是 foo。您可能不想在搜索行中放入太多域,因为搜索所有域需要时间。

该示例假定您属于域 subdomain.your-domain.edu;那么,您的机器可能被称为 your-machine.subdomain.your-domain.edu。搜索行不应包含您的 TLD(顶级域名,在本例中为 `edu')。如果您经常需要连接到另一个域中的主机,您可以像这样将该域添加到搜索行:(记住删除前导空格,如果有的话


search subdomain.your-domain.edu your-domain.edu other-domain.com

等等。显然,您需要放入真实的域名。请注意域名末尾缺少句点。这很重要;请注意域名末尾缺少句点。

3.1 启动 named

完成所有这些之后,是时候启动 named 了。如果您使用拨号连接,请先连接。现在运行 named,可以通过运行引导脚本:/etc/init.d/named start 或直接运行 named:/usr/sbin/named。如果您尝试过以前版本的 BIND,您可能习惯了 ndc。在 BIND 9 中,它已被 rndc 取代,rndc 可以远程控制您的 named,但它不能再启动 named。如果您在启动 named 时查看您的系统日志消息文件(通常称为 /var/log/messages,Debian 称之为 /var/log/daemon,另一个要查找的目录是其他文件 /var/log)(执行 tail -f /var/log/messages),您应该看到类似这样的内容

(以 \ 结尾的行在下一行继续)

Dec 23 02:21:12 lookfar named[11031]: starting BIND 9.1.3
Dec 23 02:21:12 lookfar named[11031]: using 1 CPU
Dec 23 02:21:12 lookfar named[11034]: loading configuration from \
    '/etc/named.conf'
Dec 23 02:21:12 lookfar named[11034]: the default for the \
    'auth-nxdomain' option is now 'no'
Dec 23 02:21:12 lookfar named[11034]: no IPv6 interfaces found
Dec 23 02:21:12 lookfar named[11034]: listening on IPv4 interface lo, \
    127.0.0.1#53
Dec 23 02:21:12 lookfar named[11034]: listening on IPv4 interface eth0, \
    10.0.0.129#53
Dec 23 02:21:12 lookfar named[11034]: command channel listening on \
    127.0.0.1#953
Dec 23 02:21:13 lookfar named[11034]: running

如果出现任何关于错误的提示,则说明存在错误。Named 将命名它正在读取的文件。返回并检查文件。修复后重新启动 named。

现在您可以测试您的设置。传统上,一个名为 nslookup 的程序用于此目的。现在建议使用 dig

$ dig -x 127.0.0.1
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26669
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 259200  IN      PTR     localhost.

;; AUTHORITY SECTION:
0.0.127.in-addr.arpa.   259200  IN      NS      ns.linux.bogus.

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 23 02:26:17 2001
;; MSG SIZE  rcvd: 91

如果您得到的是这个,那就说明它工作正常。我们希望如此。如果非常不同,请返回并检查所有内容。每次更改文件时,您都需要运行 rndc reload

现在您可以输入查询。尝试查找您附近的一些机器。pat.uio.no 离我很近,在奥斯陆大学

$�dig pat.uio.no
; <<>> DiG 9.1.3 <<>> pat.uio.no
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15574
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0

;; QUESTION SECTION:
;pat.uio.no.                    IN      A

;; ANSWER SECTION:
pat.uio.no.             86400   IN      A       129.240.130.16

;; AUTHORITY SECTION:
uio.no.                 86400   IN      NS      nissen.uio.no.
uio.no.                 86400   IN      NS      nn.uninett.no.
uio.no.                 86400   IN      NS      ifi.uio.no.

;; Query time: 651 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 23 02:28:35 2001
;; MSG SIZE  rcvd: 108

这次 dig 要求您的 named 查找机器 pat.uio.no。然后它联系了您的 root.hints 文件中命名的域名服务器机器之一,并从那里开始询问。在您获得结果之前可能需要一段时间,因为它可能需要搜索您在 /etc/resolv.conf 中命名的所有域。

如果您再次询问相同的内容,您将得到这个

$ dig pat.uio.no

; <<>> DiG 8.2 <<>> pat.uio.no 
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
;; QUERY SECTION:
;;      pat.uio.no, type = A, class = IN

;; ANSWER SECTION:
pat.uio.no.             23h59m58s IN A  129.240.130.16

;; AUTHORITY SECTION:
UIO.NO.                 23h59m58s IN NS  nissen.UIO.NO.
UIO.NO.                 23h59m58s IN NS  ifi.UIO.NO.
UIO.NO.                 23h59m58s IN NS  nn.uninett.NO.

;; ADDITIONAL SECTION:
nissen.UIO.NO.          23h59m58s IN A  129.240.2.3
ifi.UIO.NO.             1d23h59m58s IN A  129.240.64.2
nn.uninett.NO.          1d23h59m58s IN A  158.38.0.181

;; Total query time: 4 msec
;; FROM: lookfar to SERVER: default -- 127.0.0.1
;; WHEN: Sat Dec 16 00:23:09 2000
;; MSG SIZE  sent: 28  rcvd: 162

正如您清楚地看到的那样,这次速度快得多,4 毫秒 vs. 早先的半秒多。答案被缓存了。使用缓存答案存在答案可能过期的可能性,但原始服务器可以控制缓存答案应被视为有效的时间,因此您获得的答案有效的可能性很高。

3.2 解析器

所有实现标准 C API 的操作系统都有 gethostbyname 和 gethostbyaddr 调用。这些可以从几个不同的来源获取信息。它从哪些来源获取信息在 Linux(和一些其他 Unix 系统)上的 /etc/nsswitch.conf 中配置。这是一个很长的文件,指定了从哪个文件或数据库获取不同类型的数据。它通常在顶部包含有用的注释,您应该考虑阅读。之后找到以 `hosts:' 开头的行;它应该读取


hosts:      files dns

您记得前导空格,对吗?我不会再提了。

如果没有以 `hosts:' 开头的行,则放入上面的那一行。它表示程序应首先在 /etc/hosts 文件中查找,然后根据 resolv.conf 检查 DNS。

3.3 恭喜

现在您知道如何设置缓存 named 了。喝一杯啤酒、牛奶或任何您喜欢的饮料来庆祝一下。


下一步 上一步 目录