Si comme moi, vous utilisé la couche PF (sous OS BSD) pour protéger votre réseau des attaques extérieures, la problématique de la compatibilité du protocole FTP avec la translation d’adresse NAT devrait se poser à vous.
Nous allons donc dans ce billet voir comment configurer votre Firewall PF comme un proxy FTP efficace.
Un peu de théorie…
Si vous avez déjà eu à coder des règles de Firewall pour le protocole FTP (actif ou passif), vous savez que cela nécessite l’ouverture d’un grand nombre de ports TCP. L’idée développé dans ce billet est de passer par un mandataire (un proxy hébérgé sur votre Firewall écoutant sur le port TCP 8021) qui va effectuer les requêtes FTP à la place de votre client.
Installation de ftp-proxy
ftp-proxy est un daemon fourni en standard avec les OS BSD. Pour le lancer au démarrage du Firewall, il faut ajouter les lignes suivantes à votre fichier /etc/rc.conf:
# FTP Proxy
ftpproxy_enable=”YES”
ftpproxy_flags=”-a @IP-PUBLIQUE“
ou vous allez remplacer @IP-PUBLIQUE par l’adresse IP publique de votre Firewall. Il est possible de changer le port d’écoute par défaut de ftp-proxy en utilisant l’option -.
Pour lancer le daemon:
/etc/rc.d/ftp-proxy start
Configuration de PF pour utiliser ftp-proxy
La première chose est de configurer les règles de NAT et de PAT en utililisant les ancres pré-définies pour ftp-proxy. Pour cela, il faut ajouter les deux lignes suivantes dans la section NAT de votre fichier /etc/pf.conf.
nat-anchor “ftp-proxy/*”
rdr-anchor “ftp-proxy/*”
Nous allons ensuite forcer les paquets TCP de vos clients (venant de votre LAN) ayant comme port de destination 21 à être re-routé vers le daemon ftp-proxy qui écoute sur le port 8021.
rdr pass proto tcp from any to any port 21 -> 127.0.0.1 port 8021
Ensuite, on autorise dans la section règles de votre fichier /etc/pf.conf, les flux FTP partant de votre Firewall.
anchor “ftp-proxy/*”
pass out proto tcp from self to any port 21
Conclusion
Voici donc un moyen simple et efficace de gérer vos connections FTP sortantes. ftp-proxy peut également être utilisé pour gérer les accès entrants vers un serveur FTP hébergé sur votre réseau local. J’y reviendrai certainement dans un prochain billet.