Firewall Ipfilter

kosovafan

Well-Known Member
Hallo,

ich bin gerade dabei mich mit dem IPfilter zu beschäftigen. Jetzt hatte ich zwei Scripts am laufen, die mich aussperrten. Nach ein paar Stunden lief der Server wieder.

Jetzt habe ich doch einmal die dumme Frage. Ich habe das ganze erst einmal mit Webmin getestet, das läuft aber irgendwie gar nicht, dann nach Wiki Eintrag, was auch nicht wirklich lief. Jetzt habe ich mich mal mit den Handbuch beschäftigt und verstehe das so:

Ich sperre erst alles, dann gebe ich lokal alles frei und muß für jeden Dienst entsprechende Regeln setzen. Muss ich für jeden Dienst in/out setzen?

Code:
#Alles blocken
block in on re0
block out on re0
#Loopback freischalten
pass in quick on lo0
pass out quick on lo0
# TCP, UDP, ICMP
pass out on re0 proto tcp from any to any flags S keep state
pass out on re0 proto udp from any to any keep state
pass out on re0 proto icmp from any to any keep state
# SSH
pass in on re0 proto tcp from any to any port = 1000 keep state
# Nginx
pass in on re0 proto tcp from any to any port = 80 keep state
# Nginx/SSL
pass in on re0 proto tcp from any to any port = 443 keep state
# POP3-SSL
pass in on re0 proto tcp from any to any port = 995 keep state
# Imap-SSL
pass in on re0 proto tcp from any to any port = 993 keep state
# SMTP
pass in on re0 proto tcp from any to any port = 25 keep state
# SMTP-SSL
pass in on re0 proto tcp from any to any port = 465 keep state

Das war der erste Versuch, im Portscan war aber nur 25/443/993 zu erreichen. Nach den Handbuch verstehe ich das jetzt so:

Code:
oif="re0" 				#Out Networkcard
odns="213.133.98.98"	#Nameserver
myip="78.47.240.30"		#Static IP
ks="keep state"
fks="flags S keep state"
#All Block
block in on re0 all
block out on re0 all
#Local
pass in quick on lo0 all
pass out quick on lo0 all
# Allow out access to ISP
pass out quick on $oif proto tcp from any to $odns port = 53 $fks
pass out quick on $oif proto udp from any to $odns port = 53 $ks
#www
pass out quick on $oif proto tcp from $myip to any port = 80 $fks
#www-secure
pass out quick on $oif proto tcp from $myip to any port = 443 $fks
#ssh
pass out quick on $oif proto tcp from $myip to any port = 1000 $fks
#IMAP
pass out quick on $oif proto tcp from $myip to any port = 993 $fks
#POP
pass out quick on $oif proto tcp from $myip to any port = 995 $fks
#SMTP
pass out quick on $oif proto tcp from $myip to any port = 25 $fks
pass in quick on $oif proto tcp from $myip to any port = 25 $fks
#SMTP-SSL
pass out quick on $oif proto tcp from $myip to any port = 465 $fks
pass in quick on $oif proto tcp from $myip to any port = 465 $fks

Oder muss ich für jeden Dienst in/out setzen? Normalerweise liefert und empfängt ja nur Nginx und Postfix. Dovecot kann nur für den Abruf genutzt werden, genauso wie SSH. Oder verstehe ich alles total verkehrt?

Ich bräuchte die Firewall, weil ich nach suchen im Netz damit die einzige Möglichkeit habe, Mysql nur für eine bestimmte IP freizugeben. Wenn ich das damit erreiche kann der Mailserver wirklich nur für Emails dienen, Webmail, Spam und Admin kann dann auf den normalen Server untergebracht werden.

Würde mich über einen Wink des Wissens freuen. Vielen Dank.


Silvio
 
Hallo, Silvio,

auf die Gefahr hin, daß ich jetzt was Dummes sage, weil ich IPfilter nicht kenne:

Du hast bei den Diensten, bei denen Du "in" und "out" beide freischaltest, in beiden Zeilen gleichermaßen stehen: "from $myip to any"
Aber eine von beiden müßte dann doch lauten: "from any to $myip"

Nur so ins Blaue getippt
Tronar
 
Hallo Silvio,

es ist lange her, das ich ipfilter benutzt habe. Dazu kann ich nicht helfen.

Ein Tipp habe ich aber doch. Bevor Du ein neues Regelset lädst, erstelle doch mit at, siehe man-Page dazu, einen Eintrag in der at-Queue, der Dir in o. zu einer bestimmten Zeit wieder ein funktionierendes Regelset lädt. Wenn Du Dich durch das neue Set ausgesperrt haben solltest, wartest Du einfach, bis at den Befehl zum Laden des funktionierenden Regelsets ausgeführt hat und fängst neu an. Wenn das neue Regelset funktioniert und Du Dich einloggen kannst, entfernst Du mit atrm den Queue-Eintrag wieder.

Gruß c.
 
Zuletzt bearbeitet:
Ich hab auch länger nichts gemacht, vorgehensweise ist in etwa so
oif="re0" #Out Networkcard
odns="213.133.98.98" #Nameserver
myip="78.47.240.30" #Static IP
ks="keep state"
fks="flags S keep state"

hier eventuell noc block, wenn ipfilter sowieso beim Start auf block steht muß der Eintrag block nicht rein, ist ja dann automatisch alles geblockt.

das ist aus dem FreeBSD-Buch
# Block all inbound traffic from non-routable or reserved address spaces
# blockiert alle Verbindungen nach außen
block in quick on re0 from 192.168.0.0/16 to any #RFC 1918 private IP
block in quick on re0 from 172.16.0.0/12 to any #RFC 1918 private IP
block in quick on re0 from 10.0.0.0/8 to any #RFC 1918 private IP
block in quick on re0 from 127.0.0.0/8 to any #loopback
block in quick on re0 from 0.0.0.0/8 to any #loopback
block in quick on re0 from 169.254.0.0/16 to any #DHCP auto-config
block in quick on re0 from 192.0.2.0/24 to any #reserved for docs
block in quick on re0 from 204.152.64.0/23 to any #Sun cluster interconnect
block in quick on re0 from 224.0.0.0/3 to any #Class D & E multicast



pass in quick on lo0 to lo0 #das müßtest probieren, der Eintrag lo0 zu lo0 muß sein und nur
pass out quick on lo0 to lo0 # lo0 zu lo0 genehmigen. any to lo0 ist blödsinn
der Logig halber ist es aber so richtig auch wegen spoofing
block in quick from any to 192.168.0.0/16 on re0
und hier der Rest an Adress-Bereichen-siehe oben.
und so weiter. Schreibweise müßtest nochmal prüfen oder re0 rausnehmen.
richtig. das heißt von außen können keine Verbindungen zu 192.0.0/16 aufgebaut werden.

das
block in quick on re0 all with frags

hier trägst du deine genehmigten Verbindungen dns , http etc ein
pass in on re0 proto tcp from any to any port = 53 keep state #oder wenn geht

pass in on re0 proto tcp from my to any port = 53 keep stat # my ist natürlich besser
man könnte auch schreiben
pass in on re0 proto tcp from any (oder my) to any ( besser ip des DNS) port = 53 keep state,

und umgedreht. Verbindungen von außen bzw. any zu dir/port/ip etc zulassen.

zum Ende
block in on re0 all
block out on re0 all

################
established scheints wohl nicht zu geben, wenn, dann alles block und von any zu any , mit etablished später deine Verbindungen genehmigen. Mit ipfilter wirst du außer Eigenstudium hier nicht viel Glück haben weil die meisten auf pf schwören. ipfilter hat vom Aufbau Ähnlichkeiten zu iptables
 
Zuletzt bearbeitet:
Hi,

nur als Hinweis, wenn du outgoing explizit zulassen willst, kannst du als Zielport nicht den Port des Dienstes nehmen, der Zielport von Dienst zu Client ist >1024, Beispiel:

Code:
#www
pass out quick on $oif proto tcp from $myip port = 80 to any $fks

Rob
 
Hallo,


