[Précédent : Performances] [Index] [Suivant : Authpf : Shell Utilisateur pour les Passerelles d'Authentification]
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>".
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").
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.
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.
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]