DNS协议

DNS 的來由

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

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

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

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

DNS 的结构

DNS 是一个分层级的分散式名称对应系统﹐有点像电脑的目录树结构﹕在最顶端的是一个“root”﹐然后其下分为好几个基本类别名称﹐如﹕com﹑org﹑edu 等﹔再下面是组织名称﹐如﹕ibm﹑microsoft﹑intel 等﹔继而是主机名称﹐如﹕www﹑mail﹑ftp 等。因为当初 internet 是从美国发展起的﹐所以当时并没有国域名称﹐但随著后来 internet 的蓬勃发展﹐DNS 也加进了诸如 tw﹑hk﹑cn 等国域名称。所以一个完整的 dns 名称就好像是这样的﹕www.xyz.com.tw﹐而整个名称对应的就是一个(或多个) IP 位址了。

在早期的设计下﹐root 下面只有六个组织类别﹕

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

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

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

DNS 的运作

在我们设定 IP 网路环境的时候﹐都要告诉每台主机关于 DNS 伺服器的位址(我们可以手动的在每一台主机上面设置﹐也可以使用 DHCP 来指定)。但这设定的义意何在呢?从前面的介绍我们或可知道:其目的就是请 DNS 帮忙解析主机名称与 IP 位址啦。在这个设定过程中,DNS 被称为 resolver (也就是负责解析的 DNS Server),而被设定主机,则只是单纯的 DNS Client 了,也就是提出解析请求的主机。

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

  1. 客户端向伺服器提出查询项目﹔
  2. 当被询问到有关本域名之内的主机名称的时候﹐DNS 伺服器会直接做出回答﹔
  3. 如果所查询的主机名称属于其它域名的话﹐会检查快取记忆体(Cache)﹐看看有没有相关资料﹔
  4. 如果没有发现﹐则会转向 root 伺服器查询﹔
  5. 然后 root 伺服器会将该域名之下一层授权(authoritative)伺服器的位址告知(可能会超过一台)﹔
  6. 本地伺服器然后会向其中的一台伺服器查询﹐并将这些伺服器名单存到记忆体中﹐以备将来之需(省却再向 root 查询的步骤)﹔
  7. 远方伺服器回应查询﹔
  8. 若该回应并非最后一层的答案,则继续往下一层查询,直到获的客户端所查询的结果为止﹔
  9. 将查询结果回应给客户端﹐并同时将结果储存一个备份在自己的快取记忆(内存)里面﹔
  10. 如果在存放时间尚未过时之前再接到相同的查询﹐则以存放于快取记忆(内存)里面的资料来做回应。

从这个过程我们可以看出﹐没有任何一台 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 的记录(任何主机都是以“记录”来表示,称为 Resource Record)。这个记录可以为一个 IP 位址﹐也可以以别名形式来对应一台主机名称﹐但无论如何﹐所对应的主机名称最终是要被一个 IP 位址所对应著就是了。

同时﹐DNS 还能提供“反查询”(reverse lookup) 功能﹐也就是以 IP 来查询主机名称。网路上面的许多服务﹐如﹕FTP, SMTP﹑等等﹐都需要到这个功能。其实﹐DNS 服务本身就必须要使用反查询功能﹐而且在设定上﹐也必须要为每个网路建立起 reverse zone。虽然有些人发觉即使没有 reverse zone 也可以使用到 DNS 服务﹐但其中弊端却不容易被察觉到﹐在这个(中文)网页http://dnsrd.nctu.edu.tw/DNS-abc/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.
﹔
home	IN	ns	debian.home.siyongc.domain.
debian.home	IN	A	10.0.2.101

我们姑且不理会开头那几行的意思﹐那是给 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 工作

由于 DNS 的重要性日益显著,为提高其容错能力及查询效能,我们在架设某一单一 zone 的时侯,常以多台伺服器来负责该 zone 的服务。其中,我们必需指定一台 Primary(master) DNS 伺服器,它是架设在某一个网域下被主要授权并控制所有名称记录的主控伺服器﹐管辖著该网域的所有记录资料﹐这些记录资料只有 primary(master) 可以修改。

但如果在一个比较大型的网路中﹐DNS 伺服器就会变得很繁忙﹐所以您可以设定多个 DNS 来分担 master 的工作﹐但您或许不愿意到每一个 DNS 伺服器去更新资料吧﹖而且就算您愿意这样做﹐也容易出现错误或资料不同步的情形。这样您可以设定其它的伺服器为 secondary (slave) DNS 来复制master 上面的记录资料﹐这样﹐其它的电脑可以被分派到不同的 DNS 做查询﹐既可以分担 master 的工作﹐而且资料也可以自动进行同步工作。为确保资料的一致性,master 每次更新过资料后会以 notify 机制主动通知 slave 前来同步。此外,您可以设定 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:”的回应信息。因为在 cache 中的资料未必与真正授权主机上的一致。

若想查询更多资讯,我们可将查询模式设为 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

您就可以看到更多的资料了﹐例如﹕MX﹑NS﹑和它们的 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 的封包格式

Query Identifier(16) QR OPCodes Flags Reserved RCodes
QDCount(16) ANCount(16)
NSCount(16) ARCount(16)
Question Section(32)
Answer Section(32)
Authority Section(32)
Additional Records Section(32)

以下为各栏位的简要说明:

QID
DNS 查询封包编号,作为确认依据。
QR
查询封包为 0 ﹔回应为 1 。长度为 1 bit 。
OPCodes
封包类别(QUERY, IQUERY, STATUS, Reserved)。长度为 4 bits。
Flags
共 4 bits ,各表示:AA(Authoritative Answer)、TC(Truncation)、RD(Recursion Desired)、RA(Recursion Avalable)。
Reserved
保留未用。
RCodes
回应讯息,长 4 bits ,除 0 及 6-15 保留未用外,1-5 分别为:Format Error、Server Failure、Name Error、Not Implemented、Refused。
QDCount、ANCount、NSCount、ARCount
分别为 Question、Answer、Authority、Additional Record 这几个 section 栏位的长度。
Question Section、Answer Section、Authority Section、Additional Records Section
每一 Section 分为 NAME、TYPE、CLASS 三个子栏位,分别作为查询、应答、授权、额外记录等封包之资讯,及各自长度。

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

DNS 协议之 RFC 文件

RFC-822﹑RFC-883﹑RFC-920﹑RFC-973﹑RFC-974﹑RFC-1032﹑RFC-1033﹑RFC-1034﹑RFC-1035﹑RFC-1101﹑RFC-1296

習題﹕

  1. 请简单说说 DNS 的功能,及其来由。
  2. 请描述 DNS 系统的结构,并以尝试绘制其层阶关系。
  3. 请列举顶层常见之第一级域名,并作简要说明。
  4. 请描述 DNS 的查询/应答流程,并以实例加以刨析。
  5. 请参考文件所指示之参考资料,说明忽略反向查询之常见币端。
  6. 请列举常见的 DNS 资源记禄名称,并加以说明。
  7. 请说明 mster 与 slave 的关系,及其设计目的。
  8. 请以实作方式,使用 nslookup 验证 DNS 的工作,并对回应资讯加以分析。
  9. 请绘制 DNS 封包格式,并简要说明各栏位的作用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注