原始文件:DNS HOWTO Nicolai Langfeldt janl@math.uio.no Version 1.1, 30 June 1996 文件叙述:名字服务器说明文件 文件编号:LRG.LDTP.HOWTO.004 翻译日期:1996/08/20 翻译维护:asdchen@ms1.hinet.net 简体中文版维护:dfbb, fangh@bepc3.ihep.ac.cn ------------------------------------------------------------------ 如何成为一个能有完整了解的小型 DNS 管理者。 关键字: DNS, bind, named, dialup, ppp, slip, Internet, domain, name, hosts, resolving 版权声明: (C)opyright 1995 Nicolai Langfeldt 。 没有修订版权者请勿修改, 可自由散布但必须保留版权讯息。作者希望能对无数次阅读这份文件的 草稿并提供许多有用建议的 Arnt Gulbrandsen 表达感谢。 (C)opyright 1995 Nicolai Langfeldt. Do not modify without amending copyright, distribute freely but retain copyright message. The author wishes to thank Arnt Gulbrandsen who read the drafts to this work countless times and provided many useful suggestions. 其它声明: 这份文件将永远不会有完成的一天,请把你的问题以及成功的经验寄给 我,这可以使它成为一份更好的说明文件。所以请把钱,评论以及/或 是问题寄给 janl@ifi.uio.no 。 谨以这份说明文件献给 Anne Line Norheim 。 虽然她可能永远都不会 阅读这份文件,因为她不是这类型的女孩。 1. 简介。 这是什麽以及这不是什麽。 DNS 是,对新手(你;-)而言,网路管理中比较晦暗不明的地方之一 。这份说明文件将会试著让几件事情能清楚一点。它描述如何设立一个 简单的 DNS 名字服务器。至於更复杂的设定你将得阅读真正的文件。 我将会在”最後一章”回过头来说明这里所谓真正的文件包含有哪些。 在你可以开始进行这项工作之前你应该要先配置好你的机器以便可以从 远程接入它以及由它对其它机器作远程接入,并且使所有各种对网路的 连线(all kinds of connections to the net) 都能成功地进行,尤其 你应该要能够对 127.0.0.1 进行远程接入并且进入你自己的这台机器 。同时你也需要一份良好的 /etc/host.conf, /etc/resolv.conf 以及 /etc/hosts 文件作为一个起始点。因为我将不会在这里解释它们的功 能。如果你还没有完成所有这些设定并使其运行那麽 the networking/ NET-2 HOWTO 会解释如何设立它们。阅读之。 如果你使用 SLIP 或者是 PPP 那麽你得要能让它运行。若是它还不能 运行的话阅读 PPP HOWTO 。 当我说‘你的机器’时我的意思是你正要尝试在上面设立 DNS 的那台 机器。不是任何可能在你网路环境里的其它机器。 我假设你并不是处於任何会阻碍名称查询的防火墙後面。如果你是那麽 你将会需要特别的配置,参见讨论”防火墙以及其它特异的网路物体” 该节。 在 Unix 上的名称服务是藉由一支称为 named 的程式来执行的。这是 属於 bind 套件的一部份,这个套件是由 Paul Vixie 为网际网路软体 集团(Internet Software Consortium)所协调发展的。大部分的 Linux 发行套件都包含有 named 而且通常安装於 /usr/sbin/named 。如果 你的系统有个 named 那麽你大概可以直接使用它;如果你的系统没有 的话那麽你可以从某个 Linux ftp 站取回一份二进位执行码,或是从 ftp.vix.com:/pub/bind 底下的 release 或者 testing 目录里取得 最新最棒的原始程式码,端视哪个种类的版本最能符合你的生活格调。 DNS 是个以整个网路为范围的(net-wide)资料库。要小心你放进里面的 资料。如果你放些废物进去,你,以及其它人都将会从中取出些废物。 保持你 DNS 的整齐一致那麽你将能从中取得良好的服务。学习去使用 它,管理它,侦查它的错误那麽你将会是另一个保持网路免於因为管理 不善而效率低落的好管理者。 在这份文件里我断然地叙述几件并不完全是真实的事情(然而它们至少 有一半是真的)。全都是为了简化。如果你相信我所说的那麽这些大概 就能运行。 要诀: 如果你已经拥有我指示你去改变的文件,那所有这些文件都要做 备份,如此一来如果经历这些过程之後没有东西能运行的话你可以回复 到你旧的,可以运行的情形。 2. 暂存专用(caching only)名字服务器。 DNS 配置的首种尝试,对拨接使用者非常有用。 一台暂存专用名字服务器将会为名称查询找出答案并且在下一次你需要 该名称的时候记得答案。 首先你需要一个称为 /etc/named.boot 的文件。当 named 启动时会 读取这个文件。目前它应该单纯地包含: ______________________________________________________________________ ; Boot file for nicolais caching name server ; directory /var/named ; ; type domain source file or host cache . root.cache primary 0.0.127.in-addr.arpa pz/127.0.0 ______________________________________________________________________ `directory' 这一行告诉 named 到哪里去找寻文件。所有其後命名的 文件都将是相对於此目录的。根据 Linux 文件系统标准 (Filesystem Standard) 这个 /var/named 是正确的目录所在。就个人而言,我使用 的是 /local/named 但这是我的任性。 称为 /var/named/root.cache 的这个文件是在此文件里命名的。这个 /var/named/root.cache 应该包含: ______________________________________________________________________ \&. 518400 NS D.ROOT-SERVERS.NET. \&. 518400 NS E.ROOT-SERVERS.NET. \&. 518400 NS I.ROOT-SERVERS.NET. \&. 518400 NS F.ROOT-SERVERS.NET. \&. 518400 NS G.ROOT-SERVERS.NET. \&. 518400 NS A.ROOT-SERVERS.NET. \&. 518400 NS H.ROOT-SERVERS.NET. \&. 518400 NS B.ROOT-SERVERS.NET. \&. 518400 NS C.ROOT-SERVERS.NET. ; D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90 E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10 I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17 F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241 G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4 A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53 B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107 C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12 ______________________________________________________________________ 这个文件描述了在这个世界上的根名字服务器。这会随时间而改变并且 必须加以维护。如何能保持它跟得上时代请参见”维护篇”。在 named 的线上使用手册里有这个文件的描述,但是这,IMHO,最适合那些 已经了解 named 的人们。 在 named.boot 里的下一行是 primary 这一行。我将会在稍後的章节 里解释它的用法,目前只要把它设为在 pz 子目录下一个称为 127.0.0 的文件即可: ______________________________________________________________________ @ IN SOA linux.bogus. hostmaster.linux.bogus. ( 1 ; Serial 28800 ; Refresh 7200 ; Retry 604800 ; Expire 86400) ; Minimum TTL NS ns.linux.bogus. 1 PTR localhost. ______________________________________________________________________ 接下来,你需要一份看起来像这样的 /etc/resolv.conf 文件: ______________________________________________________________________ search subdomain.your-domain.edu your-domain.edu nameserver 127.0.0.1 ______________________________________________________________________ `search' 这一行指出对於任何你想连往的主机名称应该搜寻的领域。 `nameserver' 这一行指出你的机器可以在哪个位址上找到一台名称伺 服器,在这个例子中是你自己的这台机器,因为你在它上面执行 named 。(注意: Named 从不读取这个文件,而是使用 named 的名称解答器 会读取。) 来简介这个文件有什麽作用: 如果某个客户端尝试要找寻 foo 的话, 那麽首先尝试的是 foo.subdomain.your-domain.edu 这个名称,然後 接下来是 foo.your-domain.edu 这个名称,最後则是 foo 这个名称 。如果有某个客户端尝试要找寻 sunsite.unc.edu 的话,那首先尝试 的是 sunsite.unc.edu.subdomain.your-domain.edu 这个名称,然後 接下来是 sunsite.unc.edu.your-domain.edu 这个名称,最後则会是 sunsite.unc.edu 这个名称。你可能不会想放太多领域到 search 该行 里去,搜寻它们会多花时间。 这个示例假设你属於 subdomain.your-domain.edu 这个领域,那麽你 的机器,可能会称为 your-machine.subdomain.your-domain.edu 。 在 search 这行里不应该包含你的 TLD (顶层领域 Top Level Domain 在这个例子中是 edu 这个领域)。如果你经常需要连线到在另外一个 领域里的主机你麽你可以把该领域像这样地加进 search 这行里: ______________________________________________________________________ search subdomain.your-domain.edu. your-domain.edu. other-domain.com. ______________________________________________________________________ 依此类推。很明显的是你得放入真实的领域名称来取代这些名称。 接下来,根据你 libc 版本的不同需要修正 /etc/nsswitch.conf 或者 是 /etc/host.conf 文件。 /etc/nsswitch.conf 这是个很长的文件,它指出到何处去取得各种不同的资料型态,从什麽 文件或是资料库取得。它的顶端经常会包含一些有帮助的注解。找出以 `hosts:' 作为开头的那一行,它应该是这样: ______________________________________________________________________ hosts: files dns ______________________________________________________________________ 如果文件里没有以 `hosts:' 作为开头的行那麽把上面这一行放进去。 它是说程式应该先在 /etc/hosts 文件里找寻,然後根据 resolv.conf 检查 DNS 。 /etc/hosts.conf 它可能包含有数行,其中应该有一行以 order 作为开始而且它看起来 会像这样: ______________________________________________________________________ order hosts,bind ______________________________________________________________________ 如果文件里没有 `order' 这一行的话那麽你应该贴一份上去。它告诉 主机名称解析函式先在 /etc/hosts 里找寻,然後查问名字服务器(在 resolv.conf 里你说在 127.0.0.1 这个地方)在大部分 Linux 发行 套件中最後这两个文件的文件在 resolv(8) 的线上使用手册中(执行 `man 8 resolv' 即可)。这份线上用手册IMHO可看,而每个人, 特别是 DNS 管理者,都应该要阅读它。现在就做,如果你对你自己说 ”我稍後将会去做”你将永远不会去接近它。 起始 named 。 这些全部完成後现在是起始 named 的时候了。如果你使用拨接连线的 话那麽请先连上网路。键入 `ndc start' 并且按下 return 键,没有 选项。如果它倒弹(back-fires)那麽试著使用 `/usr/sbin/ndc start' 来取代。现在你可以测试你的设定。当你在起始 named 的时候如果你 有观察一下(使用 tail -f /var/adm/messages 指令)系统记录讯息 文件(通常是称为 /var/adm/messages 的文件)那麽你应该会看见像 样的一些东西: Jun 30 21:50:55 roke named[2258]: starting. named 4.9.4-REL Sun Jun 30 21:29:0 3 MET DST 1996 janl@roke.slip.ifi.uio.no:/var/tmp/bind/named Jun 30 21:50:55 roke named[2258]: cache zone "" loaded (serial 0) Jun 30 21:50:55 roke named[2258]: primary zone "0.0.127.in-addr.arpa" loaded (s erial 1) 如果有任何关於错误的讯息那麽就是有个错误发生,named 将会指名有 错误的文件(我想是 named.boot 以及 root.cache 其中之一:)杀掉 named 程序并回头检查 named 的文件。 $ nslookup Default Server: localhost Address: 127.0.0.1 > 如果这是你所得到的回应那麽它已经能够运行。我们希望是这样。得到 任何其它回应都请回头检查每一件事。每一次你改变 named.boot 文件 之後你都得使用 ndc restart 这个指令重新起始 named 程式。 现在你可以输入查询。尝试找寻某些靠近你的机器。pat.uio.no 离我 不远,在奥斯陆的大学里: > pat.uio.no Server: localhost Address: 127.0.0.1 Name: pat.uio.no Address: 129.240.2.50 现在 nslookup 要求你的 named 找寻 pat.uio.no 这台机器。然後它 (named) 联系在你 root.cache 文件里所指名的名称伺服机器其中一台 ,并且从那里查问它该如何继续的路径。在你取得结果之前可能得花费 一点时间,因为它搜寻你在 /etc/resolv.conf 里指名的所有领域。 如果你再试一次的话那麽你将会得到: > pat.uio.no Server: localhost Address: 127.0.0.1 Non-authoritative answer: Name: pat.uio.no Address: 129.240.2.50 注意我们在这回合所得到的 `Non-authoritative answer:' 这一行。 这代表 named 此次并未到网路外去查问,取而代之的是在它的暂存区 里找寻并且在那里发现答案。但是暂存的资讯可能会过时。所以它藉由 `Non-authorative answer:' 来知会你有这个(很轻微的)危险性存在 。当 nslookup 说这是你第二次查问某台主机时,这是 named 能暂存 该项资讯并且正常运行的一个讯号。你可以藉由使用 `exit' 指令离开 nslookup 程式。 如果你是个拨接(ppp, slip) 使用者请阅读”拨接连线专节”,里面有 一些给你的建议。 现在你知道如何设立一个能够暂存的 named 系统。来杯啤酒,牛奶, 或是任何你喜欢的东西来庆祝吧。 3. 一个简单的领域。 如何设立你自己的领域。 在我们真的开始进行这一节以前我将会提供你一些关於 DNS 如何运行 的理论。而你即将阅读它因为这对你有益。如果你不‘想要’那麽至少 你也得很快地略读一下。当你看到应该放进你 named.boot 文件里去的 内容时再停止这种略读方式。 DNS 是一个阶层式的系统。其顶端写作 `.' 而其发音为 `root' 。在 . 之下有几个顶层领域(TLDs),最知名的是 ORG, CPM, EDU 以及 NET 这几个,但是还有更多。当你想要找出 prep.ai.mit.edu 的位址时你 的名字服务器必须找到服务 edu 的一台名字服务器。这个问题它会去 查问 root.cache 文件,而 . 服务器会给它一份 edu 服务器列表。 我将会在这里对此加以介绍: $ nslookup Default Server: localhost Address: 127.0.0.1 开始查问某台根服务器。 > server c.root-servers.net. Default Server: c.root-servers.net Address: 192.33.4.12 设定查询型态为 NS (名字服务器记录 name server records)。 > set q=ns 查问关於 edu. 的资料。 > edu. 结尾的 . 在这里非常重要,它告诉该服务器我们所查问的 edu 是在 . 之下的那一个,这稍能缩小搜寻的□围。 edu nameserver = A.ROOT-SERVERS.NET edu nameserver = H.ROOT-SERVERS.NET edu nameserver = B.ROOT-SERVERS.NET edu nameserver = C.ROOT-SERVERS.NET edu nameserver = D.ROOT-SERVERS.NET edu nameserver = E.ROOT-SERVERS.NET edu nameserver = I.ROOT-SERVERS.NET edu nameserver = F.ROOT-SERVERS.NET edu nameserver = G.ROOT-SERVERS.NET A.ROOT-SERVERS.NET internet address = 198.41.0.4 H.ROOT-SERVERS.NET internet address = 128.63.2.53 B.ROOT-SERVERS.NET internet address = 128.9.0.107 C.ROOT-SERVERS.NET internet address = 192.33.4.12 D.ROOT-SERVERS.NET internet address = 128.8.10.90 E.ROOT-SERVERS.NET internet address = 192.203.230.10 I.ROOT-SERVERS.NET internet address = 192.36.148.17 F.ROOT-SERVERS.NET internet address = 192.5.5.241 G.ROOT-SERVERS.NET internet address = 192.112.36.4 这告诉我们 *.root-servers.net 服务 edu. 领域,所以我们可以藉此 继续查问 c. 服务器。现在我们想要知道是谁服务下一层的领域名称: mit.edu.: > mit.edu. Server: c.root-servers.net Address: 192.33.4.12 Non-authoritative answer: mit.edu nameserver = STRAWB.mit.edu mit.edu nameserver = W20NS.mit.edu mit.edu nameserver = BITSY.mit.edu Authoritative answers can be found from: STRAWB.mit.edu internet address = 18.71.0.151 W20NS.mit.edu internet address = 18.70.0.160 BITSY.mit.edu internet address = 18.72.0.3 steawb, w20ns 以及 bitsy 服务 mit 领域,选择其中一个并且调查 ai.mit.edu: > server W20NS.mit.edu. 主机名称不分大小写,但是我使用我的滑鼠来剪贴所以这些资料是萤幕 的拷贝。 Server: W20NS.mit.edu Address: 18.70.0.160 > ai.mit.edu. Server: W20NS.mit.edu Address: 18.70.0.160 Non-authoritative answer: ai.mit.edu nameserver = WHEATIES.AI.MIT.EDU ai.mit.edu nameserver = ALPHA-BITS.AI.MIT.EDU ai.mit.edu nameserver = GRAPE-NUTS.AI.MIT.EDU ai.mit.edu nameserver = TRIX.AI.MIT.EDU ai.mit.edu nameserver = MUESLI.AI.MIT.EDU Authoritative answers can be found from: AI.MIT.EDU nameserver = WHEATIES.AI.MIT.EDU AI.MIT.EDU nameserver = ALPHA-BITS.AI.MIT.EDU AI.MIT.EDU nameserver = GRAPE-NUTS.AI.MIT.EDU AI.MIT.EDU nameserver = TRIX.AI.MIT.EDU AI.MIT.EDU nameserver = MUESLI.AI.MIT.EDU WHEATIES.AI.MIT.EDU internet address = 128.52.32.13 WHEATIES.AI.MIT.EDU internet address = 128.52.35.13 ALPHA-BITS.AI.MIT.EDU internet address = 128.52.32.5 ALPHA-BITS.AI.MIT.EDU internet address = 128.52.37.5 GRAPE-NUTS.AI.MIT.EDU internet address = 128.52.32.4 GRAPE-NUTS.AI.MIT.EDU internet address = 128.52.36.4 TRIX.AI.MIT.EDU internet address = 128.52.32.6 TRIX.AI.MIT.EDU internet address = 128.52.38.6 MUESLI.AI.MIT.EDU internet address = 128.52.32.7 MUESLI.AI.MIT.EDU internet address = 128.52.39.7 所以 weaties.ai.mit.edu 是 ai.mit.edu 的一台名字服务器: > server WHEATIES.AI.MIT.EDU. Default Server: WHEATIES.AI.MIT.EDU Addresses: 128.52.32.13, 128.52.35.13 现在我改变查询的型态,我们已经找到该名字服务器所以现在我们将要 查问 wheaties 关於 prep.ai.mit.edu 它所知道的任何事情。 > set q=any > prep.ai.mit.edu. Server: WHEATIES.AI.MIT.EDU Addresses: 128.52.32.13, 128.52.35.13 prep.ai.mit.edu CPU = dec/decstation-5000.25 OS = unix prep.ai.mit.edu inet address = 18.159.0.42, protocol = tcp #21 #23 #25 #79 prep.ai.mit.edu preference = 1, mail exchanger = life.ai.mit.edu prep.ai.mit.edu internet address = 18.159.0.42 ai.mit.edu nameserver = alpha-bits.ai.mit.edu ai.mit.edu nameserver = wheaties.ai.mit.edu ai.mit.edu nameserver = grape-nuts.ai.mit.edu ai.mit.edu nameserver = mini-wheats.ai.mit.edu ai.mit.edu nameserver = trix.ai.mit.edu ai.mit.edu nameserver = muesli.ai.mit.edu ai.mit.edu nameserver = count-chocula.ai.mit.edu ai.mit.edu nameserver = life.ai.mit.edu ai.mit.edu nameserver = mintaka.lcs.mit.edu life.ai.mit.edu internet address = 128.52.32.80 alpha-bits.ai.mit.edu internet address = 128.52.32.5 wheaties.ai.mit.edu internet address = 128.52.35.13 wheaties.ai.mit.edu internet address = 128.52.32.13 grape-nuts.ai.mit.edu internet address = 128.52.36.4 grape-nuts.ai.mit.edu internet address = 128.52.32.4 mini-wheats.ai.mit.edu internet address = 128.52.32.11 mini-wheats.ai.mit.edu internet address = 128.52.54.11 mintaka.lcs.mit.edu internet address = 18.26.0.36 所以我们从 . 开始连续找出在领域名称里的下一层名字服务器。如果 你使用你自己的 DNS 服务器取代使用所有这些个其它的服务器,你的 named 当然会暂存所有这些在为你寻找这个答案时所找到的资讯,而且 在一段时间内它不必再次查问。 一个比较起来很少被论及,但是同样重要的是 in-addr.arpa 领域。它 也像‘正常的’领域一样是巢状的。in-addr.arpa 让我们可以在拥有 主机位址的时候得知该主机的名称。在这里有件重要的事情是要注意在 in-addr.arpa 这个领域中 ip#s 是以反向顺序书写的。如果你有某台 机器的位址: 192.128.52.43 那麽 named 会以像是 prep.ai.mit.edu 这个示例的方式来处理: 找出 in-addr.arpa. 的服务器,然後再找出 192.in-addr.arpa. 的服务器,找出 128.192.in-addr.arpa 的服务器 ,接著找出 52.128.192.in-addr.arpa. 的服务器,最後再找出所需之 43.52.128.192.in-addr.arpa. 的记录。聪明乎?(说‘是的’)。头 两年这反向的数字也引起过一些困扰。 我刚刚说了一个谎。DNS 并非完完全全地像我告诉你的这样运行。但是 这已经够接近的了。 我们自己的领域。 现在来定义我们自己的领域。我们将会创造出 linux.bogus 这个领域 并且定义其中的机器。我使用一个完全是虚拟出来的领域名称以便确定 我们不会扰乱到网路上的其它地方。 我们早就已经以 named.boot 里的这一行开始了这个部份的设定: ______________________________________________________________________ primary 0.0.127.in-addr.arpa pz/127.0.0 ______________________________________________________________________ 请注意在这个文件里的领域名称结尾并没有加上 `.' 符号。第一行把 定义 0.0.127.in-addr.arpa 的文件命名为 pz/127.0.0 。我们早已经 设立了这个文件,它是这样的: ______________________________________________________________________ @ IN SOA linux.bogus. hostmaster.linux.bogus. ( 1 ; Serial 28800 ; Refresh 7200 ; Retry 604800 ; Expire 86400) ; Minimum TTL NS ns.linux.bogus. 1 PTR localhost. ______________________________________________________________________ 请注意在这个文件里所有的完整领域名称结尾的 `.' 符号,这与上面 提到的 named.boot 文件形成对比。有些人喜欢以 $ORIGIN 指令启始 每个区域文件,但这是不必要的。一个区域文件的基点(就是其所属的 DNS 阶层架构位置)是在 named.boot 文件的‘领域’行里指定的,在 这个例子里是 0.0.127.in-addr.arpa 。 这个‘区域’文件中包含三种‘资源记录’(resource records: RRs): 一个是 SOA 资源记录。一个是 NS 资源记录以及一个 PTR 记录。SOA 是授权起始(Start Of Authority)的缩写。`@' 是个意思为基点的特殊 标记,而因为这个文件的‘领域’行说是 0.0.127.in-addr.arps 所以 第一行实际上是说 0.0.127.IN-ADDR.ARPA. IN SOA ... NS 是名字服务器资源记录,它告诉 DNS 什麽机器是这个领域的名称 服务器。而最後的 PTR 记录说 1(等於是 1.0.0.127.IN-ADDR.ARPA, ie. 127.0.0.1 )的名称是 localhosts 。 SOA 这个记录是所有区域文件的序文,而且在每一个区域文件里都应该 有唯一的一个,最开头的记录。它描述该区域,它从何而来(一台称为 linux.bogus 的机器),谁负责其内容(hostmaster@linux.bogus),这 个区域文件是什麽版本(serial: 1) ,以及其它必须做的,有关暂存与 次要 DNS 服务器的事。剩下的栏位如 refresh, retry, expire 以及 minimum 可以使用这份说明文件里所用的数字而且你应该不会出问题。 NS 这个记录告诉我们谁为 0.0.127.in-addr.arpa 提供 DNS 服务, 是 ns.linux.bogus 这台机器。PTR 这个记录告诉我们 1.0.0.127.in- addr.arpa (aka 127.0.0.1) 也称为 localhost 。 现在重新起始你的 named(使用 ndc restart 指令)并使用 nslookup 来检验我们做了什麽: $ nslookup Default Server: localhost Address: 127.0.0.1 > 127.0.0.1 Server: localhost Address: 127.0.0.1 Name: localhost Address: 127.0.0.1 所以它管理从 127.0.0.1 得到 localhost 的过程,很好。不要急。 现在开始我们的主要任务,linux.bogus 这个领域,在 named.boot 里 插入新的一行 primary 指令: ______________________________________________________________________ primary linux.bogus pz/linux.bogus ______________________________________________________________________ 注意,在 named.boot 文件里领域名称的结尾还是没有 '.' 符号。 在这个 linux.bogus 区域文件里我们将会放入一些完全虚拟的资料: ______________________________________________________________________ ; ; Zone file for linux.bogus ; ; Mandatory minimum for a working domain ; @ IN SOA linux.bogus. hostmaster.linux.bogus. ( 199511301 ; serial, todays date + todays serial # 28800 ; refresh, seconds 7200 ; retry, seconds 3600000 ; expire, seconds 86400 ) ; minimum, seconds NS ns.linux.bogus. NS ns.friend.bogus. MX 10 mail.linux.bogus ; Primary Mail Exchanger MX 20 mail.friend.bogus. ; Secondary Mail Exchanger localhost A 127.0.0.1 ns A 127.0.0.2 mail A 127.0.0.4 ______________________________________________________________________ 在这个文件里有一种新的资源记录型态,即 MX 型态,或是邮件交换者 资源记录(Mail eXchanger RR) 。这种资源记录型态告诉邮递系统地址 someone@linux.bogus 的邮件要寄送到哪里,换句话说也就是应该寄送 到 mail.linux.bogus 或是 mail.friend.bogus。在每个机器名称前面 的数字是 MX 资源记录的优先权,数字比较低 (10) 的资源记录是邮件 主要应该寄往的机器。如果失败可以把它寄往数字比较高的机器,一台 次要的邮件处理者,如在这里具有优先权 20 的 mail.friend.bogus。 藉由执行 ndc restart 重新起始 named 。以 nslookup 检验结果: $ nslookup > set q=any > linux.bogus Server: localhost Address: 127.0.0.1 linux.bogus origin = linux.bogus mail addr = hostmaster.linux.bogus serial = 199511301 refresh = 28800 (8 hours) retry = 7200 (2 hours) expire = 604800 (7 days) minimum ttl = 86400 (1 day) linux.bogus nameserver = ns.linux.bogus linux.bogus nameserver = ns.friend.bogus linux.bogus preference = 10, mail exchanger = mail.linux.bogus.linux.bogus linux.bogus preference = 20, mail exchanger = mail.friend.bogus linux.bogus nameserver = ns.linux.bogus linux.bogus nameserver = ns.friend.bogus ns.linux.bogus internet address = 127.0.0.2 mail.linux.bogus internet address = 127.0.0.4 由小心地检验你将会发现一个错误。这一行 linux.bogus preference = 10, mail exchanger = mail.linux.bogus.linux.bogus 全都错了。它应该是 linux.bogus preference = 10, mail exchanger = mail.linux.bogus 我故意犯了个错误所以你可以藉此学习:-)仔细看看该区域文件我们 会发现这一行 @ MX 10 mail.linux.bogus ; Primary Mail Exchanger 遗漏了一个句点。或是说多了个 `linux.bogus' 。在区域文件里如果 一个机器名称不是以句点结尾那麽会在其结尾加入基点。所以不论是 ______________________________________________________________________ @ MX 10 mail.linux.bogus. ; Primary Mail Exchanger ______________________________________________________________________ 或者是 ______________________________________________________________________ @ MX 10 mail ; Primary Mail Exchanger ______________________________________________________________________ 都是正确的。我比较喜欢後面这种形式,它需要的打字比较少。在一个 区域文件里领域名称应该要不就是写出来并以 `.' 结尾或者就是一点 都不要包含进去,而在这种情况下其领域预设为基点。我必须强调的是 在 named.boot 文件里领域名称後面不应该有 `.' 的存在。你不知道 有多少次因为多了或少了一个 `.' 而砸锅并且对许多人造成困扰。 所以在加入我强调的重点後这里是一份新的区域文件,其中还包含一些 额外的资讯: ______________________________________________________________________ ; ; Zone file for linux.bogus ; ; Mandatory minimum for a working domain ; @ IN SOA linux.bogus. hostmaster.linux.bogus. ( 199511301 ; serial, todays date + todays serial # 28800 ; refresh, seconds 7200 ; retry, seconds 604800 ; expire, seconds 86400 ) ; minimum, seconds NS ns ; Inet Address of name server NS ns.friend.bogus. MX 10 mail ; Primary Mail Exchanger MX 20 mail.friend.bogus. ; Secondary Mail Exchanger localhost A 127.0.0.1 ns A 127.0.0.2 mail A 127.0.0.4 ; ; Extras ; @ TXT "Linux.Bogus, your DNS consultants" ns MX 10 mail MX 20 mail.friend.bogus. HINFO "Pentium" "Linux 1.2" TXT "RMS" richard CNAME ns www CNAME ns donald A 127.0.0.3 MX 10 mail MX 20 mail.friend.bogus. HINFO "i486" "Linux 1.2" TXT "DEK" mail MX 10 mail MX 20 mail.friend.bogus. HINFO "386sx" "Linux 1.0.9" ftp A 127.0.0.5 MX 10 mail MX 20 mail.friend.bogus. HINFO "P6" "Linux 1.3.59" ______________________________________________________________________ 你也许会想要移动前面三个 A 记录以便让它们邻近於它们其它的相关 记录,而不是像这样放在最前端。 这里有几个新的资源记录: 主机资讯(HINFO: Host INFOrmation) 包括 两个部份,使用引号涵括每个部份是个好习惯。第一个部份是机器上的 硬体或是中央处理单元,而第二个部份是机器上的软体或是作业系统。 ns 有一颗 Pentium CPU 并且执行 Linux 1.2 系统。TXT 记录是个 自由的文字记录,你可以用它来做任何你想做的事。正式名称(CNAME: Canonical NAME) 可以用来给每台机器数个名称。所以 richard 以及 www 都是 ns 的一个别名。很重要的一点是 A, MX, CNAME, 以及 SOA 记录永远不该参照 CNAME 记录设定的别名,它们只应该参照 A 记录 所设定的名称,所以这样的记录是错的 ______________________________________________________________________ foobar CNAME richard ; NO! ______________________________________________________________________ 但是这样是对的 ______________________________________________________________________ foobar CNAME ns ; Yes! ______________________________________________________________________ 还有一点也很重要的是注意正式名称所设定的对电子邮递位址而言不是 合法主机名称: webmaster@www.linux.bogus 以上面的设定而言是一个 不合法的电子邮递位址。即使它在你的系统上可以运行,可以预料的是 很少有电子邮件管理者会去实行这项规则。避免这个问题的方法是使用 A 记录(或者也可能是一些其它的,像是 MX 记录)来取代之: ______________________________________________________________________ www A 127.0.0.2 ______________________________________________________________________ Paul Vixie, 主要的 named 专家,建议不要使用正式名称这个设定。 所以应该考虑不要很认真地去使用它。 藉由执行 ndc reload 载入新的资料库,这会使 named 再一次读取其 文件。 $ nslookup Default Server: localhost Address: 127.0.0.1 > ls -d linux.bogus 这意指应该列出所有的记录。 [localhost] linux.bogus. SOA linux.bogus hostmaster.linux.bogus. (1995 11301 28800 7200 604800 86400) linux.bogus. NS ns.linux.bogus linux.bogus. NS ns.friend.bogus linux.bogus. MX 10 mail.linux.bogus linux.bogus. MX 20 mail.friend.bogus linux.bogus. TXT "Linux.Bogus, your DNS consultants" localhost A 127.0.0.1 mail A 127.0.0.4 mail MX 10 mail.linux.bogus mail MX 20 mail.friend.bogus mail HINFO 386sx Linux 1.0.9 donald A 127.0.0.3 donald MX 10 mail.linux.bogus donald MX 20 mail.friend.bogus donald HINFO i486 Linux 1.2 donald TXT "DEK" www CNAME ns.linux.bogus richard CNAME ns.linux.bogus ftp A 127.0.0.5 ftp MX 10 mail.linux.bogus ftp MX 20 mail.friend.bogus ftp HINFO P6 Linux 1.3.59 ns A 127.0.0.2 ns MX 10 mail.linux.bogus ns MX 20 mail.friend.bogus ns HINFO Pentium Linux 1.2 ns TXT "RMS" linux.bogus. SOA linux.bogus hostmaster.linux.bogus. (1995 11301 28800 7200 604800 86400) 很好。让我们检查它对於单独的 www 会说什麽: > set q=any > www.linux.bogus. Server: localhost Address: 127.0.0.1 www.linux.bogus canonical name = ns.linux.bogus ns.linux.bogus linux.bogus nameserver = ns.linux.bogus linux.bogus nameserver = ns.friend.bogus ns.linux.bogus internet address = 127.0.0.2 而 ns.linux.bogus 拥有 127.0.0.2 这个位址。看起来也很好。 继续深入 当然,这个领域是高度虚拟的,里面所有的位址也都是。真正的领域要 在其中插入真正的领域名称和位址以及所有其它的资讯。这些工作完成 时你需要一个反向找寻用的区域文件,它应该会是像 127.0.0 这样的 文件并且为每个其中所使的位址包含唯一的一个 PTR 资源记录,像是 127.0.0.2 PTR ns.linux.bogus. 127.0.0.3 PTR donald.linux.bogus. 127.0.0.4 PTR mail.linux.bogus. 127.0.0.5 PTR ftp.linux.bogus. 对於作为我们示例的领域(当然是附加於 SOA 资源记录的)。该文件 的领域名称(基点)应该要是反向的,这个情况正如同 127.0.0 之於 0.0.127.in-addr.arpa 一样。 现在是你开始操作并设立你的领域的时候了。当你玩够了 linux.bogus 领域的操作後从你的 named.boot 文件里把它移除。 4. 防火墙以及其它特异的网路物体 问: 如何从防火墙里面使用 DNS 呢? 答: 有几个提示: `forwarders' `slave', 并详阅在这份说明文见後面所列举的文献。 问: 我该如何使 DNS 能够为某种服务轮回切换可以使用的位址,例如 回应 www.busy.site 这个名称不同的位址以便能取得平衡负载的功效 ,或者类似的功用? 答: 为 www.busy.site 设定几个 A 记录,如此 bind 4.9.3 或更晚的版本将会每次更替答案。这在较早的 bind 版本 是无法运行的。 5. 维护 维持它的运行。 维持它们的继续执行之外,对於 named 你还有个维护的任务得要做。 那就是维持 root.cache 文件的更新。最简单的方法是使用 dig 程式 ,首先不加任何参数执行 dig 程式,你将会取得根据你自己服务器的 root.cache 。然後以 dig @rootserver 查问所列出的根服务器其中 之一。你将会注意到这份输出看起来非常地像一个 root.cache 文件, 除了一堆额外的数字以外。这些数字不会有什麽妨碍。把它存放到文件 里(dig .@e.root-server.net > root.cache.new)并且用它来取代原本 旧的 root.cache 文件。 取代了原先的 cache 文件之後要记得重新启动 named 程式。 Al Longyear 寄给我这个指令稿,它可以自动执行来更新 named.cache 为它安装个 crontab 项目然後忘了它。这个指令稿假设你的电子邮件 可以运行而且 `hostmaster' 这个邮件别名有定义。你应该修订它以便 符合你的设定。 ______________________________________________________________________ #!/bin/sh # # Update the nameserver cache information file once per month. # This is run automatically by a cron entry. # ( echo "To: hostmaster " echo "From: system " echo "Subject: Automatic update of the named.boot file" echo export PATH=/sbin:/usr/sbin:/bin:/usr/bin: cd /var/named dig . @rs.internic.net >named.cache.new echo "The named.boot file has been updated to contain the following information:" echo cat named.boot.new chown root.root named.cache.new chmod 444 named.cache.new rm -f named.cache.old mv named.cache named.cache.old mv named.cache.new named.cache ndc restart echo echo "The nameserver has been restarted to ensure that the update is complete. " echo "The previous named.cache file is now called /var/named/named.cache.old." ) 2>&1 | /usr/lib/sendmail -t exit 0 ______________________________________________________________________ 6. 拨接连线的自动设定 这一节解释我如何设定以便自动化每个过程。我的方法可能一点都不适 合你,但是你可能从我所作的一些事情里得到一些点子。同时,我使用 ppp 拨接,然而有许多人使用 slip 或是 cslip 连线方式,所以你的 设定里几乎某个地方都可能跟我的不同。但是 slip 使用的 dip 程式 应该能够完成我所作的许多事情。 一般来说,当我没有连上网路时我的 resolv.conf 文件单纯地包含这 一行 domain uio.no 这确保我不必等待主机名称解析函式库去尝试联系某台不可能帮助我的 名字服务器。但是当我连上线的时候我想要起始我的 named 并且拥有 一个看起来像前面所描述的 resolv.conf 文件。我藉由保持两份名为 resolv.conf.local 以及 resolv.conf.connected 的文件以便作为该 resolv.conf 的‘样板’文件来解决这个问题。後面这一个看起来像在 这份文件前面所描述过的 resolv.conf 文件。 要自动化连线到网路的过程我执行一个称为 `ppp-on' 的指令稿: ______________________________________________________________________ #!/bin/sh echo calling... pppd ______________________________________________________________________ pppd 有个称为 options 的文件,这告诉它关於如何取得连线的一些 特殊事项。一旦我的 ppp 连线完成後 pppd 起始一个称为 ip-up 的 指令(这在 pppd 的线上使用手册里有描述)。这里是该指令稿里面的 一部份: ______________________________________________________________________ #!/bin/sh interface="$1" device="$2" speed="$3" myip="$4" upip="$5" cp -v /etc/resolv.conf.connected /etc/resolv.conf /usr/sbin/named ______________________________________________________________________ I.e. 我在这里起始我的 named 程式。当 ppp 离线时 pppd 执行一 个称为 ip-down 的指令稿: ______________________________________________________________________ #!/bin/sh cp /etc/resolv.conf.local /etc/resolv.conf read namedpid >/etc/hosts ______________________________________________________________________ hosts.ppp simply contains ______________________________________________________________________ 127.0.0.1 localhost ______________________________________________________________________ and the echo thing inserts the ip# i have received for my host name (roke). You should use the name your host knows itself by instead. This can be found with the hostname command. 当你没有连线到网路上时执行 named 可能并不聪明,这是因为 named 将会尝试送出查询到网路上而且其终止时限(timeout) 很长,而每次有 某些个程式尝试解析一个名称的时候你就得等待到这个终止时限。如果 你使用拨接的话你应该在连上网时起始 named 并且在离线时杀掉它。 我已经接到一些邮件说不是这样的,但是我不能使它能够等待这麽长的 时间。如果你有更好的资讯请寄给我所有的细节。 某些人喜欢在慢速的连线上使用 forwarders 指令。如果你的网际网路 提供者在 1.2.3.4 以及 1.2.3.5 设有 DNS 服务器那麽你可以插入 这麽一行 ______________________________________________________________________ forwarders 1.2.3.4 1.2.3.5 ______________________________________________________________________ 到 named.boot 文件里去。同时也让 named.cache 文件保持为空白。 这将会减低源自你主机的 IP 流量,任何可能提升的速度。如果你是依 线路的资料量付费的话这特别重要。这还有个附加价值,让你脱离作为 一个暂存的 named 维护者所应负起的责任: 你不需要去更新一个空的 named.cache 文件。 7. 如何成为一个大型的 DNS 管理者。 文件以及工具。 存在有真正的文件。在线上的或是印好的。要跨出从小型 DNS 管理者 到大型 DNS 的一步阅读几份这些文件是必要的。印好的标准参考书是 DNS and BIND by C. Liu and P. Albitz from O'Reilly & Associates, Sebastopol, CA, ISBN 0-937175-82-X. 我阅读过,它很棒。在另一本 TCP/IP Network Administration, by Craig Hunt from O'Reilly..., ISBN 0-937175-82-X 有一节是关於 DNS 的。另一本对管理 DNS 很 好的(或者是对任何这一类工作都很好)书则是 Zen and the Art of Motorcycle Maintenance by Robert M. Prisig :-) ISBN 0688052304 and others. 线上的资料你可以在这里找到 , ; 常见问题集,参考手册(BOG; Bind Operations Guide)是协订定义以及 DNS 研究的文献。这些文件 我大部分没有阅读过,但是因此我不是个大型 DNS 管理者。另一方面 Arnt Gulbrandsen 已经读过 BOG 而且对此很熟稔:-)。 网路新闻讨论群 comp.protocol.rcpip.domains 是有关 DNS 的讨论 群。此外还有好几份关於 DNS 的 RFCs, 最重要的可能是这些: RFC 1918 Y. Rekhter, R. Moskowitz, D. Karrenberg, G. de Groot, E. Lear, Address Allocation for Private Internets, 02/29/1996. RFC 1912 D. Barr, Common DNS Operational and Configuration Errors, 02/28/1996. RFC 1713 A. Romao, Tools for DNS debugging, 11/03/1994. RFC 1712 C. Farrell, M. Schulze, S. Pleitner, D. Baldoni, DNS Encoding of Geographical Location, 11/01/1994. RFC 1183 R. Ullmann, P. Mockapetris, L. Mamakos, C. Everhart, New DNS RR Definitions, 10/08/1990. RFC 1035 P. Mockapetris, Domain names - implementation and specification, 11/01/1987. RFC 1034 P. Mockapetris, Domain names - concepts and facilities, 11/01/1987. RFC 1033 M. Lottor, Domain administrators operations guide, 11/01/1987. RFC 1032 M. Stahl, Domain administrators guide, 11/01/1987. RFC 974 C. Partridge, Mail routing and the domain system, 01/01/1986.