vielen Dank. Ist ja wirklich ein schwieriges Thema. Habe mich noch nie mit einer Firewall wirklich beschäftigt. Ich habe das jetzt so gemacht, wie ich das jetzt verstanden habe:

Code:
block in all
block out all
pass in quick on lo0 all
pass out quick on lo0 all

#Nameserver from Hetzner
pass in on re0 from 213.133.98.98/32 to 78.47.240.30 mask 255.255.255.240 keep state
pass in on re0 from 213.133.99.99/32 to 78.47.240.30 mask 255.255.255.240 keep state
pass in on re0 from 213.133.100.100/32 to 78.47.240.30 mask 255.255.255.240 keep state
pass out on re0 from 78.47.240.30/32 to 213.133.98.98/32 keep state
pass out on re0 from 78.47.240.30/32 to 213.133.99.99/32 keep state
pass out on re0 from 78.47.240.30/32 to 213.133.100.100/32 keep state

#Postfix
pass in on re0 from any to 78.47.240.30/32 port = 25 keep state
pass out on re0 from 78.74.240.30/32 port = 25 to any keep state
pass in on re0 from any to 78.47.240.30/32 port = 465 keep state
pass out on re0 from 78.74.240.30/32 port = 465 to any keep state

#Pop und Imap
pass out on re0 from 78.74.240.30/32 port = 993 to any keep state
pass out on re0 from 78.74.240.30/32 port = 995 to any keep state

#Webserver
pass in on re0 from any to 78.47.240.30/32 port = 80 keep state
pass out on re0 from 78.74.240.30/32 port = 80 to any keep state
pass in on re0 from any to 78.47.240.30/32 port = 443 keep state
pass out on re0 from 78.74.240.30/32 port = 443 to any keep state

#SSH
pass in on re0 from any to 78.47.240.30/32 port = 1000 keep state
pass out on re0 from 78.74.240.30/32 port = 1000 to any keep state

Ich habe jetzt nur Postfix und Apache mit IN/OUT Regeln versehen, weil diese nach meinen Verständnis die einzigen Dienste sind die Daten empfangen und liefern. IMAP und Pop müssen ja nur liefern, oder auch hier in/out setzen? Bei SSH bin ich mir jetzt nicht wirklich sicher.

Anmerkungen sind willkommen. Vielen Dank.


Silvio
 
Ich habe jetzt nur Postfix und Apache mit IN/OUT Regeln versehen, weil diese nach meinen Verständnis die einzigen Dienste sind die Daten empfangen und liefern. IMAP und Pop müssen ja nur liefern, oder auch hier in/out setzen? Bei SSH bin ich mir jetzt nicht wirklich sicher.

Ich kenne keinen Dienst, bei dem nur in eine Richtung kommuniziert wird. Du musst auf jeden Fall in beide Richtungen zulassen (siehe unten). Desweiteren denke ich, dass du statt CIDR-Notation deiner IP-Adresse (78.74.240.30/32) einfach nur die IP-Adresse als solches nehmen solltest (78.74.240.30), ist das selbe und liest sich besser.

So wie ich das lese (http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipf.html) brauchst du eigentlich auch nur den eingehenden Traffic mit keep state erlauben, denn die entsprechende Rückverbindung wird von ipf dann automatisch zugelassen, da diese zum selben state gehört.
Damit dies auch funktioniert, kann es sein, dass die Angabe des Protokolls (tcp/udp) notwendig ist. Versuche doch mal erst folgendes:

Code:
block in all
block out all
pass in quick on lo0 all
pass out quick on lo0 all

#Nameserver from Hetzner
pass in quick on re0 proto udp from 213.133.98.98 to 78.47.240.30 mask 255.255.255.240 keep state
pass in quick on re0 proto udp from 213.133.99.99 to 78.47.240.30 mask 255.255.255.240 keep state
pass in quick on re0 proto udp from 213.133.100.100/32 to 78.47.240.30 mask 255.255.255.240 keep state

#Postfix
pass in quick on re0 proto tcp from any to 78.47.240.30 port = 25 flags S keep state
pass in quick on re0 proto tcp from any to 78.47.240.30 port = 465 flags S keep state

