DNS记录类型

经过前面学习,我们初步掌握了域名系统的基本原理。

我们知道,域名可以和指定的 IP 进行关联,进而充当 IP 的别名。我们通过域名来访问网络服务时,域名系统会帮我们将域名解析成对应的 IP 地址。

那么,域名是否只能关联 IP 地址呢?其实并不是。除了 IP 地址,域名还可以关联其他类型的信息。

实际上,域名和与之关联的信息,就构成了一条 DNS记录DNS record )。DNS记录可以理解成一个键值对:

  • 键:域名;
  • 值:与域名关联的值;

除了 IP 地址,DNS记录值还可以是 IPv6 地址、别名、文本等等。据此,DNS记录可分为若干不同类型,包括:

  • A ,主机 IP 地址;
  • AAAA ,主机 IPv6 地址;
  • ALIAS ,自动解析的别名( alias );
  • CNAME ,别名的权威名称( canonical name );
  • MX ,邮件交换服务器( Mail eXchange );
  • NS ,域名服务器( name server );
  • TXT ,描述文本;

记录类型也就是 DNS 报文中,问题记录和资源记录的类型( Type )。

A记录

A 记录,表示主机的 IP 地址,这是最常见的 DNS 记录类型。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
root@netbox [ ~ ]  ➜ dig test.fasionchan.com

; <<>> DiG 9.16.1-Ubuntu <<>> test.fasionchan.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;test.fasionchan.com.		IN	A

;; ANSWER SECTION:
test.fasionchan.com.	752	IN	A	10.0.0.1

;; Query time: 71 msec
;; SERVER: 192.168.65.1#53(192.168.65.1)
;; WHEN: Mon Apr 26 17:22:16 CST 2021
;; MSG SIZE  rcvd: 53

AAAA记录

AAAA 记录,表示主机的 IPv6 地址,与 A 记录类似。IP 地址长度为 4 字节,IPv6 地址长度为 16 字节,这也是 AAAA 记录的由来。随着 IPv6 的部署,AAAA 记录也正变得常用了。

dig 命令默认查询 A 记录,如果想查询 AAAA 记录,必须通过命令行参数指定:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
root@netbox [ ~ ]  ➜ dig t-aaaa.fasionchan.com AAAA

; <<>> DiG 9.16.1-Ubuntu <<>> t-aaaa.fasionchan.com AAAA
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5088
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;t-aaaa.fasionchan.com.		IN	AAAA

;; ANSWER SECTION:
t-aaaa.fasionchan.com.	752	IN	AAAA	::1

;; Query time: 50 msec
;; SERVER: 192.168.65.1#53(192.168.65.1)
;; WHEN: Mon Apr 26 17:37:10 CST 2021
;; MSG SIZE  rcvd: 67

CNAME记录

CNAME 记录,表示别名的 权威名称canonical name )。

域名可以取别名,以 webserver.fasionchan.com 为例,它可以取一个别名,比如:network.fasionchan.com 。如此一来,我们称前者是后者的 权威名称 ,CNAME 记录则保存权威名称。

当查询别名 network.fasionchan.com 时,如果 DNS 服务器返回的是 CNAME 记录,我们还需要进一步查询权威名称,才能得到最终结果。当然了,大部分 DNS 缓存服务器会自动帮我们做这件事情。

那么,域名为什么需要别名呢?CNAME 记录又有什么典型的应用场景呢?

假设我有一台 Web 服务器,它上面部署了多个站点:

  • 我的网络专栏:network.fasionchan.com
  • 我的 Linux 专栏:linux.fasionchan.com
  • 我的 Python 专栏:python.fasionchan.com

我可以申请一个域名 webserver.fasionchan.com ,通过 A 记录指向 Web 服务器;然后为几个专栏域名配置 CNAME 记录,指向 webserver.fasionchan.com

这样做有一个好处:如果我调整了 Web 服务器,将它迁移到另一台主机上,我只需修改 webserver.fasionchan.com 一个域名,其他专栏域名均无须调整。

我的个人网站 fasionchan.com 部署在阿里云 CDN 上,域名也是通过 CNAME 记录指向一个阿里云域名。不然的话,只要阿里云 CDN 一调整,我就得修改域名!这肯定会是一场噩梦!

MX记录

MX 记录,表示 邮件交换mail exchange )服务,即邮件服务器。其中,MX 是 Mail eXchange 的缩写。

电子邮件可以是说是互联网中发展最早,应用最为广泛的应用。我们发送邮件时,客户端需要根据自己的邮箱账号找到邮件服务器的地址,并通过 SMTP 协议和它进行通信。

每个邮件厂商都有一个自己的域名,查询该域名的 MX 记录,即可找到邮件服务器的地址。以 QQ邮箱 为例,它的域名是 qq.com 。我们执行 dig 命令查询 qq.com 的 MX 记录:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@netbox [ ~ ]  ➜ dig qq.com MX

; <<>> DiG 9.16.1-Ubuntu <<>> qq.com MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49462
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;qq.com.				IN	MX

;; ANSWER SECTION:
qq.com.			1435	IN	MX	20 mx2.qq.com.
qq.com.			1435	IN	MX	10 mx3.qq.com.
qq.com.			1435	IN	MX	30 mx1.qq.com.

;; ADDITIONAL SECTION:
mx3.qq.com.		463	IN	A	113.96.208.206
mx3.qq.com.		3	IN	AAAA	240e:ff:f101:10::127
mx1.qq.com.		2409	IN	A	14.215.140.20

;; Query time: 18 msec
;; SERVER: 10.2.66.66#53(10.2.66.66)
;; WHEN: Wed Apr 28 18:40:03 CST 2021
;; MSG SIZE  rcvd: 155

