DNS 原理及大规模高性能监测

发布者:埃文科技
发布于:2023-02-11 14:43

一、什么是DNS
DNS是Domain Name System的缩写,也就是“域名系统”。DNS是互联网中的一项核心服务,是用于实现域名和IP地址相互映射的一个分布式数据库系统。

 

域名的出现解决了互联网发展中两个大问题:
01
IP地址是互联网中所有主机的统一寻址方式,使用IP地址能够直接访问互联网上主机数据、资源,但由于IP地址只是一串数据,记忆十分困难。域名好理解方便记忆,方便上网及联网。
02
域名具有唯一性,在资源更改IP地址时,只需要进行新IP地址与恒定域名的转换,即可实现将资源移动到网络地址拓扑中的不同物理位置,方便互联网服务提供者进行维护更新而对用户无感知。

二、域名和DNS服务器结构

 

1.域名结构

 

这里以域名www.abc.example.com.作为示例,其实完整的域名,最后面都是有一个“.”的,通常都忽略掉了。一般有两种定义:

 

官方定义:

云服务商定义:

 

但不管域名如何分级,从后往前,从高层往下层都呈一个树状结构,最顶端就是常被忽略的"." ,代表根服务器。根的下一层就是由我们所熟知的.com、.net、.cn等通用域和.cn、.uk等国家域组成,称为顶级域 。然后我们在网上注册的域名基本都是二级域名 , 比 如baidu.com、ipplus360.com等等二级域名,它们基本上是归企业和运维人员管理。接下来便是三级域名,也就是www.baidu.com,www.ipplus360.com,就是我们平时常见的域名了。

 

把域名结构画成一个树型图来解释:

 

2.DNS服务器结构

 

上面我们介绍了域名的结构是一个层级树形结构,那么对应的DNS服务器也是一个层级的树形结构,层级分类及功能如下:

 

根域名:英文:Root nameserver。根域名服务器是最高层次的域名服务器,也是最重要的域名服务器。根域名服务器知道所有顶级域名服务器的域名和 IP地址。如果本地域名服务器无法对域名进行解析,就首先求助于根域名服务器。全球一共有13个根域名服务器名称,为 [a~m].root-servers.net

 

顶级域名服务器:英文:Tld nameserver。负责管理在该顶级域名服务器下面注册的二级域名,例如“www.example.com”,.com则是顶级域名服务器,在向它查询时,可以返回二级域名“example.com”所在的权威域名服务器地址。所有顶级域名服务器的名称和IP地址是在根服务器注册的,也就是说,根域名服务器知道所有的顶级域名服务器的名称和IP地址。

 

权威域名服务器:英文:authoritative nameserver。在特定区域内具有唯一性,负责维护该区域内的域名与IP地址之间的对应关系,例如云解析DNS。

 

本地域名服务器:英文:DNS resolver或Local DNS。本地域名服务器是响应来自客户端的递归请求,并最终跟踪直到获取到解析结果的DNS服务器。例如用户本机自动分配的DNS、运营商ISP分配的DNS、谷歌/114公共DNS等。

 

DNS服务器的层级树状结构如下图:

 

三、DNS解析
1.解析流程

 

以解析www.ipplus360.com这个域名为例,请求流程图如下:

 

具体步骤解释如下:

 

在浏览器中输入www.ipplus360.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

 

如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存, 如果有,直接返回,完成域名解析。

 

如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。

 

如果要查询的域名,不由本地DNS服务器区域解析,但该DNS服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。

 

