IP基础--5.DNS协定

/ns/cn/zs/data/20020806030236.htm


    DNS的来由

如果您为您的机器设定过internet连线那麽您一定接触过DNS了但DNS又是什麽东东呢说穿了DNS是用来帮助记忆网路地址的完全是为了迁就人类的记忆思维而设的。

DNS的全称是Domain Name System当您连上一个网址在URL打上www.hotmail.com的时候可以说就是使用了DNS的服务了。但如果您知道这个www.hotmail.com的IP地址直接输入209.185.243.135也同样可以到达这个网址。其实电脑使用的只是IP地址而已(最终也是0和1啦)这个www.hotmail.com只是让人们容易记忆而设的。因为我们人类对一些比较有意义的文字记忆(如www.hotmail.com)比记忆那些毫无头绪的号码(如209.185.243.135)往往容易得多。DNS的作用就是为我们在文字和IP之间担当了翻译而免除了强记号码的痛苦。

假如您的电话有名字记忆功能您只需知道对方的名字就可以拨号给友人了我们可以说这电话也具备如DNS的功能了呢但是我们在网路中使用的DNS系统就是这麽简单吗非也杂得很呢下面就让我们一起去探索一下DNS的奥秘

在早期的IP网路世界里面每台电脑都只用IP地址来表示不久人们就发现这样很难记忆於是一些UNIX的使用者就建立一个HOSTS对应表将IP和主机名字对应起来这样用户只需输入电脑名字就可以代替IP来进行沟通了。如果你安装了Linux系统在/etc下面就可以找到这个hosts档案了在NT的系统里你也可以在\winnt\system32\drivers\etc下面找到它。不过这个HOSTS档是要由管理者手工维护的最大的问题是无法适用於大型网路而且更新也是件非常头痛的事情。这就是DNS大派用场的时候了。

DNS的结构

DNS是一个分层级的分散式名称对应系统有点像电脑的目录树结构在最顶端的是一个“root”然後其下分为好几个基本类别名称如comorgedu等再下面是组织名称如sonytoshibaintel等继而是主机名称如wwwmailftp等。因为当初internet是从美国发起的所以当时并没有国域名称但随着後来internet的蓬勃发展DNS也加进了诸如twhkau等国域名称。所以一个完整的dns名称就好像是这样的www.xyz.com.tw而整个名称对应的就是一个IP地址了。

在开始的时候root下面只有六个组织类别


类别名称 代表意思
edu 教育学术单位
org 组织机构
net 网路通讯单位
com 公司企业
gov 政府机关
mil 军事单位


不过自从组织类别名称开放以後各种各样五花八门的名称也相继现出来了但无论如何取名的规则最好量适合网站性质。除了原来的类别资料由美国本土的NIC(Network Information Center)管理之外其它在国域以下的类别分别由该国的NIC管理。这样的结构看起来就像这样




在结构中各组织的DNS经过申请後由该组织或其委机构管理(通常当您申请册一个domain域名称的时候都要指定两台DNS主机负责该域名的DNS管理)。

DNS的运作

在我们设定IP网路环境的时候通常都要告诉每台主机关於DNS伺服器的地址(我们可以手动的在每一台主机上面设置也可以使用DHCP来设定)。

下面让我们看看DNS是怎样运作的

当被询问到有关本域名之内的主机名称的时候DNS伺服器会直接做出回答
如果所查询的主机名称属於其它域名的话会检查记忆体看看有没有相关资料
如果没有发现则会转向root伺服器查询
然後root伺服器会将该域名之授权(authoritative)伺服器(可能会超过一台)的地址告知
本地伺服器然後会向其中的一台伺服器查询并将这些伺服器名单存到记忆体中以备将来之需(省却再向root查询的步骤)
远方伺服器回应查询
将查询结果回应给客户并同时将结果储存一个备份在自己的快取记忆里面
如果在存放时间尚未过时之前再接到相同的查询则以存放於快取记忆里面的资料来做回应。

从这个过程我们可以看出没有任何一台DNS主机会包含所有域名的DNS资料资料都是分散在全部的DNS伺服器中而NIC只需知道各DNS伺服器地址就可以了。

为了更好地理解一下 DNS 的运作让我们用下图看看查询www.home.netman.com.tw这台主机位址的过程




