Ethernet-Schnittstelle unter Linux verwirft Pakete

1051
GNA

Ich versuche einige Ethernet-Frames mit Linux zu erfassen. Einige dieser Pakete / Frames sind ungültig und enthalten beschädigte Daten.

Ein Ethernet-Frame enthält zum Beispiel den Typ 0x0800 (IPv4), die folgenden Daten enthalten jedoch nur zufällige Bytes. Außerdem sind Quell- und Ziel-MAC unbekannt und nicht vorhersagbar.

Um diese Frames zu erhalten, habe ich ein C-Programm geschrieben, das zuerst Raw-Sockets verwendete. Dies funktionierte nicht wie erwartet, also wechselte ich zu libpcap.

Ich öffne das Ethernet-Gerät im Promiscuous-Modus, um alle Frames zu empfangen und MAC-seitiges Filtern zu verhindern. Das funktioniert gut. Ich kann Frames mit jeder Ziel-MAC-Adresse empfangen.

Nun kommen wir zum großen Problem:

Ich sende einen Ethernet-Frame mit zufälligem Ziel und Quell-MAC. Das Type-Feld ist 0x1234 und die Daten sind nur wenige Bytes, sagen wir 0xdeadbeef. Dies wird auf die minimale Nutzlast aufgefüllt. Dieser Frame wird von meinem Programm mit libpcap gut empfangen.

Wenn ich denselben Frame mit einem "bekannten" Ethernet-Feldwert wie 0x0800 sende, wird der Frame gelöscht und mein Programm kann ihn nicht empfangen.

Die Software läuft auf einer Embedded-Plattform, einem Altera Cyclone V-SoC mit einem STMMAC-Ethernet-Modul. Auf einem normalen PC / Notebook usw. läuft das Programm einwandfrei und kann sogar diese ungültigen IPv4-Frames empfangen.

Um herauszufinden, wo die Pakete abgelegt werden, habe ich mir die /sy/class/net/eth0/statistics/rx_*Dateien angesehen. Es gibt Dateien, die die Anzahl der empfangenen Pakete und Bytes sowie die Anzahl der verworfenen Pakete zählen. Diese Statistiken funktionieren gut mit normalem Ethernet-Verkehr. Das Senden eines ungültigen Frames wie oben beschrieben führt jedoch nicht zu einer Änderung der Statistiken. Der Treiber zählt nicht einmal den Zähler für "Droped Frames" auf. Ich kann das nicht verstehen, denn soweit ich weiß, wird die Statistik der Netzwerkschnittstelle beeinflusst, sobald ein Paket von der Hardware empfangen wird. Der Filterungs- und Auswertungsprozess des Netzwerkstacks sollte nichts damit zu tun haben. Habe ich recht? Daher scheint mir, dass ein sehr niedriger Treibercode diese Pakete oder vielleicht sogar die Hardware selbst filtert.

Nochmals: Mit einem normalen PC auf der anderen Seite können die Pakete mit dem Programm, das ich geschrieben habe, empfangen werden.

Das zweite Problem betrifft gültige TCP-Pakete:

Obwohl ich libpcap verwende, das rohen Datenverkehr für mich bereitstellt, werden empfangene TCP-Pakete zu großen Paketen zusammengefügt, die sogar noch größer sind als die MTU der empfangenden Netzwerkschnittstelle. Diese Pakete werden normalerweise auch mit einem PC empfangen.

Kann mir jemand helfen? Ich muss rohen Ethernet-Verkehr "so wie er ist" unter Verwendung von Linux auf der Altera SoC-FPGA-Plattform empfangen.

0
Haben Sie es mit `wireshark` versucht (das auch` libpcap` verwendet)? Lässt es Frames fallen oder missverstanden? Ist dies der Fall, ist Ihre Hardware möglicherweise nicht für die Aufgabe geeignet. AFH vor 7 Jahren 0
Entschuldigung, ich kann auf dieser Ebene nicht helfen. Ich habe in der Vergangenheit die TCP-Programmierung durchgeführt und mit "Wireshark" den TCP / UDP-Verkehr überwacht, aber ich habe mich mit diesem Problem nicht befassen müssen. Ich hoffe jemand kann helfen. AFH vor 7 Jahren 0
Ich weiß es noch nicht, aber Linux-Kernel hatten früher die Möglichkeit, Paketfragmente zu ganzen Paketen zusammenzusetzen, bevor sie weitergegeben werden. Um das Todesklingeln und andere Angriffe durch Fragmentierung zu vermeiden. Vielleicht sehen Ihre zufälligen Daten wie Fragmente dieses Codes aus, und der Kernel versucht, alles wieder zusammenzusetzen, bevor das Paket verarbeitet wird infixed vor 7 Jahren 0
Ich habe das überprüft. Das Problem ist, dass das Paket nicht einmal den Kernel-Netzwerkstapel erreicht. Nicht einmal der Low-Level-Hardwaretreiber sieht dieses Paket. Ich habe keine Ahnung, warum es gefiltert wird. Wie ich oben schrieb: Die Netzwerkstatistiken (RX-Zähler usw.) ändern sich nicht. Dies sollte jedoch erfolgen, sobald ein Paket empfangen wird, bevor alle anderen Prüfungen durchgeführt werden. GNA vor 7 Jahren 0

0 Antworten auf die Frage