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 650hw

    Voici, 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épertoire

    1è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épertoire

    Là, 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épertoire

    Récap
            | actif | passif
    –------------------
    21    | ok    | ok
    20007| ko    | ok

    Bref, malgrès déjà quelques heures de test et analyse, je ne sais plus quoi faire …

    Des idées ???


Locked