DNS 服务器
DNS 服务器
DNS 服务介绍
DNS(Domain Name System,域名系统)服务是一种用于将域名转换为IP地址的分布式数据库服务。它是互联网的核心服务之一,使得用户能够通过易于记忆的域名来访问网站和其他网络服务,而无需记住复杂的IP地址。
DNS 也是一个存储网络主机和资源目录的分层命名系统。 目录中的信息将网络名称映射到不同资源记录。

学习DNS层次结构前,首先要搞清楚DNS层次结构中一些术语,例如domain,subdomain和zone
Domain
domain 是 resource records 的集合,该集合以通⽤名结尾,表示 DNS 命名空间的整个树,如 test.cloud
-
top-level domain(TLD- 顶级域)
由 Internet Assigned Numbers Authority(IANA-互联网号码分配机构)管理,并负责委派顶级域。
常见的TLD类型:
Generic TLDs(gTLD-通用顶级域名),最初是按主题组织的,包括.com,.edu和.net
等。
Country code TLDs(ccTLD-国家代码顶级域名),根据ISO 3166-1标准在国家范围上组织
的,并包括.us,.uk,.cn和.ru之类的域。
其他顶级域参考顶级域名参考[根域数据库][https://www.iana.org/domains/root/db]。 -
Subdomain
Subdomain 是另一个域的完整子树的域。 在讨论两个域之间的关系时使用此术语。 例如,lab.test.cloud是test.cloud的子域,而test.cloud是.com的子域。 我们也可以将test.cloud称为第二级域,并将lab.test.cloud称为第三级域。 -
Zone
Zone 是特定名称服务器直接负责的域。 它可能是整个域,也可能只是域的一部分。Zone可以将
部分或全部子域都委派给另一个名称服务器或多个名称服务器。
例如,root名称服务器对root zone具有权威性,但它们将.com域的职责委派给其他名称服器,这些名称服务器为.com区域提供权威性应答。 这些服务器还可以继续将责任委派给其他名称服务器。

DNS 查询
主机的 DNS 查询主要有两种方式:递归查询和迭代查询
DNS 查询时,DNS 请求报头部的 RD 字段决定了查询类型:
RD 为 1 => 递归查询,默认查询方式。
RD 为 0 => 迭代查询。
递归查询:以本地名称服务器为中心,DNS 客户端只是发出原始的域名查询请求报文,然后就一
直处于等待状态,直到本地名称服务器发来了最终的查询结果。此时的本地名称服务器就相当中介代理的作用。
迭代查询:以DNS客户端自己为中心。所有查询工作全部是 DNS 客户端自己进行。DNS客户 会按照顺序向本地名称服务器 、一级名称服务器、二级名称服务器、权威名称服务器发出查询 DNS的请求查询报文,这个过程中每一级服务器就会返回一个能解答这个查询的下一个名称服务器列表 A,获取到下个查询列表信息 A 后 DNS 客户 会再向返回的列表 A 中发出请求,直到找到最终负责所查域名的名称服务器,从它得到最终结果。
有些DNS服务器,为了减轻自己的负载,则会配置禁止使用递归查询,则客户端只能使用递归查
询
- 递归查询 以 本地名称服务器 为中心进行查询
- 迭代查询 以 DNS客户端自己 为中心查询
迭代查询
迭代查询(Iterative Query) 也叫迭代解析。使用迭代解析方式时,所有的查询工作都是由 DNS 客户自己进行的,迭代查询遵循的是“参考与转接”原则。当一台 DNS 服务器(通常是根或顶级域服务器)收到迭代查询请求时,如果其本地没有直接答案,它不会代为向外询问,而是向请求者返回一个参考地址(Referral),即指向下一级更有权限的服务器地址。这种机制将查询的压力分散到了请求端(通常是运营商的递归服务器),确保了处于金字塔顶端的根服务器不会因为处理全球海量的嵌套递归任务而过载。
在实际运作中,迭代查询是一个层层收缩范围的过程。以查询 www.example.com 为例:本地 DNS 服务器首先以迭代方式询问根服务器,根服务器由于只维护顶级域信息,会给出 .com 服务器的地址;本地服务器转而询问 .com 顶级服务器,得到 example.com 授权服务器的地址;最后,本地服务器直接向该权威服务器发起请求,并最终获取主机记录。
如果它所配置的主名称服务器(如 Windows 系统中的 首选 DNS 服务器)不能解析的话,客户端还会继续向所配置的其它名称服务(如 Windows 系统中的 备用 DNS 服务器)查询。如果考虑了本地名称服务器的缓存技术(在 DNS 服务器上对一定数量查询过的记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率)的话,迭代名称解析的基本流程如下(在此仅以首先 DNS 服务器作为本地名称服务器为例,与其它备用 DNS服务器的解析流程完全一样):
- DNS 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。
- 本地名称服务器收到请求后,先查询本地的缓存。
- 如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端。
- 如果本地缓存中没有该域名的记录,则向 DNS 客户端返回一条 DNS 应答报文,报文中会给出一些参考信息,如本地名称服务器上的根名称服务器地址等。
- DNS 客户端在收到本地名称服务器的应答报文后,会根据其中的根名称服务器地址信息,向对应的根名称服务器再次发出与前面一样的 DNS 查询请求报文。
- 根名称服务器在收到 DNS 查询请求报文后,通过查询自己的 DNS 数据库得到请求 DNS 域名中顶级域名所对应的顶级名称服务器信息,然后以一条 DNS 应答报文返回给 DNS 客户端。
- DNS 客户端根据来自根名称服务器应答报文中的对应顶级名称服务器地址信息,向该顶级名称服务器发出与前面一样的 DNS 查询请求报文。
- 顶级名称服务器在收到 DNS 查询请求后,先查询本地的缓存:
如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给 DNS 客户端。
否则,通过查询后把对应域名中二级域名所对应的二级名称服务器地址信息以一条 DNS应答报文返回给 DNS 客户端。如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文,称为负响应。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。DNS 查找到这里就基本来可以获取域名对应的 IP 了,除非需要查找的域名没有配置 IP 则查询失败。
- 迭代查询-示例

假设客户端访问站点www.example.com ,那么 DNS 客服端的查询路径如下:
- DNS 客户端向所配置的本地名称服务器发出解析 www.example.com 域名的 DNS 请求报文。
- 本地名称服务器收到 客户端的 DNS 查询请求报文后,先查询本地缓存。假设没有查到该域名对应记录,则本地名称服务器把所配置的根名称服务器 a.rootserver.net 地址信息以 DNS 应答报文返回给 DNS 客户端。
- DNS 客户端在收到本地名称服务器的 DNS 应答报文后,根据其中给出的根名称服务器地址信息,向对应的根名称服务器再次发送解析 www.example.com 域名的 DNS 请求报文)。
- 根名称服务器在收到 DNS 查询请求后,通过查询得到 .com 顶级域名所对应的顶级名称服务器,然后把查询到的对应顶级域名信息以一条 DNS 应答报文返回给 DNS 客户端。
- DNS 客户端在收到根名称服务器的 DNS 应答报文,得到 .com 顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条解析 www.example.com 域名的的DNS 请求报文。
- .com 顶级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,先查询本地的缓存,假设也没有该域名的记录项,则查询example.com 所对应的二级名称服务器,然后把查询到的对应二级域名信息以一条 DNS 应答报文返回给 DNS 客户端。
- DNS 客户端在收到 .com 顶级名称服务器的 DNS 应答报文,得到 example.com 二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条解析www.example.com 域名的 DNS 请求报文。
- example.com 二级名称服务器在收到 DNS 客户端的 DNS 查询请求报文后,也先查询本地的缓存。假设也没有该域名的记录项,则查询 www.example.com 所对应的权威名称服务器(因为这个名称服务器已包括了整个域名 www.example.com 所在区域),然后把查询到的对应权威域名信息以一条 DNS 应答报文返回给 DNS 客户端。
- DNS 客户端在收到 example.com 二级名称服务器的 DNS 应答报文,得到www.example.com 三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器发送解析 www.example.com 域名的 DNS 请求报文。
- 权威名称服务器 www.example.com 在收到 DNS 客户端的 DNS 查询请求报文后,在它的DNS 区域数据库中查找,最终得出了 www.example.com 域名所对应的 IP 地址。然后向 DNS 客户端返回一条 DNS 应答报文。这样 DNS 客户端获取 IP 地址后就可以正常访问这个网站了。
递归查询
递归查询是默认的 DNS 解析方式。在这种解析方式中,如果客户端配置的本地名称服务器遇到不能解析的,则后面的查询全由本地名称服务器代替DNS 客户端进行查询,直到本地名称服务器从权威名称服务器得到了正确的解析结果,然后由本地名称服务器告诉 DNS 客户端查询的结果。
在递归查询过程中,一直是以本地名称服务器为中心的,DNS 客户端只是发出原始的域名查询请求报文,然后就一直处于等待状态,直到本地名称服务器返回最终的查询结果。此时的本地名称服务器就相当于中介代理的作用。
如果考虑了本地名称服务器的缓存技术(在 DNS 服务器上对一定数量查询过的记录保存一定时间,这样后面查询同样的域名信息时就可直接从缓存中调出来,以加速查询效率),则递归解析的基本流程如下(在此仅以首先 DNS 服务器作为本地名称服务器为例,与其它备 DNS 服务器的解析流程完全一样):
- 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求。
- 本地名称服务器收到请求后,先查询本地的缓存,如果有该域名的记录项,则本地名称服务器就直接把查询的结果返回给客户端;如果本地缓存中没有该域名的记录,则本地名称服务器再以 DNS 客户端的角色发送与前面一样的 DNS 域名查询请求发给根名称服务器。
- 根名称服务器收到 DNS 请求后,把所查询得到的所请求的 DNS 域名中顶级域名所对应的顶级名称服务器地址返回给本地名称服务器。
- 本地名称服务器根据根名称服务器所返回的顶级名称服务器地址,向对应的顶级名称服务器发送与前面一样的 DNS 域名查询请求。
- 顶级名称服务器在收到 DNS 查询请求后,也是先查询本地的缓存,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的二级域名所对应的二级名称服务器地址。
- 本地名称服务器根据根名称服务器所返回的二级名称服务器地址,向对应的二级名称服务器发送与前面一样的 DNS 域名查询请求。
- 二级名称服务器在收到 DNS 查询请求后,也是先查询本地的缓存,如果有所请求的 DNS 域名的记录项,则直接把对应的记录项返回给本地名称服务器,然后再由本地名称服务器返回给 DNS 客户端,否则向本地名称服务器返回所请求的 DNS 域名中的三级域名所对应的三级
名称服务器地址。 - 就这样本地名称服务器重复步骤 6 和步骤 7 的方法一次次地向三级、四级名称服务器等查询,直到最终的对应域名所在区域的权威名称服务器返回到最终的记录给本地名称服务器。
- 然后再由本地名称服务器返回给 DNS 客户,同时本地名称服务器会缓存本次查询得到的记录项。
如果在上述步骤中对应域名的权威名称服务器都说找不到对应的域名记录,则会向 DNS 客户端返回一条查询失败的 DNS 应答报文。当然,如果这个权威名称服务器上配置了指向其它名称服务器的转发器,则权威名称服务器还会在转发器指向的名称服务器上进一步重复上述步骤查询。另外,如果 DNS 客户端上配置了多个 DNS 服务器,则还会继续向其它 DNS 服务器查询的。
简单的讲,递归查询步骤; - 客户端向本机配置的本地名称服务器发出 DNS 域名查询请求,发出请求后客户端一直处于等待状态,等待本地名称服务器返回查询结果。
- 本地名称服务器收到 DNS 请求后,先查询本地的缓存,查到存在该域名记录项立即返回结果,否则本地名称服务器不断向 DNS 名称服务器发送 DNS 请求查询,直到查到改域名对应的权威名称服务器并获得记录结果。
- 本地名称服务器 解析到结果后将结果返回给客户端。
- 递归查询-示例

