DNS 原理及大规模高性能监测
一、什么是 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.解析记录
以阿里云的域名解析为例,一条解析记录,主要有如下几个信息:
● 主机记录:也就是自定义的三级及以下域名,如 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 监测和安全研究方面具有实际的应用价值和较高的性能体现。
评论