域名系统 (DNS) 简介

了解全球 DNS 系统如何使我们能够为我们每天连接的全球机器网络分配易于记忆的名称。
510 位读者喜欢这篇文章。
Introduction to the Domain Name System (DNS)

Jason Baker。CC BY-SA 4.0。来源:Cloud, Globe。均为 CC0。

上网冲浪既有趣又容易,但想想如果每次要浏览网站都必须输入 IP 地址会是什么样子。例如,当您输入时,查找网站看起来会像这样:https://93.184.216.34,这对于我们大多数人来说几乎是不可能记住的。当然,使用书签会有所帮助,但假设您的朋友告诉您一个很酷的新网站,并告诉您访问 93.184.216.34。您如何记住它?告诉别人访问 “Opensource.com” 要容易记住得多。而且,是的,那是我们的 IP 地址。

域名系统提供了一个数据库,用于将人类可读的主机名(例如 www.opensource.com)转换为 IP 地址(例如 93.184.216.34),以便您连接到互联网的计算机和其他设备可以访问它们。BIND(Berkeley Internet Name Domain)软件的主要功能是作为使用该数据库的域名解析器。BIND 还有其他名称解析器软件,但 BIND 目前是互联网上使用最广泛的 DNS 软件。在本文中,我将几乎互换使用术语名称服务器、DNS 和解析器。

如果没有这些名称解析器服务,像我们现在这样自由轻松地浏览网页几乎是不可能的。作为人类,我们更擅长使用像 Opensource.com 这样的名称,而计算机更擅长使用像 93.184.216.34 这样的数字。因此,我们需要一个翻译服务,将我们容易记住的名称转换为计算机容易处理的数字。


127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

# Lab hosts
192.168.25.1      server
192.168.25.21     host1
192.168.25.22     host2
192.168.25.23     host3
192.168.25.24     host4

在小型网络中,每个主机上的 /etc/hosts 文件可以用作名称解析器。在多台主机上维护此文件的副本会非常耗时,并且错误可能会导致很多混乱和浪费时间才能被发现。我在自己的网络上这样做了几年,最终即使只有我通常运行的八到十二台计算机,维护起来也变得太麻烦了。最终,我转换为运行自己的名称服务器来解析内部和外部主机名。

大多数任何规模的网络都需要使用名称服务软件(如 BIND)对该服务进行集中管理。主机使用域名系统 (DNS) 从 Web 浏览器、电子邮件客户端、SSH、FTP 和许多其他互联网服务等软件中给定的名称中查找 IP 地址。

名称搜索的工作原理

让我们看一个简化的示例,了解当您的计算机上的客户端服务发出网页的名称请求时会发生什么。对于此示例,我将使用 www.opensource.com 作为我想在浏览器中查看的网站。我还假设网络上有一个本地名称服务器,就像我自己的网络一样。

1. 首先,我输入 URL 或选择包含该 URL 的书签。在本例中,URL 是 www.opensource.com

2. 浏览器客户端,无论是 Opera、Firefox、Chrome、Lynx、Links 还是任何其他浏览器,都将请求发送到操作系统。

3. 操作系统首先检查 /etc/hosts 文件,查看 URL 或主机名是否在那里。如果是,则将该条目的 IP 地址返回到浏览器。如果不是,我将继续下一步。在本例中,我假设它不在。

4. 然后,URL 被发送到 /etc/resolv.conf 中指定的第一个名称服务器。在本例中,第一个名称服务器的 IP 地址是我自己的内部名称服务器。对于此示例,我的名称服务器没有缓存 www.opensource.com 的 IP 地址,必须进一步查找。让我们继续下一步。

5. 本地名称服务器将请求发送到远程名称服务器。这可以是两种目标类型之一,其中一种类型是转发器。转发器只是另一个名称服务器,例如您的 ISP 中的名称服务器,或公共名称服务器,例如 Google 的 8.8.8.8 或 8.8.4.4。另一种目标类型是顶级根名称服务器。根服务器通常不会响应所需的 IP 地址或 www.opensource.com,而是响应该域的权威名称服务器。权威名称服务器是唯一有权维护和修改域的名称数据的服务器。

