0%

DNS系统架构

本文介绍DNS系统,结合自己设计一个DNS系统视角有助于理解。

一、DNS系统部件

DNS系统本质就是一个C/S架构系统,包含3种部件:“DNS客户端”、“权威DNS服务器”和“功能性DNS服务器”。

在实际实现中,一个部件可能兼有多种上述部件功能,比如:

  • “权威DNS服务器”如果作为从DNS服务器,从主DNS服务器同步数据时,此时兼有“DNS客户端”部件功能
  • “功能性DNS服务器”需要请求其他DNS服务器,此时兼有“DNS客户端”部件功能
  • “一个自搭建DNS服务器”兼有“权威DNS服务器”和“功能性DNS服务器”部件功能,比如企业内部自搭建DNS服务器——既作为“权威DNS服务器”提供企业内部域名DNS解析服务,又作为“功能性DNS服务器”提供外部域名DNS解析服务

1.1、DNS客户端

英文名:DNS Client

不同DNS客户端支持的DNS解析相关功能可以不尽相同,比如“只需请求递归DNS服务器的DNS客户端可以不支持迭代查询功能”。

1.2、权威DNS服务器

英文名:Authoritative Name Server,简称NS

核心用途:给出域名最终IP地址或者次级域权威DNS服务器域名和IP地址。

域名/IP地址来源和工作原理:

  1. 其域名和IP地址由上级域权威DNS服务器或者DNS客户端配置给出
  2. 加载ZONE文件提供解析服务,示例见下
1
2
3
4
baidu.com.     518400  IN      A       111.63.65.103
mail.baidu.com. 518400 IN A 14.215.178.81
img.baidu.com. 518400 IN A 180.76.76.93
blog.baidu.com. 518400 IN A 180.76.76.93

权威DNS服务器中的“根DNS服务器”和“顶级域DNS服务器”常被单独叙述,所以可有“狭义权威DNS服务器”和“广义权威DNS服务器(狭义权威DNS服务器、根DNS服务器、顶级域DNS服务器)”之分,后续遇到根据上下文进行区分——一般为“广义”,当存在“根DNS服务器”,“顶级域DNS服务器”与之相对时,则为“狭义”。

1.2.1、根DNS服务器

英文名:Root Name Server,简称Root Server

核心用途:给出顶级域DNS服务器域名和IP地址。

域名/IP地址来源和工作原理:

  1. 作为一次DNS迭代查询(DNS迭代查询是一切DNS查询的根本起点,DNS迭代查询的概念详见“2.1、最简单核心架构”)的起点,其域名和IP信息全球公共可见,详见“根DNS服务器域名和IP”,这些信息极度稳定:
    • DNS客户端在配置文件固化以上根DNS服务器IP
    • 根DNS服务器的域名([a-l].root-servers.net)主要用作标识,但为了DNS系统的完备性,支持对根DNS服务器域名进行DNS解析,具体过程见下一小节
  2. 加载ZONE文件提供解析服务,根DNS服务器ZONE文件详见“根DNS服务器root.zone文件”,下面截取部分内容用以说明

根DNS服务器ZONE文件部分内容:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# com顶级域DNS服务器域名
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.


# net顶级域DNS服务器域名
net. 172800 IN NS a.gtld-servers.net.
net. 172800 IN NS b.gtld-servers.net.
net. 172800 IN NS c.gtld-servers.net.
net. 172800 IN NS d.gtld-servers.net.
net. 172800 IN NS e.gtld-servers.net.
net. 172800 IN NS f.gtld-servers.net.
net. 172800 IN NS g.gtld-servers.net.
net. 172800 IN NS h.gtld-servers.net.
net. 172800 IN NS i.gtld-servers.net.
net. 172800 IN NS j.gtld-servers.net.
net. 172800 IN NS k.gtld-servers.net.
net. 172800 IN NS l.gtld-servers.net.
net. 172800 IN NS m.gtld-servers.net.


