statefull filtering mit ipfw

megamimi

Active Member
Hallo,

Ich benutze FreeBSD 5.1 für mein LAN als Router. Das läuft auch alles Prima. Nur hab ich jetzt von den Fähigkeiten von ipfw bezüglich statefull filtering gelesen und wollte das ganze ausprobieren. Ich habe mir also folgendes Skript gebastelt:
#! /bin/sh

#Mach es leise
cmd="/sbin/ipfw -q"

#Erstmal alles loeschen
${cmd} -f flush

#
# Grundsaetzliches
#

#local und im internen Netz ist alles erlaubt
${cmd} add allow all from any to any via lo0
${cmd} add allow all from any to any via rl0
${cmd} add allow all from any to any via rl1

#Die nicht lokale verwendung von 127.0.0.0/8 verbieten
${cmd} add deny all from any to 127.0.0.0/8
${cmd} add deny all from 127.0.0.0/8 to any

#gespoofte pakete verbieten
${cmd} add deny all from 10.0.0.0/8 to any in via tun0
${cmd} add deny all from 172.16.0.0/12 to any in via tun0
${cmd} add deny all from 192.168.0.0/16 to any in via tun0

#pruefen ob das paket zu einer aktiven verbindung gehoert
${cmd} add check-state

#fragmentierte pakete verbieten
${cmd} add deny all from any to any in via tun0 frag

#Alle TCP- pakete mit ACK flag die nicht zu einer verbindung gehoeren loeschen
${cmd} add deny tcp from any to any in via tun0 established

#
# Verbindungen nach aussen
#

#netbios und anderer ms- shit ist verboten nach aussen
${cmd} add deny tcp from any to any 137-139 via tun0
${cmd} add deny udp from any to any 137-139 via tun0
${cmd} add deny tcp from any to any 445 via tun0
${cmd} add deny udp from any to any 445 via tun0
${cmd} add deny tcp from any 137-139 to any via tun0
${cmd} add deny udp from any 137-139 to any via tun0
${cmd} add deny tcp from any 445 to any via tun0
${cmd} add deny udp from any 445 to any via tun0

#wir duerfen sonst alle verbindungen aufbauen
${cmd} add allow all from any to any out via tun0 setup keep-state

#
# Ankommende Verbindungen
#

#eDonkey ist erlaubt
${cmd} add allow tcp from any to any 4662 in via tun0 setup keep-state
${cmd} add allow udp from any to any 4665 in via tun0 keep-state

#alle anderen verbindungsversuche werden geblockt
${cmd} add deny tcp from any to any in via tun0 setup

#
# ICMP
#

#echo-request und redirect werden verboten
${cmd} add deny icmp from any to any in via tun0 icmptypes 5,8

# sonst ist alles icmp erlaubt
${cmd} add allow icmp from any to any via tun0
Und soweit ich es beurteilen kann müsste auch alles gehen. Nur das tut es eben nicht...

Wenn ich "ipfw show" mache, sehe ich das kein einziges Paket von der check-state rule erfasst wird, auch nicht nach einigen Minuten.

Von den Clients hinter dem Router kann man zwar IP- Adressen direkt anpingen, aber mehr geht nicht. Also kein http, dns etc.

Ich hab jetzt langsam keine Idee mehr woran es liegen könnte.

Danke, mimi
 
Wenn ich davon ausgehe, dass rl0 und rl1 die beiden Karten in dem Router sind, dann erlauben folgende Regeln ja bereits alles:
#local und im internen Netz ist alles erlaubt
${cmd} add allow all from any to any via lo0
${cmd} add allow all from any to any via rl0
${cmd} add allow all from any to any via rl1

also verstehe ich nicht, warum irgendwas nicht gehen sollte.

nützliches:
ipfw -t show
ipfw -d show
 
hi...

Das stimmt, aber alles was ins Inet will muss durch tun0. Genaugenommen müssen die Pakete gar nicht durch rl1, sondern nur durch rl0 (mein internes Iface) und werden dann ja an das Pseudo- Device tun0 weitergeleitet, sodass sie ins Inet kommen.

Durch "${cmd} add allow all from any to any via rl1" wird zwar aller Verkehr durch rl1 (das Iface an dem mein DSL- Modem hängt) erlaubt, aber diese Regel ist eigentlich unnötig, da nie ein Paket bei ihr hängenbleiben wird. Ich habe sie nur der vollstädigkeit halber dazugenommen, nötig ist sie nicht.

