PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Firewall selbst entwickeln?



slaYer977
08.04.06, 16:24
Hallo,

ich suche eine technische Anleitung oder ähnliches, wo sehr detailiert darauf eingegangen wird, was eine (paketfilter) Firewall so alles mit einem Paket anstellen muss. Also nicht nur wie die Firewall ein ankommendes Paket mit seiner Regelliste vergleicht und dementsprechend das Paket dann weiterleitet oder verwirft, sondern mich interessieren auch die Punkte die eine Firewall davor überprüfen sollte. So z.B. ob das Paket auch überhaupt ein Regelkonformes IP-Datenpaket ist. Ob alle Felder die richtige größe haben usw.

Danke

tschloss
08.04.06, 19:49
OMG, warum das denn??

Zu "iptables" gibt es Literatur digital und gedruckt soviel du willst. Das wird die sicher schon mal einiges sagen.

Und dort steht eher, was man alles anstellen "kann".

Greetz
Thomas

Roger Wilco
09.04.06, 09:35
Der Quellcode von pf aus OpenBSD ist sehr schön. Den solltest du dir zu Gemüte führen.

slaYer977
13.04.06, 09:10
Moin,

wo genau finde ich den Quellcode?

Bin bis hierher gekommen: http://www.openbsd.org/cgi-bin/cvsweb/src/
Aber dann weiß ich nicht, wo es sich denn versteckt hält ;-)

eBoy
13.04.06, 14:24
Ich habe mir bei Terrashop zu einem günstigen Preis "Linux Sicherheit" gekauft, worin auch auf Firewalls eingegangen wird (iptables).

ISBN: 3-8155-7329-7

Genauer gelesen hab ich das bisher noch nicht, aber es klingt recht interessant und informativ (erster Eindruck)...

Roger Wilco
13.04.06, 16:26
Aber dann weiß ich nicht, wo es sich denn versteckt hält ;-)
http://www.openbsd.org/cgi-bin/cvsweb/src/sys/net/ und http://www.openbsd.org/cgi-bin/cvsweb/src/sbin/pfctl/

derRichard
15.04.06, 16:26
hallo!

lies doch den quelltext vom linux netfilter.
das ist eigentlich ganz einfach.

bei linux gibt es schnittstellen, wo man dirent an den netzwerkstack andocken kann.
die dinger nennt man nf-hooks.
da kannst festlegen, dass zum beispiel alle eingehenden pakete an deine funktion übergeben werden müssen.
die funktion bekommt dann einen pointer auf den socketbuffer (das paket selber).
da kannst es dann lesen umbauen und was auch immer.
als return-wert gibst dann an, ob es gedroppt wird oder nicht.

anbei ein kleines beispiel.

hth,
//richard