# com和net顶级域DNS服务器IP地址
a.gtld-servers.net. 172800 IN A 192.5.6.30
a.gtld-servers.net. 172800 IN AAAA 2001:503:a83e:0:0:0:2:30
b.gtld-servers.net. 172800 IN A 192.33.14.30
b.gtld-servers.net. 172800 IN AAAA 2001:503:231d:0:0:0:2:30
c.gtld-servers.net. 172800 IN A 192.26.92.30
c.gtld-servers.net. 172800 IN AAAA 2001:503:83eb:0:0:0:0:30
d.gtld-servers.net. 172800 IN A 192.31.80.30
d.gtld-servers.net. 172800 IN AAAA 2001:500:856e:0:0:0:0:30
e.gtld-servers.net. 172800 IN A 192.12.94.30
e.gtld-servers.net. 172800 IN AAAA 2001:502:1ca1:0:0:0:0:30
f.gtld-servers.net. 172800 IN A 192.35.51.30
f.gtld-servers.net. 172800 IN AAAA 2001:503:d414:0:0:0:0:30
g.gtld-servers.net. 172800 IN A 192.42.93.30
g.gtld-servers.net. 172800 IN AAAA 2001:503:eea3:0:0:0:0:30
h.gtld-servers.net. 172800 IN A 192.54.112.30
h.gtld-servers.net. 172800 IN AAAA 2001:502:8cc:0:0:0:0:30
i.gtld-servers.net. 172800 IN A 192.43.172.30
i.gtld-servers.net. 172800 IN AAAA 2001:503:39c1:0:0:0:0:30
j.gtld-servers.net. 172800 IN A 192.48.79.30
j.gtld-servers.net. 172800 IN AAAA 2001:502:7094:0:0:0:0:30
k.gtld-servers.net. 172800 IN A 192.52.178.30
k.gtld-servers.net. 172800 IN AAAA 2001:503:d2d:0:0:0:0:30
l.gtld-servers.net. 172800 IN A 192.41.162.30
l.gtld-servers.net. 172800 IN AAAA 2001:500:d937:0:0:0:0:30
m.gtld-servers.net. 172800 IN A 192.55.83.30
m.gtld-servers.net. 172800 IN AAAA 2001:501:b1f9:0:0:0:0:30


# 根DNS服务器域名对应的IP地址(此时作为root-servers.net二级域名的权威DNS服务器)
a.root-servers.net. 518400 IN A 198.41.0.4
a.root-servers.net. 518400 IN AAAA 2001:503:ba3e:0:0:0:2:30
b.root-servers.net. 518400 IN A 170.247.170.2
b.root-servers.net. 518400 IN AAAA 2801:1b8:10:0:0:0:0:b
c.root-servers.net. 518400 IN A 192.33.4.12
c.root-servers.net. 518400 IN AAAA 2001:500:2:0:0:0:0:c
d.root-servers.net. 518400 IN A 199.7.91.13
d.root-servers.net. 518400 IN AAAA 2001:500:2d:0:0:0:0:d
e.root-servers.net. 518400 IN A 192.203.230.10
e.root-servers.net. 518400 IN AAAA 2001:500:a8:0:0:0:0:e
f.root-servers.net. 518400 IN A 192.5.5.241
f.root-servers.net. 518400 IN AAAA 2001:500:2f:0:0:0:0:f
g.root-servers.net. 518400 IN A 192.112.36.4
g.root-servers.net. 518400 IN AAAA 2001:500:12:0:0:0:0:d0d
h.root-servers.net. 518400 IN A 198.97.190.53
h.root-servers.net. 518400 IN AAAA 2001:500:1:0:0:0:0:53
i.root-servers.net. 518400 IN A 192.36.148.17
i.root-servers.net. 518400 IN AAAA 2001:7fe:0:0:0:0:0:53
j.root-servers.net. 518400 IN A 192.58.128.30
j.root-servers.net. 518400 IN AAAA 2001:503:c27:0:0:0:2:30
k.root-servers.net. 518400 IN A 193.0.14.129
k.root-servers.net. 518400 IN AAAA 2001:7fd:0:0:0:0:0:1
l.root-servers.net. 518400 IN A 199.7.83.42
l.root-servers.net. 518400 IN AAAA 2001:500:9f:0:0:0:0:42
m.root-servers.net. 518400 IN A 202.12.27.33
m.root-servers.net. 518400 IN AAAA 2001:dc3:0:0:0:0:0:35

另外在实际中,根DNS服务器又作为root-servers.net二级域名的权威DNS服务器”,给出相应域名的IP地址:根DNS服务器的域名([a-l].root-servers.net)主要用作标识,但为了DNS系统的完备性,支持对根DNS服务器域名进行DNS解析,具体过程跟一般的域名解析过程无异,即:根DNS服务器 -> net顶级域DNS服务器 -> 根DNS服务器(此时作为root-servers.net二级域名的权威DNS服务器)。

域名/IP地址来源和工作原理:

  1. 其域名和IP地址由net顶级域DNS服务器给出
  2. 加载ZONE文件提供解析服务,参见上面的“根DNS服务器ZONE文件部分内容”

1.2.2、顶级域DNS服务器

