Active FTP versus Passive FTP
Inhoud:
Een van de meest voorkomende vragen bij het werken met
firewalls en ander internet connectivity problemen is het
verschil tussen Active en Passive FTP en hoe je ze beide
of afzonderlijk het best kunt ondersteunen. Hopelijk kan
deze uitleg helpen met het ophelderen van de verwarring
die er bestaat over het ondersteunen van FTP in een firewalled
omgeving.
Dit is waarschijnlijk niet DE definitieve uitleg zoals
de titel claimt maar ik heb genoeg positieve feedback gekregen
en heb dit document veelvuldig gelinkt gezien om te vermoeden
dat het voor veel mensen bruikbaar is. Ik ben echter altijd
op zoek om zaken te verbeteren en als je iets hebt gevonden
wat niet helder genoeg is of meer uitleg behoeft laat het
me dan weten!. Recente toevoegingen zijn de voorbeelden
van zowel active als passive command line (prompt) FTP sessies.
Deze sessie voorbeelden kunnen een aantal dingen verhelderen.
Daarnaast laten ze mooi zien wat er achter de schermen gebeurt
bij een FTP sessie. Nou, op naar de info....
FTP is een exclusief op TCP gebaseerde service. Er is geen
UDP component bij FTP. FTP is een bijzondere service omdat
het twee poorten gebruikt tijdens een sessie, een "data"
poort en een "command" (ook wel bekend als de"control"
) poort. Traditioneel zijn dit poort 21 voor de command
poort en 20 voor de data poort. De verwarring begint echter
dat, afhankelijk van de modus, de data poort niet altijd
poort 20 is.
In active mode FTP maakt de cliënt kant een verbinding
vanaf een willekeurige hoge poort (N>1024) met de FTP
server's command poort, poort 21. Dan begint de cliënt
te luisteren naar poort N+1 van de FTP server en stuurt het
FTP commando "PORT N+1" naar de FTP
server. Deze zal op zijn beurt een verbinding leggen naar
de door de cliënt aangeven poort vanaf zijn locale
data poort 20.
Van het standpunt van de firewall aan de serverkant Bezien
moeten voor de active mode de volgende communicatie kanalen
ge-opend worden:
- naar FTP server poort 21 van overal (Cliënt initieerd
de verbinding)
- van FTP server poort 21 naar poorten > 1024 (Server reageert
op de client's control poort)
- van FTP server poort 20 naar poorten > 1024 (Server initieerd
de data verbinding naar de cliënt's data poort)
- naar FTP server poort 20 vanaf poorten > 1024 (Cliënt
stuurt ACKs naar de server's data poort)
Uitgetekend ziet het er als volgt uit:
In stap 1, de cliënt's command poort contacteerd de
server's command poort en stuurt het commando "PORT
1027". De server stuurt een ACK terug naar de
cliënt's command poort in stap 2. In stap 3 initieert
de server een verbinding met zijn lokale data poort naar
de data poort die door de cliënt eerder werd opgegeven
(1027). Tot slot stuurt de cliënt een ACK terug zoals
te zien is in stap 4.
Het grootste probleem met active mode FTP is echter te
vinden aan de cliënts kant. De FTP cliënt maakt
niet de uiteindelijke connectie naar de data poort op de
server. Het vertelt simpelweg aan de server op welke poort
hij luistert en de server legt de uiteindelijke verbinding
naar de door de cliënt opgegeven poort. Van de kant
van de cliënt's firewall ziet het eruit alsof iemand
van buitenaf verbinding probeert te maken naar een interne
cliënt. Laat dat nu meestal geblokkeerd zijn op de
firewall.
Hieronder vind je een voorbeeld van een Active FTP sessie.
Het enige wat veranderd is zijn de server namen, IP adressen
en gebruikersnamen. In dit voorbeeld wordt eR een FTP sessie
ge-initieert vanaf testbox1.slacksite.com (192.168.150.80),
een linux systeem wat de standaard FTP command line cliënt
gebruikt, naar testbox2.slacksite.com (192.168.150.90),
een linux box waarop ProFTPd 1.2.2RC2 draait. De debugging
(-d) flag is gebruikt om te laten zien wat
eR achter de schermen gebeurd. Alles in rood is de debugging output die laat zien wat de
werkelijke commando's zijn die verstuurd worden naar de
FTP server en de respons hierop. Normale server output is
in zwart, en gebruikers input is bold.
Er zijn een paar interessante dingen aan deze dialoog.
Kijk bijvoorbeeld maar eens naar wat er gebeurd wanneer
het PORT commando wordt verstuurd, Het specifiseert
een poort op het cliënt (192.168.150.80) systeem
in plaats van op de server. We zullen het omgekeerde zien
wanneer we passive FTP gebruiken. Terwijl we nu toch op
dit onderwerp zijn even een kleine opmerking over de format
van het PORT commando. Zoals je in het voorbeeld
beneden kunt zien is het opgebouwd als een serie van 6 cijfers
gescheiden door een komma. De eerste vier octets zijn het
IP adres terwijl de laatste twee de poort vormen die gebruikt
wordt voor de data connectie. In het voorbeeld hieronder
is de poort dus ((14*256) + 178), of 3762. Een snelle controle
met netstat kan deze informatie bevestigen.
testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PORT 192,168,150,80,14,178
200 PORT command successful.
---> LIST
150 Opening ASCII mode data connection for file list.
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.
Om het probleem op te lossen van een server die de connectie
initieert naar de cliënt is er een aandere methode
ontwikkeld. Deze is bekend als passive mode, ofwel PASV,
naar het commando wat gebruikt word door de cliënt
om de server te vertellen dat hij passive mode is.
In passive mode FTP initieert de cliënt de beide connecties
naar de server waardoor het probleem van de firewall die
de inkomende data poort van de server naar de cliënt
blokkeert wordt opgelost. Bij het openen van een FTP connectie
opent de cliënt 2 willekeurige hoge lokale poorten
(N > 1024 and N+1). De eerste maakt een connectie met
de server op poort 21 maar in plaats van een PORT
commando te sturen en toestaan dat de server terugverbindt
naar zijn data poort stuurt de cliënt een PASV
commando. Het resultaat hiervan is dat de server dan een
willekeurige hoge lokale poort opent (P > 1024) en het
PORT P commando terugstuurd naar de cliënt.
De cliënt initieert dan een verbinding van port N+1
naar port P op de server om data te versturen.
Van de serverkant zijn firewall's standpunt bezien om passive
mode FTP te ondersteunen zijn de volgende communicatie kanalen
geopend:
- naar FTP server's poort 21 van overal (Client initieert de
verbinding)
- van FTP server's poort 21 naar poorten > 1024 (Server
reageert op de cliënt's control poort)
- naar FTP server's poorten > 1024 van overal (Cliënt
initieert de data connectie naar een willekeurige poort
als gespecificeert door de server)
- van FTP server's poorten > 1024 naar poorten > 1024
(Server zend ACKs (en data) naar de cliënt's data
poort)
Als dit wordt uitgetekent ziet een passive mode FTP connectie
er als volgt uit:
In stap 1, maakt de cliënt contact met de server op
de command port en verstuurt het PASV commando.
De server antwoord in stap 2 met "PORT 2024"
waarmee hij de cliënt vertelt welke poort hij gebruikt
om te luisteren naar een data connectie. In stap 3 initieert
de cliënt de data connectie vanaf zijn data port naar
de opgegeven server data port. Als laatste stuurt de server
een ACK in stap 4 naar de cliënt's data poort.
Terwijl passive mode FTP een groot deel van de problemen
oplost aan de zijde van cliënt opent het een hele reeks
van problemen aan de kant van de server. Het belangrijkste
probleem is de noodzaak om verbindingen toe te staan op
hoge poorten aan de kant van de server. Gelukkig stellen
de meest FTP Deamons, inclusief de populaire WU-FTPD de
administrator in staat om een reeks van poorten te specificeren
die server kan gebruiken. Zie Appendix 1 voor meer
informatie.
Het tweede probleem houdt in, het ondersteunen en troubleshooten
van cliënts die geen passive mode ondersteunen. Een
voorbeeld is de command line FTP utility die bij Sun's Solaris
besturingssyteem is meegeleverd waardoor het noodzakelijk
is om third-arty FTP cliënts, als ncftp te installeren.
Door de enorme populariteit van het World Wide Web, gebruiken
veel mensen hun webbrowser als FTP cliënt. De meeste
browsers ondersteunen passive mode alleen wanneer zij ftp://
URLs gebruiken. Afhankelijk van de instellingen van de firewall
en de server kan dit zowel goud als slecht uitpakken.
Hieronder vind je een voorbeeld van een Passive FTP sessie.
Het enige wat veranderd is zijn de server namen, IP adressen
en gebruikersnamen. In dit voorbeeld wordt er een FTP sessie
ge-initieert vanaf testbox1.slacksite.com (192.168.150.80),
een linux systeem wat de standaard FTP command line cliënt
gebruikt, naar testbox2.slacksite.com (192.168.150.90),
een linux box waarop ProFTPd 1.2.2RC2 draait. De debugging
(-d) flag is gebruikt om te laten zien wat
er achter de schermen gebeurd. Alles in rood is de debugging output die laat zien wat de
werkelijke commando's zijn die verstuurd worden naar de
FTP server en de respons hierop. Normale server output is
in zwart, en gebruikers input is bold.
Let op het verschil in het PORT commando in
dit voorbeeld ten opzichte van dat in het active FTP voorbeeld.
Hier zien we een poort die geopend wordt op de server
(192.168.150.90) in plaats van op de cliënt. Zie ook
de discussie over het format van het PORT commando
hierboven in de Active FTP Example
sectie.
testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV
227 Entering Passive Mode (192,168,150,90,195,149).
---> LIST
150 Opening ASCII mode data connection for file list
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.
De volgende tabel moet administators helpen hoe beide FTP
modes werken:
Active FTP :
command : client >1024 -> server 21
data : client >1024 <- server 20
Passive FTP :
command : client >1024 -> server 21
data : client >1024 -> server >1024
Een snelle samenvatting van de voor- en nadelen van active
versus passive FTP is ook wel makkelijk:
Active FTP is gemakkelijk voor de FTP server admin, maar
moeilijk voor de cliënt's kant admin. De FTP server
doet een poging om een willekeurige hoge poort te contacteren
aan de kant van de cliënt, welke vrijwel zeker is geblokkeerd
door de firewall aan de kant van de cliënt. Is dit
niet zo dan is de firewall niet goed geconfigureerd.
Passive FTP is gemakkelijk aan de kant van de cliënt,
maar lastig voor de FTP server admin. De cliënt zal
beide connecties met de server opbouwen maar 1 daarvan met
een willekeurige hoge poort die naar alle waarschijnlijkeid
op de firewall van de server's kant geblokkeerd zal zijn.
Gelukkig is er een compromis. Omdat admins die een FTP
server hebben draaien dat naar alle waarschijnlijkheid doen
voor meerdere cliënts zullen ze vrijwel altijd passive
FTP moeten ondersteunen. De openheid van hoge porten op
de server kan geminimaliseerd worden door een range te specificeren
die de FTP server kan en mag gebruiken. Dus alles behalve
deze poorten kunnen geblokkeerd worden door de firewall.
Ondanks dat ze niet het gevaar wegneemt aan de server kant
kan deze oplossing het risico behoorlijk minimaliseren.
Zie Appendix 1 voor meer
informatie.
Een uitstekende referentie over hoe de verschillende internet
protocollen werken en de zaken die gemoeid zijn met het
firewallen van deze protocollen kan gevonden worden in het
O'Reilly and Associates boek, Building Internet Firewalls,
2nd Ed, van Brent Chapman en Elizabeth Zwicky.
Als laatste, de definitieve referentie over FTP is RFC
959, welke de officiele specificaties van het FTP protocol
vermeld. RFC's kunnen gedonwload worden van verschillende
plaatsen. Onder andere van ftp://nic.merit.edu/documents/rfc/rfc0959.txt.
Andere sites zijn te vinden via Google.
Vertaald uit het engels. Origineel (in het engels) is geschreven
door Jay Ribak en is te vinden op zijn site: http://www.slacksite.com
|