2010-11-26 7 views
5

Ich bin versucht, ein Userspace-Anwendung zu schreiben, die in ein Netzwerk-Stack des Betriebssystem einhängen kann, schnüffeln Pakete vorbei fliegen und bearbeiten diejenigen, die ihre Interesse an.Umschreiben von Netzwerkpaketen on the fly mit libnetfilter_queue

Nach viel googeln, es erscheint Für mich ist das die einfachste (und doch einigermaßen robuste) Methode, dies zu tun (auf jeder Plattform) das Projekt libnetfilter_queue von Linux. Ich habe jedoch Schwierigkeiten, eine angemessene Dokumentation für das Projekt zu finden, außerhalb der begrenzten official Dokumentation. Seine Hauptmerkmale (wie durch die erste Verbindung angegeben sind)

  • Empfangen der Warteschlange Pakete von dem Kernel nfnetlink_queue Subsystem
  • ausstellende Urteilssprüche und/oder geänderten Pakete zum Kernel nfnetlink_queue Subsystem Reinjezierung

Schwerpunkt ist mein eigenes. Wie genau soll das gemeint sein? Ich habe versucht, den Code sample zu ändern, der zur Verfügung gestellt wird, aber vielleicht verstehe ich etwas falsch. Der Code arbeitet im NFQNL_COPY_PACKET Modus, also ich am empfange das ganze Paket - aber meine Änderungen scheinen auf meine eigene Anwendung beschränkt zu sein - wie man erwarten würde, angesichts der "Kopie" Semantik.

Mein Gefühl ist, dass ich irgendwie von NF_QUEUE Gebrauch machen soll, aber ich habe es noch nicht ganz gemunkelt. Irgendwelche Zeiger?

(! Wenn es ein einfacherer Mechanismus, dies zu tun ist, die auch Cross-Plattform ist, würde ich gerne davon hören)

Antwort

11

Ich kann nicht glauben, dass ich das vorher vermisst habe. So zurückhaltend ich auch bin, Fragen zu SO zu stellen, ich dachte, ich würde nie selbst daran arbeiten. :)

Ich habe den Funktionsprototyp nicht richtig angeschaut. Es stellt sich in der „Urteil“ Funktion out (umrissenen unten),

int nfq_set_verdict(struct nfq_q_handle *qh, 
    u_int32_t id, 
    u_int32_t verdict, 
    u_int32_t data_len, 
    const unsigned char *buf  
) 

Die letzten beiden Parameter sind für die Daten Stapel an das Netzwerk zurückgeführt werden. Im Nachhinein offensichtlich, aber ich habe es komplett verpasst, da die print_pkt Funktion die Paketdaten nicht als Parameter nimmt, sondern aus der struct nfq_data extrahiert.

Der Schlüssel ist zu NF_ACCEPT das Paket und übergeben Sie das entsprechend modifizierte Paket zurück zum Kernel.

+0

Sedate, haben Sie Erfahrung mit der Verwendung von Java (JNI)? Ich bin gespannt, ob es die Leistung verringert. –

+0

@TinaJasmin Leider habe ich keine Erfahrung mit JNI, daher bin ich mir nicht sicher, wie viel von einem Performance-Hit betroffen wäre. Tut mir leid, ich kann nicht hilfsbereiter sein. –

0

Nur eine wilde Vermutung von Graben um den Quellcode: versuchen explizit Hinzufügen die verfälschte Nutzlast mit nfnl_addattr_l(…, NFQA_PAYLOAD, …)?