本地名称服务器配置为使用根名称服务器,因此 .com 顶级域的根名称服务器返回 www.opensource.com权威名称服务器的 IP 地址。该 IP 地址可以是三个(在撰写本文时)名称服务器 ns1.redhat.com、ns2.redhat.com 或 ns3.redhat.com 中的任何一个。

6. 然后,本地名称服务器将查询发送到权威名称服务器,权威名称服务器返回 www.opensource.com 的 IP 地址。

7. 浏览器使用 www.opensource.com 的 IP 地址发送网页请求,该网页被下载到我的浏览器。

此名称搜索的重要副作用之一是结果会被我的本地名称服务器缓存一段时间。这意味着下次我或我网络上的任何其他人想要访问 Opensource.com 时,IP 地址可能已经本地存储,从而避免了进行远程查找。

DNS 数据库

DNS 系统依赖于其数据库来执行主机名查找,以找到正确的 IP 地址。DNS 数据库是一个通用的、分布式的、分层的、复制的数据库。它还定义了互联网上使用的主机名样式,正确地称为 FQDN(完全限定域名)。

FQDN 由完整的主机名组成,例如 hornet.example.com 和 test1.example.com。FQDN 分为三个部分。

1. TLDN(顶级域名),例如 .com、.net、.biz、.org、.info、.edu 等,提供 FQDN 的最后一段。所有 TLDN 都在根名称服务器上管理。除了国家顶级域名(如 .us、.uk 等)之外,最初只有少数几个主要的顶级域名。截至 2017 年 2 月,共有 1528 个顶级域名。

2. 在指定主机名或 URL 时,二级域名始终紧邻顶级域名的左侧,因此像 Redhat.com、Opensource.com、Getfedora.org 和 example.com 这样的名称提供了 FQDN 的组织地址部分。

3. FQDN 的第三级是名称的主机名部分,因此网络中特定主机的 FQDN 将类似于 host1.example.com。

wg61vm.png

图 1 显示了 DNS 数据库层次结构的简化图。“顶级”,用单个点 (.) 表示,没有真正的物理存在。它是用于 DNS 区域文件配置的设备,以启用域名的显式停止。稍后会详细介绍。

真正的顶级由根名称服务器组成。这些是维护顶级 DNS 数据库的有限数量的服务器。根级别可能包含某些域的 IP 地址,并且根服务器将在可用时直接提供这些 IP 地址。在其他情况下,根服务器提供所需域的权威服务器的 IP 地址。

例如,假设我想浏览 www.opensource.com。我的浏览器向本地名称服务器发出请求,本地名称服务器不包含该 IP 地址。我的本地名称服务器配置为在本地缓存中找不到地址时使用根服务器,因此它将 www.opensource.com 的请求发送到其中一个根服务器。当然,本地名称服务器必须知道如何定位根名称服务器,因此它使用 /var/named/named.ca 文件,该文件包含根名称服务器的名称和 IP 地址。named.ca 文件也称为提示文件。

在本例中,www.opensource.com 的 IP 地址未由根服务器存储。根服务器使用其数据库来查找 www.opensource.com 的权威名称服务器的名称和 IP 地址。

本地名称服务器查询权威名称服务器,权威名称服务器返回 www.opensource.com 的 IP 地址。然后,本地名称服务器响应浏览器的请求,并向其提供 IP 地址。Opensource.com 的权威名称服务器包含该域的区域文件。

# dig www.opensource.com

; <<>> DiG 9.10.4-P6-RedHat-9.10.4-4.P6.fc25 <<>> www.opensource.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54308
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 4


;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.opensource.com.            IN      A


;; ANSWER SECTION:
www.opensource.com.     300     IN      CNAME   opensource.com.
opensource.com.         300     IN      A       93.184.216.34


