home       basis       advanced       routing       switching       testen       overig      

FTP inner workings

FTP is een minder eenvoudig protocol

  • Er is enerzijds een CLI (of een GUI) die een eerste TCP-sessie opent en gebruikt waar protocol-commands en completion-replies heen en weer vliegen tussen CLIENT en SERVER.
  • Er zijn anderzijds data transfert-en (meervoud en mogelijks in beide richtingen), die telkens een extra TCP-sessie openen en weer sluiten.
  • Tenslotte is er de mogelijkheid om de DATA-sessie zowel vanaf de server als vanaf de client (PASSIVE) te initialiseren.
RFC 959                  October 1985                  File Transfer Protocol 
 
2.3. THE FTP MODEL
 
 PI:  Protocol Interpreter
 DTP: Data Transfer Process -- it establishes and manages 
      the data connection. The DTP can be passive or active.
 
                                            -------------
                                            |/---------\|
                                            ||   User  ||    --------
                                            ||Interface|<--->| User |
                                            |\----^----/|    --------
                  ----------                |     |     |
                  |/------\|  FTP Commands  |/----V----\|
                  ||Server||<-------------- ||   User  ||
                  ||  PI  ||   FTP Replies  ||    PI   ||
                  |\--^---/|--------------->|\----^----/|
                  |   |    |                |     |     |
      --------    |/--V---\|      Data      |/----V----\|    --------
      | File |<--->|Server| -<------------>- |  User   |<--->| File |
      |System|    || DTP  ||   Connection   ||   DTP   ||    |System|
      --------    |\------/|                |\---------/|    --------
                  ----------                -------------

                  SERVER-FTP                  CLIENT-FTP

      NOTES: 1. The data connection may be used in either direction.
             2. The data connection need not exist all of the time.

Meer weten? Lees de RFC: tools.ietf.org/html/rfc959
 
een zeer eenvoudige FTP download 
 
We beginnen met een zeer eenvoudig voorbeeld:

  • connecting
  • logging in
  • downloading een file met als naam timezone
  • verbinding verbreken
    $ ftp 10.0.100.101
    Connected to 10.0.100.101
     
    220 Welcome to linux800 internal FTP service.
    Name (10.0.100.101:bert): anonymous
    331 Please specify the password.
    Password:
     
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
     
    ftp> get timezone
    local: timezone remote: timezone
    200 PORT command successful. Consider using PASV.
    150 Opening BINARY mode data connection for timezone (16 bytes).
    226 File send OK.
    16 bytes received in 0.00 secs (71.3 kB/s)
     
    ftp> quit
    221 Goodbye.

     

  • In wireshark vanaf de client (capture filter: host 10.0.100.101), ziet dat er dan zo uit:
     
    standaard-ftp

     

  • Wanneer we verbinden met de FTP-server (10.0.100.101), wordt er eerst
    een ARP gestuurd om het MAC-address van de SERVER te weten te komen: (frames 3 en 4)
    Vervolgens gebeurt de TCP-3-way handshake (session setup) (segment 5 tot 7)
     
  • De eerste FTP-message, van de server is: 220 Welcome (message 8)
     
  • Login: de mens achter de client tikt credentials in (in casu anonymous ftp)
    (USER en PASS messages 10 tot 13)
     
  • De CLIENT ondervraagt de SERVER over diens OS. Dit is een standaard operatie onmiddellijk na login (SYST messages 14 en 15)
     
  • get timezone: zodra het get commando wordt ingetikt gaat de client aan het werk:
    • eerst wordt het data-type ingesteld: TYPE I binary (message 16 en 17),
    • vervolgens geeft de client een poortnummer door voor de ftp-data-sessie: PORT x.x.x.x,211,142 (message 18 en 20),
    • tot slot wordt RETR timezone doorgegeven, de primitive om de download van de file timezone te starten (message 22).
    • regels 19 en 21 bevatten geen messages
       
  • De eigenlijke data transfert duurt 7 pakkets:
    • Segmenten 23-24-25 zijn de TCP session setup voor het data-kanaal,
      uitgaande van de SERVER op source port 20 (ftp data)
      die verbindt met destination port 54158 van de CLIENT (zie PORT message 18)
    • message 28 is de transfert zelf van de file timezone
    • segmenten 30-31-32 sluiten de FTP-data-verbinding af met een TCP session tear down
       
  • Tussendoor geeft de SERVER nog feed-back op het interactieve CLI-FTP kanaal:
    • messages 26: 150 opening BIN data connection en
    • message 29: 226 file send ok
       
  • De CLIENT stuurt het QUIT commando (message 33) en
    de SERVER antwoordt met 221 goodbye (message 34)
     
  • Tot slot is er nog een in dit geval minder conventionele session-tear down van het interactieve CLI-FTP kanaal TCP-3-way handshake (segment 35 tot 37)
     

passive mode FTP
 
Om doorheen NAT of een Firewall te gaan, moet het initiatief tot verbinding komen vanaf de CLIENT. Hierboven, in punt 1 hebben we gezien dat de CLIENT een poort doorgeeft aan de SERVER, via de primitive PORT, en dat even later de SERVER het initiatief neemt om die TCP-poort naar de CLIENT te openen voor een DATA-transfert. Een directory opvragen met ls is reeds data-transfert, en bij gebruik van NAT of een stateful firewall werkt zelfs dat niet.
 
Om aan dit probleem tegemoet te komen bestaat FTP passive mode. We gaan hieronder bekijken hoe dit werkt, eerste vanaf de terminal, daarna in wireshark.
 

  • de terminal:
    $ ftp 10.0.100.101
    Connected to 10.0.100.101.
    220 Welcome to linux800 internal FTP service.
     
    Name (10.0.100.101:bert): anonymous
    331 Please specify the password.
    Password:
    230 Login successful.
     
    Remote system type is UNIX.
    Using binary mode to transfer files.
     
    ftp> passive
    Passive mode on.
     
    ftp> get timezone
    local: timezone remote: timezone
    227 Entering Passive Mode (10.0.100.101,100,185)
    150 Opening BINARY mode data connection for timezone (16 bytes).
    226 File send OK.
    16 bytes received in 0.00 secs (34.5 kB/s)
     
    ftp> quit
    221 Goodbye.

     

  • in wireshark (terug vanaf de client / zelfde capture filter):

    passive-ftp

     

  • Tot en met regel 17, (200 switching to binary mode) lopen beide network-captures gelijk.
  • Op (18) zien we deze keer de PASV primitive, waarop de server antwoordt (19) met een poort-nummer: 100,185 -- omgerekend is dit 25785.
  • In (21-23) zien we hoe het 'DATA-kanaal' deze keer geopend wordt door de CLIENT
  • Op (24) volgt nu pas de RETR primitive van de CLIENT en de replies en data transfert vanaf de server (25, 27 en 31)
  • Hierna lopen beide captures weer gelijk.