Wie am besten ipfw auf Router umsetzen

Rakor

Administrator
Teammitglied
Hallo zusammen,
gegeben sei ein Host der als Router fungiert und zwischen diversen internen Netzen und einem externen Netz, wir nennen es mal Internet, vermitteln soll.
Der Traffic soll per ipfw geregelt werden.

Wir sagen mal wir haben drei Interne Netze 10.10.10.0/24; 10.10.20.0/24 und 10.10.30.0/24.
Dazu gibt es ein Netz das nach draußen geht. Da es tatsächlich ein privates Zwischennetz ist nennen wir es mal 192.168.0.0/24. Dieses ist als defaltroute gesetzt.

Das Routing zwischen den Netzen funktioniert, nun geht es darum die Netze per ipfw sauber getrennt zu halten, bzw. nur expliziten Traffic zu erlauben.

Mein Problem ist nun wie ich am besten mit dem Traffic umgehe.
So soll es bestimmte Dienste geben die zwischen den internen Netzen kommunizieren dürfen (z.T. mit Sessionaufbau nur aus einer Richtung) und zum Teil sollen die Dienste nur in Richtung des externen Netzes kommunizieren dürfen. Die defaultrule ist deny.

Wir nehmen an, das 10er Netz soll nur mit der Außenwelt per Port 80 sprechen dürfen:

Wenn ich nun Regeln der Art schreibe
Code:
ipfw add allow tcp 10.10.10.0/24 to any 80 setup keep-state
dann kann das 10er Netz auch mit den anderen Netzen kommunizieren. Das soll es es aber nicht.

Wenn ich statt dessen eine Regel in der Art schreibe
Code:
ipfw add allow tcp 10.10.10.0/24 to any 80 out via $extern setup keep-state
dann würde ich es zwar nur über das $extern Interface zulassen... Aber ich blocke es bereits beim Eintreffen in den Kernel (noch bevor das Routing eigentlich erfolgt).

Was ist der beste Weg um sowas übersichtlich zu definieren und vernünftig filtern zu können?
 
Mach halt eine Regel für Rein und eine für Raus:
Code:
ipfw add allow proto tcp src-ip 10.10.10.0/24 dst-port 80 in setup keep-state
ipfw add allow proto tcp src-ip 10.10.10.0/24 out via $extern setup keep-state
Die zweite braucht evtl. nicht so restriktiv zu sein (vgl. "dst-port"), wenn nicht von anderswo Zehner-Absender in Deinen Router gelangen. Das sollte man ohnehin mit "verrevpath" absichern.
 
Hi Tronar,
mit der ersten Regel darf das Paket aber schon in die Nachbarnetze und die Regelauswertung ist fertig. Oder mache ich einen generellen Fehler?
 
Bitte um Entschuldigung für die späte Antwort.
Mit der ersten Regel darf das Paket in den Router hinein, aber noch längst nicht in ein anderes Netz hinaus, solange die Default-Regel für ausgehende Pakete auf "deny" gesetzt ist. Um erfolgreich geroutet zu werden, braucht es immer eine Akzeptanz für "in" und eine für "out" - oder eine Regel, die beide einschließt, indem sie keines der Schlüsselwörter "in" und "out" enthält.
Mit anderen Worten: Die Regelauswertung erfolgt zweimal, bei der Ankunft und bei der Abfahrt.
 
Hmm... ist das so...? Dann muss ich das nochmal genauer ansehen.. Ich hatte im Hinterkopf es nur mit "in"-Regeln gemacht zu haben und dennoch haben die Pakete nach dem Routing die Kiste wieder verlassen...
Ich berichte wenn ich es nochmals getestet habe.
 
So ich kam nun endlich mal zum Test... Es ist wirklich so, wenn es eine "in" Regel gibt die einen "allow" macht komme ich überall hin. Also "first hit wins". Sprich... Ich habe noch das selbe Problem :(
 
Hmm ... ich bin jetzt einigermaßen verunsichert, ob ich IPFW jahrelang falsch verstanden habe. Leider benutze ich z. Zt. kein FreeBSD und kann daher nichts testen. Aber dieses Verhalten erscheint mir unsinnig und widerspricht auch manchen Passagen in der Manpage, z. B. bei der Erklärung der Schlüsselwörter recv | xmit | via.
Nur noch einmal klargestellt: Ausnahmslos alle Firewallregeln bei Dir enthalten eines der Schlüsselwörter "in" oder "out". Du hast nicht zufällig irgendwo ein "in" vergessen? Oder möglicherweise spucken Dir check-state- oder NAT-Regeln irgendwie in die Suppe.
Könntest Du Deinen Regelsatz mal vorzeigen? Zumindest den von Deinem jüngsten Test?
 
Zurück
Oben