英文名:Top-Level Domain Name Server,简称TLD Server

核心用途:给出二级域权威DNS服务器的域名和IP地址。

域名/IP地址来源和工作原理:

  1. 其域名和IP地址由根DNS服务器给出
  2. 加载ZONE文件提供解析服务,示例见下
1
2
3
4
5
6
7
8
9
10
11
12
baidu.com.              86310   IN      NS      ns4.baidu.com.
baidu.com. 86310 IN NS ns7.baidu.com.
baidu.com. 86310 IN NS ns2.baidu.com.
baidu.com. 86310 IN NS ns3.baidu.com.
baidu.com. 86310 IN NS dns.baidu.com.


ns4.baidu.com. 518400 IN A 14.215.178.80
ns7.baidu.com. 518400 IN A 180.76.76.92
ns2.baidu.com. 518400 IN A 220.181.33.31
ns3.baidu.com. 518400 IN A 153.3.238.93
dns.baidu.com. 518400 IN A 110.242.68.134

1.3、功能性DNS服务器

功能性DNS服务器主要有两类:“递归DNS服务器”和“转发DNS服务器”。

1.3.1、递归DNS服务器

英文名:Recursive DNS Server

两个核心用途:

  1. 代理完成DNS迭代查询过程,请求递归DNS服务器的DNS客户端可精简相应功能
  2. 对DNS解析结果进行缓存:既优化性能,又能降低对上级DNS服务器(比如“根DNS服务器”、“顶级域DNS服务器”和“权威DNS服务器”等)的负载

域名/IP地址来源和工作原理:

  1. 一般不存在域名,DNS客户端直接显式配置IP,比如:
    • 企业自搭的递归DNS服务器10.110.10.20
    • 大型机构提供的公共DNS服务器(本质就是递归DNS服务器):1)谷歌-8.8.8.88.8.4.4;2)阿里巴巴-223.5.5.5223.6.6.6
  2. 自身不存在ZONE文件,代理完成DNS迭代查询过程,对DNS解析过程进行缓存

1.3.2、转发DNS服务器

英文名:Forwarding DNS Server

两个核心用途:

  1. 转发DNS查询给所配置DNS服务器(可以转发到根DNS服务器、顶级域DNS服务器、权威DNS服务器和功能性DNS服务器,一般是转发到递归DNS服务器),返回所获得的DNS查询结果
  2. 对DNS解析结果进行缓存:既优化性能,又能降低对所配置DNS服务器的负载

域名/IP地址来源和工作原理:

  1. 一般不存在域名,DNS客户端直接显式配置IP,比如:
    • 企业自搭的转发DNS服务器10.110.10.21
    • 家庭网络路由器提供的转发DNS服务器192.168.1.20
  2. 自身不存在ZONE文件,转发DNS查询/返回所获得的DNS查询结果,对DNS解析过程进行缓存

二、架构

2.1、最简单核心架构

完成一次DNS迭代查询过程的架构是最简单核心架构,如下图所示。

一点说明:架构中DNS服务器实际中一般采用集群形式,以达成“高可用”和“负载均衡”目标,常采用Anycast和主副技术作为集群化方案,比如“对于根DNS服务器:a.root-servers.net是全球13组根DNS服务器中的主根DNS服务器,其他12组根DNS服务器是副根DNS服务器,副根DNS服务器通过区域传送技术定时从主根DNS服务器同步最新数据;而每组根DNS服务器又采用Anycast技术,即每个根DNS服务器IP实际对应多台服务器”。

2.2、现实复杂架构

在最简单核心架构基础上添加功能性DNS服务器可组成现实复杂架构,如下图所示。

一点说明:图架构中的“转发DNS服务器”和“递归DNS服务器”位置和数量只是用于说明,实际架构中“转发DNS服务器”和“递归DNS服务器”的位置和数量可以有更多变化,比如“在根DNS服务器、顶级域DNS服务器、权威DNS服务器之前架设转发DNS服务器”,“架设串联的一前一后两个递归DNS服务器”等。


参考文献

[1]https://www.iana.org/domains/root/servers
[2]https://zh.wikipedia.org/wiki/%E6%A0%B9%E7%B6%B2%E5%9F%9F%E5%90%8D%E7%A8%B1%E4%BC%BA%E6%9C%8D%E5%99%A8
[3]https://root-servers.org/
[4]https://www.internic.net/domain/root.zone
[5]https://www.iana.org/domains/root/files
[6]https://stackoverflow.com/questions/21836103/how-dns-resolve-root-servers-net

您的支持将鼓励我继续分享!