[Vorige: Prestatie] [Inhoud] [Volgende: Authpf: Gebruiker-Shell voor Authentiserende Gateways]
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.
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 gebruikt wordt door OpenBSD 3.9 en PF, 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).
Merk alstublieft op dat ftp-proxy(8) dient om FTP clients achter een PF filter te helpen; het wordt niet gebruikt om een FTP server achter een PF filter aan te pakken.
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.
Hier is een voorbeeld van een subset van regels die dit zouden verwezenlijken:
ftp_server = "10.0.3.21"
rdr on $ext_if proto tcp from any to any port 21 -> $ftp_server \
port 21
rdr on $ext_if proto tcp from any to any port 49152:65535 -> \
$ftp_server port 49152:65535
# in on $ext_if
pass in quick on $ext_if proto tcp from any to $ftp_server \
port 21 keep state
pass in quick on $ext_if proto tcp from any to $ftp_server \
port > 49151 keep state
# out on $int_if
pass out quick on $int_if proto tcp from any to $ftp_server \
port 21 keep state
pass out quick on $int_if proto tcp from any to $ftp_server \
port > 49151 keep state
[Vorige: Prestatie] [Inhoud] [Volgende: Authpf: Gebruiker-Shell voor Authentiserende Gateways]