[OpenBSD]

[Précédent : Performances] [Index] [Suivant : Authpf : Shell Utilisateur pour les Passerelles d'Authentification]

PF: Gestion du Protocole FTP


Table des Matières


Modes FTP

FTP est un protocole qui date d'une époque où Internet était un petit ensemble de machines avec des relations de confiance mutuelle et où tout le monde connaissait tout le monde. A cette époque le besoin de filtrer ou d'assurer une sécurité stricte était inexistant. FTP n'était pas conçu pour filtrer, pour faire transiter du trafic à travers les pare-feux, ou pour fonctionner avec la NAT.

FTP peut fonctionner dans deux modes : passif et actif. De manière générale, le choix du mode actif ou passif consiste à déterminer l'extrêmité de communication FTP qui a un problème avec le filtrage pare-feu. Dans le meilleur des mondes, il faudrait supporter les deux modes pour rendre vos utilisateurs heureux.

Dans le mode FTP actif, quand un utilisateur se connecte à un serveur FTP distant et demande une information ou un fichier, le serveur FTP effectue une connexion vers le client pour transférer les données demandées. Cette connexion est appelée la connexion de données. Pour commencer, le client FTP choisit un port aléatoire qui lui servira pour recevoir les données. Le client envoie le numéro de port qu'il a choisi au serveur FTP puis se met à l'écoute des connexions entrantes à destination de ce port. Le serveur FTP initie ensuite une connexion vers l'adresse du client sur le port choisi et transfère les données. Ce mode de fonctionnement est problématique pour les utilisateurs essayant d'accéder à des serveurs FTP lorsqu'ils sont derrière une passerelle NAT. Vu la manière dont fonctionne la NAT, le serveur FTP initie la connexion de données en se connectant à l'adresse externe de la passerelle NAT sur le port choisi. La passerelle NAT n'a pas de correspondance pour le paquet reçu dans sa table d'état. Le paquet sera ignoré et ne sera pas délivré au client.

Dans le mode FTP passif (le mode par défaut utilisé par le client ftp(1) d'OpenBSD), le client demande au serveur de choisir un port aléatoire sur lequel ce dernier se mettra à l'écoute en attente de la connexion de données. Le serveur communique au client le port qu'il a choisi pour le transfert des données. Malheureusement, ce n'est pas toujours possible ou souhaitable à cause de la possibilité d'existence d'un pare-feu devant le serveur FTP qui bloquerait les connexions de données en entrée. Le client ftp(1) d'OpenBSD utilise le mode passif par défaut; pour forcer le mode FTP actif, utilisez le drapeau -A du client ftp(1). Il est aussi possible de désactiver le mode passif (et donc d'activer par cette action le mode actif) en utilisant la commande "passive off" à l'invite de commandes "ftp>".

Client FTP derrière un pare-feu

Comme précédemment indiqué, FTP ne fonctionne pas très bien à travers des mécanismes de NAT et des pare-feux.

Packet Filter fournit une solution à ce cas en redirigeant le trafic FTP à travers un serveur mandataire FTP (proxy). Ce processus agit de telle façon à "guider" votre trafic FTP à travers la passerelle NAT/pare-feu. Le mandataire FTP utilisé par OpenBSD et PF est ftp-proxy(8). Pour l'activer, ajustez la ligne suivante selon vos besoins et ajoutez la à la section NAT de pf.conf :

rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
   port 8021

Voici l'explication de cette ligne : "Le trafic entrant sur l'interface interne est redirigé vers le serveur mandataire sur cette machine et écoutant sur le port 8021".

Il est évident que le serveur mandataire doit être démarré et exécuté sur la machine OpenBSD. Ceci peut être effectué en insérant la ligne suivante dans /etc/inetd.conf :

127.0.0.1:8021 stream tcp nowait root /usr/libexec/ftp-proxy \
   ftp-proxy

Il faut ensuite redémarrer le système ou envoyer le signal 'HUP' à inetd(8). Une manière d'envoyer le signal 'HUP' consiste à utiliser la commande suivante :

kill -HUP `cat /var/run/inetd.pid`

Notez que ftp-proxy écoute sur le serveur 8031, le même port qui est utilisé dans la ligne rdr. Le choix du port 8021 est arbitraire, bien que 8021 est un bon choix vu qu'il n'est utilisé par aucune autre application.

Veuillez noter que ftp-proxy(8) est utilisé pour aider les clients FTP derrière un pare-feu PF; il n'est pas utilisé pour prendre en charge un serveur FTP derrière un tel pare-feu.

Serveur FTP protégé par un pare-feu PF local

Dans ce cas, PF est activé sur le serveur FTP lui-même plutôt que sur un pare-feu dédié. Pour les besoins d'une connexion FTP passive, FTP utilisera un haut port TCP choisi de manière aléatoire pour les données entrantes. Par défaut, le serveur FTP natif d'OpenBSD ftpd(8) utilise la plage 49152 à 65535. Ces ports doivent être autorisés en entrée ainsi que le port 21 (le port de contrôle FTP) :
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

Si vous le souhaitez, vous pouvez restreindre cette plage considérablement. Dans le cas du programme ftpd(8) d'OpenBSD, ceci peut être effectué en utilisant les variables sysctl(8) net.inet.ip.porthifirst et net.inet.ip.porthilast.

Serveur FTP protégé par un pare-feu PF externe avec NAT

Dans ce cas, le pare-feu doit rediriger tout le trafic vers le serveur FTP. De plus, il ne doit bloquer aucun des ports requis. Pour fournir un exemple concret, on supposera encore une fois que le serveur FTP est le serveur standard sous OpenBSD : ftpd(8), utilisant la plage de ports par défaut.

Voici un exemple de règles qui pourraient être utilisées dans ce cas de figure :

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

Plus d'Informations sur FTP

Vous pouvez obtenir plus d'informations concernant le filtrage et le fonctionnement de FTP de manière générale dans le livre blanc suivant :

[Précédent : Performances] [Index] [Suivant : Authpf : Shell Utilisateur pour les Passerelles d'Authentification]


[back] www@openbsd.org
Originally [OpenBSD: ftp.html,v 1.12 ]
$Translation: ftp.html,v 1.4 2004/02/19 20:31:29 saad Exp $
$OpenBSD: ftp.html,v 1.4 2004/02/20 06:33:11 jufi Exp $