#Pop und Imap
pass in quick on re0 proto tcp from any to 78.47.240.30 port = 993 flags S keep state
pass in quick on re0 proto tcp from any to 78.47.240.30 port = 995 flags S keep state


#Webserver
pass in quick on re0 proto tcp from any to 78.47.240.30 port = 80 flags S keep state
pass in quick on re0 proto tcp from any to 78.47.240.30 port = 443 flags S keep state

#SSH
pass in quick on re0 proto tcp from any to 78.47.240.30 port = 1000 flags S keep state

Rob
 
pass in quick on lo0 all
pass out quick on lo0 all

das ist nicht ganz richt, dort sagt du, das ist sozusagen offen,
block in quick from any to lo0
später,
pass form 127.0.0/8 to 127.0.0/8 on lo0 und und umgedreht, also pass out from 127.0.0.7/ to 127.0.0/8 on lo0, es darf nur aus dem Adressbreich von 127.0.0./8 mit lo kommunizieren und umgedreht.
block in quick on re0 from any to myip oder Adressbereich/e
und das, lehnt fragmentierte Pakete ab.
block in quick on re0 all with frags
 
Zuletzt bearbeitet:
hi

puh ipfilter das klang ganz nach iptables ..:D
ohje das ist ja der vorlaeufer vom pf.

der kann kein stateful inspection d.h

ich muss beide richtungen (in/out) angeben.

z.b. unter pf

pass on wan_if proto tcp from any to my_webserver_ip port 80 keep state
( keep state muss nicht angegeben werde da es default ist ,aber zu verdeutlichung ist es besser )

muesste unter ipfilter ungefaehr so aus sehen

pass in on wan_if proto tcp from any to my_webserver_ip port 80
pass out on wan_if proto tcp from my_webserver_ip port 80 to any

ich kann nur den tip geben finger weg von diesem zeug und pf direkt verwenden

der syntax ist aehnlich aber es gibt viele features in pf die das leben gegenueber ipfiler
vereinfachen.

holger
 
Hallo,

vielen Dank für die Anteilnahme. Aber irgendwie funktioniert es nicht, weder Pop, Imap, Http noch sonst irgendwas. Es half nur wieder ein Stop der Firewall. Ich habe mal ein

/sbin/ipf -Fa -f /etc/ipf.rules

ausgeführt, was ohne Antwort blieb. Liegt es vielleicht daran, das es ein Vserver von Hetzner ist? IpFilter wurde aktiviert, den das habe ich beim Start gesehen.

Postfix nahm wohl Emails an, konnte aber DNS nicht auflösen, DCC hat wohl auch Problem. Nginx war nicht erreichbar, SSH auch nicht.

Code:
Mar  9 23:47:11 mail dccproc[1241]: no DCC answer from dcc3.dcc-servers.net (207.195.195.223,6277) after 0 ms
----
Mar  9 23:54:13 mail postfix/smtpd[1259]: connect from unknown[213.165.64.22]
Mar  9 23:54:13 mail postfix/smtpd[1259]: NOQUEUE: reject: RCPT from 
unknown[213.165.64.22]: 450 4.7.1 Client host rejected: cannot find your reverse 
hostname, [213.165.64.22]; from=<sisi.trade@gmx.de> to=<post@silviosiefke.de> 
proto=SMTP helo=<mailout-de.gmx.net>
Mar  9 23:54:13 mail postfix/smtpd[1259]: disconnect from unknown[213.165.64.22]

Sollte ich mir andere Firewalls einmal anschauen? Doch für jeden Service in/out definieren? Das erste bei Postfix ist klar, das muss frei geschaltet werden, aber DNS sollte doch laufen oder?


MFG
Silvio
 
pass in quick on re0 proto udp from 213.133.98.98 to 78.47.240.30 port 53
pass out quick on re0 proto udp from 78.47.240.30 to 213.133.100.100 port 53

erste müßte nicht sein für dns, du holst oder beziehst dir ja die ip vom dns-Server , alles keep-state erstmal rausschmeißen und schaust ob dein Server den Namen auflösen kann. Probs ist wohl das der deine Namensauflösung nicht funktioniert und dann Rest ebenso.

