pf und ftp

crotchmaster

happy BSD user
Hallo,

ich bin gerade dabei, eine Firewall mit OpenBSD 3.3 und pf zu bauen. Soweit funktioniert auch alles nach Plan.
Das Problem liegt bei ftp.

Die Beispiel-Regeln, die ich bei openbsd.org ( http://www.openbsd.org/faq/pf/example1.html ) und über google gefunden haben, lassen den gesamten Netzwerkverkehr vom internen Netz ins Internet passieren.

Gibt es eine Möglichkeit, ftp zum Laufen zu bringen, ohne den gesamten Verkehr passieren zu lassen?
Ich stehe nämlich auf dem Standpunkt, das eine FW auch zum Durchsetzen von Sicherheitsrichtlinien da ist, also nur Verkehr durchlässt, der ausdrücklich erlaubt ist.

Mein Dank ist Euch gewiss.

Gruß crotchmaster
 
Hallo [tE]bachi,

danke für Deine schnelle Antwort. Mit soetwas ähnlichem habe ich auch rumprobiert, es aber nicht hinbekommen.

Ich poste mal einen Auszug der Regeln.

...
intIf = "rl0" # internal interface
intNet = "{ 192.168.17.0/26, 192.168.17.64/26, 192.168.17.128/26, 192.168.17.224/27 }" # internal networks

# ftp clients behind firewall
rdr on $intIf proto tcp from any to any port 21 -> 127.0.0.1 port 8021


# allow incoming ftp connections (port 21)
pass in on $intIf proto tcp from $intNet to any port ftp keep state


# temp. rule
#pass in on $intIf from $intNet to any keep state

# allow all other outgoing connections
pass out on $extIf proto tcp all modulate state flags S/SA
pass out on $extIf proto { udp, icmp } all keep state
pass out on $intIf proto tcp all keep state flags S/SA
pass out on $intIf proto { udp, icmp } all keep state


Der ftp-proxy läuft natürlich auch. Es funktioniert, wenn ich die 'temp. Regel' aktiviere. Kommentiere ich sie aus und aktiviere stattdessen die ftp-Regel, geht es nicht. :confused:

Bin weiterhin für jeden Tipp dankbar.

Gruß crotchmaster
 
Original geschrieben von crotchmaster
Hallo [tE]bachi,

danke für Deine schnelle Antwort. Mit soetwas ähnlichem habe ich auch rumprobiert, es aber nicht hinbekommen.

Ich poste mal einen Auszug der Regeln.

...
intIf = "rl0" # internal interface
intNet = "{ 192.168.17.0/26, 192.168.17.64/26, 192.168.17.128/26, 192.168.17.224/27 }" # internal networks

# ftp clients behind firewall
rdr on $intIf proto tcp from any to any port 21 -> 127.0.0.1 port 8021


# allow incoming ftp connections (port 21)
pass in on $intIf proto tcp from $intNet to any port ftp keep state


# temp. rule
#pass in on $intIf from $intNet to any keep state

# allow all other outgoing connections
pass out on $extIf proto tcp all modulate state flags S/SA
pass out on $extIf proto { udp, icmp } all keep state
pass out on $intIf proto tcp all keep state flags S/SA
pass out on $intIf proto { udp, icmp } all keep state


Der ftp-proxy läuft natürlich auch. Es funktioniert, wenn ich die 'temp. Regel' aktiviere. Kommentiere ich sie aus und aktiviere stattdessen die ftp-Regel, geht es nicht. :confused:

Bin weiterhin für jeden Tipp dankbar.

Gruß crotchmaster

Du musst das passive FTP zulassen (was ja standard ist). Das macht man mit diesen zwei Regeln:

pass in quick log on $extif inet proto tcp from $IntNet to any port ftp flags S/SA modulate state

pass in quick log on $extif inet proto tcp from $IntNet to any port >= 49152 flags S/SA modulate state

Mit diesen Regeln müsste es gehen :)

Gruß

CW

P.S. trotzdem fände ich es am Besten, wenn du mal die Konfiguration deines Netzes posten würdest.

Sollte es aber klappen, ist dies (in diesem Fall) nicht mehr notwendig.
 
Hallo CW,

ich habe nochmal rumprobiert, mit Deinen Regeln und auch nochmal die manpages von pf.conf und ftp-proxy studiert, aber ich bekomme es einfach nicht zum laufen. Ich bin aber der Meinung, das die Regeln eigentlich richtig sein sollten.

Am Ende hänge ich mal meine pf.conf an.

Die OpenBSD-Kiste ist die Firewall, daran direkt hängt das 192.168.17.0-er Netz. Die Netze 192.168.17.64, 192.168.17.128 und 192.168.17.224 sind über einen Router angeschlossen. Die externe IP-Adresse ist nicht die richtige. Außer ftp geht alles. Meine Versuche mache ich vom $adminPC aus.

Gruß crotchmaster
 

Anhänge

  • pf.conf
    3,7 KB · Aufrufe: 510