如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(没有设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。

 

本地DNS服务器收到IP信息后,将会联系负责 .com域的这台服务器。这台负责 .com域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .com域的下一级DNS服务器地址(ipplus360.com)给本地DNS服务器。

 

当本地DNS服务器收到这个地址后,就会找ipplus360.com域服务器,重复上面的动作进行查询,直至找到www.ipplus360.com主机。

 

如果用的是转发模式(设置转发器),此DNS服务器就会把请求转发至上一级ISP DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转发请求转至上上级,以此循环。不管是本地DNS服务器用的是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

 

2.解析记录

 

以阿里云的域名解析为例,一条解析记录,主要有如下几个信息:
微信图片_20230207135302
● 主机记录:也就是自定义的三级及以下域名,如www.ipplus360.com那么主机记录就是www
● 记录类型:就是这条记录的类型,一般指向IPV4地址,类型则为A记录,其他类型,下面细说。
● 解析线路:这个一般由域名服务商提供,可以根据线路解析到不同的IP,比如,国内解析到广州的服务器,国外解析到香港的服务器。类似这样,不同的服务和提供商所支持的线路也不相同。
● 记录值:也就是根据解析类型,填上对应的结果,比如A记录是解析到IPv4地址,则填入IPv4的IP地址。
● TTL:解析记录在递归DNS服务器上缓存的保存时间,也是一个域名从修改到更新到全网的最长所需时间。因为缓存失效后,会重新从权威服务器获取最新记录。DNS记录,有很多不同类型的记录,主要有如下几种,下面列举说一下
● A:将域名指向一个IPV4地址
● CNAME:将域名指向另一个域名
● AAAA:将域名指向一个IPV6地址
● NS:将子域名指定其他DNS服务器解析
● MX:将域名指向邮件服务器地址
● SRV:记录提供特定的服务的服务器
● TXT:文本记录
● CAA:CA证书颁发机构授权校验
● PTR:用于DNS反向记录查找DNS作为域名解析的基础,使用范围十分广泛,因此我们要对DNS做大量的监测分析,以此来保证DNS的正常响应及不被污染。

 

四、大规模高性能监测
在进行DNS安全监控探测里,经常需要对DNS做大量的监测分析,最重要的一部分就是需要快速获取大量探测结果。虽然有许多工具可以主动查询DNS,但很少提供DNS操作详细信息(例如,来自递归过程的每个步骤的响应)。我们利用golang的并发能力开发了一套DNS大规模高性能监测工具。

 

1.架构

 

主要由以下几部分组成:

 

(1) 一个DNS库。实现一个缓存递归解析器库,提供了递归查找、缓存、验证、交换数据包的公开转录本以及简单的DNS问题构建和答案解析。它还支持使用外部递归解析器和各种性能优化(例如,UDP套接字重用)

 

(2) 可扩展框架。核心框架负责促进命令行配置、生成查找例程、将控制委托给模块、编码、解码和将数据进出例程、与上游解析器进行负载平衡、聚合运行时统计数据,以及确保一致的输出。该框架重量较轻,没有大多数特定的dns的逻辑。

 

(3)各种DNS记录解析模块。模块负责提供特定的DNS查询的逻辑,包括特定于DNS查询或记录的逻辑、预期的查询响应、附加的命令行标志、全局和每个例程的初始化。通过实现一个Go接口来添加模块,该接口定义了一个DoLookup函数,它接受两个参数:一个要查询的名称和一个名称服务器。DoLookup返回一个带有JSON导出标记的接口(例如,一个带有标记的结构,提示我们的框架在将结构转换为JSON时如何标记字段)。通过轻量级例程协调并发,DoLookup函数可以很简单(例如,打开UDP套接字,创建和发送包,等待响应或套接字超时,关闭套接字,并从响应包中返回任何相关数据)。

 

主要实现了以下功能:

 

(1)内部递归。实现了一个DNS递归解析器,以便查看详细的解析过程并监测其解析状态是否有异常。

 

(2)高性能。利用GO的轻量级并发协程,可以快速监测上百万或上千万的域名状态,并及时返回探测的结果数据。

 

(3)安全。自动内存分配,垃圾回收,安全边界检查等特点,可以安全快速的实现一个监测模块。

 

(4)可扩展。可以动态添加扩展监测的记录类型,以便满足不同的业务需要,并支持模块化接口方便扩展接入。

 

2.高性能性能优化设计

 

在进行大批量DNS监测时,主要做了以下优化:

 

(1)并发处理。进行DNS查询所花费的大部分时钟时间都是花在等待响应上,而不是构造或解析DNS数据包。因此,有效地并行化足够多的并发查询对于实现我们所需的性能至关重要。利用GO的天生并发处理能力,使用轻量级例程有效地管理数千个并发查询。Go是内存安全和垃圾收集的,这有助于提供一个安全但可扩展的平台,同时保持高性能。

 

(2 )UDP包复用。为每次查找创建一个套接字都是非常昂贵的,因为每个套接字在被删除和重新创建之前只被用来发送和接收两个数据包。如果在每个轻量级例程中建立并维护一个长期的原始UDP套接字,作为程序执行的生命周期。原始UDP套接字绑定到静态源端口,并可用于将UDP数据包发送到任意目标IP/端口。这消除了每个连接套接字的开销,而不需要为每个请求手动构建IP和以太网报头。为了支持比操作系统临时端口范围更多的线程,可以支持绑定到多个IP地址。

 

(3)选择性缓存。缓存可以避免在迭代解析中重复初始查询(例如,重复查询.com名称服务器的根解析器仍然至关重要),但是缓存查询的名称的结果会导致不必要的抖动。因此,选择地只缓存NS和胶水记录,以帮助未来的递归,但不缓存被直接查询的叶名称的任何结果

 

(4)增加垃圾收集频率。减少垃圾收集的频率通常与提高性能有关。然而,对于该系统来说,情况则恰恰相反。将垃圾收集发生的频率增加四倍,会增加吞吐量,这可能是因为短的收集可以分散在其他请求处理之间,并且不会在等待垃圾收集完成时导致连接超时。

 

3.探测结果示例

 

这里利用该系统以监测 ipplus360.com 这个域名为例,对某次探测结果并分析展示如下:

 

通过此工具,我们监测到一些DNS服务器对于域名没有响应,也就是没有解析成功;而在有正常响应的DNS服务器里,我们监测到有些响应时延较高,甚至有些DNS服务器的解析的结果与其他DNS服务器不一致,导致DNS污染等情况。

 

从监测结果可以看到,该工具及设计思想在我们的DNS监测和安全研究方面具有实际的应用价值和较高的性能体现。


DNS
声明:该文观点仅代表作者本人,转载请注明来自看雪