在这个例子中www.home.netman.com.tw台主机的DNS对应资料是由负责home.netman.com.tw这个域名的DNS伺服器管理的。(在DNS术语中我们称一个域名为“zone”这个zone可以是您从NIC申请回来的域名也可以是从该域名之下延伸出来的“sub-zone”)。在这台DNS伺服器上面必须有一个关於home.netman.com.tw这个zone的档案而这档案里面必须有一笔关於www的记录(任何主机都是以“记录”来表示)。这个记录可以为一个IP地址也可以以别名形式来对应一台主机名称但无论如何所对应的主机名称最终是要被一个IP地址所对应着就是了。

同时DNS还能提供“反查询”(reverse lookup)功能也就是以IP来查询主机名称。网路上面的许多服务如FTP, IRC, WWW等等都需要到这个功能。其实DNS服务本身就必须要使用反查询功能而且在设定上也必须要为每个网路建立起reverse zone。虽然有些人发觉即使没有reverse zone也可以利用到DNS服务但其中弊端却不容易被察觉到在这个(中文)网页http://ns.nctu.edu.tw/Basic/WhenToUse-Rev.html上面您可以看到忽略revers zone所致一些问题。

DNS的名称记录

事实上DNS不仅仅是用来解释地址用的而且还可以回答更多关於网路和主机的其它信息其中很重要的一个功能就是可以供邮件系统进行路由。这些资料通常会以不同的“记录”名称出现在DNS的资料档案中。

下面让我们参考一个Linux的DNS档案看看这些记录是如何表示的

;
; Zone file for siyongc.domain
;
; Then full zone file
;
$TTL 86400
@ IN SOA redhat52.siyongc.domain. netman.siyongc.domain. (
1999092801 ; serial
8H ; refresh
2H ; retry
1W ; expire
1D ) ; minimun
;
IN TXT "A test domain, created by Netman"
IN NS redhat52
IN NS debian.home.
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.
;
localhost IN A 127.0.0.1

gw IN A 192.168.0.17
IN HINFO "Redhat" "MASQ"
IN TXT "The masquerade gateway to internet"

redhat52 IN A 192.168.0.17
IN MX 10 redhat52
IN MX 20 debian.home.
IN HINFO "Dell PII 266" "Linux RedHat"
www IN CNAME redhat52
mail IN CNAME redhat52
ftp IN CNAME redhat52
news IN CNAME redhat52
smtp IN CNAME redhat52

pii266 IN A 192.168.0.15
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.

slware36 IN A 192.168.0.18
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.

rhroute IN A 192.168.0.4
IN MX 10 redhat52.siyongc.domain.
IN MX 20 debian.home.


我们姑且不理会开头那几行的意思那是给DNS系统本身使用的(我将会在“学习Linux”文章里面再详细讨论)这里我们只是看看几个记录名称而已

类别名称 代表意思
TXT 只是一些说明文字可以用来说明主机/网路环境设定
NS 名称伺服器也就是该zone指定的DNS伺服器名称
MX 邮件伺服器负责经由DNS查询进行邮件传递的邮件伺服器。这样的好处是如果您要更换邮件伺服器的话只需修改DNS记录就可以了而对方的邮件伺服器则无需理会您要使用的究竟是哪一台电脑来负责邮件交换。同时您也可以指定多台邮件伺服器来分担邮件交换工作在MX後面的号数用来指定伺服器的使用顺序数字越低越优先。
A 用来对应主机名称和其IP地址这个记录最常用而且也是最重要的记录之一
HINFO 和TXT差不多是回答“Host Information”查询用的
CNAME 是一个“别名”记录可以给A记录使用另外一个(或多个)名称让外面查询。CNAME可以对应一个A记录但不鼓励对应另一个CNAME记录。
AAAA 和A记录一样只不过对应的是IP v6 格式


分担DNS工作

Primary(master) DNS伺服器是架设在某一个网域下被主要授权并控制所有名称记录的主控制伺服器管辖着所有该网域的记录资料这些记录资料只有primary(master)可以修改。

但如果在一个比较大型的网路中DNS伺服器就会变得很繁忙了所以您可以设定多个DNS来分担master的工作但您或许不愿意到每一个DNS伺服器去更新资料吧而且就算您愿意这样做也容易出现错误或资料不同步的情形。这样您可以设定其它的伺服器为secondary (slave) DNS来master上面的记录资料这样其它的电脑可以被指定到不同的DNS做查询既可以分担master的工作而且资料也可以自动进行同步工作。您可以设定DNS资料同步的时间间隔在dns档案中的Refresh设定就是了。同时您还会看到Serial当slave的上面的serial数字少於它资料就会被否则会被忽略。

验DNS工作

