本文介绍DNS系统,结合自己设计一个DNS系统视角有助于理解。
一、DNS系统部件
DNS系统本质就是一个C/S架构系统,故只包含两种部件:“DNS服务器”和“DNS客户端”。
1.1、DNS服务器
英文名:DNS Server。
DNS服务器可分为4类:根DNS服务器、顶级域DNS服务器、权威DNS服务器和功能性DNS服务器。
1.1.1、根DNS服务器
英文名:Root Name Server,简称Root Server。
存在两个核心用途:
- 作为“根DNS服务器”,给出顶级域DNS服务器域名和IP地址
- 作为
root-servers.net二级域名的权威DNS服务器”,给出相应域名的IP地址
1、作为“根DNS服务器”
域名/IP地址来源和工作原理:
- 作为一次DNS迭代查询(DNS迭代查询是一切DNS查询的根本起点,DNS迭代查询的概念详见“2.1、最简单核心架构”)的起点,其域名和IP信息全球公共可见,详见“根DNS服务器域名和IP”,这些信息极度稳定:
- DNS客户端在配置文件固化以上根DNS服务器IP
- 根DNS服务器的域名(
[a-l].root-servers.net)主要用作标识,但为了DNS系统的完备性,支持对根DNS服务器域名进行DNS解析,具体过程见下一小节
- 加载ZONE文件提供解析服务,根DNS服务器ZONE文件详见“根DNS服务器root.zone文件”,下面截取部分内容用以说明
根DNS服务器ZONE文件部分内容:
1 | # com顶级域DNS服务器域名 |
2、作为root-servers.net二级域名的权威DNS服务器
根DNS服务器的域名([a-l].root-servers.net)主要用作标识,但为了DNS系统的完备性,支持对根DNS服务器域名进行DNS解析,具体过程跟一般的域名解析过程无异,即:根DNS服务器 -> net顶级域DNS服务器 -> 根DNS服务器(此时作为root-servers.net二级域名的权威DNS服务器)。
域名/IP地址来源和工作原理:
- 其域名和IP地址由net顶级域DNS服务器给出
- 加载ZONE文件提供解析服务,参见上一小节的“根DNS服务器ZONE文件部分内容”
1.1.2、顶级域DNS服务器
英文名:Top-Level Domain Name Server,简称TLD Server。
核心用途:给出二级域权威DNS服务器的域名和IP地址。
域名/IP地址来源和工作原理:
- 其域名和IP地址由根DNS服务器给出
- 加载ZONE文件提供解析服务,示例见下
1 | baidu.com. 86310 IN NS ns4.baidu.com. |
1.1.3、权威DNS服务器
英文名:Authoritative Name Server,简称NS。
核心用途:给出域名最终IP地址或者次级域权威DNS服务器域名和IP地址。
域名/IP地址来源和工作原理:
- 其域名和IP地址由顶级域DNS服务器或者上级权威DNS服务器给出
- 加载ZONE文件提供解析服务,示例见下
1 | baidu.com. 518400 IN A 111.63.65.103 |
1.1.4、功能性DNS服务器
功能性DNS服务器主要有两类:“递归DNS服务器”和“转发DNS服务器”。
1.1.4.1、递归DNS服务器
英文名:Recursive DNS Server。
两个核心用途:
- 代理完成DNS迭代查询过程,请求递归DNS服务器的DNS客户端可精简相应功能
- 对DNS解析结果进行缓存:既优化性能,又能降低对上级DNS服务器(比如“根DNS服务器”、“顶级域DNS服务器”和“权威DNS服务器”等)的负载
域名/IP地址来源和工作原理:
- 一般不存在域名,DNS客户端直接显式配置IP,比如:
- 企业自搭的递归DNS服务器
10.110.10.20 - 大型机构提供的公共DNS服务器(本质就是递归DNS服务器):1)谷歌-
8.8.8.8和8.8.4.4;2)阿里巴巴-223.5.5.5和223.6.6.6
- 企业自搭的递归DNS服务器
- 自身不存在ZONE文件,代理完成DNS迭代查询过程,对DNS解析过程进行缓存
1.1.4.2、转发DNS服务器
英文名:Forwarding DNS Server。
两个核心用途:
- 转发DNS查询给所配置DNS服务器(可以转发到根DNS服务器、顶级域DNS服务器、权威DNS服务器和功能性DNS服务器,一般是转发到递归DNS服务器),返回所获得的DNS查询结果
- 对DNS解析结果进行缓存:既优化性能,又能降低对所配置DNS服务器的负载
域名/IP地址来源和工作原理:
- 一般不存在域名,DNS客户端直接显式配置IP,比如:
- 企业自搭的转发DNS服务器
10.110.10.21 - 家庭网络路由器提供的转发DNS服务器
192.168.1.20
- 企业自搭的转发DNS服务器
- 自身不存在ZONE文件,转发DNS查询/返回所获得的DNS查询结果,对DNS解析过程进行缓存
1.2、DNS客户端
英文名:DNS Client。
不同DNS客户端支持的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服务器”等)。
三、架构实验
实验环境叙述如下:
- 实验DNS服务器
- IP地址:
192.168.31.181 - DNS服务器实现软件:选用
BIND 9
- IP地址:
- 实验DNS客户端
- IP地址:
192.168.31.143 - DNS客户端实现软件:选用
Linux dig命令
- IP地址:
备注:
- DNS服务器实现软件有:
- BIND 9:全功能支持,即支持——根DNS服务器、顶级域DNS服务器、权威DNS服务器、递归DNS服务器、转发DNS服务器
- PowerDNS:全功能支持,即支持——根DNS服务器、顶级域DNS服务器、权威DNS服务器、递归DNS服务器、转发DNS服务器
- CoreDNS:原生支持——根DNS服务器、顶级域DNS服务器、权威DNS服务器;结合插件支持——递归DNS服务器、转发DNS服务器
- 自实现
- …
- DNS客户端实现软件有:
- Linux dig命令
- Linux nslookup命令
- BIND 9
- PowerDNS
- 自实现
- …
3.1、转发
在实验DNS服务器的配置文件“/etc/bind/named.conf.options”中增加以下配置,此时其作为转发DNS服务器。
1 | forwarders { |
1、实验DNS客户端
执行dig @192.168.31.181 baidu.com +short命令,得到以下结果,表明实验转发DNS服务器正常工作。
1 | 111.63.65.247 |
2、实验DNS服务器
转发DNS请求给阿里巴巴公共DNS服务器,网络抓包结果如下。
请求报文:
1 | Internet Protocol Version 4, Src: 192.168.31.181, Dst: 223.5.5.5 |
响应报文:
1 | Internet Protocol Version 4, Src: 223.5.5.5, Dst: 192.168.31.181 |
3.2、递归
在实验DNS服务器的配置文件“/etc/bind/named.conf.options”中增加以下配置,此时其作为递归DNS服务器。
1 | recursion yes; // 允许递归查询。须注意:这是默认配置,这里为了实验进行显式配置 |
1、实验DNS客户端
执行dig @192.168.31.181 baidu.com +short命令,得到以下结果,表明实验递归DNS服务器正常工作。
1 | 111.63.65.247 |
2、实验DNS服务器
请求根DNS服务器(192.58.128.30是根DNS服务器j.root-servers.net对应的IP)获取顶级域DNS服务器域名和IP地址,网络抓包结果如下。
请求报文:
1 | Internet Protocol Version 4, Src: 192.168.31.181, Dst: 192.58.128.30 |
响应报文:
1 | Internet Protocol Version 4, Src: 192.58.128.30, Dst: 192.168.31.181 |
请求顶级域DNS服务器(192.41.162.30是顶级域DNS服务器l.gtld-servers.net对应的IP)获取权威DNS服务器域名和IP地址:
请求报文:
1 | Internet Protocol Version 4, Src: 192.168.31.181, Dst: 192.41.162.30 |
响应报文:
1 | Internet Protocol Version 4, Src: 192.41.162.30, Dst: 192.168.31.181 |
请求权威DNS服务器(153.3.238.93是权威DNS服务器ns3.baidu.com对应的IP)获取最终IP地址:
请求报文:
1 | Internet Protocol Version 4, Src: 192.168.31.181, Dst: 153.3.238.93 |
响应报文:
1 | Internet Protocol Version 4, Src: 153.3.238.93, Dst: 192.168.31.181 |
3.3、根DNS服务器
对实验DNS服务器作如下修改,此时其作为根DNS服务器。
配置文件“/etc/bind/named.conf.options”中增加以下配置,关闭递归功能,确保作为纯粹的根DNS服务器:
1 | recursion no; |
配置文件“/etc/bind/named.conf.local”中增加以下配置,加载作为根DNS服务器核心的ZONE文件:
1 | zone "." { |
上述ZONE文件内容如下:
1 | . 86400 IN SOA dslztx.top. admin.dslztx.top. 2025112201 1800 900 604800 86400 |
1、实验DNS客户端
执行dig @192.168.31.181 baidu.com +short命令,得到空结果,这是因为实验根DNS服务器未返回最终IP,符合预期。
2、实验DNS服务器
网络抓包结果如下。
请求报文:
1 | Internet Protocol Version 4, Src: 192.168.31.143, Dst: 192.168.31.181 |
响应报文:
1 | Internet Protocol Version 4, Src: 192.168.31.181, Dst: 192.168.31.143 |
参考文献
[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