Packet Filter (PF) keep static

dfa

Active Member
Hallo Zusammen

Ich habe eine Machine mit drei Dual-Port Netzwerkkarten (3com) und den PF (OpenBSD 3.6) eingerichtet. Bis jetzt habe ich den PF immer nur als Stealth-Firewall benutzt, also 'up' in hostname.xyz und bridge erstellt. Dies hat auch immer gut funktioniert.

Nun habe ich das Problem, dass drei Server die gleiche IP benutzen sollen (redirection/nat). Um die Firewall noch sicherer zu machen, habe ich folgendes unternommen:

em0: Kabel mit externer IP (keine IP zugewiesen)
em1->em2: crossover Kabel
em2: IP des externen Netzes <externe_ip>
em3: Server1
em4: Server2
em5: Server3

Die Ports em0 und em1 sind im bridging Modus. Zusammengefasst habe ich folgende Regeln:

nat on em2 from <ip Server1> to any <externe_ip>
nat on em2 from <ip Server2> to any <externe_ip>
nat on em2 from <ip Server3> to any <externe_ip>

rdr on em2 proto udp from any to <externe_ip> port 5101 -> <ip Server1>
rdr on em2 proto udp from any to <externe_ip> port 5201 -> <ip Server2>
rdr on em2 proto udp from any to <externe_ip> port 5301 -> <ip Server3>

block log all
block quick inet6

pass in on em0 proto udp from any to <externe_ip> port 5101
pass in on em0 proto udp from any to <externe_ip> port 5201
pass in on em0 proto udp from any to <externe_ip> port 5301
pass out on em0 all (*1)
pass on em1 all

pass on em2 all

pass on em3 all (*2)
pass on em4 all (*2)
pass on em5 all (*2)

Folgende Probleme ergeben sich:

*1: Wenn ich 'keep state' einfüge kann von der Firewall aus pingen, jedoch von den Servern nicht. Wenn ich es weglasse, trifft der umgekehrte Fall ein. Wenn ich das externe Kabel direkt an em2 (ohne Bridge) anhänge, funktioniert es bei beiden. So viel ich erfahren konnte wird bei NAT sowieso ein 'state' zwischengespeichert. Kann es sein, dass zwei mal 'keep state' nach dem Motto 'minus mal minus' wiederum kein 'state' ergeben?

*2: Die restlichen Ports lassen sich nicht einschränken (z.B. pass out on em3 all), da 'keep state' nicht funktioniert. Es sollten hier weitere Filter-Regeln eingesetzt werden können, damit die Server untereinander keine Verbindung haben.

Hat jemand schon einmal eine solche Lösung realisiert? Erfahrungen? Meinungen? Hat jemand einen guten Draht zu den PF-Entwicklern?

Vielen Dank für Euere Hilfe.

Gruss Dom
 
Ich verstehe bei deiner Konfiguration den Vorteil des Bridging nicht. Bei einer Stealth-Firewall (oder Stealth-Bridge, ich denke, dass trifft es wohl eher) hast du ja den Vorteil, dass dein System keine IP hat und somit nicht im IP-Netz sichtbar ist (daher heißt es wohl auch stealth :) ).

Bei deiner jetzigen Konfiguration wird sie aber zwangsläufig eine IP haben, nämlich einmal die ,externe' IP und jeweils eine IP, die zu den Servern zeigt.

Damit hast du keinen Stealth-Vorteil mehr, sondern einfach nur weitere Last für dein System, weil es über weitere Netzwerkkarten (bzw. in deinem Fall Interfaces) geleitet werden muss. Also für mich wirkt das somit nur nach Ressourcenverschwendung.

Vielleicht habe ich das auch einfach nicht genau verstanden, was das Bridging genau soll, aber statt

Code:
pass in on em0 ....
pass out on em0 all

kannst du dann auch einfach

Code:
pass in on em2 ....
pass out on em2 all

setzen und die em0- und em1-Interfaces deaktivieren. Und dann ist es ein ,einfaches' Routing des Systems, bei dem es ja anscheinend keine großen Probleme gibt, du sagtest ja, dass das Einstecken direkt in em2 das Problem (*1) gelöst hat.
 
*1: Wenn ich 'keep state' einfüge kann von der Firewall aus pingen, jedoch von den Servern nicht. Wenn ich es weglasse, trifft der umgekehrte Fall ein. Wenn ich das externe Kabel direkt an em2 (ohne Bridge) anhänge, funktioniert es bei beiden. So viel ich erfahren konnte wird bei NAT sowieso ein 'state' zwischengespeichert. Kann es sein, dass zwei mal 'keep state' nach dem Motto 'minus mal minus' wiederum kein 'state' ergeben?

*2: Die restlichen Ports lassen sich nicht einschränken (z.B. pass out on em3 all), da 'keep state' nicht funktioniert. Es sollten hier weitere Filter-Regeln eingesetzt werden können, damit die Server untereinander keine Verbindung haben.


Es hat ein Weilchen gedauert, bis ich die Konfig geschnallt habe und kann ebenfalls nur sagen, dass das was du da machst nicht wirklich sinnvoll ist. Grundsätzlich sollte man nur auf einem Interface keep state aktivieren. Ein genereller Tip zum Troubleshooten und besseren Verständis: keep state auf dem NAT Interface aktivieren, die States anzeigen und auf die Source und Destination IP und Ports achten (am besten notieren). Dann machst du das gleiche nochmal auf dem em0, schaltest das keep state aber auf dem NAT-Interface ab. Wenn du die Ergebnisse vergleichst, wirst du wahrscheinlich auch den Fehler finden.

Besser wäre es wenn du zwei Boxen benutzt. Die eine macht das Bridging und hat ihre eigenen Regeln und States, die andere macht NAT mit redirection und hat ebenfalls eigene States. Denn du musst dir einfach vor Augen halten, dass du für ein Paket in deiner Firewalllösung meherere States erzeugst und das gibt im Zusammenspiel mit NAT nur Trouble.

Gruß
Morph
 
Danke für euere Hilfe. Habe den PF nun umgestellt und das bridging weggelassen.

Gruss Dom
 
Zurück
Oben