Python 如何使用损坏的FCS发送以太网帧?

Python 如何使用损坏的FCS发送以太网帧?,python,networking,automated-tests,ethernet,Python,Networking,Automated Tests,Ethernet,我不确定这是否可能,因为这可能在硬件中处理,但我需要发送一些带有错误的以太网帧。我希望能够创建矮子、叽叽喳喳、错位和糟糕的FCS错误。我在使用Python。它可以在硬件中处理,但并不总是这样——即使是这样,也可以关闭它;请参阅卸载参数 关于完全控制您创建的框架——查看(一种方法)或(另一种方法) 这里有一篇关于的文章。首先,禁用以太网卡的校验和: sudo ethtool -K eth1 tx off 然后,从python发送损坏的帧: #!/usr/bin/env python from

我不确定这是否可能,因为这可能在硬件中处理,但我需要发送一些带有错误的以太网帧。我希望能够创建矮子、叽叽喳喳、错位和糟糕的FCS错误。我在使用Python。

它可以在硬件中处理,但并不总是这样——即使是这样,也可以关闭它;请参阅卸载参数

关于完全控制您创建的框架——查看(一种方法)或(另一种方法)


这里有一篇关于的文章。

首先,禁用以太网卡的校验和:

sudo ethtool -K eth1 tx off
然后,从python发送损坏的帧:

#!/usr/bin/env python

from socket import *

#
# Ethernet Frame:
# [
#   [ Destination address, 6 bytes ]
#   [ Source address, 6 bytes      ]
#   [ Ethertype, 2 bytes           ]
#   [ Payload, 40 to 1500 bytes    ]
#   [ 32 bit CRC chcksum, 4 bytes  ]
# ]
#

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth1", 0))
src_addr = "\x01\x02\x03\x04\x05\x06"
dst_addr = "\x01\x02\x03\x04\x05\x06"
payload = ("["*30)+"PAYLOAD"+("]"*30)
checksum = "\x00\x00\x00\x00"
ethertype = "\x08\x01"
s.send(dst_addr+src_addr+ethertype+payload+checksum)

请参见尝试使用scapy for python,这里有生成巨型帧的示例,也有生成矮小帧的示例

该程序没有按预期运行,无法生成FCS错误

网络驱动程序在生成的帧末尾再次添加了正确的校验和。当然,这种解决方案很可能适用于某些卡,但我敢肯定,英特尔的任何卡都不适用。(对我来说,它也可以在没有任何ethtool更改的情况下工作。)

对于至少一个Intel e1000e网卡,您需要对上面的代码进行一些小的更改: 在“s=socket(AF_PACKET,SOCK_RAW)”之后添加以下行:

这会告诉NIC驱动程序使用socket.h中定义的“SO_NOFCS”选项,并在不计算和添加FCS的情况下发送帧

您可能还对以下C程序感兴趣,它向我展示了如何操作:

但是请注意,如果没有一个小的改动,这个程序将无法在最近的内核上运行。 SOL_套接字似乎在过去某个时候将数字ID从42更改为43


根据原作者的说法,该功能应至少适用于以下驱动程序:e100、e1000和e1000e。3.16.0内核源代码中的快速grep表明ixgbe-igb和i40e也应该工作。如果您不使用这些卡中的任何一个,此插座选项可能不可用

谢谢你的指点,但请在答案中始终张贴示例,因为链接中的内容会发生变化,我们无法始终找到我们想要的内容。例如,我在这里找不到巨型或矮子的例子。(巨型机很简单,只需使用一个大的有效负载。)嗨@brice我是网络事物的初学者。请为您提到的每个变量添加一行代码/示例。IP地址需要是十进制还是十六进制格式?哪些值需要更改?
s.setsockopt(SOL_SOCKET,43,1)