Rückruf garantiert
Das Netfilter-Subsystem ruft die Callback-Funktion (Zeilen 15 bis 46) auf und übergibt dabei einige wichtige Argumente, darunter ein Handle zur Warteschlange (»struct nfq_q_handle«) und die Netfilter-Daten (»struct nfq_data«). Da der Funktionsaufruf von »nfq_set_mode()« in Zeile 84 die Option »NFQNL_COPY_PACKET« enthält, kann die Callback-Funktion auf das gesamte in die Warteschlange gestellte Netzwerkpaket zugreifen. Als ersten Schritt sollte sie jedoch »nfq_get_msg_packet_hdr()« aufrufen (Zeile 27), da die hiervon gelieferte Datenstruktur unter anderem die Paket-ID enthält, die bei der Rückgabe des Pakets an den Kernel via »nfq_set_verdict()« anzugeben ist.
Der Aufruf von »nfq_get_payload()« (Zeile 30) holt einen Zeiger auf die eigentlichen Paketdaten (zweites Argument, »pkt«), die das Programm dann abhängig vom Inhalt interpretieren kann. Da für das Beispiel nur ICMP-Pakete in die NFQueue-Warteschlange gelangen, greift die Anwendung gezielt auf die ICMP-Headerfelder zu. In Zeile 39 berechnet sie, wie viele Bytes auf das ICMP-Datenfeld abfallen, und kopiert dann mit »read()« in der nächsten Zeile maximal diese Menge an Daten in das entsprechende Feld des ICMP-Headers.
Abschließend ruft sie die Funktion »nfq_set_verdict()« auf, die das - in diesem Fall veränderte - Paket an den Kernel zurückgibt (Zeile 42). Die Option »NF_ACCEPT« fordert Netfilter dabei auf, das Paket normal weiterzuverarbeiten. Alternativ könnte das Programm im Userspace entscheiden, bestimmte Pakete zu verwerfen, indem es statt »NF_ACCEPT« die Option »NF_DROP« verwendet. Sind die letzten beiden Argumente dieser Funktion nicht »0« und »NULL«, enthalten sie die Länge und einen Zeiger auf veränderte Paketdaten. So arbeitet auch der Beispielcode.
Probelauf
Beim Übersetzen muss der Linker wissen, dass das Programm die Bibliotheken »netfilter_queue« und »nfnetlink« benötigt. Listing 2 zeigt ein passendes Makefile. Vor dem Testlauf teilt ein »iptables«-Aufruf dem Kernel mit, dass er Pakete in eine Warteschlange einreihen soll. Dafür sorgt das Sprungziel »NFQUEUE«. Genauere Auskunft über die Syntax gibt die Manpage von »iptables«.
Das Beispielprogramm erwartet nur ICMP-Pakete, der folgende Aufruf befiehlt dem Kernel, diese in die NFQueue-Warteschlange zu stellen:
iptables -t filter -I OUTPUT --proto icmp -j NFQUEUE
Ruft nun ein Anwender auf diesem Rechner »ping« auf, landen die damit erzeugten Pakete in der neuen Warteschlange. Nur wenn ein Prozess diese abholt und anschließend wieder an den Kernel übergibt, funktioniert die Kommunikation. Andernfalls bleiben die Pakete für immer in der Warteschlange hängen.
| Listing 2: Makefile |
|---|
01 CC=gcc
02 CFLAGS=-Wall -g
03 LDFLAGS=-lnetfilter_queue -lnfnetlink
04
05 BIN=pinger
06
07 all: $(BIN)
08
09 $(BIN): $(BIN).o
10 $(CC) $(LDFLAGS) -o $@ $<
11
12 $(BIN).o: $(BIN).c
13 $(CC) $(CFLAGS) -c -o $@ $<
14
15 clean:
16 -rm -f $(BIN){,.o}
|
Die Informationen, die das Beispielprogramm innerhalb des ICMP-Datenfelds überträgt, holt es sich aus der Datei »/tmp/data«, die zunächst der folgende Perl-Aufruf erzeugt:
perl -e 'print "A"x20,"B"x20;' >/tmp/data
Er schreibt je 20-mal »A« und »B« in diese Datei. Wenn nun das Programm läuft und gleichzeitig »ping« Pakete verschickt, erhält der Empfänger diese Pakete mit verändertem ICMP-Datenfeld, was einige Ping-Versionen mit einem Fehlerhinweis quittieren. Abbildung 3 zeigt die empfangenen ICMP-Echo-Request-Pakete als Wireshark-Ausgabe, Abbildung 4 führt die IPtables-Regeln vor und nach dem Ausführen des Beispiels auf.
Abbildung 4: Ein Ping bei aktivem Beispielprogramm und passender IPtables-Regel erhöht den Paketzähler um 1. Auch das Programm »pinger« zeigt an, dass es ein Paket verarbeitet hat.
Die ICMP-Prüfsumme passt wegen der Veränderung nicht, das Betriebssystem des Zielrechners antwortet nicht - wie sonst üblich - mit einem Echo-Reply. Experimentierfreudige erweitern das Beispiel jedoch um die Neuberechnung dieser Prüfsumme innerhalb der Funktion »callback_funktion()«, nachdem sie die Daten aus der Datei gelesen hat.
|
Tabelle 2: Variablen |
|---|
|
|
Diesen Artikel als PDF kaufen
Express-Kauf als PDF
Umfang: 5 Heftseiten
Preis € 0,99
(inkl. 19% MwSt.)
Als digitales Abo
Weitere Produkte im Medialinx Shop »
Versandartikel
Onlineartikel
Alle Rezensionen aus dem Linux-Magazin
- Buecher/07 Bücher über 3-D-Programmierung sowie die Sprache Dart
- Buecher/06 Bücher über Map-Reduce und über die Sprache Erlang
- Buecher/05 Bücher über Scala und über Suchmaschinen-Optimierung
- Buecher/04 Bücher über Metasploit sowie über Erlang/OTP
- Buecher/03 Bücher über die LPI-Level-2-Zertifizierung
- Buecher/02 Bücher über Node.js und über nebenläufige Programmierung
- Buecher/01 Bücher über Linux-HA sowie über PHP-Webprogrammierung
- Buecher/12 Bücher über HTML-5-Apps sowie Computer Vision mit Python
- Buecher/11 Bücher über Statistik sowie über C++-Metaprogrammierung
- Buecher/10 Bücher zu PHP-Webbots sowie zur Emacs-Programmierung
Insecurity Bulletin
Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...





