En FTP passif, la connexion du canal Data s’initie depuis le client vers le serveur. Le serveur renvoit donc au client le port (et l’IP) sur lequel doit s’établir le canal Data.

Dans le cas où le serveur est dans une DMZ avec une adresse privée, de base le serveur va renvoyer au client cette adresse privée et la connexion avec Internet ne pourra donc pas se monter.
Il suffit donc d’utiliser dans vsftpd le paramètre pasv_address pour indiquer l’IP publique.

L’histoire pourrait s’arrêter là, mais maintenant que c’est l’IP publique qui est annoncée, il devient parfois délicat de se connecter depuis le LAN. (Problème de firewall, de routage etc..)
vsftpd permet d’utliser des fichiers de configuration différents en fonction de l’adresse IP de la machine qui se connecte, grâce à tcpwrapper. (vsftpd doit être compilé pour).

Il suffit donc d’utiliser 2 fichiers de configuration, chacun ayant une valeur différente de pasv_address.

$ grep vsftpd /etc/hosts.allow   
vsftpd: 10.: setenv VSFTPD_LOAD_CONF /etc/vsftpd_tcp_wrap_private_ip.conf  
$  
$ cat /etc/vsftpd_tcp_wrap_private_ip.conf  
pasv_address=10.20.30.40  
$  

Avec cette configuration, si c’est une machine du LAN qui se connecte (réseau 10.0.0.0), c’est l’adresse 10.20.30.40 qui sera renvoyée pour le canal Data en passif.
Sinon, ca sera l’adresse publique spécifié dans le fichier de configuration par défaut.

Extrait de /usr/share/doc/vsftpd/EXAMPLE/PER_IP_CONFIG/README

vsftpd: 192.168.1.3: setenv VSFTPD_LOAD_CONF /etc/vsftpd_tcp_wrap.conf

If a client connects from 192.168.1.3, then vsftpd will apply the vsftpd config file /etc/vsftpd_tcp_wrap.conf to the session! These settings are applied ON TOP of the default vsftpd.conf.

Extrait du man vsftpd.conf

pasv_address
Use this option to override the IP address that vsftpd will advertise in response to the PASV command. Provide a numeric IP address, unless pasv_addr_resolve is enabled, in which case you can provide a hostname which will be DNS resolved for you at startup.
Default: (none - the address is taken from the incoming connected socket)