域名系统是一个分层分布命名系统,负责为计算机,服务或者任何连接到因特网和私人网络的资源提供命名。它通过域名分配到参与的网络实体联合了各种各样的信息。更重要的是,它会将域名翻译,使人们可以轻松记住网站的地址,而不是数字形式的IP地址。域名系统是大多数因特网服务的关键功能性组件,因为它是因特网首要的目录服务。以上解释引用自维基百科
域名(Domain names),其实就是网站的网址。电脑可以理解的网址的格式是下面这样的:
173.194.121.32
又或者是这样的:
2027:0da8:8b73:0000:0000:8a2e:0370:1337
这些由数字或是数字和字母组成的地址,对于计算机来说很容易理解和处理,但是对人来说,很难记住,于是域名系统应运而生。
有了域名系统,网址就变成了下面的样子:
developer.mozilla.org
www.baidu.com
因为有了域名,网址可以变成具体的名字,容易识别和记忆。
一个域名由一个或多个部分组成,技术上讲叫做标签,多个标签惯例上由点号连接和分隔,例如example.com
。
域名结构1
如上图所示,域名是从后往前看的,最后一个部分,.org
被称作 Top-level domains,汉语意思为顶级域名。
然后往左,是第一个标签,再往左是第二个标签。
通常紧挨着顶级域名的第一个标签也被叫做二级域名 (Second-level damains)。
所以依次类推就是下面这张图:
域名结构2
如上图所示,从顶级域名往左,每隔一个点就会降一个层次,分别为二级,三级,以此类推。
也就是说左边的低级别域是右边的子域。例如,对于example.com
中,example
域是com
域的子域。
类似 .com .net .org 这样的域名被称为顶级域名,一个域名会以一个顶级域名作为结尾。
顶级域名一般有两种,一种是通用顶级域,一种是国家和地区顶级域。
举例如下:
通用顶级域
.gov 政府网站
.edu 学校和教育相关网站
.com 商业,注册量最大最通用的域名
.org 非营利组织
.net 网络,被定位为网络基础服务提供商
.int 国际组织
国家顶级域
.cn 中国
.us 美国
.uk 英国
上面已经说过,紧挨着顶级域名的就是二级域名,再往左就是三级域名,然后是四级域名,等等以此类推。
一般有多少级域名是没有限制的,一个网址可以有四级域名,例如:sos.state.oh.us
。
一般二级域名的名字都是公司的名字,或者产品和服务的名字,例如:www.baidu.com
。
而下一级域名一般被用来指定主机服务器,比如www.baidu.com
中的www
指明了是万维网服务器,ftp.example.com
中的ftp
指明了是FTP服务器,mail.example.com
中的mail
指明了是电子邮件服务器。
IP 地址是我们称之为可访问的网络地址。每一个 IP 地址必须是独一无二的。
IPv4 是最普遍的 IP 地址形式,它由4组0 ~ 255数字组成,彼此用点号分隔。例如下面:
111.222.111.222
IPv6 地址是最新的 IP 地址形式,它由8组4位的16进制数字组成,彼此用分号分隔。例如下面:
2001:0DB8:02de:0000:0000:0000:0000:0e13
有了 DNS,就可以通过域名找到对应的 IP 地址来访问网站。
一个被用来将域名翻译成对应的 IP 地址的服务器就是域名服务器。这些服务器在 DNS 系统中做了大部分的工作。当大量的域名翻译工作对一台服务器来说任务量太重的时候,就拆分出很多台服务器,每一台服务器负责不同的子域名,这样减轻了一台服务器的工作量。
前面解释了一些涉及 DNS 系统的术语,但是 DNS 到底是如何工作的?
从很高级别的角度来看这个系统会觉得很简单,但是深入细节后其实很复杂。
就像之前说的,DNS 是一个分层的系统。这个系统的最高处就是根服务器。这些服务器被不同的机构控制并且被 ICANN 委派权限。(ICANN,互联网名称与数字地址分配机构)
目前正在运转的根服务器一共有13台。然而,每一分钟都有巨大数量的域名需要被解析,这其中处理请求的每一台服务器其实都是镜像。有趣的事情是每一台根服务器的镜像服务器都与之分享相同的 IP 地址。当向某个确定的根服务器的请求被接受到时,请求会被转向最近的镜像服务器。
这些根服务器是做什么用的?根服务器用来处理有关获取顶级域名(Top-level domains)信息的请求。所以当一个请求获取的信息是低级别域名服务器无法解析的,紧接着就会去查询根服务器。
根服务器实际上不知道域在哪里托管。但是,它们将能够将请求者引导到处理特定请求的顶级域的域名服务器。
所以当一个请求www.wikipedia.org
发向根服务器的时候,根服务器并不会找到最终的地址。它会检查区域文件(zone files)中匹配www.wikipedia.org
这个网站的一个列表,而不是仅仅查找到一个匹配项。
它会查找到负责org
这个顶级域的域名服务器的地址然后告诉请求实体跳转过去。
然后请求者会发送一个新的请求到这个 IP 地址(根服务器返回的地址),这个地址是负责对应的顶级域的服务器。
继续我们的例子,一个请求发送到知道org
顶级域的服务器,看看它是否知道www.wikipedia.org
的位置。
服务器再一次查找服务器中的区域文件(zone files)。
最后在文件中会找到一个记录,这个记录列出了负责wikipedia.org
的域名服务器。这个查询结果离我们想要的答案接近了。
此刻,请求者知道了负责wilipidia.org
真实 IP 地址的域名服务器的 IP 地址。接着就再次发送一个新的请求到这个域名服务器。
服务器查找它的区域文件(zone files),在其中找到了一个与wikipedia.org
网站相关联的文件,在这个文件中,有一条关于www
主机的记录。这一条记录会告知这个主机真实的 IP 地址。然后域名服务器将真实地址返回给请求者。
上面的一系列过程至此,走通了一遍 DNS 的处理流程。
在上面的场景中,我们提到了“请求者”。在这样的情况下谁是请求者?
几乎在所有情况下,这个请求者就是我们在此处说的“解析域名服务器”。一个解析域名服务器是专门用来向其他服务器提问的服务器。它基本上作为一个中间人在用户和其他服务器之间,缓存了用户之前的查询结果,这样可以提高访问速度,它还知道哪些根服务器可以帮助解析请求。
总的来说,一个用户将会有好几个配置好的解析域名服务器。这些解析域名服务器通常由 ISP 提供(互联网服务提供商)。例如谷歌提供了解析 DNS 的服务器供用户查询信息。你可以在你的电脑上手工配置。
当你在浏览器地址栏中输入一个 URL 后,计算机首先会去看是否有现成的对应的地址。它会查找系统的“hosts”文件以及其他几个地方。然后发送请求给解析域名服务器然后等待服务器返回网站的真实 IP 地址。
解析域名服务器先会去检查缓存。如果缓存中没有,就会执行我们上面讲过的 DNS 的流程。
解析域名服务器帮助用户做了很多工作,所以客户端这边只需要向它发出请求然后等待最终结果就行了。
上面的 DNS 工作流程中我们提到了一个概念:区域文件(zone files)。
区域文件里存储着域名服务器所知道的关于域名的信息。域名服务器知道的域名信息都会存储在区域文件中。大多数发送到普通域名服务器的请求都会跳转,因为服务器没有对应的区域文件。
一个域名服务器的区域文件越多,它能够答复的请求就越多,并且越可信。
一个区域文件通常只包含一个单独的域的信息。它保存的信息是资源地址的多条记录。
区域文件的参数 $ORIGIN 是一个默认情况下这个域的最高级别依据。
所以如果一个区域文件被用作配置example.com
域名,它的 $ORIGIN 就会被设置为example.com.
。
这个要么被设置在区域文件的最顶层,要么被定义在 DNS 服务器的配置文件中来标记区域文件。无论什么方式,这个参数都用来描述一个域对什么具有权限。
类似的,$TTL 配置了提供的信息“存活的时间”。它就是一个定时器。一个缓存域名服务器会使用上一次查询结果来响应请求直到 $TTL 时间过去。
在区域文件之中存有很多不同的记录类型。下面来过一遍有哪些常见的(或者说必须有的)记录类型。
权威记录的起始(Start of Authority),或者叫 SOA 记录,是一种所有区域文件中强制必须存在的记录。SOA 记录必须是区域文件中的第一条真实记录(尽管 $ORIGIN 或者 $TTL 说明可能会出现在 SOA 之上)。它也是最复杂难懂的一种记录类型。
SOA 记录看起来就像下面的样子:
domain.com. IN SOA ns1.domain.com. admin.domain.com. (
12083 ; serial number
3h ; refresh interval
30m ; retry interval
3w ; expiry period
1h ; negative TTL
)
让我们来解释每一部分的作用:
domain.com.
:这是区域的根。它指定了这个区域文件对应的域名是domain.com.
。通常,你会发现这个域名被替换成了@
符号,这只是一个占位符用来替代 $ORIGIN 变量的内容。- IN SOA:
IN
部分意思是因特网(很多记录中都会有IN
)。SOA 是指示此处是权威记录的起始位置的指示器。 ns1.domain.com.
:这一项定义了对应这个域名的主服务器。服务器可以是主服务器也可以是从服务器,如果动态 DNS 配置了一个服务器需要作为主服务器,那么就是这一项。如果你没有配置动态 DNS,那么这里写的只是主服务器的其中一台。admin.domain.com.
:这个是这个区域文件对应域名的管理员邮箱地址。邮箱地址中的@
符号被替换成了点号。如果邮箱地址的名字部分中有点号,就会被替换成一个\
(例如[email protected]
会变成your\name.damain.com
)。- 12083:这是区域文件的序列号。每一次编辑了一个区域文件,你必须让序列号这个数字增大使区域文件能够正确地扩散。从服务器会检查是否主服务器的区域文件的序列号比自己系统上的大。如果是,就会请求新的区域文件,如果否,就会继续使用原来的文件。
- 3h:这是更新区域文件的时间间隔。这是从服务器轮询主服务器获取区域文件变化的等待时间。
- 30m:这是再次尝试获取区域文件的时间间隔。如果从服务器无法连接到主服务器,就会等待这个时间后再尝试轮询主服务器。
- 3w:这是终止时间。如果这么多时间过去后从服务器还是无法连接主服务器,那么它就不在作为这个区域文件的可靠的源。
- 1h:这是域名服务器缓存一个查找记录错误的缓存存活时间,如果在这个文件中找不到某个记录,就会缓存这个找不到的错误这么长时间。
A 和 AAAA 记录都是画出一张主机对应 IP 地址的地图。A
记录被用于记录 IPv4 地址,而AAAA
记录 IPv6 地址。
通常它们的格式如下所示:
host IN A IPv4_address
host IN AAAA IPv6_address
因此自从我们的 SOA 记录在ns1.domain.com
的位置召集了一个主服务器,我们将必须记录下这个地址对应的 IP 地址,因为根据此区域文件ns1.domain.com
是属于domain.com
域的。
这个记录会像下面这个样子:
ns1 IN A 111.222.111.222
请注意不必给出域名的全称。我们可以只给出主机名,而不用加上 FQDN(全限定域名) 然后 DNS 服务器会使用 $ORIGIN 变量自动填充剩余的部分。然而,我们应该更频繁地使用 FQDN (全限定域名)为了语义化:
ns1.domain.com. IN A 111.222.111.222
在大多数案例中,你会定义你的服务器名字为www
:
www IN A 222.222.222.222
我们还应该告知基础域名被解析到哪里。我们可以像下面这么做:
domain.com. IN A 222.222.222.222
可以使用@
符号来替代基础域名:
@ IN A 222.222.222.222
我们也可以将在基础域下的任何域名解析到某个 IP 地址,即使这些域名并没有被明确定义。使用*
通配符:
* IN A 222.222.222.222
上面所有这些工作对于 AAAA 记录都同样,却别只是 AAAA 记录 IPv6 地址
CNAME 记录为你的服务器定义了规范域名的别名(规范的域名由 A 或者 AAAA 记录来定义)。
举个例子,我们可以拥有一个 A 域名记录来定义server1
主机,然后使用www
作为这个主机的别名:
server1 IN A 111.111.111.111
www IN CNAME server1
你可能会意识到这些别名可能会造成一些性能的损失因为他们需要向服务器发出额外的查询。大多数情况下,相同的结果可以使用额外的 A 或者 AAAA 记录来实现。
一个 CNAME 记录的建议使用场景是为在本区域文件之外的资源提供一个别名。
MX 记录被用来定义被域名使用的邮件交换服务。这能够帮助邮件信息正确抵达邮件服务器。
不像很多其它的记录类型,邮件记录通常不会是主机和地址的对应地图,因为它们适用于整个区域文件。通常像下面这样:
IN MX 10 mail.domain.com.
注意在记录的一开始并没有主机名称。
还要注意到有一个额外数字在中间。那个数字代表优先级别,它帮助电脑决定向哪一个服务器发送邮件如果存在多个邮件服务器的情况。数字越小,优先权越高。
MX 记录通常指向一个主机名,这个主机名由 A 或者 AAAA 记录来定义,而不是由 CNAME 定义。
如果我们有两个邮件服务器。那么就会有如下的记录:
IN MX 10 mail1.domain.com.
IN MX 50 mail2.domain.com.
mail1 IN A 111.111.111.111
mail2 IN A 222.222.222.222
这个例子中,mail1
主机名是优先权级别较高的邮件交换服务器。
也可以像下面这样写:
IN MX 10 mail1
IN MX 50 mail2
mail1 IN A 111.111.111.111
mail2 IN A 222.222.222.222
这个记录类型定义了此区域文件使用的名称服务器。
也许你会觉得奇怪,“如果区域文件本身就在名称服务器上,为什么还需要去引用自身?”。使 DNS 系统如此成功的一部分原因其实就是它的多级别缓存。将名称服务器定义在区域文件中的一个原因就是区域文件可能实际上在另外一台名称服务器上有一个拷贝的缓存版区域文件来真正起作用。还有其他原因需要名称服务器在自身的区域文件记录中定义自己,但是我们暂时不会研究那么深入。
就像 MX 记录一样,这里也有整个区域的参数,因此它们也不指定主机名。通常,NS 记录如下所示:
IN NS ns1.domain.com.
IN NS ns2.domain.com.
你应该在每一个区域文件中定义起码两个名称服务器,如果其中一台服务器出了问题,那么还能够正常运行。大多数 DNS 服务器软件把只有一个名称服务器的区域文件看做是无效的。
像往常一样,还包括了主机名对应地图使用 A 或者 AAAA 记录:
IN NS ns1.domain.com.
IN NS ns2.domain.com.
ns1 IN A 111.222.111.111
ns2 IN A 123.211.111.233
还有其他记录类型可以使用,但是上面这些可能是你会遇到的最常用常见的记录类型了。
指针记录被用来定义一个和某一个 IP 地址相联合的名称。指针记录是 A 或者 AAAA 记录的相反的操作。指针记录是唯一的,它们以 .arpa 根起始并且被授权于 IP 地址的所有者。区域互联网注册管理机构(Regional Internet Registries or RIRs)来管理 IP 地址授权给哪些机构和服务提供商。区域互联网注册管理机构包括 APNIC,ARIN,RIPE NCC,LACNIC 和 AFRINIC。
下面是一个指向 111.222.333.444 的指针记录:
444.333.222.111.in-addr.arpa. 33692 IN PTR host.example.com.
下面是一个 IPv6 地址的指针记录的例子,展示了数字格式的谷歌 IPv6 DNS 服务器 2001:4860:4860::8888 的反向的结果。
8.8.8.8.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6.8.4.0.6.8.4.1.0.0.2.ip6.arpa. 86400IN PTR google-public-dns-a.google.com.
命令行的 dig 工具使用 -x 标识可以用来查看 IP 地址反向的 DNS 名称。
下面是一个 dig 命令的例子。+short 被添加到后面来减少输出的反向 DNS 名称的长度。
dig -x 8.8.4.4 +short
上面的dig 命令的输出结果就是指针记录中的域名,对应了那个 IP 地址:
google-public-dns-b.google.com.
互联网中的服务器使用指针记录来放置域名在日志入口中,作出明智的垃圾邮件处理决策,还可以显示可读性好的设备细节。
大多数通用的邮件服务器会去查找它接收到的邮件的来源 IP 地址的指针记录。如果源头 IP 地址没有相对应的指针记录,那么这封邮件就会被处理为垃圾邮件而被拒绝。指针记录中的全限定域名(FQDN)和被发送的邮件的来源域名互相匹配这件事并不重要。重要的事情是存在一个有效的指针记录指向一个一致的和匹配的 A 记录。
通常因特网上的网络路由会赋予和它们的物理地址相一致的指针记录。举个例子,你可能看到对于一个纽约市或者芝加哥的路由有向'NYC'或者'CHI'这样的引用。当运行一个追踪路由或者 MTR 并且检测互联网流量的时候很有帮助。
大多数提供商都提供专用服务器或者 VPS 服务器,将会给用户设置自己的 IP 地址的指针记录的能力。
CAA 记录被用来指定哪一个 CA (权威认证中心)允许发布 SSL/TLS 证书给你的域名。自从2017年9月8号之后所有 CA 都需要在发布证书之前检查这个记录。如果不存在记录,那么任何 CA 都可以发布证书。另外,只有指定的 CA 可以发布证书。CAA 记录可以应用于单个主机名或者整个域名。
CAA 记录的例子如下:
example.com. IN CAA 0 issue "letsencrypt.org"
上面例子中的主机名,IN 和记录类型(CAA)都是共有的 DNS 范畴。而独特的 CAA 信息是 0 issue "letsencrypt.org"
部分。由三部分组成:标识(0),标签(issue),和值("letsencrypt.org")。
- 标识是一个整数,用来指示一个 CA 如何处理它不理解的标签。如果标识是 0,那么记录将会被忽略。如果是 1,那么 CA 必须拒绝发布证书。
- 标签是一个字符串代表一条 CAA 记录的目的。
- 值是一个对应记录的标签的字符串。对于 issue 来说这个值是用来授予许可的 CA 的域名。
你可以使用 dig 命令获取 CAA 记录使用下面选项:
dig example.com type257
现在你应该大致了解了 DNS 如何工作。一旦熟悉了策略那么普通的概念就相对容易理解,但是对于缺乏经验的开发者来说仍然有一些东西比较有难度,需要在实践中学习。