gechger
Goto Top

Analyse von TCP IP-Paketen auf bestimmte Inhalte im Datenbereich

In meinem aktuellen Projekt soll bei einer Prüfung des Datenbereiches von TCP/IP Paketen bei bestimmten definierten Inhalten eine Reaktion erfolgen. Gesucht wird zunächst das passende konzept.

Guten Morgen liebe Administrator-Gemeinde,

heute habe ich eine sehr spezielle Frage im Bereich TCP/IP. Nach tagelanger Recherche habe ich (hoffentlich) einige Ansätze für mein Projekt bekommen, frage aber lieber nach, ob ich mich da in eine Sackgasse bewege, um nicht noch mehr Zeit zu investieren. Kurze Beschreibung des Projektes:

Zum Testen habe ich einen Ubuntu Server aufgesetzt, es läuft Apache und PHP darauf, ebenfalls Wireshark zur Analyse. Der Server ist im Internet und lauscht auf Port 4000 auf bestimmte Informationen. Um diese Informationen geht es.

Geräte senden über GPRS/Internet über Port 4000 TCP/IP Pakete an meinen Webserver. Die kommen auch an, Wireshark dokumentiert dies. Ich brauche aber nur bestimmte Pakete, die ich filtern muß.
Schritt 1: Prüfung der Pakete auf Inhalt, gesucht wird eine definierte Seriennummer.
Schritt 2: Suche der Seriennummer in einer MySQL-Datenbank
Schritt 3: Falls erfolgreich, Rücksendung einer Freigabe in einem TCP/IP-Datenbank an das Gerät
Schritt 4: Gerät sendet TCP/IP-Datenpaket mit Life-Daten
Schritt 5: Diese Life-Daten werden umgewandelt und in einer MySQL-DB abgelegt

Zur Zeit versuche ich Schritt 1 umzusetzen. Wie prüfe ich am sinnvollsten die Pakete?
Ich könnte den Port 4000 in ein eigenes Root-Verzeichnis senden lassen, dort eine .htaccess Datei plazieren, die die Pakete an ein Skript sendet.
Das könnte PHP sein, wo ich über die Socket-Skripts versuchen könnte, die TCP/IP-Pakete auseinander zu nehmen. Ich könnte aber auch versuchen, die Bits zu zählen, um über die String-Skripts an die nötigen Informationen zu gelangen. Oder es gibt noch eine viel einfachere Lösung?

In JAVA scheint es auch entsprechende Funktionen zu geben. Das Ganze muß hoch effektiv sein, da später im Lifebetrieb einige 100 Geräte in 30 Sekunden-Abständen Daten loswerden sollen.

Es wäre mir eine große Hilfe, wenn mir einer von Euch helfen könnte, das Konzept zu definieren. Bei der Umsetzung mag es dann später noch weitere Fragen geben, aber zunächst ist das Konzept wichtig.

Vielen Dank für jede Hilfe
Chris

Content-ID: 195800

Url: https://administrator.de/contentid/195800

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

maretz
maretz 13.12.2012 um 09:42:51 Uhr
Goto Top
Moin,

erste Frage: Was verstehst du unter "Paket"? Es kann ja zum einen ein komplettes Informations-Paket sein (z.B. bei Positionsdaten ein Satz mit den Lat/Lng-Werten usw.). Oder meinst du wirklich ein einzelnes IP-Paket - hier müsstest du dann ja darauf Rücksicht nehmen das ein Paket fragmentiert worden sein kann…

Jetzt hast du natürlich die Option z.B. mittels Netcat einfach den Datenstrom abzugreiffen, in ne Datei zu loggen und dann mit einem zweiten Netcat die Dateien wieder in die Pipe zu senden. Nicht schön - aber machbar.

Alternativ könntest du einfach deinen Listener-Prozess ansehen - wenn du hier die Möglichkeit hast da in den Programmcode zu gucken dann wäre das m.E. der Platz an dem ich suchen würde.

Wenn du allerdings unter Echtzeit-Bedingungen arbeiten musst (je nachdem wie relevant die Daten sind die da kommen - beim autonomen Fahrzeug kann es ja durchaus relevant sein ob ich die Position des Fahrzeuges *jetzt* habe - oder vor 1 Sekunde (dann habe ich ggf. schon 15 Meter abweichung….)) dann wirst du mit beiden Wegen nix werden… Hier musst du dann schon mehr Aufwand betreiben - bis hin dazu das du das Programm im ASM schreibst und auf nem eigenen Chip laufen lässt ;).

Um da nen sinnvollen Tipp zu geben müsstest du halt schon die Randbedingungen erklären -> mit den Infos wäre noch so ziemlich alles möglich…

Schönen Gruß

Mike
marinux
marinux 13.12.2012 um 10:07:56 Uhr
Goto Top
Hi,

siehe z.B. http://ask.wireshark.org/questions/9682/trigger-an-executable-file-once ...
oder
http://www.snort.org/

Damit kannst du direkt mitschneiden und triggern.

Gruß
gechger
gechger 13.12.2012 um 10:46:18 Uhr
Goto Top
Hallo
vielen Dank für die schnellen Antworten.

Zur Erläuterung:
ich protokolliere den Dialog in Wireshark (Follow TCP-Stresm), sehe die Aushandlung des Dialoges und erkenne beim [PSH,ACK] des Client, daß nach dem TCP-Header Daten enthalten sind (Im Bereich > 256 Bit). Darin steht die Seriennummer. Alle Pakete vorher enthalten keine Informationen im Datenbereich.

Es geht mir also darum, das Paket zu greifen, wo in dem Datenbereich etwas drin steht, zu prüfen, ob der Inhalt gültig ist, und dann eine Antwort zum Client zu senden. Alle anderen Pakete sollen ignoriert werden. Wenn ein Paket fragmentiert wäre, kann keine Freigabe an den Client gesendet werden. Dieser probiert es dann gleich wieder, solange bis ein gültiger Datensatz ankommt.

Sekundengenau muß die Information nicht zur Verfügung stehen, die Zeit des Datensatzes wird zwar sekundengenau erfasst und versendet, muß aber nicht zwingend in der folgenden Sekunde sichtbar sein. Das Holen der Daten erfolgt immer mit etwas zeitlichem Versatz (kleinster Aktualisierungs-Intervall: 1 Minute). Es geht tatsächlich um Ortungsdaten von Fahrzeugen, wobei uns eher die Orte wichtig sind, wo das Fahrzeug steht. Für den Bereich "Einsatzsteuerung" reicht diese Aktualisierungsrate.

Freundliche Grüße
Chris
gechger
gechger 13.12.2012 um 10:49:28 Uhr
Goto Top
Hallo Marinux,

wenn ich den Link richtig verstehe, dann kommt dort LUA zum Einsatz. Dann könnte ich doch sicher mit dem MySQL-Proxy auch arbeiten? Der unterstützt doch LUA?

Freundliche Grüße
Chris
marinux
marinux 13.12.2012 um 10:59:59 Uhr
Goto Top
Hi,

bezüglich der Anbindung externer Programme kann ich Dir leider nichts sagen, da habe ich so gut wie keine Erfahrung. Ich wollte Dir nur aufzeigen, dass es möglich ist direkt mit Netzwerksniffern Events auszulösen, was in Deinem Fall viel Arbeit sparen sollte face-smile

Gruß
aqui
aqui 14.12.2012 um 11:52:47 Uhr
Goto Top
Und filtern tust du die Pakete über iptables aber das geht maximal bis zum Layer 4. Content in höheren Layern kann iptables nicht filtern da musst du was anderes nehmen.