quinte17
15.04.06, 17:29
ich habe hier auch noch ein buch, was man auch empfehlen kann
ISBN 3-8272-6257-7 (http://www.amazon.de/exec/obidos/ASIN/3827262577/qid%3D1145118498/028-1128610-5688530)
ist von Robert Ziegler

greetz

slaYer977
23.04.06, 18:20
@derRichard: Danke für diesen Quelltext. Sieht interessant aus und könnte mir evtl. weiterhelfen. Mich würde interessieren, ob man woanders noch mehr über Netfilter bzgl. Schnittstellen und programmierung erfährt. Oder ist die Webseite von Netfilter die beste Adresse. Habe da nur paar Howtos gesehen, da habe ich aber nichts gefunden, woraus ich dann in der Lage wäre so ein Beispiel zu programmieren.

Ich habe versucht dein Quelltext zu übersetzen. Klappt aber nicht. Könnte mir jemand sagen, wo ich mich zum dumm anstelle, oder woran es liegt?

thx

$ gcc -o rwpf rwpf.c
rwpf.c:11:27: error: linux/vmalloc.h: No such file or directory
In file included from rwpf.c:13:
/usr/include/linux/netfilter_ipv4.h:53: error: ‘INT_MIN’ undeclared here (not in a function)
/usr/include/linux/netfilter_ipv4.h:59: error: ‘INT_MAX’ undeclared here (not in a function)
In file included from rwpf.c:14:
/usr/include/linux/ip.h:97: error: syntax error before ‘uint8_t’
/usr/include/linux/ip.h:104: error: syntax error before ‘tot_len’
/usr/include/linux/ip.h:105: error: syntax error before ‘id’
/usr/include/linux/ip.h:106: error: syntax error before ‘frag_off’
/usr/include/linux/ip.h:107: error: syntax error before ‘ttl’
/usr/include/linux/ip.h:108: error: syntax error before ‘protocol’
/usr/include/linux/ip.h:109: error: syntax error before ‘check’
/usr/include/linux/ip.h:110: error: syntax error before ‘saddr’
/usr/include/linux/ip.h:111: error: syntax error before ‘daddr’
rwpf.c:15:21: error: net/udp.h: No such file or directory
rwpf.c:28: warning: ‘struct net_device’ declared inside parameter list
rwpf.c:28: warning: its scope is only this definition or declaration, which is probably not what you want
rwpf.c:28: warning: ‘struct sk_buff’ declared inside parameter list
rwpf.c: In function ‘hook_handle’:
rwpf.c:31: error: dereferencing pointer to incomplete type
rwpf.c:32: error: dereferencing pointer to incomplete type
rwpf.c:32: error: dereferencing pointer to incomplete type
rwpf.c:34: error: dereferencing pointer to incomplete type
rwpf.c:34: error: ‘IPPROTO_UDP’ undeclared (first use in this function)
rwpf.c:34: error: (Each undeclared identifier is reported only once
rwpf.c:34: error: for each function it appears in.)
rwpf.c:37: error: dereferencing pointer to incomplete type
rwpf.c:37: error: dereferencing pointer to incomplete type
rwpf.c: At top level:
rwpf.c:43: error: variable ‘rwpf_ops’ has initializer but incomplete type
rwpf.c:44: error: unknown field ‘hook’ specified in initializer
rwpf.c:44: warning: excess elements in struct initializer
rwpf.c:44: warning: (near initialization for ‘rwpf_ops’)
rwpf.c:45: error: unknown field ‘owner’ specified in initializer
rwpf.c:45: warning: excess elements in struct initializer
rwpf.c:45: warning: (near initialization for ‘rwpf_ops’)
rwpf.c:46: error: unknown field ‘pf’ specified in initializer
rwpf.c:46: error: ‘PF_INET’ undeclared here (not in a function)
rwpf.c:46: warning: excess elements in struct initializer
rwpf.c:46: warning: (near initialization for ‘rwpf_ops’)
rwpf.c:47: error: unknown field ‘hooknum’ specified in initializer
rwpf.c:47: warning: excess elements in struct initializer
rwpf.c:47: warning: (near initialization for ‘rwpf_ops’)
rwpf.c:48: error: unknown field ‘priority’ specified in initializer
rwpf.c:49: warning: excess elements in struct initializer
rwpf.c:49: warning: (near initialization for ‘rwpf_ops’)

derRichard
23.04.06, 19:57
@derRichard: Danke für diesen Quelltext. Sieht interessant aus und könnte mir evtl. weiterhelfen. Mich würde interessieren, ob man woanders noch mehr über Netfilter bzgl. Schnittstellen und programmierung erfährt. Oder ist die Webseite von Netfilter die beste Adresse. Habe da nur paar Howtos gesehen, da habe ich aber nichts gefunden, woraus ich dann in der Lage wäre so ein Beispiel zu programmieren.

Ich habe versucht dein Quelltext zu übersetzen. Klappt aber nicht. Könnte mir jemand sagen, wo ich mich zum dumm anstelle, oder woran es liegt?

thx

hallo!

naja, da gibt es nicht wirklich viel, ich hab mir eigentlich alles selber gelernt (viel, sehr viel kernelsourcen lesen).
du musst mein makefile zum kompilieren verwenden.
du kannst ein kernelmodul nicht als userspace-programm kompilieren, du musst das kbuild-system vom kernelverwenden. mein makefile macht das.
es setzt halt voraus, dass du einen kernelquelltext hast.


rw@raccoon:~/kernel-dev/2> make
make -C /lib/modules/2.6.15.6-smp-rw/build SUBDIRS=`pwd` modules
make[1]: Entering directory `/home/rw/linux-kernel/linux-2.6.15.6'
CC [M] /home/rw/kernel-dev/2/rwpf.o
Building modules, stage 2.
MODPOST
CC /home/rw/kernel-dev/2/rwpf.mod.o
LD [M] /home/rw/kernel-dev/2/rwpf.ko
make[1]: Leaving directory `/home/rw/linux-kernel/linux-2.6.15.6'
rw@raccoon:~/kernel-dev/2> nano Makefile
rw@raccoon:~/kernel-dev/2> ls /lib/modules/`uname -r`/build
arch COPYING Documentation include Kbuild MAINTAINERS Module.symvers REPORTING-BUGS sound vmlinux
binkernel.spec CREDITS drivers init kernel Makefile net scripts System.map
block crypto fs ipc lib mm README security usr
rw@raccoon:~/kernel-dev/2>

hth,
//richard

slaYer977
20.05.06, 17:52
Gibt es eine gute Quelle, wo ich mehr darüber erfahre wie ich mit skbuff umgehen kann. Also wie ich z.B. TCP Pakete bearbeite oder UCP. Also wie ich halt auf dass alles Zugreifen kann.

Habe im Internet viele Stellen gefunden, wo auf folgenden Link verwiesen wird:
http://gnumonks.org/ftp/pub/doc/skb-doc.html

Aber dieser funktioniert nicht ! :-(

Ansonsten bin ich gerade dabei mir skbuff.h anzuschauen, aber ich bin halt nicht so der c experte. java wäre mir lieber ;-)

derRichard
20.05.06, 17:58
hallo!

lerne c. sonst wird das nichts.

//richard

slaYer977
20.05.06, 21:17
Vielen Dank für deine Antwort!

Ja ich weiß c lernen wäre ganz gut :-)
Mein Problem ist nur, dass es sich hierbei um ein Projekt an der Uni (Informatik 8tes Semester) handelt. Wir sollen in diesem Semester u.a. eine Firewall in netfilter basteln. Gelernt wird an der Uni nur Java. Und um C jetzt zu lernen fehlt ein wenig die Zeit, da halt auch noch andere Projekte, Vorlesungen, Übungen usw. + Arbeit Zeit in Anspruch nehmen.