;; AUTHORITY SECTION:
opensource.com.         129903  IN      NS      ns1.redhat.com.
opensource.com.         129903  IN      NS      ns3.redhat.com.
opensource.com.         129903  IN      NS      ns2.redhat.com.


;; ADDITIONAL SECTION:
ns2.redhat.com.         125948  IN      A       209.132.183.2
ns3.redhat.com.         125948  IN      A       66.187.233.212
ns1.redhat.com.         125948  IN      A       209.132.186.218


;; Query time: 71 msec
;; SERVER: 192.168.0.51#53(192.168.0.51)
;; WHEN: Sat Mar 04 21:23:51 EST 2017
;; MSG SIZE  rcvd: 186

上面的列表 2 显示了 dig 命令的结果,它不仅显示了所需主机的 IP 地址,还显示了权威服务器、它们的 IP 地址以及实际满足请求的服务器。以下是 dig 命令的用法,该命令获取 www.opensource.com 的 DNS 信息。dig 命令是一个强大的工具,可以告诉我们很多关于主机 DNS 配置的信息。dig 命令从 DNS 数据库返回实际记录,并将结果显示在四个主要部分中。在阅读这些部分的描述时,请参考列表 2。

第一部分是问题部分。对于此示例,它说明我正在查找 “www.opensource.com” 的 A 记录。请注意顶级域名末尾的点。这表明 .com 是主机名中的最后一个域名组件。

答案部分显示两个条目,CNAME 记录和 A 记录。A 记录是主要的名称解析器记录,必须有一个 A 记录,其中包含每个主机的 IP 地址。CNAME 代表规范名称,此记录类型是 A 记录的别名并指向它。使用 “www” 作为 Web 服务器的主机名不是典型的做法。常见的是看到指向 FQDN 的 A 记录的 CNAME 记录;但是,这里的情况并非如此。请注意,Opensource.com 的 A 记录没有关联的主机名。可以有一个适用于整个域的记录,就像这里的情况一样。

权威部分列出了 Opensource.com 域的权威名称服务器。在本例中,这些是 Red Hat 名称服务器。请注意,这些条目的记录类型为 NS。

附加部分列出了 Red Hat 名称服务器的 A 记录。

在附加部分之后,我可以找到一些其他有趣的信息,包括返回结果中显示的信息的服务器的 IP 地址。在本例中,它是我自己的内部名称服务器。

DNS 客户端配置

大多数计算机只需要少量配置即可使其能够访问名称服务。它通常包括将一到三个名称服务器的 IP 地址添加到 /etc/resolv.conf 文件中。这通常在大多数家庭和笔记本电脑的启动时执行,因为它们是使用 DHCP(动态主机配置协议)配置的,DHCP 为它们提供 IP 地址、网关地址和名称服务器的 IP 地址。

对于静态配置的主机,resolv.conf 文件通常在安装期间从执行安装的系统管理员输入的信息生成。在当前的基于 Red Hat 的发行版和其他使用 NetworkManager 管理网络配置和执行连接管理的发行版中,静态信息(如名称服务器、网关和 IP 地址)都存储在位于 /etc/sysconfig/network-scripts 中的接口配置文件中。

可以通过将该信息添加到接口配置文件来覆盖提供给主机的默认值。例如,我有时会将我首选的名称服务器添加到我的笔记本电脑和上网本上的接口配置文件中。公共场所(如酒店、咖啡店,甚至朋友的个人 Wi-Fi 连接)中的远程连接提供的许多名称服务器可能不可靠,并且在某些情况下可能会使用故意审查结果或将查询重定向到广告页面的转发器,因此我始终将 Google 公共名称服务器插入到我的接口配置文件中。有关接口配置文件的信息,请参阅我的文章如何在 Linux 中配置网络

另请注意,NetworkManager 为其连接的每个 Wi-Fi 网络创建一个接口配置文件。配置文件以网络的 SSID(服务集标识符)命名。请务必将所需的名称服务器条目添加到正确的文件中。

