初次尝试 DNS 配置,对于拨号、有线调制解调器、ADSL 和类似用户非常有用。
在 Red Hat 和 Red Hat 相关发行版上,您可以通过安装 bind
、bind-utils
和 caching-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.
名为 key
和 controls
的部分一起指定您的 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 (xntpd
和 ntpdate
) 软件来做到这一点。
接下来,您需要一个看起来像这样的 /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
等等。显然,您需要放入真实的域名。请注意域名末尾缺少句点。这很重要;请注意域名末尾缺少句点。
完成所有这些之后,是时候启动 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. 早先的半秒多。答案被缓存了。使用缓存答案存在答案可能过期的可能性,但原始服务器可以控制缓存答案应被视为有效的时间,因此您获得的答案是有效的可能性很高。
所有实现标准 C API 的操作系统都有 gethostbyname 和 gethostbyaddr 调用。这些可以从几个不同的来源获取信息。它从哪些来源获取信息在 Linux(和一些其他 Unix 系统)上的 /etc/nsswitch.conf
中配置。这是一个很长的文件,指定了从哪个文件或数据库获取不同类型的数据。它通常在顶部包含有用的注释,您应该考虑阅读。之后找到以 `hosts:
' 开头的行;它应该读取
hosts: files dns
(您记得前导空格,对吗?我不会再提了。)
如果没有以 `hosts:
' 开头的行,则放入上面的那一行。它表示程序应首先在 /etc/hosts
文件中查找,然后根据 resolv.conf
检查 DNS。
现在您知道如何设置缓存 named 了。喝一杯啤酒、牛奶或任何您喜欢的饮料来庆祝一下。