9

我不确定这是否可能,因为这可能在硬件中处理,但我需要发送一些带有错误的以太网帧。我希望能够创建 runts、jabber、misalignment 和 bad FCS 错误。我正在使用 Python。

4

4 回答 4

9

可以在硬件中处理,但并非总是如此——即使是,您也可以将其关闭;请参阅ethtool卸载参数。

关于获得对您创建的帧的完全控制——查看PF_PACKET(对于一种方法)或tap driver(对于另一种方法)。

这是一篇关于使用 PF_PACKET 从 Python 发送手工制作的帧的文章。

于 2009-04-07T02:50:09.807 回答
5

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

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)

看到一个类似的问题

于 2011-06-17T08:02:35.137 回答
3

尝试使用 scapy for python,有一些例子可以生成巨型帧,还有一个矮帧。http://www.dirk-loss.de/scapy-doc/usage.html

于 2011-12-02T13:15:42.377 回答
2

该程序没有按预期工作以生成 FCS 错误。

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

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

s.setsockopt(SOL_SOCKET,43,1)

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

您可能还对以下 C 程序感兴趣,它确实向我展示了如何做到这一点:http: //markmail.org/thread/eoquixklsjgvvaom

但请注意,如果不进行小的更改,该程序将无法在最近的内核上运行。SOL_SOCKET 似乎在过去某个时间将数字 ID 从 42 更改为 43。

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

于 2014-09-18T20:55:09.790 回答