[FTP] Problème de connexion sur un port non-standard + nat

Problème de connexion sur un port non-standard + nat [FTP] - réseaux et sécurité - Linux et OS Alternatifs

Marsh Posté le 17-03-2008 à 15:23:13    

Bonjour à tous !

 


J'ai à nouveau 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/da [...] -Linux.pdf

 

Paramètres du firewall :
J'ai suivi le howto http://wiki.pfsense.com/wikka.php? [...] ngFTPHowTo pour configurer pfsense.
Dans les règles suivantes, hSrv02 est un alias vers mon serveur ftp interne.
J'ai donc dans le portforwarding :

Code :
  1. If  |Proto   |Ext. port range |NAT IP             |Int. port range |Description
  2. WAN |TCP/UDP |21 (FTP)        |hSrv02 (ext.: any) |21 (FTP)        |NAT_21_21


Et dans les firewall rules :

Code :
  1. Proto   |Source |Port |Destination |Port    |Gateway |Description
  2. TCP/UDP |*      |*    |hSrv02      |21(FTP) |*       |NAT_21_21 
  3. 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 :

Code :
  1. If  |Proto   |Ext. port range |NAT IP             |Int. port range |Description
  2. WAN |TCP/UDP |20007           |hSrv02 (ext.: any) |21 (FTP)        |NAT_20007_21
 

et Firewall rules :

Code :
  1. Proto   |Source |Port |Destination |Port    |Gateway |Description
  2. TCP/UDP |*      |*    |hSrv02      |20007   |*       |NAT_20007_21
  3. 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

Citation :


-> Etat : Connexion à monftp.ch ...
-> Erreur : Impossible de se connecter !


- connexion ftp actif sur le port 20007

Citation :


-> (...)
-> 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 CLIENT.PRIVATE.IP,9,70
-> 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 :

Citation :


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 SERVER.PUBLIC.IP,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:

Code :
  1. If  |Proto   |Ext. port range |NAT IP             |Int. port range      |Description
  2. WAN |TCP/UDP |50000 - 50100   |hSrv02 (ext.: any) |50000 - 50100        |NAT_ftp_passif
 

et Firewall rules :

Code :
  1. Proto   |Source |Port |Destination |Port            |Gateway |Description
  2. 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 :

Code :
  1. MasqueradeAddress MON.IP.PUBLIC
  2. PassivePorts 50000 50100
 

Tests
- connexion ftp passif sur le port 21

Citation :


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 (SERVER.PUBLIC.IP,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

Citation :


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 (SERVER.PUBLIC.IP,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 ???


Message édité par helvetik le 17-03-2008 à 16:02:10

---------------
---helvetik---
Reply

Marsh Posté le 17-03-2008 à 15:23:13   

Reply

Marsh Posté le 17-03-2008 à 15:52:13    

tu as une option à rajouter quand tu rajoutes les modules pour le conntrack du ftp pour indiquer sur quel port passe les commandes FTP.
 
je me rappelle plus la synthaxe exacte mais une bref recherche devrait te donner la réponse


---------------
Relax. Take a deep breath !
Reply

Marsh Posté le 17-03-2008 à 16:04:36    

Je vais me renseigner. Donc tu confirme que le module ftp pour bsd s'appel aussi ftp_conntrack?


---------------
---helvetik---
Reply

Marsh Posté le 17-03-2008 à 16:12:06    

J'ai fait quelques recherche. Apparement, il existe un équivalent à ftp_conntrack sur *bsd : ftp-proxy
 
Je vais faire des recherches là-dessus...


---------------
---helvetik---
Reply

Marsh Posté le 17-03-2008 à 16:33:32    

Désolé j'avais pas vu que c'était un bsd [:whatde]


---------------
Relax. Take a deep breath !
Reply

Marsh Posté le 17-03-2008 à 22:02:48    

Pourquoi est ce que tu ne te contentes pas de rediriger le port 20007 vers le 20007,
et tu dis à Proftpd d'écouter sur ce port là au lieu du 21 ?

 

edit - Parce que là forwarder 2 ports distincts (21 et 20007) sur le 21 ça me fait bizarre...


Message édité par Profil supprimé le 17-03-2008 à 22:04:30
Reply

Marsh Posté le 18-03-2008 à 08:10:27    

Je fais ça car j'ai pris l'habitude de garder les ports standards dans le LAN et surtout ça m'évite de savoir où changer ce port pour chacun de mes services (tse, mysql, pcanywhere, etc...)

 

Je précise que, sauf pour le ftp, ça fonctionne très bien...

 

Je vais quand même tester de modifier le port du serveur ftp. Je pourrais faire une exception...


Message édité par helvetik le 18-03-2008 à 09:40:59

---------------
---helvetik---
Reply

Marsh Posté le 18-03-2008 à 09:48:06    

j'ai donc modifier mes rèlges nat de cette manière :

Code :
  1. If  |Proto   |Ext. port range |NAT IP             |Int. port range |Description
  2. WAN |TCP/UDP |20007           |hSrv02 (ext.: any) |20007           |NAT_20007_21
 

Malheureusement, ça ne passe toujours pas. J'ai droit à ce message après l'autentification:

Citation :

Réponse : 500 Illegal PORT command
Erreur : N'a pas pu récupérer la liste du répertoire


Message édité par helvetik le 18-03-2008 à 09:50:00

---------------
---helvetik---
Reply

Marsh Posté le 20-03-2008 à 11:40:56    

Je suis tombé sur cette doc, sur le wiki des developpeurs de pfsense :
http://devwiki.pfsense.org/FTPTroubleShooting
C'est assez intéressant, surtout le dernier point :
Oh no, the above doesn't help. What can I do?

 

1. Use SCP/SFTP which only needs 1 port to traverse the firewall since its wrapped in SSH (yes a safe AND simple way of traversing a firewall!)
2. Don't use FTP
3. Turn off the FTP helper option in Interfaces -> LAN and Interfaces ->WAN or any optional interfaces in use.
4. Switch to an alternative firewalling system

[:bap2703]


Message édité par helvetik le 20-03-2008 à 11:43:31

---------------
---helvetik---
Reply

Marsh Posté le 04-12-2009 à 11:19:05    

J'ai désactivé le FTP-Proxy pour WAN et LAN et ça marche nickel :)
 
Attention, faire les tests de connexion d'un poste extérieur au VLAN et ne pas entrer une adresse WAN à partir de son poste LAN ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed