[OpenBSD]

[Zurück: Leistung] [Inhalt] [Weiter: Authpf: Benutzer-Shell für authentifizierende Gateways]

PF: Probleme mit FTP


Inhaltsverzeichnis


FTP-Modi

FTP ist ein Protokoll, das zu der Zeit entwickelt wurde, als das Internet noch eine kleine, freundliche Ansammlung von Computern war und jeder jeden kannte. Zu dieser Zeit war die Notwendigkeit zum Filtern und für strikte Sicherheit nicht gegeben. FTP wurde nicht zum Filtern, zum Weiterleiten durch Firewalls oder für die Zusammenarbeit mit NAT entwickelt.

Du kannst FTP auf zwei unterschiedliche Weisen verwenden: passiv oder aktiv. Generell gilt, dass die Wahl zwischen aktiv und passiv entscheidet, wer das Problem mit der Firewall haben wird. Sei realistisch, du wirst beide unterstützen müssen, um glückliche Anwender zu haben.

Bei aktivem FTP wird der FTP-Server eine neue Verbindung zurück zum -Client eröffnen, um die angefragten Daten zu übertragen, wenn ein Benutzer sich zu einem entfernten FTP-Server verbindet und eine Information oder Datei anfragt. Diese wird als data connection bezeichnet. Am Anfang entscheidet der FTP-Client sich für einen zufälligen Port, auf dem die Datenverbindung angenommen werden soll. Der Client sendet dann die gewählte Portnummer zum FTP-Server und lauscht dann auf dem Port für eine eingehende Verbindung. Der FTP-Server erstellt dann eine Verbindung zur Adresse vom Client am gewählten Port und überträgt die Daten. Dies ist ein Problem für Benutzer, die auf einen FTP-Server zugreifen wollen, wenn sie selbst hinter einem NAT-Gateway liegen. Wegen der Funktionsweise von NAT wird der FTP-Server eine Datenverbindung zur externen Adresse des NAT-Gateways auf dem gewählten Port aufbauen. Die NAT-Maschine wird diese Verbindung erhalten, aber da sie nicht in der Statustabelle aufgelistet ist, wird sie das Paket fallen lassen und nicht zum Client weiterleiten.

Beim passiven FTP-Modus (dem standardmäßigen Modus mit OpenBSDs ftp(1)-Client) wird der Client vom Server verlangen, dass dieser einen zufälligen Port auswählen soll, auf dem er dann auf die Datenverbindung wartet. Der Server teilt dem Client mit, welchen Port er ausgewählt hat und der Client verbindet sich auf diesen Port, um die Daten zu übertragen. Unglücklicherweise ist dies nicht immer möglich oder erwünscht, da die Möglichkeit besteht, dass eine Firewall vor dem FTP-Server die eingehende Datenverbindung blockt. OpenBSDs ftp(1) verwendet standardmäßig den passiven Modus. Um aktives FTP zu erzwingen, verwende die Option -A mit ftp oder setze den passiven Modus aus (off), indem du das Kommando »passive off« am »ftp>«-Prompt eingibst.

FTP-Client hinter der Firewall

Wie zuvor schon angedeutet, funktioniert FTP nicht sonderlich gut über NAT und Firewalls.

Packet Filter bietet eine Lösung für dieses Problem, indem der FTP-Verkehr durch einen FTP-Proxyserver hindurch geleitet wird. Dieser Prozess leitet deinen FTP-Verkehr durch das NAT-Gateway/durch die NAT-Firewall, indem aktiv benötigte Regeln zum PF-System hinzugefügt und danach wieder entfernt werden. All das wird über das Anker-System von PF ermöglicht. Der FTP-Proxy, der von OpenBSD und PF verwendet wird, ist ftp-proxy(8). (Hinweis: frühere OpenBSD-Versionen verwendeten einen anderen Proxy mit dem selben Namen, der in OpenBSD 3.8 dokumentiert wurde: ftp-proxy(8)v3.8)

Um ihn zu aktivieren, schreibe in die NAT-Sektion von pf.conf einen Eintrag, der auf diesem aufbaut:

nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
   port 8021

Die ersten beiden Zeilen aktivieren eine Reihe Anker, die von ftp-proxy genutzt werden, um Regeln bei Bedarf hinzufügen zu können, wenn es um die Verwaltung von FTP-Verkehr geht. Die letzte Zeile leitet FTP von deinen Clients zum Programm ftp-proxy(8) um, welches auf deiner Maschine auf dem Port 8021 hört.

Du braucht ebenfalls einen Anker in deiner Regelsektion:

anchor "ftp-proxy/*"

Hoffentlich ist es ersichtlich, dass der Proxyserver auf dem OpenBSD-System gestartet werden und laufen muss. Dies wird erreicht, indem die folgende Zeile in die /etc/rc.conf.local hinzugefügt wird:

ftpproxy_flags=""

Das Programm ftp-proxy kann als root gestartet werden, um es auch ohne Neustart zu aktivieren.

ftp-proxy lauscht auf dem Port 8021 - der gleiche Port, der im vorherigen rdr-Ausdruck genannt wurde, als es um die Umleitung des FTP-Verkehrs ging.

