一:前言
域名系统(DNS)是最重要的互联网协议之一,因为它是总所周知的黏合剂,把域名转换为IP地址。当我们想要和一台网络设备通信却不知道它的IP地址,可以使用它的域名来进行访问。
DNS服务器存储了一个有着IP地址和DNS名字映射资源记录的数据库,并将其和客户端以及其他DNS服务器共享
由于DNS服务器的结构很复杂,因此我们只关注于通常类型的DNS流量
二:DNS数据包结构
事务ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数,这6个字段是DNS的报文首部,共12个字节
整个DNS格式主要分为3部分内容,级基础结构部分、问题部分、资源记录部分
基础结构中的标志字段又分为若干个字段,如下图
事务ID(Transaction ID):用来对应DNS查询和响应的过程
QR(Query / Response):指明数据包是DNS查询还是DNS响应
操作码(Opcode):用来定义消息中请求的类型
权威应答(Authoritative Answer,AA):如果数据包设定了这个值,说明该响应是由域名内权威域名服务器发出的
截断(Truncation,TC):指明这个响应由于太长,无法装入数据包被极端
期望递归(Recursion desired,RD):如果在请求中设定了这个值,说明DNS客户端在目标域名服务器下不含有所请求信息的情况下,要求进行递归
可用递归(Recursion Avaliable,RA):如果响应中设定了这个值,则说明域名服务器支持递归查询
保留(Z):在RFC1035的规定被设为全0,但有时会被用来作为RCode域的扩展
响应码(Response Code):在DNS响应中用来指明错误
问题计数(Question Count):在问题区段中的条目数
回答计数(Answer Count):在回答区段中的条目数
域名服务器计数(Name Server Count):在权威区段的域名资源记录数
额外记录计数(Additional Records Count):在额外信息区段中的其他资源记录数
问题区段(Question section):大小可变、包含要被发送到DNS服务器的一条或多条的信息查询部分
回答区段(Answer section):大小可变、包含用来回答查询的一条或多条资源记录
权威区段(Authority section):大小可变、包含指向权威域名服务器的资源记录,用以继续解析过程
额外信息区段(Additional Information section):大小可变、包含于查询有关的额外信息,但对于回答查询这并不是绝对必要的资源记录
三:一次简单的DNS查询过程
DNS以查询/响应的模式工作。当一个客户端想要将一个DNS解析成IP地址时,它会向DNS服务器发送一个查询,然后服务器在响应中提供所请求的信息,在比较简单的情况下,这个过程包含两个数据包
第一个数据包是由192.168.0.114的客户端通过DNS的标准端口53发向205.152.37.23的服务器进行DNS查询
其中DNS协议也是基于UDP协议的,在数据包的DNS区段,开头的一些较小域都被Wireshark合并成了一个标志区段(Flags section ) 。这是一个典型的请求:没有截断并且期望递归查询。在展开查询时,里面也有仅有一个问题,查询名字为Wireshark.org的主机类型(A)互联网(IN)地址:哪个IP地址对应着Wireshark.org域
第二个数据包响应了这个请求,该包有着唯一的标识码,包含着对于原始查询的正确响应
标志区段可以确保这是一个响应并且允许必要的递归。这个数据包仅包含一个问题和一个资源记录,因为它将原问题和回答连接了起来。展开回答区段 就可以看到对于查询的回答:Wireshark.org 的地址是128.121.50.122。有了这个信息之后,客户端就可以开始构建IP数据包,与Wireshark.org通信了
四:DNS问题类型
DNS查询和响应中所使用的类型域,指明了这个查询或者响应的资源记录类型
值 | 类型 | 描述 |
---|---|---|
1 | A | IPv4主机地址 |
2 | NS | 权威域名服务器 |
5 | CNAME | 规范别名 |
16 | MX | 邮件交换 |
16 | TXT | 文本字符串 |
28 | AAAA | IPv6主机地址 |
251 | IXFR | 增量区域传送 |
252 | AXFR | 完整区域传送 |
五:DNS递归
由于互联网的DNS结构是层级的,因此为了能够回答客户端提交的查询,DNS服务器必须能够彼此通信。我们内部DNS服务器知道本地局域网服务器的名字和IP地址的映射
当DNS服务器需要查找一个IP地址时,它会代表发出请求的客户端向另一个DNS服务器查询。实际上,这个DNS服务器与客户端的行为相同,这个过程叫做递归查询
上图的数据包是从DNS客户端 172.16.0.8 发往DNS服务器 172.16.0.102 的初始查询
第一个数据包时用以查找DNS名称为 www.nostarch.com 的A 类型记录的标准查询,如上图
第二个数据包是我们所希望的看到的对于初始数据包的响应,如下图
这个数据包的事务ID和我们的查询一致,也没有列出错误,所以就得到了 www.nostarch.com所对应的A类型资源记录
如果我们想要知道查询是否被递归应答,唯一的方法就是当进行递归查询时监听DNS服务器的流量
上图中的第一个数据包和上一次捕获文件中的初始查询相同。这时,DNS服务器接到了这个查询,在其本地数据包检查后,发现它并不知道关于DNS域名(nostarch.com)所对应IP地址的这个问题的答案。由于这个数据包发送时设置了 期望递归 ,因此在第二个数据包中,这个DNS服务器为了的得到答案向其他DNS服务器询问这个问题
在第二个数据包中,位于 172.16.0.102 的DNS服务器向 4.2.2.1 (其所设定的要转发上行请求的服务器)发送了一个新的查询,如下图
这个数据包被 4.2.2.1 接收之后,本地DNS服务器就接到了响应,如下图
接到了这个响应之后,本地的DNS服务器就可以将这个信息传递给 DNS客户端,如下图
虽然该例只展示了一层的递归,但对于一个DNS请求来说,递归查询可能会发生很多次。这里我们收到了来自DNS服务器 4.2.2.1 的回答,但那个服务器可能为了寻找答案也向其他服务器进行了递归查询。一个简单的递归查询在其得到最终响应之前可能遍历了全世界,DNS递归查询的过程如下图
六:DNS区域传送
DNS区域是一个DNS服务所授权管理的名字空间(或是一组DNS名称)。例如,masaike的这个网站可能由一个DNS服务器masaike.com负责,这样,无论是masaike内部或者外部的设备,如果希望将masaike.com解析成IP地址,都需要和这个区域的权威,也就是这个DNS服务器联系。如果masaike发展壮大了,它可能会增加一个DNS服务器,专门用来处理其名字空间的email部分,比如mail.masaike.com,那么这个服务器,就成为这个邮件子区域的权威,如果必要的话,还可以为子域名添加更多的DNS服务器,如下图所示
区域传送指的是通常出于冗余备份的的需要,在两台设备之间传送区域数据。例如,在拥有多个DNS服务器的组织中,管理员通常都会配置一台备用的DNS服务器,用来维护一份主服务器DNS信息的副本,以防止主DNS服务器不可用。主要存在两种区域传送
完整区域传送(AXFR):这个类型的传送将整个区域在设备间进行传送
增量区域传送(IXFR):这类型的传送仅传送区域信息的一部分
上图描述了有一个主机 172.16.16.164 和 172.16.16.139之间进行完整区域传送的例子
虽然DNS基于UDP协议,但它在比如区域传送的一些任务中也会使用TCP协议,因为TCP对于规模数据的传输更加可靠。上图的前三个数据包是TCP的三次握手
第四个数据包开始在 172.16.16.164 和 172.16.16.139进行实际的区域传送。这个数据包并不包含任何DNS信息。由于区域传送请求的数据包中的数据由多个数据包所发送,因此这个数据包被标记为重组装PDU的 TCP分片。数据包 4 和 6 包含了数据包的数据。数据包5是对于数据包4被成功接收的确认。这些数据包以这种方式显示出来是因为Wireshark处于可读性的考虑,将TCP数据包如此解析并呈现。可以将数据包6作为完整的区域传送请求,如下图
区域传送请求是典型的查询,但它请求的是AXFR类型而不是单一记录类型,这意味着它希望从服务器接收全部DNS区域。 服务器在数据包7中回复了区域记录,如下图
区域传送包含了相当多的数据,并且这还是一个很简答的例子。在区域完成之后,捕获文件以TCP连接的终止过程作为结束
区域传送的数据如果录入他人之手可能会很危险,例如:通过枚举一个DNS服务器,可以绘出整个网络的结构
来源:CSDN
作者:马赛克|
链接:https://blog.csdn.net/qq_39112646/article/details/104879920