cu mimi
 
als vorläufige letzte regel ist auch
Code:
${cmd} add allow log ip from any to any
dann kannst du in deiner firewall log sehen was bis zu dieser regel durchgekommen ist und entsprechend neue regeln bauen...
 
hi....

Durch trial and error hab ich das ganze jetzt zum laufen gebracht: Das Problematische war folgende Regel:
${cmd} add allow all from any to any out via tun0 setup keep-state

Weil Regel in denen "setup" vorkommt von ipfw automatisch mit tcp verbunden werden. Dadurch konnte ich keine udp Pakete senden, weshalb ich kein dns hatte.

Mit folgenden Regeln funzt alles prima:
${cmd} add allow tcp from any to any out via tun0 setup keep-state
${cmd} add allow udp from any to any out via tun0 keep-state

Danke für die Hilfe, Mimi
 
Bitte lies ipfw(8) und davon die Section STATEFUL FIREWALL. Und dann ueberlege Dir, was Du mit "deny tcp from any to any in via tun0 established" machst.

PS: Fehlt da nicht eine divert Regel?
 
hi...

Ob dus glaubst oder nicht, ich hab die manpage mehrmahls gelesen und hab glaube ich schon eine Ahnung was "deny tcp from any to any in via tun0 established" macht. Die Frage ist nur: Hast du meine Kommentare in den Rules gelesen?

Denn da steht:
#Alle TCP- pakete mit ACK flag die nicht zu einer verbindung gehoeren loeschen
${cmd} add deny tcp from any to any in via tun0 established
Was eigentlich nicht missverstanden werden kann, oder?
Ich habe schließlich noch "${cmd} add check-state" davor, was schon auf aktive Verbindungen prüft....

Ich will ja schließlich kein pseudo statefull filtering das nur nach tcp- flags schaut, sondern richtiges mit dynamischen Regeln.

PS: Fehlt da nicht eine divert Regel?

Nein, denn ich verwende ppp und nicht natd für NAT

cu mimi
 
In der Manpage steht diese vorgeschlagene Reihenfolge:
ipfw add check-state
ipfw add allow tcp from my-subnet to any setup keep-state
ipfw add deny tcp from any to any

Warum probierst du also nicht einfach mal deine
${cmd} add allow all from any to any out via tun0 setup keep-state
_VOR_ die
${cmd} add deny tcp from any to any in via tun0 established
zu setzen?
 
Hallo,

In der Manpage steht diese vorgeschlagene Reihenfolge:
ipfw add check-state
ipfw add allow tcp from my-subnet to any setup keep-state
ipfw add deny tcp from any to any

Ja und? Muss man alles so machen wie in der Manpage? Meine Loesung ist absolut gleichwertig IMO ....

Warum probierst du also nicht einfach mal deine
${cmd} add allow all from any to any out via tun0 setup keep-state
_VOR_ die
${cmd} add deny tcp from any to any in via tun0 established
zu setzen?

Und was würde das bitte ändern?

Vieleicht hast dus noch nicht mitgekriegt, aber meine Regeln funktioniern jetzt und das Problem war nicht diese rule:
${cmd} add deny tcp from any to any in via tun0 established

Steht aber alles oben schonmal...

cu mimi
 
ganz ruhig hier :)
es muss sich ja keiner angegriffen fühlen.

Ich glaube MrFixit wollte nur hilfreich sein, da wäre etwas _dankbarkeit_ angebrachter.
 
hallo,

ganz ruhig hier :)
es muss sich ja keiner angegriffen fühlen.

Also ich hab mich schon ein bischen blöd angemacht gefühlt, als MrFixit so großspurig gesagt hat, ich solle mich erstmal die Manpage lesen und mir dann überlegen was ich mit meinen Rules überhaupt mache. Und das konnte ich doch unmöglich auf mir sitzen lassen, oder;)

Sollte ich ein wenig überreagiert oder was falsch verstanden haben, tut es mir natürlich Leid *zu MrFixit geh und ihm die Hand schüttel*

Ich schlage vor wir vergessen das Ganze, schließlich ghet meine FW ja jetzt:)

cu mimi
 
Zurück
Oben