DNS消息格式

消息类型

DNS消息包含三种类型:

  • 请求
  • 响应
  • 更新

请求和响应在原始标准中定义,更新在RFC 2136中定义。

DNS通用消息格式

DNS通用消息格式如下:

DNS消息头

DNS消息头包含以下字段:

字段名称描述
Transaction ID16比特,标识一次DNS交互。由请求端生成,响应端返回,用于将响应报文对应到请求报文
Flags:16比特,包含各种标记,标记定义如下:
Request/response1比特,为0时表示请求,为1时表示响应
Operation code4比特,表示操作码,0x0表示查询
Authoritative answer1比特,表示响应者是域名的权威名字服务器
Truncation截断标志位,1比特,为1时表示响应超过512字节,已被截断
Recursion desired1比特,表示递归查询
Recursion available1比特,为1时表示响应值可以处理递归查询
Reserved3比特,保留字段,为0
Return code4比特,返回码。0表示成功响应,0x3表示域名错误,域名在权威名字服务器上不存在
Question Resource Record count16比特,表示问题个数
Answer Resource Record count16比特,表示回答个数
Authority Resource Record count16比特,表示权威资源记录个数
Additional Resource Record count16比特,表示额外资源记录个数

问题字段

该字段表示查询的域名,包含以下三个字段:

  • Question Name:查询名,由一组labels组成,为length-value格式,1字节表示长度,尾随数据(即label)。例如对于域名www.baidu.com,表示为0x03www0x05baidu0x03com,其中十六进制数表示长度。
  • Question Type:16比特,表示查询类型,有以下类型:
    • 0x01 Host (A) record
    • 0x02 Name server (NS) record
    • 0x05 Alias (CNAME) record
    • 0x0C Reverse-lookup (PTR) record
    • 0x0F Mail exchange (MX) record
    • 0x21 Service (SRV) record
    • 0xFB Incremental zone transfer (IXFR) record
    • 0xFC Standard zone transfer (AXFR) record
    • 0xFF All records
  • Question Class:表示查询类

DNS资源记录

回答、授权、额外信息字段均采用资源记录(Resource Record)格式,定义如下:

字段名称描述
Resource Record NameDNS域名,其格式与问题字段中的查询名相同,但是为了节省数据,如果之前出现了相同的名字,则此处的值为之前相同名字相对报文中DNS起始数据的位置。如问题的查询名为www.baidu.com,回答字段中的资源记录名字与之相同,因此其值为0xc0 0x0c(0xc0表示引用,0x0c表示查询名相对DNS起始数据的位置是12)
Resource Record Type16比特,资源记录类型,与问题字段中查询类型相同
Resource Record Class16比特,资源记录类(IN: 0x0001)
Time-to-Live32比特,TTL
Resource Data Length16比特,资源数据长度
Resource Data资源数据

转载于:https://www.cnblogs.com/aurora-s/p/5030021.html

### Wireshark 中 DNS 报文的格式结构分析 DNS 协议是一种基于 UDP 或 TCP 的应用层协议,主要用于域名解析服务。在 Wireshark 中捕获并分析 DNS 数据包时,可以通过其字段来理解请求和响应的具体内容。 #### DNS 请求报文的主要组成部分 DNS 请求报文中包含了多个关键字段,用于指定查询的目标名称以及所需的记录类型: 1. **Transaction ID**: 事务标识符是一个 16 位整数,由客户端随机生成,用来匹配请求与响应之间的关系[^3]。 2. **Flags**: 标志字段定义了消息的性质(如是否为查询或响应),还包括其他标志位,比如 recursion desired (RD),表示客户希望服务器提供递归查询支持。 3. **Question Count (QDCOUNT)**: 表明此数据包中有多少条问题记录,通常是单个值 `1`。 4. **Answer Record Count (ANCOUNT), Authority Record Count (NSCOUNT), Additional Record Count (ARCOUNT)**: 对于请求来说这些计数值一般都设为零;而对于应答而言,则会填充相应的资源数量信息。 以下是典型的 DNS 查询部分展示: ```plaintext ; <<>> DiG 9.18.12-RedHat-9.18.12-7.el9_2.1 <<>> ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50421 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ``` #### DNS 响应报文的关键要素 当接收到一个有效的 DNS 请求后,DNS 服务器返回的数据包也遵循固定的格式布局: 1. **Header Section**: 同样包含 Transaction ID 和 Flags 字段,在这里 QR bit 被置为 '1' 来表明这是一个回应而非询问。 2. **Questions Section**: 复制自原始提问中的疑问描述区域,保持不变以便验证回复准确性。 3. **Answers Resource Records (RRs)**: 提供所求解的信息集合,每一条目至少包括名字(Name)、类型(Type)、类别(Class)、TTL(Time To Live) 及实际资料(Data)[^3]。 4. **Authority RRs & Additional Information Sections**: 如果适用的话还会附加权威性的 NS 记录或者额外辅助说明材料等补充细节。 通过上述介绍可以看出,利用 Wireshark 工具能够深入剖析每一个阶段内的具体交互过程及其背后隐藏的技术原理。 ```python import dpkt def parse_dns_packet(packet): eth = dpkt.ethernet.Ethernet(packet) ip = eth.data udp = ip.data dns = dpkt.dns.DNS(udp.data) transaction_id = dns.id is_query = bool(dns.qr == 0) # Check if this is a query or response. questions = [] answers = [] for q in dns.qd: questions.append((q.name, q.type)) for rr in dns.an: answers.append((rr.name, rr.type, rr.rdata)) return { "transaction_id": transaction_id, "is_query": is_query, "questions": questions, "answers": answers } # Example usage with pcap file reading. from scapy.all import rdpcap packets = rdpcap('example.pcap') for packet in packets: result = parse_dns_packet(bytes(packet)) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值