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