Vielleicht bestelle ich mir mal das C Buch von Galileo C von A bis Z. Habe sonst noch zu hause das Buch von Brian W. Kernighan und Dennis Ritchie.

Aber ich gebe Dir vollkommen recht. C lernen wäre einen gute Sache.

Wenn ich denn skbuff.h duchlese (mit C KnowHow) würde ich dann aus dieser Datei ersehen können, wie ich IP, UDP, TCP und ICMP Pakete auf Richtigkeit überprüfe und filtere? Höchstwahrscheinlich schon. Aber mit ner skbuff Doku wäre es einfacher und zeitsparender ;-)

killerhorse
22.05.06, 16:26
Hallo,

Also ganz versteh ich das nicht. Du meinst Du willst eine Firewall mit "netfilter" basteln.
Das Netfilter Kernelmodul unter Linux ist nichts anderes als das Modul das du mittels "iptables" alles beibringen kannst was für eine "Firewall" benötigt wird.

So wie es sich also anhört brauchst Du da nichts neu Programmieren (was ohne zweifel, Kenntnisse einer Programmiersprache wie C verlangt) sondern lediglich Deinen Linuxrechner mit den entsprechenden netfilter Regeln füttern.
Dazu wurden ja auch schon einige Bücher empfohlen...

MfG

Christian

PS: Hier die Homepage des netfilter Projekts: http://netfilter.org/

slaYer977
10.06.06, 12:54
Ich möchte durch meine kleine Firewall nur unfragmentierte Pakete durchlassen.
Dazu muss man ja laut RFC 791 (IP) eigentlich prüfen, ob Fragment Offset gleich 0 ist und ob das MF Flag nicht gesetzt ist.

Fragment Offset prüfen kriege ich hin:

if(iph->frag_off==0) ...

Aber wo verstecken sich die Flags? Finde in skbuff bzw. skb->nh.iph im header von ip keine flags !?

Danke

derRichard
10.06.06, 13:02
hallo!

die flags bekommst, wenn vom skbuff-pointer 6 byte(hab ich grad schnell rausgezählt) dazurechnest.
die nächsten 3bit sind deine flags.

//richard

slaYer977
10.06.06, 14:57
Danke für Deine Antwort. Habe es so probiert aber irgendwie klappt es nicht so recht. Bekomme keine brachbaren Werte. Mal wenn ich es lade kommen irgendwelche Werte und mal wenn ich das Modul lade kommt immer nur 0. Auch wenn ich per Ping befehl die flags manuell setze.

Ich denke es könnte daran liegen, dass Fedora dieses SELinux aktiviert hat, was vor Bufferoverflows schützen soll und somit sich die Speicheradresse öfter mal ändern kann.

Aber ist auch nicht so wild. Ich habe gerade durch Probieren herausgefunden, dass unter iph->frag_off nicht nur der Offset gespeichert wird, sondern dort auch die flags mit drinne sind.

Kleines Beispiel, wenn man es sich binär anschaut mit den Flags DF, MF und dem Flag, was nicht benutzt werden soll/darf, hier als X.


01110010 | 0 | 0 | 1 | 00001
offset | X|DF|MF| offset