摘要:网络协议是计算机网络进行数据交换而建立的规则、标准或约定的集合。随着互联网的飞速发展,应用层协议越来越丰富,为了更好保障我们的业务,熟悉并掌握常用应用层网络协议成为每位互联网大佬必须的知识储备,也是熟练掌握流量分析技术的基础。今天我们从流量视角出发,和大家一起
前言
网络协议是计算机网络进行数据交换而建立的规则、标准或约定的集合。随着互联网的飞速发展,应用层协议越来越丰富,为了更好保障我们的业务,熟悉并掌握常用应用层网络协议成为每位互联网大佬必须的知识储备,也是熟练掌握流量分析技术的基础。今天我们从流量视角出发,和大家一起聊聊DNS协议。
本期互动问题,欢迎大家评论区一起聊聊:
DNS可以使用TCP作为传输协议进行交互吗?
DNS相关概念
域名系统(Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS协议是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)的应用层协议。
看了概念,大家肯定会有很多疑问,譬如这个分布式数据库会很庞大,真有主机能存下所有记录?域名比IP地址更好记忆?域名的IP变化了怎么办?……答案就是:使用“树状名字空间”!举例如下:
如图,根服务器只管理根域名,顶级服务器管理顶级域名,以此类推。这样就不需要一台服务器维护整个域名到IP的映射表。
用www.colasoft.com.cn举例说明如下:
解析时,就会先找根服务器,根服务器应该找管理“cn”这个顶级域的顶级域名服务器,再找管理“com”的二级域名服务器。
以此类推,最后找到www.colasoft.com.cn域名到IP的映射。
DNS原理
1. DNS完整查询过程
一图胜千言,直接上图:
当我们在浏览器中访问域名www.colasoft.com.cn,整个域名解析过程是这样的:
首先尝试本地解析:
(1) 操作系统会检查自己本地的hosts文件是否有这个网址映射关系?如果有,就调用这个IP地址映射,直接完成域名解析(本地解析,此时同样不会产生DNS数据包);
注:Windows的host文件在C:\Windows\System32\drivers\etc\hosts;Linux在/etc/hosts;
(2) 如果浏览器访问过该域名,并且DNS记录被浏览器进行了缓存,则会根据浏览器缓存记录直接进行访问(此时不会产生DNS数据包);
(3) 如果前2步没有结果,则会真正发出DNS查询数据包,访问到本地“DNS解析器缓存”。这里“DNS解析器缓存”是个泛称(浏览器缓存其实也是它的一种,因为不产生数据包,所以单独列为了一个步骤),比如家用小路由器带DNS缓存、防火墙带DNS缓存功能等。
本地解析无结果,则开始向本地DNS服务器发请求包:
(4) 访问本地DNS服务器(TCP/IP参数中设置的首选DNS服务器)。我们正常在客户端抓到的DNS数据包,其实就是客户端和本地服务器交换的DNS数据包(注意,抓包位置不同,看到的数据包是不同的,如果在客户端进行抓包,是看不到DNS服务器之间交互过程的)。如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户端,完成域名解析,此解析具有权威性(后文中解释什么是权威回答)。
(5) 如果要查询的域名不是本地DNS服务器区域解析,但该服务器缓存了客户端查询的网址映射关系,则调用这个IP地址映射返回解析结果,完成域名解析,此解析不具有权威性。
本地DNS服务器无映射结果,则本地DNS服务器开始向前文介绍的根服务器、顶级域名服务器、二级域名服务器等发起迭代查询(后文解释递归和迭代):
(6) 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS(或根的镜像服务器),根DNS服务器收到请求后会判断这个域名(.cn)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.cn域的这台服务器。负责.cn域的顶级域名服务器收到请求后,如果自己无法解析,就会找一个管理com.cn域的下一级DNS服务器地址给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找com.cn域服务器。重复上面的动作进行查询(迭代过程),直至找到(http://www.colasoft.com.cn)主机的IP映射关系。
(7) 如果用的是转发模式(上图中的Q8和A8),此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。
注意:不管是不是转发模式,最终查询结果都是返回给本地DNS服务器,由本地DNS服务器把结果再交给客户端。
以上便是DNS解析的全过程,需要再次提醒大家,如果是在客户端进行抓包分析DNS协议,只会看到客户端和本地DNS的交互过程:
2. 递归查询和迭代查询
(1) 迭代查询
如下图,本地DNS服务器先问根域名服务器,根域名服务器将顶级域名服务器地址返回给本地DNS服务器;本地DNS服务器再去找顶级域名服务器查询,顶级域名服务器将对应二级域名服务器地址返回给本地DNS服务器;然后本地DNS服务器去找二级域名服务器查询,二级域名服务器将最终结果给到本地DNS服务器。由此可见,每一次DNS查询请求都是由本地DNS服务器发出,这种查询方式称之为迭代查询。如下图:
(2) 递归查询
和迭代查询不同,递归是本地域名服务将请求传给根域名服务器,根域名服务器将请求传递给顶级域名服务器,顶级域名服务器再将请求传给二级域名服务器;当二级域名服务器查到结果后,将结果返回给顶级域名服务器,顶级域名服务器将结果交给根域名服务器,根域名服务器将结果最终给到本地域名服务器。如下图:
从上面两种机制谁更好呢?从查询效率和减轻重要服务器负担为出发点,实际DNS在运行时遵循:客户端到本地DNS服务器的查询过程为递归查询;本地DNS服务器到其他DNS服务器的查询过程过迭代。下图为客户端到服务器的查询包,期望递归查询:
3. DNS资源记录
DNS服务器就是根据资源记录来返回DNS应答。以上图这条资源记录为例,各字段含义如下:
域名Domain:www.colasoft.com.cn;
生存周期TTL:600,递归服务器会缓存该资源记录的时间,单位:秒;
网络/协议类型class:IN,DNS在设计之初希望能支持不同的网络,不同的协议,IN代表internet类,目前DNS系统主要支持的协议是IN;
资源记录类型type:A,决定和域名关联的信息种类,A记录代表IPV4的主机地址;(资源记录类型在后文流量解码中详述)
47.57.8.223:域名关联的信息数据;
在请求数据包中,会提供要查询DNS记录的相关信息:
DNS流量解码
DNS报文标准格式如下:
下面我们以访问科来官网为例,在客户端进行抓包,结果如图:
1、DNS请求包
上图中9号包为DNS请求包,详细解码如下:
主要字段说明如下:
从数据包中我们得到信息:
这是一个DNS请求包,查询的问题数为1,域名为:secure.colasoft.com.cn,查询类型为1(A记录),互联网类型为0x1(IN互联网)。
2、DNS响应包
因为是在客户端抓的数据包,所以本地DNS向域名服务器迭代查询的过程是看不到的,只能看到本地DNS发送给客户端的DNS响应包,前面图中的10包为响应包:
能看到DNS响应包比请求包内容多了不少,除了“基础结构部分”,多了“资源记录部分”。
从资源记录部分我们能看到,回答可能有多个。这是资源记录的特殊性句定的,同一个域名的同一类型资源记录可以同时有多条(默认的应答机制是轮询),如:
www.google.com. 120 IN A 74.125.128.105
www.google.com. 120 IN A 74.125.128.106
www.google.com. 120 IN A 74.125.128.147
在部分场景中,同一个域名可以存在不同类型的资源记录:
www.google.com. 120 IN AAAA 240e:e1:8100:28::2:16
www.google.com. 120 IN A AAA 240e:e1:8100:28::2:17
一个域名,多个相同类型的资源记录的集合称为资源记录集(RRset),RRset是DNS传输的基本单元,也就是说查询一个域名对应的某种信息,DNS系统不会返回一条RR,而是返回一个资源记录集RRset。
3、不同DNS记录类型的数据包
不同的记录类型,如下表:
下面解释常见DNS的记录类型,并展示对应数据包:
(1) A记录
最常见的就是A记录(A record),用于指定主机名(或域名)对应的IPv4地址。就是域名直接到IPv4的映射。
DNS请求数据包:
对应的DNS响应包:
(2) AAAA记录
AAAA(AAAA record)记录用于指定主机名(或域名)对应的IPv6地址。
DNS请求数据包:
对应的DNS响应包:
(3) NS记录
NS(Name Server Record)记录指明了由哪台DNS服务器来解析特定域名的记录。
例如,企业因规模较大采用了分布式网络架构,拥有多个子域(本文因篇幅问题未进一步讲解子域、区的概念,有兴趣的读者可深入了解),并且希望不同的子域由不同的DNS服务器解析,NS记录就显得尤为关键。通过设置NS记录,可以确保名字解析请求被正确地分发到指定的DNS服务器上,从而提高解析效率和可靠性。
注意:NS记录优先于A记录,也就是说如果一个主机地址既存在NS记录又存在A记录,那么优先使用NS记录,A记录不生效。
DNS请求数据包:
对应的DNS响应包:
(4) CNAME记录
CNAME ( Canonical NAME ),通常称为别名或者规范名,它允许将多个名字映射到同一台计算机。在多个子域名需要指向同一服务器的场景中非常有用。
例如,如果设置了test.mydomain.com作为www.colasoft.com的CNAME,意味着所有访问test.mydomain.com的请求都会被路由到www.colasoft.com。CNAME的使用简化了DNS记录的管理,特别是在配置负载均衡或有多个服务共享同一服务器时。
注意:CNAME记录不能与A记录共存。如果一个域名已有一条A记录,再添加CNAME记录会导致冲突;CNAME记录的目标只能是主机名,而不能是IP地址,这避免了直接依赖特定服务器的IP,增加了配置的灵活性。
DNS请求数据包:
对应的DNS响应包:
(5) MX记录
MX(Mail Exchanger Record)专门用于邮件交换,定义了邮件服务器的优先级和地址,保证邮件能正确送达。通过设置MX记录,可以指定哪些服务器负责处理发送到域名邮箱的邮件。
例如,设置mydomain.com的MX记录指向mailserver.com,意味着所有发往@mydomain.com的邮件将被传送到mailserver.com进行处理。
DNS请求数据包:
对应的DNS响应数据包:
(6) SOA记录
SOA(Start of Authority)记录是DNS(Domain Name System,域名系统)中的一种记录类型,用于指定域的权威信息。它包含了关于域的管理和配置的基本信息,对于域的运行和管理至关重要。
SOA记录通常包含以下部分信息:
Primary Name Server:主域名服务器的地址。
Email Address:负责管理该域的技术联系人的电子邮件地址。
Serial Number:序列号,用于标识 DNS 记录的最后更新时间。
Refresh Interval:刷新间隔,指辅助域名服务器向主域名服务器请求更新的频率。
Retry Interval:重试间隔,指辅助域名服务器在未能成功更新后,再次尝试更新的时间间隔。
Expire Time:过期时间,指辅助域名服务器在未收到更新的情况下,保持记录有效的时间。
Minimum TTL (Time to Live):最小 TTL ,指 DNS 解析器缓存记录的最短时间。
DNS请求数据包:
对应DNS响应包:
(7) PTR记录
PTR( Pointer Record ) 指针记录,代表“IP地址”与“主机名”的对应关系,作用刚好与A记录相反。某些场景使用PTR记录来检验客户端的主机名称是否可信。
DNS请求包:
对应DNS相应包:
(8) TXT记录
TXT(文本)记录,一般指为某个主机名或域名设置的说明。
例如,在TXT记录中填写SPF(SPF是一种邮件安全策略框架,不在本文讲解范围内)记录格式数据,进而提升邮件的发送成功率,下面以qq.com为例,看数据包的解码
DNS请求包:
对应DNS响应包:
4、响应包中的响应状态码
如果DNS查询不成功,找到响应包中的RCODE字段是关键:
参考RFC2136,状态码有以下几种:
下面对经常遇见的4种状态码作详细说明:
(1) 状态码“0”NOERROR
代表域名正常解析到记录,说明解析成功。
(2) 状态码“2”SERVFAIL
递归DNS服务器至权威服务器的网络不通,或者DNS服务器发生错误,则会导致SERVFAIL。
如:客户端向递归服务器发起DNS解析,由于网络问题,递归服务器向权威DNS解析超时,此时递归服务器会向向客户端应答SERVFAIL。
(3) 状态码“3”NXDOMAIN
解析某一域名,此域名没有任何类型的解析记录。
如:客户端向DNS服务器解析ww123.colasof.tcom 的错误A记录,服务器应答码为NXDOMAIN,并附带test.com 的SOA。
(4)状态码“4”REFUSED
名称服务器出于策略或安全原因拒绝执行指定的操作。
如:客户向DNS服务器发起www.colasoft.com.的查询,此时DNS服务器需要对外递归查询,但服务器没有开启DNS递归功能。这样DNS就向客户端相应REFUSED。
DNS常见安全问题及流量分析举例
DNS协议的开发年限较早,且使用广泛,不可避免的存在一些安全风险。根据面临的攻击类型,大概可以把风险分为4类,如下图:
这里我们不再一一介绍了,从流量角度选2个分析举例。
例1:DNS放大攻击
分析:放大攻击的原理,主要是利用了DNS请求大小和DNS响应大小的不对等(前面我们在解码中已经看到,响应会多出RR应答集部分)。攻击者如果通过精心设计,让被控的僵尸机(多台)把请求包的原IP替换为被攻击者的IP地址,通过向递归DNS服务器(多台)发送很小的请求包(请求类型为ANY),让被攻击者收到很大的响应包。这样,就会在短时间内让被攻击者收到超出自身接收能力的数据,造成带宽阻塞或宕机。如下图:
如果是同网段内主机发起的攻击,则可以在请求包中看到请求的类型为ANY;若攻击者不在我们抓包点所在网络内,则只会看到大量的响应包。在CSNAS中看到的流量如下:
流量特征:原地址为伪造IP(无法溯源);接收响应的都是同一台主机;;短时间内出现流量突发;DNS流量占比极高。
防御办法:采用DNSSEC技术;引入IDPS设备;提取DNS攻击流量特征,对包含此特征的流量进行过滤清洗等。
例2:典型的DNS隧道
分析:DNS隐蔽隧道原理大致如下图(本文不再详述)
流量特征:会看到大量的DNS请求和响应,他们的顶级域名和二级域名相同,在三级域名中会携带通信信息(外人无法看懂内容,需要翻译)。
在CSNAS中流量显示如图:
防御办法:提取相关流量特征进行告警;封禁攻击者IP等。
结语
本文从流量侧对DNS的概念、原理、解码及分析举例等多维度进行了讲解,大家通过看数据包可以更直观的看到DNS的真实工作过程。DNS是一个非常重要的应用层协议,掌握和了解DNS协议对我们运维、安全工作都巨大帮助!希望阅读本文能让大家对DNS协议有了更深的认识。后面我们会继续对其他应用层协议作讲解,请读者们持续关注~
还记得开篇的互动问题吗?
DNS可以使用TCP作为传输协议进行交互吗?
看了这篇文章,你有什么新的想法?欢迎在评论区留言和我们交流~
- End -
来源:夏琳论科技