[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-feu, 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-feu.

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 en activant des règles pour PF puis en les désactivant lorsque le transfert est terminé à l'aide du système des ancres PF. Le proxy FTP utilisé par PF dans OpenBSD 3.9 et les releases suivantes est ftp-proxy(8). (remarque : les versions précédentes d'OpenBSD utilisaient un proxy différent du même nom qui est documenté dans la page de manuel OpenBSD 3.8 ftp-proxy(8)v3.8).

Pour l'activer, ajustez la ligne suivante selon vos besoins et ajoutez la à la section NAT de pf.conf :

nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 \
   port 8021

Les deux premières lignes sont les ancres utilisées par ftp-proxy afin d'ajouter les règles à chaud afin de gérer votre trafic FTP. La dernière ligne redirige FTP en provenance de vos clients vers le programme ftp-proxy(8) qui écoute sur votre machine au port 8021.

Vous avez également besoin dans vos règles :

anchor "ftp-proxy/*"

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/rc.conf.local :

ftpproxy_flags=""

Le programme ftp-proxy peut être démarré en tant que root afin d'avoir à éviter de redémarrer.

ftp-proxy écoute sur le port 8021, le même port auquel la ligne rdr précédente renvoie le trafic FTP.

Pour activer les connexions actives, vous devez utiliser l'option "-r" de ftp-proxy(8) (avec l'ancien proxy, vous utilisiez l'option "-u root").

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 et ne doit pas bloquer les ports requis. Afin d'accomplir celà, parlons à nouveau de ftp-proxy(8).

ftp-proxy(8) peut-être utilisé dans un mode ou il transmet toutes les connexions FTP à un serveur FTP spécifique. Généralement, on configurera le proxy pour écouter sur le port 21 du firewall et rediriger toutes les connexions sur le serveur applicatif.

Editez /etc/rc.conf.local et ajoutez :

ftpproxy_flags="-R 10.10.10.1 -p 21 -b 192.168.0.1"

Ici, 10.10.10.1 est l'adresse IP du serveur FTP, 21 est le port sur lequel va écouter ftp-proxy(8), et 192.168.0.1 est l'adresse du firewall sur laquelle doit écouter le proxy.

À présent, pour les règles de pf.conf :

ext_ip = "192.168.0.1"
ftp_ip = "10.10.10.1"

nat-anchor "ftp-proxy/*"
nat on $ext_if inet from $int_if -> ($ext_if)
rdr-anchor "ftp-proxy/*"

pass in on $ext_if inet proto tcp to $ext_ip port 21 \
    flags S/SA keep state
pass out on $int_if inet proto tcp to $ftp_ip port 21 \
    user proxy flags S/SA keep state
anchor "ftp-proxy/*"

Ici, nous autorisons la connexion entrante sur le port 21 et l'interface externe ainsi que la connexion sortante vers le serveur FTP. L'ajout de "user proxy" à la règle de sortie permet de s'assurer que seules les connexions initiées par ftp-proxy(8) sont permises.

Il est à noter que si vous désirez que ftp-proxy(8) protège un serveur FTP sans empêcher pour autant les clients de faire du FTP sortant en étant derrière le firewall, deux instances de ftp-proxy seront nécessaires.

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 :

Proxy TFTP

Le protocole Trivial File Transfer Protocol (TFTP) souffre du même genre de limitations que FTP lorsqu'il s'agit de traverser un firewall. Heureusement, PF dispose d'un proxy d'aide pour TFTP appelé tftp-proxy(8).

tftp-proxy(8) est configuré d'une façon similaire à celle de ftp-proxy(8) dans la section Client FTP derrière un pare-feu ci-dessus.

nat on $ext_if from $int_if -> ($ext_if)
rdr-anchor "tftp-proxy/*"
rdr on $int_if proto udp from $int_if to port tftp -> \
    127.0.0.1 port 6969

anchor "tftp-proxy/*"

Les règles ci-dessus autorisent le protocole TFTP en sortie depuis le réseau interne et vers les serveurs TFTP sur le réseau externe.

La dernière étape à considérer est l'activation de tftp-proxy dans inetd.conf(5) afin que ce dernier écoute sur le port indiqué par la règle rdr ci-dessus, en l'occurence 6969.

127.0.0.1:6969 dgram udp wait root /usr/libexec/tftp-proxy tftp-proxy

Contrairement à ftp-proxy(8), tftp-proxy(8) est utilisé via inetd.

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


[back] www@openbsd.org
$OpenBSD: ftp.html,v 1.24 2008/01/13 13:43:34 tobias Exp $