DNS 运行机制

DNS(Domain Name System,域名系统)的主要任务是进行主机名(hostname,也称域名)到 IP 地址转换的目录服务,它由两部分组成:

  • 一个由分层DNS 服务器(DNS server)实现的分布式数据库
  • 一个使得主机能够查询分布式数据库的应用层协议

DNS 服务器通常是运行 BIND(Berkeley Internet Name Domain)软件的 UNIX 机器。DNS 协议运行在 UDP 之上,使用 53 号端口。

除了进行主机名到 IP 地址的转换外,DNS 还提供了一些重要的服务:

  • 主机别名(host aliasing):有着复杂主机名的主机能拥有一个或着多个别名
  • 邮件服务器别名(mail server aliasing)
  • 负载分配(load distribution):DNS 也用于在冗余的服务器(如冗余的 Web 服务器等)之间进行负载分配。这种负载均衡的缺点为由于 DNS 缓存(如 LDNS 中缓存)的存在,其实际作用很有限。

DNS 服务器

DNS 服务器大致分为 3 种:

  • 根 DNS 服务器:根 DNS 服务器提供 TLD 服务器的 IP 地址。有 400 多个根 DNS 服务器遍及全世界。这些根 DNS 服务器由 13 个不同的组织管理。根 DNS 服务器的全部清单连同管理它们的组织及其 IP 地址可以在这里找到。
  • 顶级域(Top-Level Domain,TLD)DNS 服务器:TLD 服务器提供了权威 DNS 服务器的 IP 地址。对于每个顶级域(如 comorgnetedugov)和所有国家的顶级域(如 ukfrcajp),都有 TLD 服务器(或服务器集群)。所有顶级域的列表可参见维基百科
  • 权威 DNS 服务器:在因特网上具有公共可访问主机(如 Web 服务器和邮件服务器)的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。一个组织机构的权威 DNS 服务器收藏了这些 DNS 记录。一个组织机构能够选择实现它自己的权威 DNS 服务器以保存这些记录;另一种方法是,该组织能够支付费用,让这些记录存储在某个服务提供商的一个权威 DNS 服务器中。

还有另一类重要的 DNS 服务器,称为本地 DNS 服务器(Local DNS server,LDNS)。严格来说,一个本地 DNS 服务器并不属于该服务器的层次结构,但它对 DNS 层次结构是至关重要的。每个 ISP(如一个居民区的 ISP 或一个机构的 ISP)都有一台本地 DNS 服务器(也叫默认名字服务器)。当主机与某个 ISP 连接时,该 ISP 提供一台主机的 IP 地址,该主机具有一台或多台其本地 DNS 服务器的 IP 地址(通常通过 DHCP)。主机的本地 DNS 服务器通常“临近”本主机。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 服务器层次结构中,大致过程如下所述:

  1. 客户端向它的本地 DNS 服务器发送一个关于 tieba.baidu.com 的 DNS 查询报文
  2. 本地 DNS 服务器将该报文转发到根 DNS 服务器
  3. 根 DNS 服务器注意到其 com 前缀并向本地 DNS 服务器返回负责 com 的 TLD 的 IP 地址列表
  4. 本地 DNS 服务器则再次向这些 TLD 服务器之一发送查询报文
  5. TLD 服务器注意到 baidu.com 前缀,并用权威 DNS 服务器的 IP 地址进行响应,该权威 DNS 服务器是 dns.baidu.com
  6. 本地 DNS 服务器直接向 dns.baidu.com 重发查询报文,dns.baidu.comtieba.baidu.com 的 IP 地址进行响应

注意到在本例中,为了获得一台主机名的映射,共发送了 8 份 DNS 报文:4 份查询报文和 4 份回答报文!下文将介绍利用 DNS 缓存(DNS caching)减少这种查询流量的方法。

上述例子利用了递归查询(recursive query)和迭代查询(iterative query)。从请求主机到本地 DNS 服务器的查询是递归的,其余的查询是迭代的。从理论上讲,任何 DNS 查询既可以是迭代的也能是递归的。

DNS 协议

共同实现 DNS 分布式数据库的所有 DNS 服务器存储了资源记录(Resource Record,RR),RR 提供了主机名到 IP 地址的映射。每个 DNS 回答报文包含了一条或多条资源记录。

资源记录是一个包含了下列字段的 4 元组:

1
(Name, Value, Type, TTL)

TTL(Time To Live)是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。Name 和 Value 的值取决于 Type:

  • 若 Type = A,则 Name 是主机名,Value 是该主机名对应的 IP 地址。因此,一条类型为 A 的资源记录提供了标准的主机名到 IP 地址的映射。例如 (relay1.bar.foo.com, 145.37.93.126, A) 就是一条类型 A 记录。
  • 若 Type = NS,则 Name 是个域(如 foo.com),而 Value 是个知道如何获得该域中主机 IP 地址的权威 DNS 服务器的主机名。这个记录用于沿着查询链来路要 DNS 查询。例如 (foo.com, dns.foo.com, NS) 就是一条类型为 NS 的记录。
  • 若 Type = CNAME,则 Value 是别名为 Name 的主机对应的规范主机名。该记录能够向查询的主机提供一个主机名对应的规范主机名,例如 (foo.com, relay1.bar.foo.com, CNAME) 就是一条 CNAME 类型的记录。
  • 若 Type = MX,则 Value 是个别名为 Name 的邮件服务器的规范主机名。举例来说,(foo.com, mail.bar.foo.com, MX) 就是一条 MX 记录。MX 记录允许邮件服务器主机名具有简单的别名。值得注意的是,通过使用 MX 记录,一个公司的邮件服务器和其他服务器(如它的 Web 服务器)可以使用相同的别名。为了获得邮件服务器的规范主机名,DNS 客户应当请求一条 MX 记录;而为了获得其他服务器的规范主机名,DNS 客户应当请求 CNAME 记录。

如果一台 DNS 服务器是用于某特定主机名的权威 DNS 服务器,那么该 DNS 服务器会有一条包含用于该主机名的类型 A 记录(即使该 DNS 服务器不是其权威 DNS 服务器,它也可能在缓存中包含有一条类型 A 记录)。如果服务器不是用于某主机名的权威服务器,那么该服务器将包含一条类型 NS 记录,该记录对应于包含主机名的域;它还将包括一条类型 A 记录,该记录提供了在 NS 记录的 Value 字段中的 DNS 服务器的 IP 地址。

DNS 只有查询和回答这两种报文,并且,查询和回答报文有着相同的格式,如下图所示:

dns message

前 12 个字节是首部区域,其中有如下几个字段:

  • 标识符:是一个 16 比特的数,用于标识该查询。这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。
  • 标志:含有若干标志。1 比特的“查询/回答”标志位指出报文是查询报文(0)还是回答报文(1)。当某 DNS 服务器是所请求名字的权威 DNS 服务器时,1 比特的“权威的”标志位被置在回答报文中。如果客户在该 DNS 服务器没有某记录时希望它执行递归查询,将设置 1 比特的“希望递归”标志位。如果该 DNS 服务器支持递归查询,在它的回答报文中会对 1 比特的“递归可用”标志位置位。
  • 剩余 4 个有关数量的字段,这些字段指出了在首部后的 4 类数据区域出现的数量。

问题区域包含着正在进行的查询信息。该区域包括:

  1. 名字字段,包含正在被查询的主机名字;
  2. 类型字段,指出有关该名字的正被询问的问题类型,例如主机地址是与一个名字相关联(类型 A)还是与某个名字的邮件服务器相关联(类型 MX)。

在来自 DNS 服务器的回答中,回答区域包含了对最初请求的名字的资源记录。在回答报文的回答区域中可以包含多条 RR,因此一个主机名能够有多个 IP 地址。

权威区域包含了其他权威服务器的记录。

附加区域包含了其他有帮助的记录。例如,对于一个 MX 请求的回答报文的回答区域包含了一条资源记录,该记录提供了邮件服务器的规范主机名。该附加区域包含一个类型 A 记录,该记录提供了用于该邮件服务器的规范主机名的 IP 地址。

上面的讨论只是关注如何从 DNS 数据库中取数据,这些数据最初是怎么进入数据库中的呢?注册登记机构(registrar)是一个商业实体,它验证域名的唯一性,并将域名输入 DNS 数据库,对提供的服务收取少量费用。因特网名字和地址分配机构(Internet Corporation for Assigned Names and Numbers,ICANN)向各种注册登记机构授权。

DNS 缓存

实际上,为了改善时延性能并减少在因特网上到处传输的 DNS 报文数量,DNS 广泛使用了缓存技术。

DNS 缓存的原理非常简单。在一个请求链中,当某 DNS 服务器接收一个 DNS 回答(例如,包含某主机名到 IP 地址的映射)时,它能将映射缓存到本地存储器中。如果在 DNS 服务器中缓存了一台主机名/IP 地址对,另一个对相同主机名的查询到达该 DNS 服务器时,该 DNS 服务器就能够提供所要求的 IP 地址,即使它不是该主机名的权威服务器。由于主机和主机名与 IP 地址间的映射并不是永久的,DNS 服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。

本地 DNS 服务器也能够缓存 TLD 服务器的 IP 地址,因而允许本地 DNS 绕过查询链中的根 DNS 服务器。事实上,因为缓存,除了少数 DNS 查询以外,根服务器被绕过了。

安全性

第一种针对 DNS 服务的攻击是分布式拒绝服务(DDoS)带宽洪泛攻击,对 DNS 的潜在更为有效的 DDoS 攻击将是向顶级域名服务器(例如向所有处理 .com 域的顶级域名服务器)发送大量的 DNS 请求,以上两种 DDoS 攻击的严重性都可以通过本地 DNS 服务器中的缓存技术可将部分地被缓解。

DNS 能够潜在地以其他方式被攻击。在中间人攻击中,攻击者截获来自主机的请求并返回伪造的回答,这被称为 DNS 劫持。在 DNS 毒害(DNS 投毒、DNS 污染)攻击中,攻击者向一台 DNS 服务器发送伪造的回答,诱使服务器在它的缓存中接收伪造的记录。这些攻击中的任一种,都能够将毫无疑虑的 Web 用户重定向到攻击者的 Web 站点。然而,这些攻击难以实现,因为它们要求截获分组或扼制住服务器。