当您建立好一个DNS伺服器之後除了可以直接使用命令 ping (这个会在後面章节说明)直接ping一下上面的记录之外最好还是使用“nslookup”这个命令进行检测或除错(Windows9x系统并不包含此命令)。下面让我们在Linux中验一下当您输入nslookup之後您会看到您机器目前指定的DNS伺服器的回应

Default Server: redhat52.siyongc.domain
Address: 192.168.0.17


然後您输入欲查询的主机或IP地址您会看到从DNS回来的结果

> pii266.siyongc.domain
Server: redhat52.siyongc
Address: 192.168.0.17

Name: pii266.siyongc.domain
Address: 192.168.0.15

> www.hinet.net
Server: redhat52.siyongc.domain
Address: 192.168.0.17

Non-authoritative answer:
Name: w3c2.hinet.net
Address: 168.95.1.84
Aliases: www.hinet.net


这是一个标准模式下面的查询我们可以看到不是这台DNS伺服器管理的查询而且已经在 cache 里面了会附加一个“Non-authoritative answer:”的回应信息。但如果我们先将查询模式设为any之後再输入同样的主机名称

> set q=any
> pii266.siyongc.domain
Server: redhat52.siyongc.domain
Address: 192.168.0.17

pii266.siyongc.domain preference = 20, mail exchanger = debian.home
pii266.siyongc.domain preference = 10, mail exchanger = redhat52.siyongc.domain
pii266.siyongc.domain internet address = 192.168.0.15
siyongc.domain nameserver = debian.home
siyongc.domain nameserver = redhat52.siyongc.domain
debian.home internet address = 192.168.0.2
redhat52.siyongc.domain internet address = 192.168.0.17


您就可以看到更多的资料了例如MXNS和它们的IP地址等信息。假如您使用“除错模式”的话看到的资料还将更多

> set debug
> www.hinet.net
Server: redhat52.siyongc.domain
Address: 192.168.0.17

;; res_nmkquery(QUERY, www.hinet.net, IN, ANY)
------------
Got answer:
HEADER:
opcode = QUERY, id = 3102, rcode = NOERROR
header flags: response, want recursion, recursion avail.
questions = 1, answers = 1, authority records = 3, additional = 3

QUESTIONS:
www.hinet.net, type = ANY, class = IN
ANSWERS:
-> www.hinet.net
canonical name = w3c2.hinet.net
ttl = 76134 (21h8m54s)
AUTHORITY RECORDS:
-> hinet.net
nameserver = HNTP1.hinet.net
ttl = 162533 (1d21h8m53s)
-> hinet.net
nameserver = HNTP3.hinet.net
ttl = 162533 (1d21h8m53s)
-> hinet.net
nameserver = DNS.hinet.net
ttl = 162533 (1d21h8m53s)
ADDITIONAL RECORDS:
-> HNTP1.hinet.net
internet address = 168.95.192.1
ttl = 162533 (1d21h8m53s)
-> HNTP3.hinet.net
internet address = 168.95.192.2
ttl = 162533 (1d21h8m53s)
-> DNS.hinet.net
internet address = 168.95.1.1
ttl = 162533 (1d21h8m53s)

------------
Non-authoritative answer:
www.hinet.net
canonical name = w3c2.hinet.net
ttl = 76134 (21h8m54s)

Authoritative answers can be found from:
hinet.net
nameserver = HNTP1.hinet.net
ttl = 162533 (1d21h8m53s)
hinet.net
nameserver = HNTP3.hinet.net
ttl = 162533 (1d21h8m53s)
hinet.net
nameserver = DNS.hinet.net
ttl = 162533 (1d21h8m53s)
HNTP1.hinet.net
internet address = 168.95.192.1
ttl = 162533 (1d21h8m53s)
HNTP3.hinet.net
internet address = 168.95.192.2
ttl = 162533 (1d21h8m53s)
DNS.hinet.net
internet address = 168.95.1.1
ttl = 162533 (1d21h8m53s)


另外您还可以用 set q=mx 或 set q=ptr 等模式来查询特定的记录也可以用 ls 後接 domain name 来查看某个 domain 的所有主机记录。善用 nslookup 我们可以找到许多 DNS 的信息而当有问题发生的时候这个工具就变得非常有用了。

同时在设定 DNS 的时候需要比较慎密的设计以免不实资料的滥。管理好 DNS 系统是每一个网路管理员应尽的义务来的。详细的 DNS 设定我会在“学习 Linux”里面讨论。

好了关於DNS的讨论暂时介绍到这里相信上面说的这些也够您消化的了。