Um Verbindungen für aktives FTP zu ermöglichen, musst du die Option »-r« an ftp-proxy(8) übergeben (hierfür musstest du an den alten Proxy »-u root« benutzen).

Ein FTP-Server, der »sich selbst mit PF schützt«

In diesem Fall läuft PF direkt auf dem FTP-Server, statt auf einem extra dafür installiertem Firewall-Computer. Wenn eine passive FTP-Verbindung angeboten wird, wird FTP zufällig einen hohen TCP-Port für eingehende Daten auswählen. Standardmäßig wird OpenBSDs nativer FTP-Server ftpd(8) einen Port aus dem Bereich 49152 bis 65535 nutzen. Diese müssen selbstverständlich zusätzlich zum Port 21 (FTP-Kontrollport) durch die Filterregeln gelassen werden.
pass in on $ext_if proto tcp from any to any port 21 keep state
pass in on $ext_if proto tcp from any to any port > 49151 \
   keep state

Wenn du möchtest, kannst du den Bereich der Ports beachtlich verbessern. Im Falle von OpenBSDs ftpd(8)-Programm wird dies durch die Verwendung von den sysctl(8)-Variablen net.inet.ip.porthifirst und net.inet.ip.porthilast ermöglicht.

FTP-Server, die durch eine externe PF-Firewall mit NAT beschützt werden

In diesem Fall muss die Firewall den Verkehr zum FTP-Server nicht nur zu den Ports durchlassen, sondern auch weiterleiten. Um dies zu bewerkstelligen, wenden wir uns wieder ftp-proxy(8) zu.

ftp-proxy(8) kann in einem Modus betrieben werden, der alle FTP-Verbindungen zu einem bestimmten FTP-Server weiterleitet. Im Grunde werden wir also einen Proxy einrichten, der auf Port 21 der Firewall lauscht und alle Verbindungen zum eigentlichen Server weiterleitet.

Editiere /etc/rc.conf.local und füge folgende Zeile hinzu:

ftpproxy_flags="-R 10.10.10.1 -p 21 -b 192.168.0.1"

10.10.10.1 ist hierbei die IP-Adresse des tatsächlichen FTP-Servers, 21 ist die Portnummer, auf der ftp-proxy(8) lauschen soll und 192.168.0.1 ist die Adresse der Firewall, an die sich der Proxy binden soll.

Kommen wir nun zu den pf.conf-Regeln:

ext_ip = "192.168.0.1"
ftp_ip = "10.10.10.1"

nat-anchor "ftp-proxy/*"
nat on $ext_if inet from $int_if -> ($ext_if)
rdr-anchor "ftp-proxy/*"

pass in on $ext_if inet proto tcp to $ext_ip port 21 \
    flags S/SA keep state
pass out on $int_if inet proto tcp to $ftp_ip port 21 \
    user proxy flags S/SA keep state
anchor "ftp-proxy/*"

Hiermit erlauben wir eingehenden Verkehr zum Port 21 des externen Interfaces und ausgehenden Verkehr zum FTP-Server. Die Erweiterung »user proxy« bei der ausgehenden Verbindung stellt sicher, dass nur Verbindungen erlaubt werden, die vom ftp-proxy initiiert wurden.

Falls du mit ftp-proxy(8) einen FTP-Server beschützen möchtest und gleichzeitig FTP-Clients hinter der Firewall verwalten musst, so brauchst du zwei ftp-proxy-Instanzen.

Weitere Informationen zum Thema FTP

Weitere Informationen zum Thema FTP-Filtern und wie FTP generell funktioniert, können in diesem Whitepaper gefunden werden:

Proxy für TFTP

Das »Trivial File Transfer Protocol« (TFTP) hat die gleichen Nachteile wie FTP, wenn es um die Weiterleitung durch eine Firewall geht. Zum Glück verfügt PF über einen Hilfsproxy für TFTP: tftp-proxy(8).

tftp-proxy(8) wird fast genauso wie ftp-proxy(8) im Abschnitt FTP-Client hinter der Firewall eingerichtet.

nat on $ext_if from $int_if -> ($ext_if)
rdr-anchor "tftp-proxy/*"
rdr on $int_if proto udp from $int_if to port tftp -> \
    127.0.0.1 port 6969

anchor "tftp-proxy/*"

Diese Regeln erlauben ausgehenden TFTP-Verkehr vom internen Netzwerk zu TFTP-Servern im externen Netzwerk.

Der letzte Schritt besteht darin, tftp-proxy in der inetd.conf(5) zu aktivieren, sodass der Proxy auf dem selben Port lauscht, wie in der rdr-Regel angegeben; in diesem Fall 6969.

127.0.0.1:6969 dgram udp wait root /usr/libexec/tftp-proxy tftp-proxy

Im Gegensatz zu ftp-proxy(8) wird tftp-proxy(8) von inetd aufgerufen.

[Zurück: Leistung] [Inhalt] [Weiter: Authpf: Benutzer-Shell für authentifizierende Gateways]


[zurück] www@openbsd.org
$OpenBSD: ftp.html,v 1.16 2007/11/12 20:29:59 saad Exp $