2008-09-15 21 views
4

Es ist nicht nur eine Aufnahme, die ich hier machen möchte. Ich möchte zuerst das Paket erfassen, dann in Echtzeit die Nutzdaten auf bestimmte Daten überprüfen, entfernen, eine Signatur einfügen und das Paket erneut in den Stapel einspeisen, um es wie zuvor zu versenden.Einbinden in den TCP-Stack in C

Ich hatte einen Blick auf die IPFW Umleitung Sockets mit IPFW und es sieht sehr vielversprechend aus. Wie wäre es mit Beispielen, wie Pakete verändert und mit Umleitungssockeln wieder in den Stack eingefügt werden? Wäre es aus Neugierde auch möglich, die Daten aus der Steckdose mit Java zu lesen, oder würde dies mich mit dem Packen von Mangeln und Reinjektieren etc. einschränken?

Antwort

0

Ich wollte andere Antworten, die Iptables empfohlen haben (abhängig von der Komplexität der Muster, die Sie versuchen zu entsprechen und den Paketänderungen, die Sie vornehmen wollen), bis ich das BSD-Tag bemerkte auf die Frage.

Da Stephen Pellicer bereits erwähnt wurde, ist libpcap eine gute Option zum Erfassen der Pakete. Ich glaube jedoch, dass libpcap auch zum Senden von Paketen verwendet werden kann. Als Referenz bin ich mir ziemlich sicher, dass tcpreplay es verwendet, um pcap formatierte Dateien wiederzugeben.

4

Siehe Umleitungsanschlüsse: Divert Sockets mini HOWTO.

Sie arbeiten, indem sie Datenverkehr, der mit einer bestimmten ipfw-Regel übereinstimmt, an einen speziellen rohen Socket übergeben, der dann geänderten Verkehr in die Netzwerk-Layer einlagern kann.

1

Wenn Sie nur nach Paketerfassung suchen, ist libpcap sehr beliebt. Es wird in grundlegenden Tools wie tcpdump und ätherisch verwendet. Was das "Einhängen in den Stack" betrifft, so scheint es, als würde man die Art und Weise, wie das Netzwerk implementiert wird, grundlegend ändern (dh eigene Layer hinzufügen oder das Verhalten von TCP ändern) die beste Wette. In Linux haben sie ein spezifisches Umleitungsziel für Benutzerraummodule, IPF hat wahrscheinlich etwas Ähnliches oder Sie könnten IPF modifizieren, um etwas Ähnliches zu tun.

Wenn Sie nur die Pakete sehen möchten, dann ist libpcap der richtige Weg. Sie finden es unter: http://www.tcpdump.org/

1

Es ist möglich, dies in Userspace mit der QUEUE oder NFQUEUE iptables Ziel zu tun, denke ich. Die Clientanwendung hängt an eine Warteschlange an und empfängt alle übereinstimmenden Pakete, die sie ändern kann, bevor sie erneut injiziert werden (sie kann sie auch löschen, wenn sie dies wünscht).

Es gibt eine Client-Bibliothek libnetfilter_queue, die für die Verknüpfung benötigt wird. Leider ist die Dokumentation minimal, aber es gibt einige Mailing-Listen-Posts und Beispiele, die herumklopfen.

Aus Leistungsgründen sollten Sie dies nicht für jedes Paket tun, sondern nur für bestimmte Pakete, die Sie mit den Standardregeln von iptables vergleichen müssen. Wenn das nicht genug ist, müssen Sie Ihr eigenes netfilter Kernel-Modul schreiben.