2016-06-01 7 views
2

Ich beabsichtige, bestimmte Paketdaten im Kernel zu finden und abzufangen (entweder bestimmte Pakete fallenzulassen oder sie umzuleiten). Ein natürlicher Weg besteht darin, alle Pakete irgendwie zu erfassen, ihre Daten zu überprüfen und bestimmte Pakete abzusetzen oder umzuleiten.Wie man Paket auf TCP Schicht im Kern abfängt, um Daten zu analysieren?

Ich habe versucht, sie direkt im Kernel-Code abzufangen (here, bei point, um die Daten in Benutzerbereich zu kopieren), aber die Daten, die vom Server ohne Anforderungen geschoben wird, kann dort nicht zugegriffen werden.

Eine andere Wahl könnte Netfilter Haken wie this post sein. Ein solcher Hook befindet sich jedoch unterhalb der TCP-Schicht, und es scheint, dass Neuordnung und Paketverlust noch nicht behoben sind.

Also frage ich mich, ob es elegante Lösungen gibt, Pakete zu fangen und auf TCP-Ebene zu operieren?

Danke!

+1

Sie auf Snort und schreiben Regeln für das aussehen könnte (oder, wie es ist Open Source, den Code bekommen, und herauszufinden, was sie tun). – Cwissy

+0

@Cwissy Danke! Also darf ich noch eine Frage stellen: Weißt du, ob Snort auf TCP funktioniert (um eine Neuordnung zu ermöglichen)? Mein Bauchgefühl ist, dass es die Neuordnung umgehen könnte, weil es libpcap verwendet, das von tcpdump verwendet wird. Hab ich recht? – zzy

+0

Nein, tut mir leid. Ich stelle mir vor, dass es tun muss, aber wie ich weiß, können Sie passende Regeln schreiben, die tief in die Pakete eindringen, d. H. Wenn eine E-Mail von einer bestimmten Adresse kommt, Pakete von der IP-Adresse fallen lassen, die sie sendet. Dazu müsste jedes Paket geöffnet werden und es wäre sinnlos, wenn nicht die ganze Nachricht in der richtigen Reihenfolge wäre. – Cwissy

Antwort

2

Wenn Sie nur bestimmte Sachen erhalten und nicht passende Sachen fallen lassen möchten, könnten Sie einen rohen/tcp-Sockel mit einem BFP-Filter öffnen?

Ex - https://www.kernel.org/doc/Documentation/networking/filter.txt

+0

Das klingt vielversprechend! Zwei Fragen dazu: 1) Kann ich das Paket tatsächlich fallen lassen, um zu vermeiden, dass es in den Protokollstapel eingeht? Es scheint, dass der Filter nur Pakete für den aktuellen BFP-Socket fallen lassen kann. 2) Gibt es einen einfacheren Weg den Magic Filter Code zu schreiben? Der Binärcode ist in der Tat nicht einfach zu handhaben .... Danke! – zzy

+1

1. In Ihrer ursprünglichen Frage erwähnten Sie netfilter nicht zu tun, weil es unter TCP ist. Auf welcher Basis möchten Sie Pakete löschen? 2. Das könnte etwas sein, das Sie sich https://github.com/iovisor/bcc ansehen möchten –

+0

Sie haben Recht ... Das Dilemma hier ist, dass BPF unter TCP ist und Neuordnung/Duplizierung wird noch nicht behandelt ... So es kann nicht einfach sein, Pakete mit Inhalt zu handhaben (die in mehreren Paketen getrennt sein können). – zzy