使用Python发送手工制作的BPDU(生成树协议包)

使用Python发送手工制作的BPDU(生成树协议包),python,sockets,networking,ethernet,scapy,Python,Sockets,Networking,Ethernet,Scapy,我正在尝试发送手工制作的BPDU TCN数据包(以及其他一些属于不同协议的数据包),以测试我的网络实验室是否存在DoS攻击 我找到了,但没用 我曾尝试使用原始套接字和scapy,但没有成功 这是我使用原始套接字的代码: from socket import * from struct import pack class EthFrame(): def __init__(self, dst_addr='', src_addr='', llc_header ='', payload ='

我正在尝试发送手工制作的BPDU TCN数据包(以及其他一些属于不同协议的数据包),以测试我的网络实验室是否存在DoS攻击

我找到了,但没用

我曾尝试使用原始套接字和
scapy
,但没有成功

这是我使用原始套接字的代码:

from socket import *
from struct import pack
class EthFrame():
    def __init__(self, dst_addr='', src_addr='',  llc_header ='',  payload =''):
        self.dst_addr = dst_addr
        self.src_addr = src_addr
        self.llc_header = llc_header
        self.payload = payload
        self.header = pack('!s', self.dst_addr + self.src_addr + self.llc_header)  
        self.frame = pack('s',  self.header + self.payload)

    def sendFrame(self,  interface):
        s = socket(AF_PACKET,  SOCK_RAW)
        s.bind((interface, 0))
        s.send(self.frame)

p = EthFrame(b'\x01\x80\xC2\x00\x00\x00',  b'\x00'*6,  b'\x42\x42\x03',  b'\x00\x00\x00\x80')
p.sendFrame('eth0')
结果是一个格式错误的数据包只包含一个字节——“00000010”。 据我在文档中读到的,NIC应该自己添加CRC和填充位

这是我的
scapy
代码:

import scapy.all
from scapy.all import *

netpacket = Raw('\x00\x00\x00\x80')
sendp(netpacket,  iface="eth0")
它还发送一个格式错误的数据包,这次包含两个字节

我正在准备的数据包在的第5页进行了描述

我正在使用Linux

----编辑: 按照Oliver的建议,我正在添加链接文档中的信息

TCN(拓扑更改通知)BPDU数据包是第2层以太网(I)数据包。根据硬件供应商的不同,BPDU数据包的结构存在细微差异。在这个例子中,我使用CISCO实现

以太网报头应始终将目标地址设置为01:80:C2:00:00:00(STP多播地址)

在以太网报头之后,TCN BPDU应包括:
逻辑链路控制-3个字节,始终设置为[0x42、0x42、0x03]
BPDU头-4字节,用于TCN BPDU,始终设置为[0x00,0x00,0x00,0x80]


然后是填充(在本例中39字节设置为0x00)

您忘记了数据包中源以太网地址和LLC之间的以太网长度。在本例中,它将是7(LLC为3字节,STP为4字节)。在代码中,替换:

        self.header = pack('!s', self.dst_addr + self.src_addr + self.llc_header)  
        self.frame = pack('s',  self.header + self.payload)
作者:

但正如@Yoel所建议的,您最好的选择是使用Scapy:

>>> sendp(Dot3(dst="01:80:c2:00:00:00")/LLC()/STP(bpdutype=128))
或者,如果您想直接打造自己的LLC级别:

>>> sendp(Dot3(dst="01:80:c2:00:00:00")/LLC('\x42\x42\x03\x00\x00\x00\x80'))

欢迎来到Stackoverflow。您能否将该pdf文档中的相关信息添加到您的问题中?这样做是为了帮助未来的用户,以便在链路崩溃的情况下,他们仍然能够推断数据包的内容。感谢您的回复。Scapy解决方案非常有效。Python脚本仍然只发送1字节格式错误的压缩数据。
>>> sendp(Dot3(dst="01:80:c2:00:00:00")/LLC('\x42\x42\x03\x00\x00\x00\x80'))