Scapy构造带Router Alert选项的IPv6逐跳扩展头发送失败,报ValueError错误求助
Scapy构造带Router Alert选项的IPv6逐跳扩展头发送失败,报ValueError错误求助
我之前也踩过这个坑!你遇到的问题本质是构造IPv6逐跳扩展头选项的方式不符合Scapy的要求,导致数据包构建失败,后续还触发了看似和dst相关的二次错误(其实是第一个构建错误引发的连锁反应)。
先还原你当前的问题代码:
hdr = IPv6ExtHdrHopByHop(options=[("Router Alert", b'\x01\x00')]) ip6 = IPv6(src="xxxx::xxxx", dst="yyyy::yyyy") send(ip6 / hdr)
这里用("Router Alert", b'\x01\x00')这种元组格式是错误的——Scapy并不识别直接用选项名称字符串作为元组的第一个元素,它期望的选项元素要么是预定义的选项Packet对象,要么是(选项类型码, 选项数据)的元组。
两种正确的解决写法
方法1:用Scapy预定义的RouterAlert类(推荐)
Scapy在inet6层已经帮我们预定义了RouterAlert这个选项类,直接实例化传值就行,最不容易出错:
from scapy.layers.inet6 import IPv6, IPv6ExtHdrHopByHop, RouterAlert from scapy.sendrecv import send # 替换成你的真实源目IPv6地址 ip6 = IPv6(src="xxxx::xxxx", dst="yyyy::yyyy") # value参数对应你之前的b'\x01\x00',转成十六进制就是0x0100 hdr = IPv6ExtHdrHopByHop(options=[RouterAlert(value=0x0100)]) send(ip6 / hdr)
方法2:直接用(选项类型码, 数据)的元组
Router Alert的IPv6选项类型码是0x05,也可以直接传类型码加数据的元组:
from scapy.layers.inet6 import IPv6, IPv6ExtHdrHopByHop from scapy.sendrecv import send ip6 = IPv6(src="xxxx::xxxx", dst="yyyy::yyyy") # 0x05是Router Alert的标准类型码,后面是你要传的选项数据 hdr = IPv6ExtHdrHopByHop(options=[(0x05, b'\x01\x00')]) send(ip6 / hdr)
为啥原来的写法会报错?
当你传入("Router Alert", b'\x01\x00')时,Scapy没法把这个字符串映射成合法的选项结构,在构建数据包时,它会把这个元组当成一个选项对象去调用alignment_delta方法(这是Scapy选项Packet才有的方法),自然就触发了AttributeError。而这个错误在后续的异常处理流程中被误判为缺少dst属性,才出现了那个看似无关的ValueError,其实根源还是选项的构造错误。
备注:内容来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

