IP Privé vue depuis Internet

Bonjour,

J’ai une application VB.Net qui dépose un fichier sur mon serveur FTP (utilisation de la classe System.Net.FtpWebRequest du FrameWork 3.5). Ce serveur FTP est “proftpd 1.3.0” hébergé sur une machine Linux Debian Etch (Linux Serveur-00 2.6.18-4-486 #1 Wed May 9 22:23:40 UTC 2007 i686 GNU/Linux).

Dans le cadre d’un réseau local, tout se passe correctement. L’application VB.Net se connecte au serveur FTP puis dépose le fichier. Malheureusement, cela se complique lors de l’utilisation de l’adresse Internet de mon serveur FTP. L’application VB.Net retourne le message “La connexion de données a été effectuée à partir d’une adresse qui est différente de l’adresse de la connexion FTP.”

Mon serveur FTP est ouvert sur Internet par l’intermédiaire d’une FreeBox configurée en mode routeur et NAT. Avec un client FTP (WinSCP), il n’y a pas de problème pour se connecter à mon serveur FTP depuis Internet. Cependant, en attaquant par “telnet” mon serveur FTP Internet et en y effectuant quelques commandes, je me suis aperçu que le serveur FTP retournait mon adresse IP privé et non mon adresse IP Public. Cela semble correspondre à l’exception remonté par l’application VB.Net!

Comment peut-on forcer l’adresse IP Privé à être remplacée par l’adresse IP Public ?
J’ai essayé des choses avec “#iptables -t nat -A POSTROUTING -j MASQUERADE” mais cela n’a rien donné. L’adresse IP Privé est toujours renvoyée et non l’IP Public.

Je suis preneur de toutes idées et solutions.
Merci pour votre collaboration.

A Noste Kêe,
Richard.

À vue de nez c’est plutôt un problème de configuration du serveur, pas un problème de routage. Ce dernier se passe bien, c’est juste le serveur qui n’est pas au courant et choppe son IP sur l’interface réseau.
C’est quoi comme serveur?

@ fran.b

@ KiteAtao

  1. A la base WinSCP utilise plutôt le protocole SSH pour faire du transfert de fichiers, qui ne souffre pas du problème de NAT des connexions de données du protocole FTP. Tu es sûr qu’il a utilisé le protocole FTP ? Peux-tu fournir le contenu de la connexion avec telnet (en masquant les données confidentielles) ?

  2. C’est normal que le serveur annonce son adresse privée (en fait sa seule adresse propre, si on excepte l’adresse de loopback) en mode passif. C’est normalement le NAT du routeur qui connaît l’adresse publique et s’occupe de transformer l’adresse dans la réponse à la commande PASV. Le firmware de la Freebox est basé sur un noyau Linux, dont les modules de suivi de connexion et de NAT pour le protocole FTP devraient savoir faire cette translation. A condition d’utiliser le port FTP par défaut, 21, pour la connexion de commande FTP.

  3. Si le NAT du routeur ne le fait pas, alors il y a deux solutions :

  • côté client, utiliser le mode actif ou le mode passif étendu (EPSV) où le serveur n’annonce pas son adresse pour les connexions de données, celle-ci étant supposée être la même que celle de la connexion de commande ;
  • côté serveur, forcer celui-ci à annoncer l’adresse publique (chercher une option du genre “passive address”, j’ai la flemme de chercher) et définir aussi avec l’option qui va bien une plage de ports passifs que le routeur doit rediriger vers le serveur.

En tout cas faire du masquerading sur le serveur lui-même ne sert à rien puisqu’il n’a qu’une adresse privée.

Bon, il me semble que pour proftp, l’adresse peut se préciser en dur par une directive

<VirtualHost TON_IP_PUBLIQUE> [la config] </VirtualHost>

Je ne crois pas que la directive “VirtualHost” serve à ça mais plutôt à définir plusieurs “sites” sur un même serveur, comme pour Apache. Apparemment c’est plutôt la directive “MasqueradeAddress”, et PassivePorts pour la définition des ports.
http://www.proftpd.org/docs/directives/linked/by-name.html

Hum, tu dois avoir raison, le nom de la directive m’a paru curieux aussi mais le texte où j’ai lu ça (un fil sur un forum) semblait indiqué que ça avait résolu le pbm. Je n’ai pas réussi à trouver ta page mais la directive que tu donnes est nettement plus crédible.

“Ma page” ?

Dans la configuration de mon serveur FTP (proftpd), j’ai rajouté dans la section “VirtualHost” du serveur FTP Internet les parametres ci-dessous:

MasqueradeAddress urlSiteFTP ou urlSiteFTP est remplacé par l’URL d’acces à mon serveur FTP Internet (ex: ftp.monDomaine.fr)

J’ai ensuite ouvert la page de port 65500 à 65534 dans la configuration de ma FreeBox.

Mon application VB.Net peut maintenant deposer son fichier par l’adresse Internet de mon serveur FTP.
Merci à vous deux pour votre implication.

A Noste Kêe,
Richard.

Ce n’est pas un URL mais un nom de domaine, plus particulièrement un nom d’hôte qui pointe vers une adresse IP et sert à localiser un hôte. Un URL est de la forme protocole://hote/chemin/ressource et sert à localiser une ressource.

Je suis quand même surpris que la Freebox ne fasse pas la translation elle-même. Je n’ai jamais essayé moi-même, mais si elle translate les connexion FTP actives en sortie, cela signifie que le module assistant de NAT FTP est actif et il gère aussi le mode passif.