Next Previous Contents

4. 一个简单的领域

如何建立你自己的领域

4.1 先来一点纯理论

在我们真的开始进行这一节以前我将会提供你一些关於 DNS 如何运作的理论. 而你应该阅读它因为这对你有益.如果你不‘想要’那麽至少你也得很快地略读一下. 当你看到应该放进 named.boot 档案里去的内容时再停止这种略读方式.

DNS 是一个阶层式的系统.其顶端写作 `.' 而其发音为 `root' . 在 . 之下有几个顶层领域(TLDs),最知名的是 ORG, COM, 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.eduai.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 数字是以反向顺序书写的. 如果你有某台机器的位址: 192.128.52.43 那麽 named 会以类似 prep.ai.mit.edu 这个□例的方式来处理: 找出 arpa. 的伺服器,找出 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 并非完完全全地像我告诉你的这样运作.但是这已经够接近的了.

4.2 我们自己的领域

现在来定义我们自己的领域.我们将会创造出 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.arpa 所以第一行实际上是指

  0.0.127.IN-ADDR.ARPA. IN      SOA ...

NS 是名称伺服器资源记录,它告诉 DNS 什麽机器是这个领域 0.0.127.in-addr.arpa 的名称伺服器,也就是 ns.linux.bogus. 而最後的 PTR 记录说 1 (等於是 1.0.0.127.IN-ADDR.ARPA, 也就是 127.0.0.1)的名称是 localhost.

SOA 这个记录是所有区域档案的序文,而且在每一个区域档案里都应该有这唯一的一个,最开头的记录. 它描述该区域,它从何而来(一台称为 linux.bogus 的机器),谁负责其内容(hostmaster@linux.bogus), 这个区域档案是什麽版本(serial: 1),以及其它必须做的,有关暂存与次要名称伺服器的事. 剩下的栏位如 refresh, retry, expire 以及 minimum 你可以使用这份文件里所用的数字而且应该不会出问题.

现在重新起始你的 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

关於 SOA 记录有两件事需要注意.首先 ns.linux.bogus 必须 是一台具有 A 记录的真正机器. 在 SOA 记录中用 CNAME 记录为名称的机器是不合法的.它的名字不一定要是 ns,它可以是任何合法的主机名称. 再来,hostmaster.linux.bogus 应该被视为 hostmaster@linux.bogus,这应该是一个邮件位址或别名, 是维护这个 DNS 的人经常读信的位址.任何关於此领域的信件会被送到这个位址. 它的名字不一定要是 hostmaster,它可以是任何合法的电子邮件位址,然而这个位址 `hostmaster' 应该能工作正常.

在这个档案里有一种新的资源记录型态,即 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 专家,建议不要使用 CNAME 这个设定. 所以应该考虑不要认真地去使用它.

藉由执行 ndc reload 载入新的资料库,这会使 named 再一次读取其档案.

$ nslookup
Default Server:  localhost
Address:  127.0.0.1

> ls -d linux.bogus

这意指应该列出所有的记录

[localhost]
 linux.bogus.                   SOA   ns.linux.bogus hostmaster.linux.bogus. (199511301 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   ns.linux.bogus hostmaster.linux.bogus. (199511301 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

...换句话说,www.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 这个位址.看起来也很好.

4.3 继续深入

当然,这个领域是高度虚拟的,里面所有的位址也都是,而这或许会让你有些混淆. 真实领域的一个真实例子请见下一节.


Next Previous Contents