DNS数据包格式解析

       DNS数据包大概可以分为基本选项部分、请求部分、应答资源部分;下面讲解将以访问百度抓取到的请求/应答数据包来说明

 

 

  1. 基本选项部分

基本选项部分的结构请求数据包和应答数据包基本都是一样的,只是对应的值不一样或者某些标志位只对请求书包或应答数据包有效而已,下面说明下每个标志的作用

请求数据包的基本选项部分:

应答数据包的基本选项部分:

Length:占用两个字节,表示整个DNS数据的长度(不包含length占用的两个字节),这个标志只在TCP请求数据包中存在

Transaction ID:占用两个字节,请求的ID号,应答数据包中的ID号会与请求中的ID号一一对应,理论上此ID号应该是随机的,但是在测试中发现win中使用nslookup查询时此ID号是递增1的,属于特殊情况

Flags:占用两个字节,表示多个标志

Q/R:第一位表示请求(1)/应答(0);

Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。

Truncated:表示应答包是否有被截断。请求中会带有一个UDP payload size字段,当应答数据包中DNS数据长度超过该值时,应答则会被截断;只有UDP应答会被截断,TCP请求中,UDP payload size不生效;当客户端收到被截断的数据包时,应转而发送一个TCP-DNS的数据包来获取完整的应答

Recursion desired:为1时表示期望递归查询,为0时表示可以接受迭代查询

Z:保留字段,一般置为0

AD bit:当服务器返回的资源记录已被的本地DNS服务器认证通过时,会将此位置为1,否则置为0

reply-code:应答响应码,表示查询结果

Questions、Answer RRss、Authority RRs、Additonal RRs:标志域名数与资源记录数;一般会根据这里提取到的数值去获取后面的RRs;当数值比实际RRs数要大时,就会解析失败,而当数值比实际的RRs数小时则可能可以解析成功,多出来的RRs数会被放置到下一个区域中去解析(e.g.,answer区域中多出来的RRs数会被放置到authority区域中),末尾多出来的则会被忽略。

2、请求部分

       请求数据包和应答数据包中的请求部分都是一样的,应答数据包会把请求数据包中的请求部分原样返回

       首先从含义上看,请求中携带的是请求域名、请求记录类型、还有记录类;服务器会跟着请求记录类型来判断需要返回哪种记录类型的数据;记录类(class)表示网络类型,目前只有互联网,所以都是IN。

       type和class都是固定占用了两个字节,而域名占用的则有不同;首先域名被分成了3段,即图中的Label Count;域名总长度为13字节(Name Length)。但是在数据包中实际上是占用了15个字节,因为在解析DNS数据包时,会按段提取解析并在每段前面加上每段的长度值,例如第一段是www,长度是3,w对应的ascall码值为77,则会用03 77 77 77来表示www;最终域名的结尾还会加上00来表示

       还有一种域名表达方式是当该域名在数据包前面已经出现过了,那么后面的域名就会引用前面的域名;引用方式为以c0开头,后面加上一个偏移量,这个偏移量从DNS数据部分开始计算;例子如下:

       在应答区域中出现了请求的域名名称,因为不是第一次出现,所以用了c0 0c表示;在DNS数据包中,c0 0c会是比较常见的,因为请求区域中的域名都是在第12个字节中出现。(ID:2字节+flags:2字节+ Questions:2字节+Answer RRss:2字节+Authority RRs:2字节+Additonal RRs:2字节 = 12)。

  1. 资源记录部分

资源记录部分可以分成三个区域:answer、authority、additional;后面两者在应答数据包中属于对answer 的补充;请求数据包中,也会常会带一个additional区域,以此来实现一些拓展功能;

首先看下请求数据包中的资源记录部分

请求数据包中的资源记录部分,type值为opt,表示是拓展选项功能;其中我们一般会用到,需要注意的是UDP payload size和Client subnet这两个部分;

        UDP payload size我们在前面有提起过,是用于限制服务器返回的DNS数据长度大小,且只对UDP的DNS应答有效;最小值为512;老版本的DNS中不支持EDNS,也就不支持指定UDP payload size,此时默认的UDP payload size大小为512字节,超过了也会被截断;当我们使用dig请求去发起请求时,也可以通过添加bufsize来指定其大小。

        Client subnet部分用于携带客户端的源IP;我们在发起DNS请求时,数据包可以会被多次转发、SNAT,导致最终服务器无法得知真实的客户端源IP,这时则可以通过指定Client subnet来避免;服务器获取到源IP后就可以根据源IP来返回距离客户更近的服务器地址。下面我们看下Client subnet的构成

        首先是一个option code字段用来表示以下为Client subnet部分;接着是length表示Client subnet的整体长度;再接着两个字节表示源IP类型,1表示IPv4,2表示IPv6;下一个字节Source Netmask表示源IP的掩码长度。最后的Client subnet则是源IP的网络号,如果是IPv4类型,则网络号中每一段都只占用1个字节;而如果是IPv6类型,则每段占用2个字节。在使用dig发起请求时,可以通过+subnet=1::23/128来指定Client subnet值。

        接下来看下应答数据包中的资源记录部分

        应答数据包的资源记录部分各区域的结构都是一致的,与请求部分也很相像,重复的部分就不再赘述;多的部分有TTL时间以及解析结果;TTL时间表示了该记录的有效期限,当期限到了后,客户端需要重新发起申请。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值