Hallo Zusammen,
aktuell schreibe ich meine Masterarbeit. Um eine Implementierung durchzuführen, benötige ich einen Paketfilter. Eine erste Implementierung mit der libPCAP war so weit ganz erfolgreich. Es ist möglich, Pakete nach geählten Kriterien zu filtern. Allerdings muss ich das Paket nach der Filterung weitergehend bearbeiten. Die Bearbeitung betrifft die Modifikation einiger Bytes des Payload im zu Grunde liegenden Ethernetframe.
Das Problem ist nun folgendes. Ich erkenne zwar, dass ein entsprechendes Paket ankommt, allerding kann ich nicht verhindern, dass dieses an die oberen Netzwerkschichten des Stacks weitergegeben wird. Gibt es bei der libPCAP eine Option, die Weiterleitung in die höheren Schichten des Stack so lange zu unterbinden, bis ich meine Modifikationen durchgeführt habe?
Alternativ bin ich auf den Berkley Paket Filter aufmerksam geworden. Hat hier ggf. schon jemand Erfahrungen mit solchen Paketfiltern und vielleicht einen Tip wie ich das Paket filtern, anschließend bearbeiten und dann in den Stack zurück speisen kann?
Viele Grüße,
Andreas
Netzwerkprogrammierung
Re: Netzwerprogrammierung
Den bringt Linux mit iptables bereits mit.AndreasDT hat geschrieben:Um eine Implementierung durchzuführen, benötige ich einen Paketfilter.
Siehe auch http://www.netfilter.org
libnetfilter_queue bietet genau das, abfangen von Paketen, setzten eines Urteils (verwerfen oder akzeptieren) und/oder verändern des Paketinhaltes.Allerdings muss ich das Paket nach der Filterung weitergehend bearbeiten.
Re: Netzwerprogrammierung
Evtl wärs auch einfacher direkt ins Ethernet-Modul zu gehen.
Hast Du mal nen Blick in die Kernelsourcen geworfen?
Hast Du mal nen Blick in die Kernelsourcen geworfen?
Re: Netzwerprogrammierung
Hallo Zusammen,
erst einmal vielen Dank für die Hinweise. Ich habe leider etwas länger gebraucht um mich mit den Hinweisen zu beschäftigen, ich schreibe meine Thesis nebenberuflich.
Zuerst bin ich dem Hinweis "Netfilter" gefolgt. Die Installation von Netfilter hat gut geklappt, im Wesentlichen bin ich den Schritten eines Tutorials gefolgt.
http://www.roman10.net/2011/12/01/how-t ... -on-linux/
Ein erster Testlauf des mitgelieferten Beispielcodes war ebenfalls erfolgreich, ich konnte diverse Pakete filtern. Wenn ich das Prinzip richtig verstanden habe, werden iptables genutzt um den Traffic zu untersuchen. Wenn eine Übereinstimmung mit der festgelegten Regel besteht, wird das Paket an "NFQUEUE" weitergegeben. In dem Beispielcode findet sich die folgende Anweisung:
// Source: nfqnl_test.c from libnetfilter_queue
printf("setting copy_packet mode\n");
if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {
fprintf(stderr, "can't set packet_copy mode\n");
exit(1);
}
Aktuell wird, wenn ich es korrekte verstanden habe, eine Kopie des ganzen Paketes in den Userspace verschoben, dass original Paket wird verschickt. Für mich ergeben sich zwei Fragen.
1. Mir ist nicht ganz klar, wie der Wechsel zwischen Kernel- und Userspace funktioniert. Läuft der C-Code aus dem Beispiel im Kernel- oder im Usermode? Ich vermute, dass der Code im Userspace läuft. Die Weiterleitung der Pakete erfolgt durch die iptables, die im Kernelspace laufen. Ist das richtig?
2. Ich müsste das original Paket jetzt stoppen. Kann ich dies ebenfalls in dem C-Code machen?
Ich stehe gerade etwas auf dem Schlauch, es ist wirklich nicht einfach verständliche Informationen bzgl. der Netfilter-Programmierung zu finden. Kennt ihr da was gutes? Tutorials, Bücher, es ist alles herzlich willkommen.
Am Rand:
Wenn ich es korrekt verstanden habe, kann durch Nutzung von ebtables auf Layer 2 gefiltert werden. Das damalige ebtables scheint jetzt unter nftables (http://www.netfilter.org/projects/nftables/index.html) weiterentwickelt zu werden. Grundsätzlich finde ich auch diesen Ansatz spannend. Ich verfolge das weiter und berichte.
Viele Grüße,
Andreas
erst einmal vielen Dank für die Hinweise. Ich habe leider etwas länger gebraucht um mich mit den Hinweisen zu beschäftigen, ich schreibe meine Thesis nebenberuflich.
Zuerst bin ich dem Hinweis "Netfilter" gefolgt. Die Installation von Netfilter hat gut geklappt, im Wesentlichen bin ich den Schritten eines Tutorials gefolgt.
http://www.roman10.net/2011/12/01/how-t ... -on-linux/
Ein erster Testlauf des mitgelieferten Beispielcodes war ebenfalls erfolgreich, ich konnte diverse Pakete filtern. Wenn ich das Prinzip richtig verstanden habe, werden iptables genutzt um den Traffic zu untersuchen. Wenn eine Übereinstimmung mit der festgelegten Regel besteht, wird das Paket an "NFQUEUE" weitergegeben. In dem Beispielcode findet sich die folgende Anweisung:
// Source: nfqnl_test.c from libnetfilter_queue
printf("setting copy_packet mode\n");
if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) {
fprintf(stderr, "can't set packet_copy mode\n");
exit(1);
}
Aktuell wird, wenn ich es korrekte verstanden habe, eine Kopie des ganzen Paketes in den Userspace verschoben, dass original Paket wird verschickt. Für mich ergeben sich zwei Fragen.
1. Mir ist nicht ganz klar, wie der Wechsel zwischen Kernel- und Userspace funktioniert. Läuft der C-Code aus dem Beispiel im Kernel- oder im Usermode? Ich vermute, dass der Code im Userspace läuft. Die Weiterleitung der Pakete erfolgt durch die iptables, die im Kernelspace laufen. Ist das richtig?
2. Ich müsste das original Paket jetzt stoppen. Kann ich dies ebenfalls in dem C-Code machen?
Ich stehe gerade etwas auf dem Schlauch, es ist wirklich nicht einfach verständliche Informationen bzgl. der Netfilter-Programmierung zu finden. Kennt ihr da was gutes? Tutorials, Bücher, es ist alles herzlich willkommen.
Am Rand:
Wenn ich es korrekt verstanden habe, kann durch Nutzung von ebtables auf Layer 2 gefiltert werden. Das damalige ebtables scheint jetzt unter nftables (http://www.netfilter.org/projects/nftables/index.html) weiterentwickelt zu werden. Grundsätzlich finde ich auch diesen Ansatz spannend. Ich verfolge das weiter und berichte.
Viele Grüße,
Andreas
Re: Netzwerprogrammierung
Der C-Code läuft im Userspace, deshalb muß das zu untersuchende Paket ja auch kopiert werden, Kernelmodeobjekte darf man nicht im Userspace modifizieren.AndreasDT hat geschrieben:1. Mir ist nicht ganz klar, wie der Wechsel zwischen Kernel- und Userspace funktioniert. Läuft der C-Code aus dem Beispiel im Kernel- oder im Usermode?
Du mußt nichst stoppen. Der Beispielprogramm instaliert einen Callback, der für jedes Paket aufgerufen wird. Hier passiert aber (ist ja nur ein Beispiel) nicht viel, ausser, daß für das Paket der Verdict ACCEPT abgegeben wird:2. Ich müsste das original Paket jetzt stoppen. Kann ich dies ebenfalls in dem C-Code machen?
Code: Alles auswählen
static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
struct nfq_data *nfa, void *data)
{
u_int32_t id = print_pkt(nfa);
printf("entering callback\n");
return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);
}
Damit, wie man Pakete modifiziert und wieder einreiht (also reinject-et), habe ich mich noch nicht beschäftigt. Ich nutze das für einen selbstgestrickten Daemon, der etwas ähnliches wie Portknocking, allerdings über Pingpakete macht. Wenn die Payload des ankommenden Pingpaketes ein bestimmtes Paßwort enthält, öffne ich z.B. für eine Minute den SSH-Port für die IP-Adresse, die im Pingpaket als Absender angegeben war, Reinjection brauche ich dafür nicht.