[Zurück: Leistung] [Inhalt] [Weiter: Authpf: Benutzer-Shell für authentifizierende Gateways]
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.
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).
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-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.
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]