下面列出了 NetworkManager 在过去几个月内在我的笔记本电脑上创建的一些接口配置文件。

  • ifcfg-enp0s25(这是有线网络的配置文件。)
  • ifcfg-FBI-DHS.TF1_EXT
  • ifcfg-HOME-14A2
  • ifcfg-linksys
  • ifcfg-LinuxDude
  • ifcfg-MomsPlace
  • ifcfg-FBI-van
  • ifcfg-PointSourceGuest
  • ifcfg-Red_Hat_Guest
  • ifcfg-Sands_3_hoa1
  • ifcfg-Sheraton_Raleigh_Guest_Access
  • ifcfg-SM-CLC1
  • ifcfg-xfinityWi-Fi

不,我与 FBI 没有任何联系。我认识的某位不愿透露姓名的人具有有趣的幽默感,并且喜欢让邻居感到紧张。

DNS 记录类型

有许多不同的 DNS 记录类型,我想在这里介绍一些更常见的类型。我的下一篇文章将介绍如何使用 BIND 创建您自己的名称服务器,并将使用许多这些记录类型来构建您的名称服务器。这些记录类型用于构成 DNS 数据库的区域文件中。

所有这些记录中的一个常见字段是 “IN”,它指定这些是 INternet 记录。

Wikipedia 上查看完整的 DNS 记录类型列表

SOA

SOA 是起始授权记录。它是任何正向或反向区域文件中的第一个记录,它将此标识为它描述的域的权威源。它还指定某些功能参数。典型的 SOA 记录如下面的示例所示。


@   IN SOA  epc.example.com   root.epc.example.com. (

                     2017031301      ; serial
                     1D              ; refresh
                     1H              ; retry
                     1W              ; expire
                     3H )            ; minimum

SOA 记录的第一行包含区域的服务器名称和区域管理员,在本例中为 root。

第二行是序列号。在本例中,我使用 YYYYMMDDXX 格式的日期,其中 XX 是计数器。因此,上面 SOA 记录中的序列号表示此文件的第一个版本,日期为 2017 年 3 月 13 日。此格式确保序列号的所有更改都以数字顺序递增。这样做很重要,因为辅助名称服务器(也称为从属服务器)仅在主服务器上区域文件的序列号大于辅助服务器上的序列号时才从主服务器复制。请务必在进行更改时递增序列号,否则辅助服务器将不会与修改后的数据同步。

SOA 记录的其余部分由辅助服务器应从主服务器执行刷新并在第一次刷新失败时等待重试的各种时间组成。它还定义了区域的权威状态过期前的时长。

时间以前都以秒为单位指定,但最近版本的 BIND 允许使用 W=周、D=天、H=小时和 M=分钟定义的其他选项。如果未使用其他说明符,则假定为秒。

$ORIGIN

$ORIGIN 记录就像变量赋值。BIND 程序将此变量的值附加到 A 或 PTR 记录中任何未以句点 (.) 结尾的名称,以便为该主机创建 FQDN(完全限定域名)。这减少了打字量,因为区域管理员只需键入主机名部分,而无需为每个记录键入 FQDN。

$ORIGIN         example.com.

此外,@ 符号用作此变量的快捷方式,文件中任何出现的 @ 都会被 $ORIGIN 的值替换。

NS

NS 记录指定区域的权威名称服务器。请注意,此记录中的两个名称都以句点结尾,因此 “.example.com” 不会附加到它们。此记录通常会通过其 FQDN 指向本地主机。

example.com.            IN      NS      epc.example.com.

请注意,主机 epc.example.com 也必须在区域中有一个 A 记录。A 记录可以指向主机的外部 IP 地址或本地主机地址 127.0.0.1。

A

A 记录是地址记录类型,它指定主机名和分配给该主机的 IP 地址之间的关系。在下面的示例中,主机 test1 的 IP 地址为 192.168.25.21。请注意,$ORIGIN 的值附加到名称 test1,因为 test1 不是 FQDN,并且在此记录中没有终止句点。

test1                   IN      A       192.168.25.21

A 记录是最常见的 DNS 数据库记录类型。

CNAME

