《TCP/IP 详解 卷1:协议》第 11 章:名称解析和域名系统
引言
到目前为止,我们使用 IP 地址来研究参与网络的主机。对于大众来说,这些地址太繁琐且难以记忆。为了使用如 TCP 和 IP 等协议,主机名称通过名为名称解析(name resolution)的过程转换成 IP 地址。在互联网中,存在着不同形式的名称解析,其中最普遍、最重要的是域名系统(Domain Name System,DNS)。
DNS 是一种分布式数据库系统,是一种典型的客户端/服务器模型的网络数据库。TCP/IP 应用程序使用它来完成主机名称和 IP 地址的映射。“分布式”是指在互联网中,没有一个站点可以保存所有的信息,而是有许许多多的站点(学校、公司、部门等等)都维护自己的信息数据库,运行一个服务器程序以供互联网上的其他系统查询。DNS 提供了客户端和服务器之间、服务器和服务器之间通信的协议。
DNS 作为互联网上的应用程序运行,是一个应用层设计。从别的应用程序的角度看,访问 DNS 是通过一个称为地址解析器(resolver)的程序来完成的。而TCP/IP 协议对 DNS 的存在一无所知,它们只对网络地址进行操作。
为了实现可扩展性,DNS 名称是分层的。我们将了解 DNS 名称空间,地址解析器、服务器如何使用 DNS 协议进行通信,以及 DNS 如何为普通用户所用。
DNS 名称空间
DNS 中所有使用的名称构成了 DNS 名称空间(name space)。名称空间和计算机系统的文件系统相似,都是划分为层次且大小写不敏感的。DNS 名称空间是一棵域名树。
- 位于顶部的树根未命名。
- 树的最高层是所谓的顶级域名(Top-Level Domain Name,
TLD
)。包括通用顶级域名(generic,gTLD
)、国家代码顶级域名(country code,ccTLD
)、国际化国家代码顶级域名(internationalized,IDN ccTLD),基础设施顶级域名(infrastructure TLD)等等。 - 国际化域名 IDN 的历史是互联网国际化的一部分,漫长而复杂。
- gTLD 分为几类:通用、通用限制、赞助。通用 gTLD 是开放的,其他两类受限于各种适用类型,以及什么实体可以从域名中分配名称。
- ccTLD 包含 ISO 3166 标准中指定的两个字母的国家代码。
- TLD 管理相关政策一般由 ICANN(互联网名称和号码分配机构)负责。
命名语法
域名树的 TLD 下面的名称进一步划分,称为子域名(subdomain)。
例如,英国大部分教育站点使用后缀.ac.uk
,而大多数盈利机构以后缀.co.uk
结尾。美国市政府的站点使用子域名ci.city.state.us
,city 是城市的名称,state 是州名的两个字母缩写。例如www.ci.manhatan-beach.ca.us
是加州曼哈顿海滩市的站点。
域名又分为完全限定域名(FQDN)和非限定域名(unqualified domain name)两种。前者书写为带有后随点的形式,例如mit.edu.
,代表该名称是完整的,进行名称解析时,不会再添加额外的信息。
与此相对的就是非限定域名,域名解析时,会有字符串添加到尾部。例如,当配置系统时,使用 DHCP ,指定一个默认域名扩展和搜索列表。例如,默认域名为can.berkeley.edu
在伯克利计算机系的系统中配置,这些机器上的用户输入名称vangogh
,解析器就会将名称转换为vangogh.cs.berkeley.edu
,解析器根据这个来找vangogh
的地址。
一个域名包含一系列由点分开的标签(label)。每个标签代表域名树层级中的一个位置。点就是层次结构的分割,按照名称从右到左的顺序沿树下降。例如:www.net.in.tum.de.表示包含在一个 4 级深度域名
net.in.tum.de的主机名
www`。
- TLD 是 de,是德国的 ccTLD。
- tum 是 Technische UNiversitat Munchen 的缩写
- in 是 informatik (德语计算机科学)的缩写
- net 是计算机学科中网络组缩写。
标签是大小写不敏感的。
名称服务器和区域
DNS 命名空间的层次结构运行不同的管理机构管理名称空间的不同部分。例如,创建一个新的 DNS 名称elevator.cs.berkeley.edu
只需与cs.berkeley.edu
的子域拥有者协商即可。DNS 的这个特点是它可扩展性的保证,没有一个单一中心化实体必须管理整个 DNS 名称空间的所有变化。
部分(也通常是次级) DNS 名称空间的管理责任分配给了组织或个人。这些组织和个人至少安置两台名称服务器(name server)或者DNS 服务器(DNS server)来存储相关信息,提供给互联网用户查询名称。因为服务器的集合构成了 DNS 服务的核心本身,所以我们说DNS 是一个分布式系统。这个分布式系统的主要工作是提供名称到地址的映射,也可以提供额外的广泛信息。
在 DNS 的语境中,管理授权的单位是区域(zone)。
介绍并区分两个术语:
- 所有域名的集合:
namespace
- 管理授权的单位:
zone
可以理解为一个区域就是 DNS 命名空间中的一棵子树。即使是 TLD 也是在 root zone 中。每当一条新纪录添加到 zone 中,该 zone 管理员将新建一条新条目,保存名称和 IP 地址的映射,添加到服务器的数据库中。
一台 DNS 服务器可以提供多个区域的信息。在一个域名的任何层次变化点上,不同的区域和包含的服务器可能被访问,以提供该名称的地址。这称为授权(delegation)。例如在 berkeley.edu
中可能存在主机 www.berkeley.edu
,也可能存在其他的域cs.berkeley.edu
。每一个区域都有一个负责方或者管理者,拥有管理名称、地址、该区域下属区域的权利。不仅管理区域的内容,也管理区域数据库、各种服务器。
区域信息最少应存在两个地方,这样做是为了如果有一台服务器不能工作,至少有另一台可以使用。这叫做主服务器和辅助服务器之间的区域传输(zone transfer)进程。
DNS 缓存
名称服务器包含名称到 IP 地址的映射信息。这些信息可以来自三个途径:
- 直接来自于区域数据库。在这种情况下,服务器应该包含该区域的授权信息(authoritative information),服务器可以被称为该区域的授权服务器(authoritative server),这样的服务器能通过区域内的鉴别。
- 从一个从属服务器区域传输的结果。
- 来自处于解析过程中的另一台服务器。
大部分名称服务器会缓存(cache)它们学习的区域信息,直到一个时间限制(TTL)为止。用缓存的信息来响应查询请求,可以大大减少 DNS 消息流量和响应时间。当应答查询时,服务器指明这条消息是来自缓存、还是区域的授权副本。
缓存同时适用成功的解析和不成功的解析。(否定缓存,negative caching)如果对一个特定域名的请求无法返回一个记录,则该事实也会被缓存。这样,再次请求同一不存在的域名时,就可以帮助降低互联网流量。
DNS 协议
DNS 协议由两个主要部分组成。
- DNS 特定名称的查询/响应报文协议。(最典型的用法)
- 名称服务器用于交换数据库的区域传输协议。分为 DNS 通知和动态更新。
通过每个站点或是 ISP 本地部署服务器和一组特殊的根服务器(root server)构成 DNS 分布式基础设施,通过该基础设施支持 DNS 查询/响应。
截止 2011 年,共有 13 台由字母 A 到 M 命名的根服务器。13 台 gTLD 服务器,也由 A 到 M 标示。通过联系根服务器和 gTLD 服务器,互联网中任何用 TLD 格式名称的主机、服务器,都可以被发现。
对于 UDP 和 TCP 来说,DNS 的知名端口号是 53。
例子
下列序号是图中的箭头上的消息序号:
- 当笔记本电脑 A.HOME 需要进行域名解析时,电脑上的解析器先朝最接近的本地名称服务器发送请求。也就是(消息1)。
- 如果本地的域名服务器不清楚此域名对应的 IP,它就会将查询转发至另一个服务器(也就是递归)。(消息2)前往 ISP 提供的 DNS 服务器。
- ISP DNS 服务器也不清楚的话,就联系根服务器中的一台。
- 根服务器不是递归的,它们不会再进一步朝别的服务器请求,而是返回需要联系的正确的服务器的信息。
- 根据这些信息,ISP DNS 联系一个 gTLD 服务器。
- 这个 gTLD 服务器发现了对应的名称服务器的 IP 地址,通过消息6返回。
- 基于消息6,ISP DNS 联系适当的服务器。
- 该服务器回复请求的 IP地址
- ISP DNS 返回给本地名称服务器。
- 本地名称服务器返回给笔记本电脑。
DNS 消息格式
字段 | 长度(bits) | 含义 |
---|---|---|
事务ID | 16 | 由客户端设置,服务器来返回,用来匹配响应和查询 |
QR | 1 | QR = 0表示查询,QR = 1表示响应 |
OpCode | 4 | 有三种值,0:标准查询,4:通知(NOTIFY),5:更新(UPDATE) |
Flag | 7 | 查看下文 |
RCODE | 4 | 是一个响应码,常用的值有0:没有差错;3:不存在域名 等 |
查询数、区域数 | 16 | 这接下来4条的字段都是16bits,表示DNS消息中各个区段(问题、回答、授权、额外信息)的条目数量。 |
回答数、先决条件数 | 16 | 查看下文 |
授权记录数 | 16 | 查看下文 |
额外信息数 | 16 | 查看下文 |
区段 | 可变长度 | DNS消息最后的部分。第一个区段指示类型,后续的区段都可以包含资源记录(resource record,RR)。RR可以被缓存,而问题则不可以。 |
标志
一共7个标志,每一个 1bit。
标志名 | 意义 |
---|---|
AA | Authoritative answer,指示希望的是授权信息,还是缓存里的信息也可以。 |
TC | Truncated,截断信息,表示当应答超过512字节时,只发送前512字节 |
RD | Recursion desired,告诉服务器希望执行递归查询 |
RA | Recursion availabe,服务器表明自己是可以递归查询的。根服务器就不是递归的 |
Z | 0 |
AD | 如果包含信息是授权信息,设置这一位 |
CD | 禁止校验 |
区段
接下来先讲标准查询。
区段是DNS消息最后的部分,有问题、回答、授权、额外信息四个种类。问题是 query 包里的,其余三个是 response 包的。在区段的前面四个16bits的字段就是对应这四个区段的条目数。对于 query 包来说,查询数就是1,其余三个的数量就是0。对于 response 包来说,回答数至少为 1,有可能包含其他信息。
问题区段格式
问题区段有名称、类型、类,见下图。
字段 | 长度(bits) | 含义 |
---|---|---|
查询名称 | 可变,但需要填充字节 | 需要被查询的域名,使用一种标签编码,见下文 |
查询类型(Types) | 16 | 查询哪种类型的资源记录,见下文“资源记录类型” |
查询类(Class) | 16 | 1:互联网类,254:没有类,255:所有类 |
下图是 DNS 系统中表示一个域名的编码——标签。一个标签就是一个完整的域名。对于一个标签来说,首先是用标签长度来指示后面跟了几个字符。0 表示一个标签的结束。每个标签的长度是 0 到 63。
如果使用普通的数据标签,如果在一次查询中出现了相同的名称,DNS 消息中的相同字符会重复。例如在一次查询中需要查询usc.edu
和ucla.edu
,如果使用上面的普通编码方式,edu
这个字符会重复出现在消息内容中。下图是压缩标签,通过引用其他标签从而节省空间。普通的数据标签的开头是用一个字节的数字来表示后续的字符数量的。而压缩标签的用法是:开头用两个字节,共16bits,头两个bits置1,然后后续的14个bit形成一个偏移量指针,偏移量指示的是距离此消息开头的字节数。在查询usc.edu
和ucla.edu
时,后面的edu
用偏移量 4 表示,就可以省下空间,见下图:
回答、授权、额外信息区段格式
除了问题区段,其他的区段包含零个或多个资源记录,RR。RR有固定的格式,见下图。
字段 | 长度(bits) | 含义 |
---|---|---|
名称 | 可变,需要填充 | 就是域名 |
查询类型Type | 16 | 见下文“资源记录类型” |
查询类Class | 16 | 同问题的区段。1:互联网类,254:没有类,255:所有类 |
TTL | 16 | 缓存时间(秒) |
RDLENGTH | 16 | 资源数据长度(bytes) |
RDATA | 16 | 资源数据,根据查询类型的不同这里回放不同的东西 |
资源记录类型
虽然 DNS 常用来确定特定的名称对应的 IP 地址,但是它可以用于相反的目的(根据IP查域名),也经常用来查一些别的。这是由于 DNS 能够拥有很多类型的资源记录,DNS 甚至可以为非互联网数据提供分布式数据库功能。
资源记录分为三大类:
- 数据类型。传达 DNS 中存储的信息。
- 查询类型。使用和数据类型相同的值,增加几个额外的值,在问题区段中使用。
- 元类型,特定单一 DNS 消息相关联的临时数据。
上图黄色标出了常用的资源记录类型。例如,一个 query 包里的问题区段的查询类型Type字段的值是 A
,意味着需要查询一个对应域名的 IPv4 地址。
A
:IPv4 地址NS
:区域授权服务器的名称,以供查询使用CNAME
:规范名称,也就是提供别名AAAA
:IPv6 地址
区域传输 和 DNS 通知
区域传输是用于从一个服务器复制另一区域的一组 RR 的,通常是主服务器复制到从服务器。这个功能的目的是为了保持多台服务器的内容同步。如果一台服务器失效了,这个功能也能让其他服务器帮助它恢复。与这个功能有关的字段是OpCode
中的DNS NOTIFY
值。由于数据量很大,这会使用TCP协议。
总结
DNS 是互联网的一个重要组成部分,也同时广泛地应用于私有网络中。DNS 名称空间是全世界范围的。应用程序使用解析器联系一个或多个 DNS 服务器,执行域名解析。解析器联系一个本地域名服务器,该服务器可能会递归地联系其他满足该请求的服务器。大多数 DNS 服务器会缓存知道的信息。DNS 协议被用于 DNS 查询、响应,区域交换。DNS 查询、响应由通用的消息格式,包括问题、回答、授权信息、额外信息等。资源记录用来保存大多数 DNS 信息。
DNS 一直受到众多攻击。例如伟光正的域名污染。
- DOS攻击,使重要的 DNS 过载,不能提供服务。
- 改变资源记录的内容,或者伪造成合法的 DNS 地址,但是回复假的资源记录,从而导致主机连接到错误的 IP 地址。也就是域名污染。
- 攻击者使用伪造的 IP 源地址产生对于 MX 记录的 DNS 请求。请求是较小的数据分组,但响应流量大(放大攻击,amplification)。响应会定向到请求的源 IP 地址。
- 域名污染的另一种形式——缓存中毒(cache poisoning),在这种攻击中,一台 DNS 服务器的缓存内容被错误的、伪造的数据替代。客户端被定向到伪服务器,若由别有用心的人将服务器故意配置成原来的模样,例如伪装成银行的 Web 洁面,用户可能会无意识泄露敏感信息。