hast du das im Kernel:

options IPFILTER_DEFAULT_BLOCK

steht ipfilter automatisch bei ipfilter_enable="YES" in rc.config auf Block und das muß zum Ende des Scriptes, nach deinen erstellten Regeln.
block in all
block out all
einfügen.Stehen die Einträge oder die zwei Regeln am Anfang des Scriptes denkt ipfilter es soll alles blocken und sperrt oder übergeht deine Einträge. Andere Firewall hilft dir auch nicht weiter, da hilft nur hinsetzen und bißchen reinarbeiten in die ganze Sache.
Der Ablauf ist etwa so:
1. Ipfilter steht im Kernel auf block, ipfilter ist zu
2. deine Regeln was erlaubt ist oder nicht und ipfilter im Script benutzt
3. und Ende block, Rest darf ipfilter blockieren und brauchst du nicht.
 
Zuletzt bearbeitet:
hi
ok mein wissen stand ist zimlich alt was ipfilter betrifft.

alternativ einfach mal den deny all rausnehmen und schauen ob die anderen regeln matchen.

holger
 
Hallo,


options IPFILTER_DEFAULT_BLOCK

Ich bin mir nicht sicher wie ich das heraus finde, ich verwende den Standard Kernel von FreeBSD. Wenn ich in den Verzeichnissen /usr/src/sys/amd64/conf/GENERIC und /usr/src/sys/i386/conf/GENERIC nachschaue, dann finde ich nichts von IPFILTER, einzige aktivierte Firewall ist dort "device bpf".

Muss ich jetzt den Kernel neubauen?

Mein System:
mail# uname -a
FreeBSD mail.silviosiefke.de 8.2-STABLE FreeBSD 8.2-STABLE #0: Tue Mar 8 15:57:49 CET 2011 root@mail.silviosiefke.de:/usr/obj/usr/src/sys/GENERIC amd64


MFG
Silvio
 
Postfix nahm wohl Emails an, konnte aber DNS nicht auflösen,

Bevor es zu Missverständnissen kommt, zeig mal die Ausgabe von
$ cat /etc/resolv.conf

Alternativ würde ich DNS generell aufmachen:
Code:
pass in quick on re0 proto udp from any port = 53 to 78.47.240.30
pass out quick on re0 proto udp from 78.47.204.30 to any port = 53
 
Hallo,

anscheinend läuft es jetzt.

/etc/rc.conf habe ich das eingetragen was im FreeBSD Handbuch steht:

#Firewall
ipfilter_enable="YES"
ipmon_enable="YES"
ipmon_flags="-Ds"

Scheint jetzt alles zu funktionieren. Ich habe das jetzt so gemacht:

Code:
#LocalFree
pass in quick on lo0 all
pass out quick on lo0 all

#Nameserver from Hetzner
pass in quick on re0 proto udp from 213.133.98.98 to 78.47.240.30 port 53
pass out quick on re0 proto udp from 78.47.240.30 to 213.133.98.98 port 53
pass in quick on re0 proto udp from 213.133.99.99 to 78.47.240.30 port 53
pass out quick on re0 proto udp from 78.47.240.30 to 213.133.99.99 port 53
pass in quick on re0 proto udp from 213.133.100.100 to 78.47.240.30 port 53
pass out quick on re0 proto udp from 78.47.240.30 to 213.133.100.100 port 53

#Postfix
pass in quick on re0 proto tcp from any to 78.47.240.30 port 25
pass out quick on re0 proto tcp from 78.47.240.30 to any port 25
pass in quick on re0 proto tcp from any to 78.47.240.30 port 465
pass out quick on re0 proto tcp from 78.47.240.30 to any port 465

#Pop und Imap
pass in quick on re0 proto tcp from any to 78.47.240.30 port 993
pass out quick on re0 proto tcp from 78.47.240.30 to any port 993
pass in quick on re0 proto tcp from any to 78.47.240.30 port 995
pass out quick on re0 proto tcp from 78.47.240.30 to any port 995

