DNS报文格式及抓包解析

    技术2024-07-11  73

    报文结构

    DNS的报文结构如下,其中黄色为基础部分,绿色为问题部分,蓝色为资源记录部分。资源记录部分只在响应包中出现。

    基础部分

    1.事务ID

    16bit,DNS报文的标识,请求报文和对应的响应报文的事务ID应该相同。

    2. 标志

    16bit,分为8个字段:

    字段长度/bit作用QR1查询报文为0,响应报文为1Opcode4标准查询为0,反向查询为2,请求服务器状态为2AA1授权应答,在响应报文中有效1表示名称服务器是权威服务器0表示不是权威服务器TC1是否被接断1表示响应超过512个字节,只返回前512个字节RD1期望递归,在查询报文中设置1表示递归查询0表示迭代查询RA1可用递归,用于响应RD1表示服务器支持递归查询zero3保留字段,全为0rcode4返回码0表示没有错误1表示请求报文格式错误2表示域名服务器失败 3表示解析的域名不存在 4表示查询类型不支持 5表示拒绝应答

    3. 问题计数

    16bit,DNS查询请求的数量

    4. 回答资源记录数

    16bit,DNS响应的数量

    5. 权威名称服务器计数

    16bit,权威名称服务器的数量

    6. 附加资源记录数

    16bit,额外的记录数目(权威服务器对应的Ip地址)

    问题部分

    问题部分由三个字段组成:查询名,查询类型,查询类

    1. 查询名

    要查询的域名。长度不固定,由一段或多段标识符组成,首字节表示随后标识符的长度,单位为字节;每个域名结尾用一个0字节表示。例如baidu.com:

    5baidu3com0计数计数结尾

    2. 查询类型

    16bit,表示要查询的类型,常见的有:

    值助记符说明1A由域名获得IPv4地址28AAAA由域名获得IPv6地址12PTR由IP地址获得域名

    3. 查询类

    16bit,表示地址类型,常用的是IN(值为1),表示互联网地址。

    资源记录部分

    资源记录部分包含回答问题区域、权威名称服务器区域、附加信息区域。这三部分的格式都为域名+类型+类+生存时间+资源数据长度+资源数据。

    1. 域名

    长度可变,DNS请求的域名。当此域名与前文重复时,为减小报文的长度可以将此域名压缩为16bit的指针,指向前文中已经出现过的域名,方法为:

    16bit指针的最高两位均置1,剩余14位的值表示前文中的域名相对于DNS报文头的偏移字节数。如:

    在上图中,回答问题区域的域名与问题部分的域名重复,因此使用了指针c0 0c。去掉最高两位后,指针表示重复域名距离DNS的报文头偏移了0c个字节。从图中可以看到,第十三个字节开始被蓝色框住的部分,即为问题部分的域名数据。

    2. 类型

    16bit,与问题部分的查询类型相同。

    3. 类

    16bit,与问题部分的查询类相同。

    4. 生存时间

    32bit,表示资源记录可以缓存的时间,单位为秒。

    5. 资源数据长度

    16bit,资源数据的长度。

    6. 资源数据

    按要求返回的资源数据。

    抓包解析

    基础部分

    问题部分

    资源记录部分

    Processed: 0.015, SQL: 9