由此可见,QQ邮箱总共有 3 个邮件交换服务,分别是:

  • mx1.qq.com.
  • mx2.qq.com.
  • mx3.qq.com.

我们可以从中挑选一台,比如 mx3.qq.com. ,它的 IP 地址是 14.215.140.20 。通过 SMTP 协议连接上去,认证完毕后,即可正常收发邮件了。

读到此处,您可能会有疑问了:根据域名找到邮件服务器,A 记录不也能够胜任吗?

确实如此,A 记录理论上也是可以胜任的。只不过在互联网发展早期,电子邮件是一个重量级应用。网络先驱们为它特地设计了 MX 记录,也就不奇怪了。

实际上,腾讯不止 QQ 邮箱一个产品,还有腾讯网。由于邮件服务有自己的 MX 记录,腾讯网可以使用 A 记录。这样一来,两者可以使用相同的域名qq.com

浏览器访问腾讯网时,可以查询 qq.com 的 A 记录,得到服务器地址。我们可以执行 dig 命令模拟一下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@netbox [ ~ ]  ➜ dig qq.com A

; <<>> DiG 9.16.1-Ubuntu <<>> qq.com A
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46166
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;qq.com.				IN	A

;; ANSWER SECTION:
qq.com.			193	IN	A	203.205.254.157
qq.com.			193	IN	A	61.129.7.47
qq.com.			193	IN	A	183.3.226.35
qq.com.			193	IN	A	123.151.137.18

;; Query time: 11 msec
;; SERVER: 10.2.66.66#53(10.2.66.66)
;; WHEN: Wed Apr 28 18:41:16 CST 2021
;; MSG SIZE  rcvd: 99

NS记录

NS 记录,保存着负责该域解析的权威DNS服务器,记录值为DNS服务器的域名。

以我的域名 fasionchan.com 为例,它在腾讯云 dnspod 上解析。我注册域名后,需要配置 NS 记录,指向 dnspod 服务器。这个 NS 记录,最终会被同步到 .com 顶级域名服务器。

由此一来,当客户端发起迭代解析时,com 域名服务器就知道查询该域名应该去找 dnspod

如果我想将域名转到阿里云上去解析,我只需找我的域名注册商,修改 NS 记录指向阿里云的 DNS 服务器。一切就绪后,我就可以在阿里云上管理我的域名了。

我还可以将子域 lumy.fasionchan.com 送给我的朋友 Lumy ,只要我在 dnspod 上为 lumy.fasionchan.com 添加 NS 记录,指向 Lumy 选择的 DNS 服务器即可。此后,Lumy 就可以在自己的 DNS 服务上管理该域。

当有客户端迭代查询 lumy.fasionchan.com 这个子域时,dnspod 将根据该 NS 记录,告诉客户端应该去找 Lumy 的 DNS 服务器查询(假设 Lumy 在阿里云上管理子域):

由此可见,NS 记录在 DNS 迭代查询中扮演着非常重要的角色。上级 DNS 服务器通过 NS 记录,找到下级 DNS 服务器,直到域名查询完毕。

理论上,根域也需要 NS 记录,来指向全球的 13 台根域名服务器。那根域的 NS 记录维护在哪里呢?由于根服务器极少改动,所以可以通过配置的形式指定。客户端可以查询根域 NS 记录,DNS 缓存服务器会根据自己的配置进行回答:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
root@netbox [ ~ ]  ➜ dig . NS

; <<>> DiG 9.16.1-Ubuntu <<>> . NS
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10652
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 4

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;.				IN	NS

;; ANSWER SECTION:
.			1767	IN	NS	h.root-servers.net.
.			1767	IN	NS	l.root-servers.net.
.			1767	IN	NS	k.root-servers.net.
.			1767	IN	NS	f.root-servers.net.
.			1767	IN	NS	b.root-servers.net.
.			1767	IN	NS	d.root-servers.net.
.			1767	IN	NS	m.root-servers.net.
.			1767	IN	NS	i.root-servers.net.
.			1767	IN	NS	c.root-servers.net.
.			1767	IN	NS	g.root-servers.net.
.			1767	IN	NS	e.root-servers.net.
.			1767	IN	NS	j.root-servers.net.
.			1767	IN	NS	a.root-servers.net.

;; ADDITIONAL SECTION:
h.root-servers.net.	2926	IN	A	198.97.190.53
c.root-servers.net.	37	IN	A	192.33.4.12
a.root-servers.net.	2217	IN	A	198.41.0.4

;; Query time: 17 msec
;; SERVER: 10.2.66.66#53(10.2.66.66)
;; WHEN: Thu Apr 29 19:45:54 CST 2021
;; MSG SIZE  rcvd: 300

TXT记录

TXT 记录用来保存一些文本信息,这些信息可以用作配置,但不太常见。我们举个例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
root@netbox [ ~ ]  ➜ dig t-txt.fasionchan.com TXT

; <<>> DiG 9.16.1-Ubuntu <<>> t-txt.fasionchan.com TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23557
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;t-txt.fasionchan.com.		IN	TXT

;; ANSWER SECTION:
t-txt.fasionchan.com.	600	IN	TXT	"hello world"

;; Query time: 55 msec
;; SERVER: 10.2.66.66#53(10.2.66.66)
;; WHEN: Wed Apr 28 18:04:24 CST 2021
;; MSG SIZE  rcvd: 73

很多云平台使用 TXT 记录来验证域名所有权:先让域名所有人配置一条特殊的 TXT 记录,然后查询该记录看结果是否匹配。

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: