[OpenBSD]

[Vorige: Prestatie] [Inhoud] [Volgende: Authpf: Gebruiker-Shell voor Authentiserende Gateways]

PF: Problemen met FTP


Inhoudsopgave


FTP Modi

FTP is een protocol dat dateert van toen het Internet een kleine, vriendelijke verzameling computers was en iedereen iedereen kende. In die tijd was er geen nood aan filtering of aan strikte beveiliging. FTP werd niet ontworpen om te filteren, om doorheen firewalls te passeren, of om te werken met NAT.

U kan FTP op ййn van twee manieren gebruiken: passief of actief. In het algemeen wordt de keuze tussen actief of passief gemaakt om te bepalen wie het probleem met firewalling heeft. Realistisch gezien zal u beide moeten ondersteunen om gelukkige gebruikers te hebben.

Bij actieve FTP maakt de FTP server een nieuwe verbinding terug naar de client om de opgevraagde gegevens over te dragen, wanneer een gebruiker verbindt naar een remote FTP server en informatie of een bestand opvraagt. Dit wordt de data connection genoemd. Om te beginnen kiest de FTP client een willekeurige (random) poort om de "data connection" op te ontvangen. De client stuurt het poortnummer dat hij koos naar de FTP server en luistert dan naar een binnenkomende verbinding op die poort. De FTP server initieert vervolgens een verbinding naar het adres van de client op de gekozen poort en transfereert de gegevens. Dit is een probleem voor gebruikers die proberen toegang te verkrijgen tot FTP servers van achter een NAT gateway. Omwille van hoe NAT werkt, initieert de FTP server de "data connection" door te verbinden naar het externe adres van de NAT gateway op de gekozen poort. De NAT machine zal dit ontvangen, maar omdat hij geen afbeelding heeft voor het pakket in zijn toestandstabel, zal hij het pakket laten vallen en zal het niet aan de client bezorgen.

