通过scapy发送的DNS-SD PTR数据包的rdata字段导致wireshark中的未知扩展标签

时间:2014-11-14 15:11:02

标签: dns wireshark scapy

目前我正在尝试为要求_printer._tcp.local的查询模拟DNS-SD回复

我用scapy发送的内容如下:

send(IP(dst="224.0.0.251")/UDP(sport=5353,dport=5353)/DNS(aa=1, qr=1,rd=0,an=DNSRR(rrname='_printer._tcp.local', type="PTR", rclass=1, ttl=100, rdata="Devon's awesome printer._printer._tcp.local")))

但是,当我检查Wireshark时,我收到以下错误信息包

_printer._tcp.local: type PTR, class IN, <Unknown extended label>

我假设我的发送功能中有一些错误的参数。但是,我尝试了一些变化,我似乎无法使其正常工作(我与打印机的实际回复相比,而且看起来相同)。

任何人都可以帮我解决正确的参数吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个突出的问题,可以在scapy's issue tracker上看到。

因此,您必须自己对rdata字段进行编码,如下所示:

from scapy.all import *
import struct

label = "Devon's awesome printer._printer._tcp.local"
sublabels = label.split(".") + [""]
label_format = ""

for s in sublabels:
    label_format = '%s%dp' % (label_format, len(s) + 1)

label_data = struct.pack(label_format, *sublabels)

send(IP(dst="224.0.0.251")/UDP(sport=5353,dport=5353)/DNS(aa=1,qr=1,rd=0,an=DNSRR(rrname='_printer._tcp.local',type="PTR",rclass=1,ttl=100,rdata=label_data)))