假设客户端访问站点www.example.com ,那么 DNS 客服端的查询路径如下:
- DNS 客户端 向所配置的本地名称服务器 dns.example.com 发出解析 www.example.com
域名的 DNS 请求报文。 - 本地名称服务器收到请求后,先查询本地缓存。假设没有查到该域名对应记录,则本地名称服务器向所配置的根名称服务器 a.rootserver.net 发出解析请求解析 www.example.com域名的 DNS 请求报文(相当于对本地名称服务器说:“请给我 www.example.com 所对应的 IP
地址”)。 - 根名称服务器收到 客户端的 DNS 查询请求报文后,通过查询得到.com 顶级域名所对应的顶级名称服务器,然后向本地名称服务器返回一条应答报文(相当说“我不知道
www.example.com 域名所对应的 IP 地址,但我现在告诉你 .com 域名所对应的顶级名称服
务器地址”)。 - 本地名称服务器在收到根名称服务器的 DNS 应答报文,得到 .com 顶级域名所对应的顶级名称服务器地址后,再次向对应的顶级名称服务器发送一条请求解析 www.example.com 域名的 DNS 请求报文。
- .com 顶级名称服务器在收到 DNS 请求报文后,先查询本地的缓存,假设也没有该域名的记录项,则查询 example.com 所对应的二级名称服务器,然后也向本地名称服务返回一条 DNS 应答报文(相当于对本地名称服务器说:“我不知道 www.example.com 域名所对应的 IP 地址,但我现在告诉你 example.com 域名所对应的二级名称服务器地址”。
- 本地名称服务器在收到 .com 顶级名称服务器的 DNS 应答报文,得到example.com 二级域名所对应的二级名称服务器地址后,再次向对应的二级名称服务器发送一条请求解析
www.example.com 域名的 DNS 请求报文。 - example.com 二级名称服务器在收到 DNS 请求报文后,也先查询本地的缓存,假设也没有该域名的记录项,则查询 www.example.com 所对应的权威名称服务器,然后也向本地名称服务器返回一条 DNS 应答报文(相当于本地名称服务器说:“我不知道 www.example.com 域名所对应的 IP 地址,但我现在告诉你 www.example.com 域名所对应的权威名称服务器地址”)。
- 本地名称服务器在收到 example.com 二级名称服务器的 DNS 应答报文,得到
www.example.com 三级域名所对应的权威名称服务器地址后,再次向对应的权威名称服务器发送一条请求解析 www.example.com 域名的 DNS 请求报文。 - www.example.com 权威名称服务器在收到 DNS 请求后,在它的 DNS 区域数据库中查找,最终得出了www.example.com 域名所对应的 IP 地址。然后向本地名称服务器返回到一条 DNS 应答报文(相当于对本地名称服务器说:“ www.example.com 域名的 IP 地址为xxx.xxx.xxx.xxx”)。
- 本地名称服务器在收到权威名称服务器的应答报文后,向 DNS 客户端返回一条DNS 应答报文,告诉 DNS 客户端所得到的www.example.com 域名的 IP 地址。这样 DNS 客户端就可以正常访问这个网站了。
DNS 资源记录
DNS区域中的DNS resource record (RR-DNS资源记录)条目指定有关区域中特定名称或对象的信
息。 资源记录格式如下:
owner-name TTL class type data
server.test.cloud. 300 IN A 192.168.1.10
### A 资源记录
A 资源记录将主机名映射到IPv4地址
server.test.cloud. 86400 IN A 172.25.254.254
AAAA 资源记录
AAAA资源记录(4A记录)将主机名映射到IPv6地址
a.root-servers.net. 604800 IN AAAA 2001:503:ba3e::2:30
CNAME 资源记录
CNAME资源记录将一个名称别名为另一个名称(规范名称),该名称应具有A或AAAA记录。
当DNS解析程序收到对查询的CNAME记录时,它将使用规范名称而不是原始名称重新发出查询。
CNAME记录的数据字段可以指向DNS中任何区域的名称,无论该区域是内部的还是外部的:
www-dev.test.cloud. 30 IN CNAME lab.test.cloud.
server.test.cloud. 30 IN CNAME www.redhat.com.
CNAME记录可能指向具有CNAME的名称,但CNAME记录链最终必须解析为A或AAAA记录
的名称。
通常,避免将CNAME记录指向其他CNAME记录。 CNAME会使查找效率降低,更脆弱,并且我们可能会意外地创建一个指向彼此的CNAME记录循环。
CNAME记录链有合法用途。 例如,它们与Content Delivery Network(CDN)结合使用。
NS和MX记录不得指向带有CNAME记录的名称,而是使用带有A和/或AAAA资源记录的名
称。
PTR 资源记录
PTR 资源记录
PTR记录以一种类似于主机名的特殊格式对IP地址进行编码。
- 对于IPv4地址,该地址被颠倒,以最具体的部分开始,然后视为in-addr.arpa域的子域中的主机。
- 对于IPv6地址,该地址在半字节边界(每个十六进制数字)上划分为子域,并设置为ip6.arpa域的子域。
4.0.41.198.in-addr.arpa. 785 IN PTR a.root-servers.net.
0.3.0.0.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.e.3.a.b.3.0.5.0.1.0.0.2.ip6.arpa
. 86400 IN PTR a.root-servers.net.
NS 资源记录
NS或名称服务器资源记录将域名映射到对其DNS区域具有权威性的DNS名称服务器。 该区域的每个公共权威名称服务器都必须具有NS记录。
test.cloud. 86400 IN NS dns.test.cloud.
168.192.ip-addr.arpa. 86400 IN NS dns.test.cloud.
9.0.e.1.4.8.4.6.2.e.d.f.ip6.arpa. 86400 IN NS dns.test.cloud.
说明:
其中两个NS记录用于10.1.8.0/16网络和fde2:6484:1e09::/48网络的反向查找。
classroom.test.cloud上的区域可能包含NS记录,以将对192.168.254.0/24和
fde2:6484:1e09::1:: /64的反向查找委托给另一个名称服务器。
NS记录映射的名称必须有A或4A记录
SOA 资源记录
SOA资源记录,也叫做起始授权机构记录,提供有关DNS区域如何运行的信息。 每个区域必须有一个SOA记录。
指定了一个序列号
指定其他权威性名称服务器用来确定何时从主要名称服务器传输区域资源记录的各种超时时间。
test.cloud. 86400 IN SOA dns.test.cloud. root.test.cloud. 2015071700
3600 300 604800 60

MX 资源记录
MX资源记录将域名映射到接受该域的电子邮件的邮件交换(mail exchange)。邮件服务器故障时,提供负载平衡和冗余的邮件服务器帮助路由电子邮件。
该记录类型的数据是用于确定在多个MX记录之间选择的优先级(首选最低),以及用于该名称的邮件交换的主机名。
test.cloud. 86400 IN MX 10 dns.test.cloud.
test.cloud. 86400 IN MX 10 mail.test.cloud.
test.cloud. 86400 IN MX 100 mailbackup.test.cloud.
TXT 资源记录
TXT 资源记录将名称映射到编码为可打印ASCII字符的任意文本。 它们通常用于提供用于各种电子邮件身份验证方案(例如SPF,DKIM和DMARC)的数据,以验证域所有权(例如,用于Google和Facebook),以及用于其他目的。
lwn.net. 27272 IN TXT "google-site-verification: sVlx-
S_z1es5DfNSUNXrqr3n9Y4F7tOr7HNVMKUGs"
lwn.net. 27272 IN TXT "v=spf1 a:mail.lwn.net a:prod.lwn.net
a:git.lwn.neta:ms.lwn.net -all"
SRV 资源记录
SRV 资源记录可帮助客户端找到域中支持特定服务的主机。
示例:表明存在一个可以使用TCP传输协议( _tcp )与LDAP连接的LDAP服务器( _ldap ),该主机属于域test.cloud。 LDAP服务器是server.test.cloud,正在侦听端口389,优先级为0,权重为100(如果客户端接收到多个SRV记录,则控制选择哪个服务器)。
_ldap._tcp.test.cloud. 86400 IN SRV 0 100 389 server0.test.cloud.
主机和资源记录
- ⼀个主机,无论是客户端还是服务器,都具有以下 DNS 资源记录:
⼀个或多个A或AAAA记录
用于将其IP地址反向映射到名称的PTR记录
⼀个或多个CNAME记录(可选)
- DNS zone 还具有以下资源记录:
唯一的 SOA 记录
每个权威名称服务器的 NS 记录
⼀个或多个MX记录(可选)
用于在域中查找服务的⼀个或多个SRV记录(可选)











