Le protocole FTP
09/02/2005
 Christian CALECA 
Liste des cours

Les bases de FTP

Accueil ] [ Pourquoi FTP ? ] [ Les bases de FTP ] [ Plus avant ] [ Cadeau bonus ]


Le cas le plus "classique"

Un client (utilisateur FTP) va se servir de ce protocole, pour faire du transfert de fichiers (upload ou download) avec un serveur (serveur FTP).

Il existe une multitude de logiciels clients en mode graphique pour réaliser ces opérations. Passons sur les fonctions FTP implémentées dans les navigateurs web (Internet Explorer, Mozilla...), qui ne sont pas toujours très performantes.

Clients Windows

Vous serez probablement surpris de constater le nombre impressionnant de clients FTP disponibles, le plus souvent en "shareware" (Windows oblige). Il en existe cependant au moins un sous licence GPL : Filezilla.

En plus d'être sous licence GPL, ce logiciel est également localisé en français, ce qui ne gâte rien. Je vous le conseille absolument. Voici l'allure de sa fenêtre de travail dans sa version 2.1.3a :

FileZilla

Dans la suite, nous aurons également l'occasion d'utiliser un "shareware" : FlashFXP qui sait faire des choses que FileZilla ne sait réaliser.

Clients GNU/Linux

Ici, le choix est peut-être plus restreint. Le plus abouti (parmi ceux que je connais) est probablement gftp , naturellement sous licence GPL :

gFTP

Autres possibilités

Il existe également des utilitaires FTP en ligne de commande, aussi bien sous Windows que sous Linux. Il sont certainement moins conviviaux, mais pas forcément moins puissants.

Le principe de base

Le client ouvre une session FTP sur un serveur. Il existe une grande quantité de serveurs FTP publics. Un serveur FTP requiert une identification du client. Il existe souvent un compte "anonyme", qui donne accès en lecture seule dans la partie publique du serveur, mais il existe également des parties privées où les clients disposant d'un compte peuvent accéder en écriture sur certains répertoires de l'arborescence. C'est le cas, par exemple, pour les mises à jour de pages web personnelles.

schéma

La première chose que l'on constate, c'est que, contrairement à d'autres protocoles comme HTTP, nous allons ici utiliser deux canaux distincts :

Le client FTP  (partie de droite), par l'intermédiaire de l'interface utilisateur, va cacher les diverses commandes du protocole FTP par des manipulations plus conviviales, en proposant à l'utilisateur une vision des choses similaire à un gestionnaire de fichiers. Avec des clicks et des "glisser/déposer" l'utilisateur exploitera FTP sans en connaître la multitude de commandes. Mais sachez qu'avec beaucoup de courage et de connaissance du protocole, vous pourriez utiliser Telnet pour faire du FTP.

L'autre cas

schéma

Un utilisateur pourra exploiter FTP pour transférer depuis son poste de travail des fichiers d'un serveur distant à un autre serveur distant, sans que les données ne transitent par sa machine, ce qui est fort intéressant si l'on travaille depuis une connexion RTC pour passer des données d'une machine à une autre, ces dernières étant, elles, connectées par des liens à haut débit.

Cependant, cette opération ne sera possible que si les serveurs FTP l'acceptent, ce qui n'est pas souvent le cas, pour des raisons de sécurité.

Après avoir longuement tourné autour du pot (et avoir relu plusieurs fois la RFC 959), j'ai finalement pensé que le meilleur moyen pour comprendre FTP n'était certainement pas la lecture de cette RFC mais plutôt l'expérimentation. Nous allons donc mettre en oeuvre FTP, voir comment ça se passe et vérifier seulement après que c'est bien conforme à ce qui est dit dans les Livres.

Les manipulations sont faites depuis un poste client Windows connecté à un LAN, lui-même connecté à l'Internet par une passerelle NAT GNU/Linux. Un sniffeur est placé sur le poste Windows lui-même, il aurait pu l'être sur la passerelle.

Modes Actif et Passif

Il faut bien prendre le problème par un bout pour le décortiquer, même si pour l'instant, nous ne savons rien, ou pas grand chose, de FTP. Nous sommes donc obligé de faire appel à un paramétrage du client, sans trop savoir pourquoi on va le faire comme ça. Rassurez-vous, nous y reviendrons par la suite.

Le protocole FTP supporte deux manières de fonctionner, à peine différentes, mais la différence est d'importance, surtout lorsque l'on a à traverser un firewall par filtrage de paquets. Ce sont :

