Scapy生成的pcap文件被tcpreplay读取出现DLT错误如何解决
错误原因
你构造的Scapy数据包仅包含三层IP及上层协议,没有以太网链路层结构,调用wrpcap写入pcap文件时,Scapy会默认使用DLT_RAW(值为0xe4)作为链路层类型,而tcpreplay默认仅支持标准以太网的DLT_EN10MB(值为0x1)类型,因此抛出不支持DLT类型的报错。
解决方案
方案1:构造包时补全以太网层(推荐,从根源解决问题)
在构造Scapy包时补充以太网链路层,生成的pcap默认就会使用tcpreplay支持的DLT类型,修改后代码参考:
from scapy.all import Ether, IP, UDP, Raw, wrpcap # 以太网目的MAC可根据实际需求填写,测试场景可直接使用广播地址ff:ff:ff:ff:ff:ff pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / IP(dst="116.73.117.174", src="239.50.50.12") / UDP(sport=10812, dport=42)/ Raw(load=b"Data") pkt.show2() # 自动计算校验和 wrpcap('DATA.pcap', pkt, append=True)
重新生成的pcap文件可直接用tcpreplay正常回放。
方案2:修改已有pcap的DLT类型
如果已经生成了无链路层的pcap文件,可使用Wireshark自带的editcap工具直接修改DLT类型,执行命令:
editcap -T ether 原始.pcap 转换后.pcap
将命令中的原始.pcap替换为你现有文件的路径,转换后.pcap替换为输出文件路径即可,转换后的文件可直接被tcpreplay识别。
验证DLT修改结果
可通过capinfos工具(Wireshark自带)查看pcap的DLT类型,确认转换是否成功:
capinfos 目标.pcap | grep "DLT"
正常输出为DLT = Ethernet (1) / Ethernet即代表DLT类型符合tcpreplay的要求。
内容的提问来源于stack exchange,提问作者DrBug
相关产品推荐
相关产品推荐