CNAME 记录是主机 A 记录中名称的别名。例如,主机名 server.example.com 可能既充当 Web 服务器又充当邮件服务器。服务器会有一个 A 记录,并且可能有两个 CNAME 记录,如下所示。

server                  IN      A       192.168.25.1
www                     IN      CNAME   server
mail                    IN      CNAME   server

使用 dig 命令在 www.example.com 和 mail.example.com 上查找将返回 mail 或 www 的 CNAME 记录以及 server.example.com 的 A 记录。

PTR

PTR 记录用于提供反向查找。这是当您已经知道 IP 地址并且需要知道完全限定的主机名时。例如,许多邮件服务器对发送邮件服务器的所谓 IP 地址执行反向查找,以验证电子邮件标头中给出的名称和 IP 地址是否匹配。PTR 记录用于反向区域文件中。尝试确定可疑网络数据包的来源时,也可以使用反向查找。

请注意,并非所有主机都有 PTR 记录,并且许多 ISP 创建和管理 PTR 记录,因此反向查找可能无法提供所需的信息。

MX

MX 记录定义了邮件交换器(即域 example.com 的邮件服务器)。请注意,它指向上面示例中服务器的 CNAME 记录。请注意,MX 记录中的两个 example.com 名称都以点结尾,因此 example.com 不会附加到名称中。

; Mail server MX record
example.com.            IN      MX      10      mail.example.com.

域可以定义多个邮件服务器。上面 MX 记录中的数字 “10” 是优先级值。其他服务器可能具有相同的优先级或不同的优先级。数字越小,优先级越高。因此,如果所有邮件服务器都具有相同的优先级,则将以轮询方式使用它们。如果它们具有不同的优先级,则邮件传递将首先尝试传递到优先级最高的邮件服务器(数字最小的邮件服务器),如果该邮件服务器没有响应,则将尝试传递到优先级次高的邮件服务器。

其他记录

您可能会在 DNS 数据库中遇到其他类型的记录。一种类型是 TXT 记录,用于记录有关 DNS 数据库中区域或主机的注释。TXT 记录也可以用于 DNS 安全。其余 DNS 记录类型超出了本文的范围。

最终想法

名称服务是使互联网易于访问的非常重要的组成部分。它将连接到互联网的无数个不同主机绑定到一个有凝聚力的单元中,从而可以轻松地与地球的遥远角落进行通信。它具有复杂的分布式数据库结构,这种结构可能甚至无法完全知晓,但任何连接的设备都可以快速搜索该结构,以查找数据库中具有条目的任何其他设备的 IP 地址。

如果您是几乎任何规模的网络上的系统管理员,您可能会发现了解如何构建自己的名称服务器很有帮助。我将在我的下一篇文章《在 Linux 上构建您自己的 DNS 服务器》中介绍如何做到这一点。

资源

David Both
David Both 是一位开源软件和 GNU/Linux 倡导者、培训师、作家和演讲者。他自 1996 年以来一直从事 Linux 和开源软件工作,自 1969 年以来一直从事计算机工作。他是 “系统管理员 Linux 哲学” 的坚定拥护者和传播者。

5 条评论

AAAA 记录是 IPv6 中 A 记录的等效项,越来越普遍。dig 默认只返回 A 记录,因此您需要使用类型集进行额外的查询,或者使用 host 命令,该命令也包含在 bind-utils 中。

$ host facebook.com
facebook.com 的地址为 157.240.3.35
facebook.com 的 IPv6 地址为 2a03:2880:f112:83:face:b00c:0:25de
facebook.com 的邮件由 10 msgin.vvv.facebook.com 处理。

对于网络计算来说,这是一个令人难以置信的资源。David,您是一位学者。

谢谢,Don。不确定我是不是 “学者”,但我尝试以我希望别人向我解释的方式来解释事情。;-)

回复 by Don Watkins

您好,多么精彩的解释,这是教学生关于网络的道路。我一直在阅读您的文章。非常感谢。

精彩的解释。感谢分享!!!!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© 2025 open-source.net.cn. All rights reserved.