如何建立你自己的领域
在我们真的开始进行这一节以前我将会提供你一些关於 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.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 数字是以反向顺序书写的.
如果你有某台机器的位址: 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 并非完完全全地像我告诉你的这样运作.但是这已经够接近的了.
现在来定义我们自己的领域.我们将会创造出 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 这个位址.看起来也很好.
当然,这个领域是高度虚拟的,里面所有的位址也都是,而这或许会让你有些混淆. 真实领域的一个真实例子请见下一节.