Original geschrieben von crotchmaster
Hallo CW,

ich habe nochmal rumprobiert, mit Deinen Regeln und auch nochmal die manpages von pf.conf und ftp-proxy studiert, aber ich bekomme es einfach nicht zum laufen. Ich bin aber der Meinung, das die Regeln eigentlich richtig sein sollten.

Am Ende hänge ich mal meine pf.conf an.

Die OpenBSD-Kiste ist die Firewall, daran direkt hängt das 192.168.17.0-er Netz. Die Netze 192.168.17.64, 192.168.17.128 und 192.168.17.224 sind über einen Router angeschlossen. Die externe IP-Adresse ist nicht die richtige. Außer ftp geht alles. Meine Versuche mache ich vom $adminPC aus.

Gruß crotchmaster

Ich habe deine pf.conf überprüft und das Problem bei dir liegt in der Tatsache, dass du leider nicht beachtet hast, dass das Redirecting vor JEDER anderen Regel ausgeführt wird. Es gilt immer: first matching rule wins, wenn es ums Redirecting geht!

Hier der Auszug deiner rdr-Regel:


# redirect incoming traffic
# FTP Clients behind Firewall
rdr on $intIf proto tcp from any to any port 21 -> 127.0.0.1 port 8021


Damit leitest du jede FTP-Anfrage an den Port 8021 um.

Somit wird also der Standard-Port 21 nicht mehr benutzt.

Und folglich wird er auch gefiltert (d.h. geblockt)

------------------------------------------------------------------------------------------

So, jetzt wenden wir uns deiner FTP-Regel zu, die du anwedest:

# allow incoming ftp connections (port 21)
pass in log on $intIf proto tcp from $intNet to any port ftp keep state
pass in log on $extIf proto tcp from any to $extIp port > 49151 keep state


Diese Regeln werden leider niemals ausgeführt (sie matchen also nie), da du ja mit dem obengenannten Redirect alles umgeleitet hast.

------------------------------------------------------------------------------------------

Daher musst du hier anstatt ftp bzw. 21 anzugeben eben die 8021 angeben. Dadurch wirst du die umgeleiteten FTP-Transfers auf 8021 schnappen und mit diesen Regeln passieren lassen.

Außerdem gehören diese beiden Regeln zusammen und sollten NICHT auf zwei Interfaces verteilt werden.

Daher setze sie beide auf ein einziges Interface und nicht, wie hier auf $intIf und $extIf.

-----------------------------------------------------------------------------

So, und jetzt rate mal, warum diese Regel immer Abhilfe für dich schaffen konnte?:

# temp. Regel !!! mit dieser Regel funtioniert FTP !!!
#pass in log on $intIf from $intNet to any keep state


Weil du eben JEGLICHEN Verkehr zugelassen hast (also auch den über 8021).
 
Zuletzt bearbeitet:
Hallo CW,

das wars, es funktioniert jetzt. Das ich mit der Regel

#pass in log on $intIf from $intNet to any keep state
den ganzen Verkehr von innen nach außen zulasse, war mir auch klar. Das wollte ich ja auch nicht und deshalb auch meine Frage.

Ich wußte nicht, das die redirect-Regeln bei 'first matching rule wins' miteinbezogen werden. Deshalb habe ich den port 21 gefiltert, in der irrigen Annahme, das das was dann noch durchkommt zu 127.0.0.1:8021 umgeleitet wird. Da hab ich wohl noch an ipfilter gedacht.

Das mit den verschieden Interfaces bei
pass in log on $extIf proto tcp from any to $extIp port > 49151 keep state
war noch ein Rest meiner Versuche, der auch gar keinen Sinn ergibt bei passivem FTP.

Danke und Gruß

crotchmaster
 
Original geschrieben von crotchmaster
Hallo CW,

das wars, es funktioniert jetzt. Das ich mit der Regel


den ganzen Verkehr von innen nach außen zulasse, war mir auch klar. Das wollte ich ja auch nicht und deshalb auch meine Frage.

Ich wußte nicht, das die redirect-Regeln bei 'first matching rule wins' miteinbezogen werden. Deshalb habe ich den port 21 gefiltert, in der irrigen Annahme, das das was dann noch durchkommt zu 127.0.0.1:8021 umgeleitet wird. Da hab ich wohl noch an ipfilter gedacht.

Das mit den verschieden Interfaces bei

war noch ein Rest meiner Versuche, der auch gar keinen Sinn ergibt bei passivem FTP.

Danke und Gruß

crotchmaster

Schön, das es geklappt hat.

PF ist zwar eine feine Sache, kann aber auch leicht nervig werden, wenn man etwas außer Acht lässt.

Ist mir auch mal passiert ;)

Da wird man so richtig sauer und vor allem dann, wenn man sieht, dass es eine Trivialität war. :)

Nun, dann viel Spaß mit PF und OpenBSD.

Gruß

CW
 
Zurück
Oben