Pour l'instant, contentons-nous de dire que si l'on doit passer un firewall, il vaut mieux utiliser le mode passif, car le mode actif risque de se solder rapidement par un échec. Ceci dit, mon firewall à moi que j'ai fait moi-même avec IPtables, il sait parfaitement reconnaître du FTP actif. Nous allons donc commencer par ce mode là, qui est la configuration par défaut de Filezilla. 

Nous allons nous connecter au serveur ftp.oleane.fr, parcourir son arborescence,  et télécharger un fichier quelconque, par exemple /pub/doc/rfc/rfc765.txt, puis qu'on en parle. Cette RFC est rendue obsolète par la RFC 959, mais ça peut servir de début...

Ce que montre le sniffeur

Avertissement

L'étude qui va suivre est assez longue, voire laborieuse. Munissez-vous de temps, de friandises et de boissons, parce qu'on va rester coincé ici pendant un petit moment...

Pour vous éviter de faire plusieurs aller-retours sur la page, j'ai essayé d'organier cette étude de façon la plus linéaire possible, c'est ce qui rend ce paragraphe très long. Vous êtes prêts ? Allons-y.

Etablissement de la connexion pour les commandes 

No. Time     Source        Destination  Protocol Info
  1 0.000000 192.168.0.10  194.2.0.36   TCP      1175 > ftp [SYN]
  2 0.022327 194.2.0.36    192.168.0.10 TCP      ftp > 1175 [SYN, ACK]
  3 0.022356 192.168.0.10  194.2.0.36   TCP      1175 > ftp [ACK]

Etablissement d'une connexion TCP entre le client (192.168.0.10:1175) et le serveur (192.2.0.36:21). Le port 21 est le port standard d'écoute des commandes FTP. Nous trouvons ici le classique dialogue [SYN], [SYN,ACK], [ACK]. Etait-il nécessaire de le signaler ? FTP s'appuie bien entendu sur un mode connecté (TCP).

Pour savoir que le port nommé "ftp" est bien le port 21, il suffit d'aller regarder dans le détail de la trame 1 par exemple :

Frame 1 (62 bytes on wire, 62 bytes captured)
    ...
    Transmission Control Protocol, Src Port: 1175 (1175), Dst Port: ftp (21)
    Source port: 1175 (1175)
    Destination port: ftp (21)
    ...

Mais passons à la suite...

  4 0.055680 194.2.0.36    192.168.0.10 FTP      Response: 220 ProFTPD 1.2.0pre10 Server (ProFTPD)
                                                           [ftp.oleane.net]

Le serveur entame le dialogue propre au protocole FTP en se présentant. Chaque réponse commence par un nombre, optionnellement suivi d'un commentaire. La réponse 220 signifie : "Service disponible pour nouvel utilisateur".
Vous aurez l'occasion de constater dans la suite à quel point les systèmes informatiques savent être civilisés (souvent plus que les humains). Le serveur se présente, par la même occasion.

  5 0.057744 192.168.0.10  194.2.0.36   FTP      Request: USER anonymous

