Probleme de connection ftp active sur port non-standard
-
Bonjour à tous !
J'ai à besoin de vos lumières…
Comme beaucoup de monde, d'après tous les messages que j'ai pu consulter dans les forums, j'ai des soucis dans la mise en place d'un serveur FTP derrière un NAT. N'ayant pas trouvé de solution à mon problème, je me permet de poster ici.
J'ai essayé d'être le plus exhaustif possible. Merci de me lire ;)Config utilisée
serveur ftp : proftpd 1.3.0 sur debian etch
client ftp : filezilla
passerelle du serveur : Alix2c3 (http://www.pcengines.ch/alix2c3.htm) avec pfsense 1.2-RC4
passerelle du client : zyxel prestige 650hwVoici, pour ceux que ça intéresse, la situation (sinon passer directement au problèmes):
Je dois mettre en place un soft sur une dizaine de sites, tous connectés à internet via des modem/routeur adsl (de marques hétérogènes, évidement)…
Ces sites devront se connecter à un serveur FTP luis même connecté derrière une passerelle pfsense.Jusque là, même si ce n'est pas une situation idéale, pas de soucis. Après configuration du port forwarding et du firewall de pfsense, j'arrive faire fonctionner ma connection FTP sur le port 21.
Evidement, puisque c'était trop facile, j'ai appris par la suite que le soft communique sur un port ftp non standard, le 20007 et que je dois rediriger sur pfsense ce port sur celui, standard, du serveur ftp. Bien sûr, le client ftp du soft n'est pas paramètrable et utilise le mode actif.
C'est là que ça se corse...
Rappel de fonctionnement du mode actif :
Le protocole FTP offre 2 modes, le mode actif et le mode passif.
En mode actif, le client appel le serveur sur le port 21 (le port commande ftp). Il va répondre à cet appel, ce qui ne posera pas de problème du côté client. La ou ça pose problème c'est qu'ensuite, c'est le serveur qui va appeler le client (d'où le terme "actif") depuis le port 20 (port de données ftp) vers un port (par défaut) >1024.
Et là, si le client est "masqué" derrière un routeur ou un firewall (ou les 2), la transaction sera rompu.
Donc en mode actif, sans ouvrir et rediriger tous les ports >1024 vers le serveur ftp, est-il possible d'avoir le client et le serveur derrière un NAT??
Je sais que sur les noyaux linux, il y a un module à charger (ip_conntrack) qui permet de "suivre" les transaction ftp et d'une manière qui m'est inconnue, faire fonctionner la chose.
Pfsense étant basé sur bsd (que je maîtrise encore moins que linux) dois avoir un truc similaire à ip_conntrack, puisque, si j'utilise le port 21, ça fonctionne. D'ailleurs, il y a dans le webconfigurator, une option nommée FTP Helper (mais, comme vous verrez plus loin, elle fonctionne pas comme je pensais)…Pour ceux que le fonctionnement de ftp intéresse, ils peuvent consulter ce document, page 10 : http://www.linux.efrei.fr/miel2/datadoc/proftpd/Cours-Proftpd-EFREI-Linux.pdf
Paramètres du firewall :
J'ai suivi le howto http://wiki.pfsense.com/wikka.php?wakka=IncomingFTPHowTo pour configurer pfsense.
Dans les règles suivantes, hSrv02 est un alias vers mon serveur ftp interne.
J'ai donc dans le portforwarding :If |Proto |Ext. port range |NAT IP |Int. port range |Description WAN |TCP/UDP |21 (FTP) |hSrv02 (ext.: any) |21 (FTP) |NAT_21_21
Et dans les firewall rules :
Proto |Source |Port |Destination |Port |Gateway |Description TCP/UDP |* |* |hSrv02 |21(FTP) |* |NAT_21_21 TCP/UDP |* |* |* |21(FTP) |* |NAT_auto_generate
J'ai aussi rajouté les règles suivantes, sur le même model que les précédentes, pour utiliser mon ports non-standard :
portforwarding :If |Proto |Ext. port range |NAT IP |Int. port range |Description WAN |TCP/UDP |20007 |hSrv02 (ext.: any) |21 (FTP) |NAT_20007_21
et Firewall rules :
Proto |Source |Port |Destination |Port |Gateway |Description TCP/UDP |* |* |hSrv02 |20007 |* |NAT_20007_21 TCP/UDP |* |* |* |20007 |* |NAT_auto_generate
De plus, j'ai activé le "ftp helper" en décochant l'option "Disable the userland FTP-Proxy application" de l'interface WAN
Tests
- connexion ftp actif sur le port 21
-> Etat : Connexion à monftp.ch …
-> Erreur : Impossible de se connecter !- connexion ftp actif sur le port 20007
-> (…)
-> Réponse : 230 Connexion reussie pour ftp
-> (...)
-> Réponse : 500 Illegal PORT command
-> Erreur : N'a pas pu récupérer la liste du répertoire1ère constatation :
Impossible de se connecter avec le port standard
Et
Connection ok avec le port non standard, mais impossible de lister le répertoire.2ème constatation :
En désactivant le FTP Helper, et donc en cochant l'option "Disable the userland FTP-Proxy application" de l'interface WAN, j'obtiens le même résultat sur le port non standard (20007), par contre, sur le port standard :Etat : Connexion à monftp.ch …
(...)
Réponse : 230 Connexion reussie pour ftp
(...)
Etat : Connecté
Etat : Récupération de la liste de répertoires...
Commande : PWD
Réponse : 257 "/" is current directory.
Commande : PORT MON.IP.PUBLIC,6,127
Réponse : 200 PORT command successful
Commande : TYPE A
Réponse : 200 Type set to A
Commande : LIST
Réponse : 150 Opening ASCII mode data connection for file list
Réponse : 226 Transfer complete.
Etat : Succès du listage du répertoireLà, contre toutes (mes) attentes, ça marche. Je dois avouer que je comprend pas ce comportement… Quelqu'un pourrait m'expliquer ?
Pour continuer mes investigations, et par curiosité, j'ai modifié les règles du firewall pour que le mode passif fonctionne aussi derrière mon NAT :
Portforwarding:If |Proto |Ext. port range |NAT IP |Int. port range |Description WAN |TCP/UDP |50000 - 50100 |hSrv02 (ext.: any) |50000 - 50100 |NAT_ftp_passif
et Firewall rules :
Proto |Source |Port |Destination |Port |Gateway |Description TCP/UDP |* |* |hSrv02 |50000 - 50100 |* |NAT_ftp_passif
Dans mon fichier de conf de proftpd, j'ai aussi dû ajouter les deux lignes suivantes afin que le mode passif fonctionne, conformément à la doc officielle (http://www.proftpd.org/localsite/Userguide/linked/x862.html), sinon, le client voyait l'adresse ip privé de mon serveur… De plus je désigne les ports que j'ai ouvert à proftpd :
MasqueradeAddress MON.IP.PUBLIC PassivePorts 50000 50100
Tests
- connexion ftp passif sur le port 21
Etat : Connexion à monftp.ch …
Etat : Connecté à monftp.ch. Attente du message d'accueil...
(...)
Réponse : 230 Connexion reussie pour ftp
(...)
Etat : Connecté
Etat : Récupération de la liste de répertoires...
Commande : PWD
Réponse : 257 "/" is current directory.
Commande : PASV
Réponse : 227 Entering Passive Mode (MON.IP.PUBLIC,195,126).
Commande : TYPE A
Réponse : 200 Type set to A
Commande : LIST
Réponse : 150 Opening ASCII mode data connection for file list
Réponse : 226 Transfer complete.
Etat : Succès du listage du répertoire- connexion ftp passif sur le port 20007
Etat : Connexion à monftp.ch:20007 …
Etat : Connecté à monftp.ch:20007. Attente du message d'accueil...
(..)
Réponse : 230 Connexion reussie pour ftp
(...)
Etat : Connecté
Etat : Récupération de la liste de répertoires...
Commande : PWD
Réponse : 257 "/" is current directory.
Commande : PASV
Réponse : 227 Entering Passive Mode (MON.IP.PUBLIC,195,95).
Commande : TYPE A
Réponse : 200 Type set to A
Commande : LIST
Réponse : 150 Opening ASCII mode data connection for file list
Réponse : 226 Transfer complete.
Etat : Succès du listage du répertoireRécap
| actif | passif
–------------------
21 | ok | ok
20007| ko | okBref, malgrès déjà quelques heures de test et analyse, je ne sais plus quoi faire …
Des idées ???