#Webserver
pass in quick on re0 proto tcp from any to 78.47.240.30 port 80
pass out quick on re0 proto tcp from 78.47.240.30 to any port 80
pass in quick on re0 proto tcp from any to 78.47.240.30 port 443
pass out quick on re0 proto tcp from 78.47.240.30 to any port 443

#SSH
pass in quick on re0 proto tcp from any to 78.47.240.30 port 1000
pass out quick on re0 proto tcp from 78.47.240.30 to any port 1000

#Pyzor
pass in quick on re0 proto udp from any to 78.47.240.30 port 24441
pass out quick on re0 proto udp from 78.47.240.30 to any port 24441

#Razor
pass in quick on re0 proto tcp from any to 78.47.240.30 port 2703
pass out quick on re0 proto tcp from 78.47.240.30 to any port 2703

#DDCPROC
pass in quick on re0 proto udp from any to 78.47.240.30 port 6277
pass out quick on re0 proto udp from 78.47.240.30 to any port 6277

#Alles blocken
block in all
block out all

Eine Frage habe ich noch, die Aktivierung von IPMON soll wie ich das verstanden habe den Logging dienen, wo finde ich den die Logs?

Vielen Dank für die Hilfe, immer wieder schön hier zu sein.


Gruß
Silvio
 
log steht im syslog, dazu muß die option im Kernel sein, options IPFILTER_LOG

mit dem Kernel, wer hat den den gebaut oder aktiviert das.
 
Hallo,


achso, es steht nichts in den Konfigurationen von IPFILTER in den Generic des Kernels. Dann muss ich den Kernel mal selber bauen. Ich baue den zwar im Wege des Updates zum Beispiel, aber verwende nie eine eigene Konfiguration.

Wie ich bereits geschrieben habe, ist das ein Virtueller Server von Hetzner. Ich weiß das ich als Installation die 64Bit Variante gewählt. Nur welche Generic soll ich jetzt nehmen, den bei der Abfrage der CPU erhalte ich nur:

mail# dmesg | grep CPU
CPU: QEMU Virtual CPU version 0.13.0 (2807.02-MHz K8-class CPU)
cpu0: <ACPI CPU> on acpi0

MFG
Silvio
 
und in den Regekln muß auch das zum loggen:
block out log first quick on dc0 all

mit Glück funzt das eventuell auch ohne Kernelbau. Im Handbuch sind ja Beispiele
 
Hallo,

jetzt muss ich doch noch einmal nachfragen. Die Firewall scheint ja geladen und aktiv, aber warum kann ich dann auf die Mysql Datenbank zugreifen ohne entsprechende Regel gesetzt zu haben? Im Scan erscheint der Port als open, ist das so richtig, oder habe ich etwas falsch verstanden?


MFG
Silvio
 
Das ist jetzt nur mittelbar auf die Frage bezogen, aber ich habe for einiger Zeit eine sehr schöne Anleitung zu IPfilter in deutscher Übersetzung ausfindig gemacht. Die Seite weiß ich nicht mehr, aber weil das Dokument zum Download angeboten war, spricht wohl nichts gegen die Weiterverbreitung:
http://www.scheinast.homepage.t-online.de/ipf.pdf

Salü
Tronar
 
dir fehlt noch das
block von any zu mir 127.0.0.0/8 an re0
block von any zu mir verwendeter Adreßbreich
block von any zu mir zweiter Agressbereich
u.s.w
die Regel entprechend anpassen, dort müssen zuimdestens alle verwenden Adress-bereiche rein. Schaust du in m,einen ersten Post mit lo0 und 127.0.0.0/8 und auch im Handbuch ist das beschrieben. Die Regel/n müssen vor deinen Freigaben oder freigegebenen Ports/Verbindungen ins Script eingetragen werden.

pass out quick on lo0 all
das ist auch verkehrt,
hier darf nur 127.0.0.0/8 mit lo0 kommunizieren und nicht alles. Dein mysql-Server z.B läuft ja auf 127.0.0.x oder. Aber hast es bald geschafft.
 
Zuletzt bearbeitet:
Zurück
Oben