Wie sende ich einen rohen Ethernet-Frame in Python
Ich muss ein Projekt in ein paar Tagen fertig haben, es ist eine grundlegende Client- und Serverschnittstelle. Der Haken ist, dass es nur rohe Steckdosen sein müssen. Ich habe kein Problem damit, das zu erstellen, ich stecke nur beim Senden der Pakete fest.
Zuerst habe ich versucht, es an ein Interface 'en1' zu binden, aber es gibt mir immer wieder einen Fehlernodename not known
. Wenn ich es an meine lokale IP-Adresse binde, funktioniert es einwandfrei. Nach Abschluss dieses Vorgangs habe ich eine Rohpaketklasse erstellt. Ich habe dann einen sendto-Anruf getätigt, um es auf dem Draht zu senden.
Das Problem ist, dass wenn ich das Paket mit Wireshark aufnehme, es als Nutzlast eines IPv4-Pakets angezeigt wird. Ich möchte nicht, dass die Header automatisch erstellt werden. Dafür war meine Rohpaketklasse sowieso gedacht. Wissen Sie, wie ich diese Header entfernen kann?
Hier ist mein Code - nur die Raw-Funktion:
def raw():
HOST = gethostbyname('192.168.1.10')
s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
s.bind((HOST, 0))
s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!
pckt = packet("\x68\x65\x6c\x6c\x6f")
netpacket = pckt.getpacket()
print "Sending.. "
print ""
s.sendto(netpacket, ('192.168.1.1', 80))
data = s.recv(4096)
print data
o und hier ist das erfasste Paket mit einem Hallo am Ende:
007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f
2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050
0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello
* Dies ist der Beginn der Nutzlast, obwohl dies der Beginn des Pakets sein sollte. Ich werde auch keine anderen Module verwenden, für die ich den Socket verwenden muss.