Netzwerkprogrammierung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
AndreasDT
Beiträge: 2
Registriert: 15.03.2016 12:14:15

Netzwerkprogrammierung

Beitrag von AndreasDT » 15.03.2016 12:21:27

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

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Netzwerprogrammierung

Beitrag von MSfree » 15.03.2016 13:13:33

AndreasDT hat geschrieben:Um eine Implementierung durchzuführen, benötige ich einen Paketfilter.
Den bringt Linux mit iptables bereits mit.

Siehe auch http://www.netfilter.org
Allerdings muss ich das Paket nach der Filterung weitergehend bearbeiten.
libnetfilter_queue bietet genau das, abfangen von Paketen, setzten eines Urteils (verwerfen oder akzeptieren) und/oder verändern des Paketinhaltes.

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Netzwerprogrammierung

Beitrag von eggy » 15.03.2016 15:25:47

Evtl wärs auch einfacher direkt ins Ethernet-Modul zu gehen.
Hast Du mal nen Blick in die Kernelsourcen geworfen?

AndreasDT
Beiträge: 2
Registriert: 15.03.2016 12:14:15

Re: Netzwerprogrammierung

Beitrag von AndreasDT » 20.03.2016 16:54:51

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

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: Netzwerprogrammierung

Beitrag von MSfree » 20.03.2016 20:23:15

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?
Der C-Code läuft im Userspace, deshalb muß das zu untersuchende Paket ja auch kopiert werden, Kernelmodeobjekte darf man nicht im Userspace modifizieren.
2. Ich müsste das original Paket jetzt stoppen. Kann ich dies ebenfalls in dem C-Code machen?
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:

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);
}
Erst dann geht die Paketverarbeitung im Kernel weiter. Du könntest das Paket auch mit NF_DROP verwerfen.

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.

Antworten