Active vs Passive FTP

Posted on

Het FTP protocol is een “raar” protocol omdat het gebruik maakt van twee totaal verschillende verbindingen tussen de client en de server.  Enerzijds heb je de control connection (de verbinding waarover client en server met elkaar praten zeg maar) en anderzijds heb je de data connection (de verbinding waarover client en server data (= bestanden) met elkaar uitwisselen).

De control connection is de eenvoudigste om te omschrijven.  Deze (op TCP gebaseerde) verbinding wordt opgezet op vraag van de client tussen poort 21 van de server en een willekeurige poort boven de 1024 van de client. Dit is +/- altijd zo en het doet er niet toe of je een “active” of een “passive” ftp verbinding gebruikt. Deze verbinding wordt ook in stand gehouden zolang de FTP sessie duurt en wordt oa. gebruikt om informatie uit te wisselen over de manier waarop de data connectie moet opgezet worden.

De data connection kan op twee manieren verlopen.  We beginnen met de “active” ftp sessie. Hierbij zal er een tweede verbinding opgezet worden op vraag van de server tussen poort 20 van de server en een poort op de client.  De poort op de client werd eerder door de client gekozen en doorgegeven aan de server (over de control connection) middels een PORT commando.

Zo’n PORT commando ziet eruit als volgt:

PORT 199,174,116,17,17,170

De eerste vier getallen zijn het IP adres van de client, de laatste twee getallen zijn de poort waarmee de server verbinding moet maken. Neem het eerste van de twee getallen, vermenigvuldig het met 256 en tel er het laatste cijfer bij. In dit geval gaat het dus om het IP 199.174.116.17 en poort 4522.

Dit werkt prima op voorwaarde dat de server het juiste IP adres van de client krijgt en hier wrikt het schoentje. Wanneer je client zich achter een firewall bevindt die de NAT techniek toepast (omzetten van private in publieke ip adressen) dan zal je client het private IP adres aanbieden aan de server. De server zal proberen om met dat private IP adres een data connection op te bouwen maar uiteraard zal dat niet lukken.

Het heeft ook geen zin om je client aan te leren dat hij het publieke IP adres moet doorgeven aan de server. De NAT router/firewall zal deze verbinding niet toelaten. (NAT routers laten geen verbindingen toe behalve als ze van binnen uit geïnitieerd worden.)

Daarom bestaat een twee techniek: passive ftp. Hierbij zal de client tegen de server zeggen “jij moet geen data connection proberen op te zetten, dat doe ik wel”.  Daarop zal de server antwoorden “ok, maak jij dan maar verbinding met mijn poort XXX”, waarbij XXX een poort is boven de 1024.  De client zal daarop een data connection opzetten tussen een willekeurige poort op de client en de eerder doorgegeven poort op de server.  De commando’s daarvoor zijn als volgt:

Client: PASV
Antwoord v/d server: Entering passive mode (199,10,17,154,50,103)

Ook hier zijn de zes cijfers uit te splitsen in de eerste 4 (het IP adres) en de laatste 2 (het eerste * 256 + het tweede = het poort nummer van de server die klaar gemaakt is om een data connectie te ontvangen van de client)

Deze manier van werken werkt wel als de client achter een NAT router/firewall zit.

Als u vragen hebt over deze techniek of dit artikel, of u wil er meer over weten, dan hoor ik graag van u.