Le client se présente aussi en indiquant son nom. Comme nous avons fait un accès anonyme, nous utilisons le nom conventionnel "anonymous". Nous n'aurons droit qu'à un accès en lecture. Si nous avions disposé d'un compte d'utilisateur, nous aurions un identifiant personnel (nom d'utilisateur et mot de passe) qui nous permettrait éventuellement de disposer d'un droit d'accès en écriture dans un répertoire de l'arborescence.

  6 0.078527 194.2.0.36    192.168.0.10 TCP      ftp > 1175 [ACK]
  7 0.081892 194.2.0.36    192.168.0.10 FTP      Response: 331 Anonymous login ok, send your complete
                                                          e-mail address as password.

Le serveur accepte les accès anonymes. Ce n'est pas une obligation, certains serveurs ne le font pas. En général, en accès anonyme, on envoie son adresse e-mail comme mot de passe, mais tout ce qui a vaguement une forme d'adresse e-mail est généralement accepté.

  8 0.084076 192.168.0.10  194.2.0.36   FTP      Request: PASS anon@

La preuve, Filezilla envoie un laconique " anon@ " et ça va fonctionner quand même...
PASS est une commande FTP, c'est l'abréviation de Password.

  9 0.108851 194.2.0.36    192.168.0.10 FTP      Response: 230-Welcome, archive user 
                                                           anonymous@ca-marseille-51-107.abo.wanadoo.fr!
 10 0.109282 194.2.0.36    192.168.0.10 FTP      Response: 230-

La preuve... La réponse 230 veut dire : "Session ouverte"

Remarque.
J'ai travaillé comme un cochon, à savoir que dans mon client Filezilla, je n'ai pas renseigné les champs "Utilisateur" ni "Mot de passe". Connaissant les usages, j'aurais pu les remplir en mettant "anonymous" dans "Utilisateur" et "christian.caleca@free.fr" dans "Mot de passe". Ca aurait fonctionné aussi, mais l'expérience montre que dans la plupart des cas, le serveur se moque complètement du mot de passe envoyé pour une connexion anonyme.
 11 0.109313 192.168.0.10  194.2.0.36   TCP      1175 > ftp [ACK]
 12 0.109914 194.2.0.36    192.168.0.10 FTP      Response: 230-The local time is: 
                                                           Sat Jan 11 10:32:57 2003
 13 0.110341 194.2.0.36    192.168.0.10 FTP      Response: 230-
 14 0.110365 192.168.0.10  194.2.0.36   TCP      1175 > ftp [ACK]
 15 0.131452 194.2.0.36    192.168.0.10 FTP      Response: 230-For informations about 
                                                           this archive service,
                                                           or to report problems,

Le serveur nous donne son heure locale, qui peut être utile si l'on devait signaler un problème à l'administrateur du service.

 16 0.141903 192.168.0.10  194.2.0.36   FTP      Request: PWD

Le client envoie la commande PWD qui signifie : "Print Working Directory"

 17 0.172747 194.2.0.36    192.168.0.10 FTP      Response: 257 "/" is current directory.

Nous sommes à la racine de l'arborescence du serveur FTP. Le code 257 signifie "Chemin créé".

Où en sommes-nous ?

Nous avons initié une connexion FTP avec le serveur. Nous nous sommes identifié comme un utilisateur anonyme et nous nous retrouvons dans la racine de l'arborescence du serveur FTP.
Nous avons vu quelques commandes FTP : USER, PASS, CWD et quelques codes de réponse. Jusqu'ici, c'était relativement simple, nous n'avons transmis que des commandes et des réponses à ces commandes. Maintenant, ça va commencer à se compliquer, parce que nous allons faire aussi transiter des données.

 18 0.176308 192.168.0.10  194.2.0.36   FTP      Request: PORT 192,168,0,10,4,152

Première commande curieuse : PORT 192.168.0.10,4,152, qui nécessite quelques explications.

La suite va nous indiquer plus clairement à qui va servir ce port.

 19 0.198149 194.2.0.36    192.168.0.10 FTP      Response: 200 PORT command successful.

Le serveur répond qu'il est d'accord. 200 signifie : "Commande conclue".

 20 0.200751 192.168.0.10  194.2.0.36   FTP      Request: TYPE A

La commande TYPE indique au serveur quel type de données sont attendues. Le type A signale que l'on attend du texte ASCII.

 21 0.223387 194.2.0.36    192.168.0.10 FTP      Response: 200 Type set to A.

Le serveur est toujours d'accord.

 22 0.225874 192.168.0.10  194.2.0.36   FTP      Request: LIST

La commande LIST qui signifie que le client attend la liste des objets présents dans le répertoire courant (l'équivalent de la commande DIR de MSDOS ou ls de UNIX).

Attention !!!
Ce qu'il va se passer maintenant réclame beaucoup d'attention. Rappelons-nous :

 23 0.247769 194.2.0.36    192.168.0.10 TCP      ftp-data > 1176 [SYN]
 24 0.247826 192.168.0.10  194.2.0.36   TCP      1176 > ftp-data [SYN, ACK]
 25 0.264940 194.2.0.36    192.168.0.10 TCP      ftp > 1175 [ACK]
 26 0.267461 194.2.0.36    192.168.0.10 TCP      ftp-data > 1176 [ACK]

Le serveur FTP initie une nouvelle connexion FTP (trames 23,24 et 26). Mais vous avez bien vu, c'est le serveur qui initie la connexion, autrement dit, il agit comme un client TCP, et c'est le client FTP qui va agir comme un serveur TCP, c'est à dire qu'il va rester à l'écoute de son port 1176. Cette particularité est due au mode actif. Le client FTP est actif, parce qu'ici, ce sera lui le serveur (au sens TCP). 

Résumons nous

A ce stade, nous avons deux connexions TCP ouvertes :

 27 0.299444 194.2.0.36    192.168.0.10 FTP      Response: 150 Opening ASCII mode data 
                                                            connection for file list.

Le serveur FTP répond 150, c'est à dire : "Statut de fichier vérifié, ouverture de canal de données en cours".

 28 0.303502 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 75 bytes
 29 0.305993 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 699 bytes
 30 0.306052 192.168.0.10  194.2.0.36   TCP      1176 > ftp-data [ACK]
 31 0.306101 194.2.0.36    192.168.0.10 FTP      Response: 226-Transfer complete.

Normalement, c'est bien le catalogue de la racine du serveur FTP qui a été envoyée vers le client FTP. Nous pouvons le vérifier en regardant par exemple les données contenues dans la trame 29. Ce n'est pas très lisible, mais c'est bien ça. Je vous demande de me croire sur parole, inutile de charger encore d'avantage cette page déjà lourde. :

La réponse 226 signifie : "Fermeture du canal de données. Service terminé".

 32 0.306117 192.168.0.10  194.2.0.36   TCP      1175 > ftp [ACK]
 33 0.306470 194.2.0.36    192.168.0.10 FTP      Response: 226 Quotas off
 34 0.307484 192.168.0.10  194.2.0.36   TCP      1176 > ftp-data [FIN, ACK]
 35 0.338378 194.2.0.36    192.168.0.10 TCP      ftp-data > 1176 [ACK]

Comme c'était prévu, 192.168.0.10:1176 met fin à la connexion TCP qui a servi de support au canal de données. C'est le client FTP qui met fin à cette connexion.

 36 0.457543 192.168.0.10  194.2.0.36   TCP      1175 > ftp [ACK]
 37 2.447889 192.168.0.10  194.2.0.36   FTP      Request: CWD pub

Nous somme de nouveau sur le canal de commandes et le client FTP demande à changer de répertoire. CWD voulant dire : "Change Working Directory". Nous allons dans le répertoire "pub". Ce qui va maintenant suivre va ressembler à ce que nous venons de voir. Je vous laisse la totalité des trames pour deux raisons :

 38 2.471233 194.2.0.36    192.168.0.10 FTP      Response: 250 CWD command successful.
 39 2.473782 192.168.0.10  194.2.0.36   FTP      Request: PWD
 40 2.499085 194.2.0.36    192.168.0.10 FTP      Response: 257 "/pub" is current directory.
 41 2.502415 192.168.0.10  194.2.0.36   FTP      Request: PORT 192,168,0,10,4,153
 42 2.524624 194.2.0.36    192.168.0.10 FTP      Response: 200 PORT command successful.
 43 2.527863 192.168.0.10  194.2.0.36   FTP      Request: TYPE A
 44 2.549182 194.2.0.36    192.168.0.10 FTP      Response: 200 Type set to A.
 45 2.551642 192.168.0.10  194.2.0.36   FTP      Request: LIST
 46 2.572805 194.2.0.36    192.168.0.10 TCP      ftp-data > 1177 [SYN]
 47 2.572856 192.168.0.10  194.2.0.36   TCP      1177 > ftp-data [SYN, ACK]
 48 2.585185 194.2.0.36    192.168.0.10 TCP      ftp > 1175 [ACK]
 49 2.593535 194.2.0.36    192.168.0.10 TCP      ftp-data > 1177 [ACK]

Selon le même mécanisme que celui vu plus haut, un nouveau canal de données est ouvert, mais le client FTP utilise un nouveau port : 1177, cette fois-ci. C'est ce détail qui a son importance...

En effet, dans le cas où nous avons beaucoup de fichiers à transférer, nous allons utiliser beaucoup de ports succesivement. Pour calculer des firewalls qui ne sont pas "statefull", ça ne simplifie pas les choses.

 50 2.595535 194.2.0.36    192.168.0.10 FTP      Response: 150 Opening ASCII mode data 
                                                           connection for file list.
 51 2.625058 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 59 bytes
 52 2.627332 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 718 bytes
 53 2.627375 192.168.0.10  194.2.0.36   TCP      1177 > ftp-data [ACK]
 54 2.629615 194.2.0.36    192.168.0.10 FTP      Response: 226-Transfer complete.
 55 2.629654 192.168.0.10  194.2.0.36   TCP      1175 > ftp [ACK]
 56 2.630203 194.2.0.36    192.168.0.10 FTP      Response: 226 Quotas off
 57 2.652599 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 1229 bytes
 58 2.652668 192.168.0.10  194.2.0.36   TCP      1177 > ftp-data [ACK]
 59 2.654073 192.168.0.10  194.2.0.36   TCP      1177 > ftp-data [FIN, ACK]
 60 2.700163 194.2.0.36    192.168.0.10 TCP      ftp-data > 1177 [ACK]

Bien, nous n'allons pas poursuivre plus longtemps le cheminement dans les sous répertoires, d'autant qu'à chaque niveau, le catalogue devient de plus en plus volumineux.

 87 11.063406   192.168.0.10          194.2.0.36            FTP      Request: CWD rfc
...
 95 11.177496   192.168.0.10          194.2.0.36            FTP      Request: LIST
...

Et un grand saut plus loin :

413 29.719734 192.168.0.10  194.2.0.36   FTP      Request: PWD
414 29.741101 194.2.0.36    192.168.0.10 FTP      Response: 257 "/pub/doc/rfc" 
                                                            is current directory.

Nous arrivons enfin dans le bon répertoire...

415 29.912570 192.168.0.10  194.2.0.36   TCP      1180 > ftp [ACK]
416 30.584219 192.168.0.10  194.2.0.36   FTP      Request: TYPE A
417 30.605939 194.2.0.36    192.168.0.10 FTP      Response: 200 Type set to A.
418 30.609380 192.168.0.10  194.2.0.36   FTP      Request: PORT 192,168,0,10,4,157
419 30.635498 194.2.0.36    192.168.0.10 FTP      Response: 200 PORT command successful.
420 30.639387 192.168.0.10  194.2.0.36   FTP      Request: RETR rfc765.txt
421 30.660814 194.2.0.36    192.168.0.10 TCP      ftp-data > 1181 [SYN]
422 30.660867 192.168.0.10  194.2.0.36   TCP      1181 > ftp-data [SYN, ACK]
423 30.676003 194.2.0.36    192.168.0.10 TCP      ftp > 1180 [ACK]
424 30.683263 194.2.0.36    192.168.0.10 TCP      ftp-data > 1181 [ACK]
425 30.684698 194.2.0.36    192.168.0.10 FTP      Response: 150 Opening ASCII mode data 
                                                            connection for rfc765.txt (146641 bytes).
426 30.685450 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 2 bytes
427 30.687400 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 716 bytes

Nous ouvrons encore un nouveau canal de données, nous en sommes maintenant au port 1181, données de type A toujours (ASCII) et utilisons la commande RETR (Retrieve) pour transférer le fichier rfc765.txt depuis le serveur FTP vers le client FTP.

Certains lecteurs à l'oeil acéré auront remarqué que le port utilisé par le client FTP sur le canal de commande a changé depuis le début de la session. Pour une raison parasite, il y a eu une re connexion au serveur à la fin de la transmission du catalogue de /pub/doc/rfc, re connexion qui a entraîné l'ouverture d'un nouveau canal de commande, sans que le précédent ne soit fermé.

428 30.687446 192.168.0.10  194.2.0.36   TCP      1181 > ftp-data [ACK]
429 30.710881 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 1400 bytes
430 30.712372 194.2.0.36    192.168.0.10 FTP-DATA FTP Data: 1400 bytes
431 30.712414 192.168.0.10  194.2.0.36   TCP      1181 > ftp-data [ACK]
...

Les données commencent à venir, il y en a pour un moment. Nous nous retrouvons à la fin du fichier :

614 33.613493 192.168.0.10  194.2.0.36   TCP      1181 > ftp-data [FIN, ACK]
615 33.636771 194.2.0.36    192.168.0.10 TCP      ftp-data > 1181 [ACK]

Voilà, c'est fini. nous arrêtons la transaction avec le serveur FTP :

616 36.666211 192.168.0.10  194.2.0.36   TCP      1175 > ftp [FIN, ACK]
617 36.686973 194.2.0.36    192.168.0.10 TCP      ftp > 1175 [ACK]
618 36.689259 194.2.0.36    192.168.0.10 TCP      ftp > 1175 [FIN, ACK]
619 36.689275 192.168.0.10  194.2.0.36   TCP      1175 > ftp [ACK]
620 38.511841 192.168.0.10  194.2.0.36   TCP      1180 > ftp [FIN, ACK]
621 38.530529 194.2.0.36    192.168.0.10 TCP      ftp > 1180 [ACK]
622 38.533514 194.2.0.36    192.168.0.10 TCP      ftp > 1180 [FIN, ACK]
623 38.533552 192.168.0.10  194.2.0.36   TCP      1180 > ftp [ACK]

Toutes les connexions TCP encore ouvertes sont fermées, y compris le canal de commande initialement ouvert (port 1175).

Qu'avons-nous appris ?

Déjà beaucoup de choses :

Bien qu'à ce niveau, si vous avez réussi à suivre ces explications, vous pouvez commencer à lire cette fameuse rfc 765 avec quelques chances d'y comprendre quelque chose, vous sentez bien, n'est-ce pas, qu'il y aurait encore quelques manipulations intéressantes à faire...

Rassurez-vous, nous allons les faire dans la suite.


Précédente ] [ Accueil ] [ Suivante ]