Bij passieve FTP modus (de standaard modus voor OpenBSD's ftp(1) client), vraagt de client aan de server een willekeurige poort te kiezen om op te luisteren voor de "data connection". De server informeert de client over de poort die hij gekozen heeft, en de client verbindt naar deze poort om de gegevens te transfereren. Jammer genoeg is dit niet altijd mogelijk of wenselijk omwille van de mogelijke aanwezigheid van een firewall vууr de FTP server die de binnenkomende "data connection" blokkeert. OpenBSD's ftp(1) gebruikt standaard de passieve modus; om actieve FTP te forceren, gebruikt u de -A vlag voor ftp, of stelt u passive mode in op "off" door het commando "passive off" uit te voeren op de "ftp>" prompt.

FTP Client achter de Firewall

Zoals eerder aangegeven, gaat FTP niet erg goed doorheen NAT en firewalls.

Packet Filter voorziet een oplossing voor deze situatie door FTP verkeer om te leiden doorheen een FTP proxy server. Dit proces grijpt in om uw FTP verkeer doorheen de NAT gateway/firewall te "gidsen", door op een actieve manier de nodige regels toe te voegen aan het PF systeem en ze weer te verwijderen als het klaar is, door middel van het PF ankers systeem. De FTP proxy die door PF gebruikt wordt in OpenBSD 3.9 en later, is ftp-proxy(8). (opmerking: vroegere versies van OpenBSD gebruikten een andere proxy met dezelfde naam, die gedocumenteerd is in OpenBSD 3.8's ftp-proxy(8)v3.8).

Om het te activeren, zet u iets als dit in de NAT sectie van pf.conf:

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

De eerste twee lijnen zijn een paar ankers die gebruikt worden door ftp-proxy om "on-the-fly" regels toe te voegen naarmate dat nodig is om uw FTP verkeer te beheren. De laatste lijn leidt FTP van uw clients om naar het ftp-proxy(8) programma, dat op uw machine luistert op poort 8021.

U hebt ook een anker nodig in de regels-sectie:

anchor "ftp-proxy/*"

Hopelijk is het duidelijk dat de proxy server gestart moet worden en moet draaien op de OpenBSD machine. Dit wordt gedaan door de volgende lijn in te voegen in /etc/rc.conf.local:

ftpproxy_flags=""

Het ftp-proxy programma kan als root gestart worden om het te activeren zonder te herstarten.

ftp-proxy luistert op poort 8021, dezelfde poort als die waar het bovenstaande rdr commando FTP verkeer naartoe stuurt.

Om actieve modus verbindingen toe te laten, hebt u de '-r' optie voor ftp-proxy(8) nodig (hiervoor moest u de oude proxy met "-u root" uitvoeren).

Een FTP Server die "zichzelf beschermt" met PF

In dit geval draait PF op de FTP server zelf, veeleer dan op een toegewijde firewall computer. Bij het bedienen van een passieve FTP verbinding zal FTP een willekeurig gekozen, hoge TCP poort gebruiken voor binnenkomende gegevens. Standaard gebruikt OpenBSD's aangeboren FTP server ftpd(8) het bereik 49152 tot 65535. Vanzelfsprekend moeten deze doorgelaten worden door de filterregels, samen met poort 21 (de FTP controlepoort):
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

Merk op dat indien u dat wenst, u dat bereik van poorten aanzienlijk kan vernauwen. In het geval van het OpenBSD ftpd(8) programma, gebeurt dat met de sysctl(8) variabelen net.inet.ip.porthifirst en net.inet.ip.porthilast.

FTP Server Beschermd door een Externe PF Firewall die NAT draait

In dit geval moet de firewall verkeer omleiden naar de FTP server bovenop het niet blokkeren van de vereiste poorten. Om dit te verwezenlijken, keren we terug naar ftp-proxy(8).

ftp-proxy(8) kan gedraaid worden in een modus die ervoor zorgt dat het alle FTP verbindingen doorstuurt naar een specifieke FTP server. Eigenlijk zullen we de proxy instellen om te luisteren op poort 21 van de firewall en alle verbindingen naar de back-end server door te sturen.

Wijzig /etc/rc.conf.local door het volgende toe te voegen:

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

Hier is 10.10.10.1 het IP adres van de eigenlijke FTP server, 21 is de poort waarop we willen dat ftp-proxy(8) luistert, en 192.168.0.1 is het adres op de firewall waaraan we de proxy willen binden.

Nu de pf.conf regels:

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/*"

Hier zullen we de ingaande verbinding toelaten op poort 21 op de externe interface, alsook de overeenkomstige uitgaande verbinding naar de FTP server. De "user proxy" toevoeging aan de uitgaande regel verzekert dat alleen verbindingen geпnitieerd door ftp-proxy(8) toegestaan worden.

Merk op dat als u ftp-proxy(8) wil draaien zowel om een FTP server te beschermen als om clients naar buiten te laten FTP'en van achter de firewall, dan twee instanties van ftp-proxy vereist zullen zijn.

Meer Informatie over FTP

Meer informatie over het filteren van FTP en hoe FTP werkt in het algemeen, kan u terugvinden in dit artikel:

TFTP Proxy'en

Trivial File Transfer Protocol (TFTP) leidt aan enkele van dezelfde beperkingen als FTP wanneer het gaat om door een firewall heen te geraken. Gelukkig heeft PF een helper-proxy voor TFTP, tftp-proxy(8) genoemd.

tftp-proxy(8) wordt ingesteld op een gelijkaardige manier als ftp-proxy(8) in de FTP Client achter de Firewall sectie hierboven.

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/*"

De regels hierboven laten uitgaande TFTP toe vanaf het interne netwerk naar TFTP servers op het externe netwerk.

De laatste stap is om tftp-proxy in te schakelen in inetd.conf(5) zodat het luistert op dezelfde poort als de rdr regel hierboven gespecificeerd, in dit geval 6969.

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

In tegenstelling tot ftp-proxy(8), wordt tftp-proxy ge-"spawned" vanuit inetd.

[Vorige: Prestatie] [Inhoud] [Volgende: Authpf: Gebruiker-Shell voor Authentiserende Gateways]


[terug] www@openbsd.org
$OpenBSD: ftp.html,v 1.11 2007/11/19 10:43:15 tobias Exp $