9

これはハードウェアで処理される可能性があるため、これが可能かどうかはわかりませんが、エラーのあるイーサネットフレームを送信する必要があります。ラント、ジャバー、ミスアライメント、および不良FCSエラーを作成できるようにしたいと思います。私はPythonで働いています。

4

4 に答える 4

9

ハードウェアで処理できますが、常にそうであるとは限りません。ethtoolオフロード パラメータを参照してください。

作成したフレームを完全に制御するには、PF_PACKET (あるアプローチの場合) またはタップドライバー(別のアプローチの場合) を調べてください。

これは、 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

Python 用の scapy を使用してみてください。ジャンボ フレームやラント フレームを生成する例もあります。http://www.dirk-loss.de/scapy-doc/usage.html

于 2011-12-02T13:15:42.377 に答える
2

プログラムが意図したとおりに動作せず、FCS エラーが発生しました。

ネットワーク ドライバーは、生成されたフレームの最後に正しいチェックサムを再度追加しました。もちろん、ソリューションが一部のカードで機能する可能性は十分にありますが、Intel のカードでは機能しないと確信しています。(ethtool を変更しなくても動作します。)

少なくとも Intel e1000e ネットワーク カードでは、上記のコードを少し変更する必要があります: "s = socket(AF_PACKET, SOCK_RAW)" の後に次の行を追加します:

s.setsockopt(SOL_SOCKET,43,1)

これにより、socket.h で定義された「SO_NOFCS」オプションを使用して、FCS を計算および追加せずにフレームを送信するように NIC ドライバーに指示します。

次の C プログラムにも興味があるかもしれませんが、その方法を教えてくれました

ただし、最近のカーネルでは少し変更しないとプログラムが動作しないことに注意してください。SOL_SOCKET は、過去のある時点で数値 ID を 42 から 43 に変更したようです。

元の作者によると、この機能は少なくとも次のドライバーで利用できるはずです: e100、e1000、および e1000e。3.16.0 のカーネル ソースの簡単な grep は、ixgbe igb と i40e も動作するはずであることを示しています。これらのカードを使用していない場合、このソケット オプションは使用できない可能性があります。

于 2014-09-18T20:55:09.790 に答える