Configurer un serveur FTP (VSFTPD) dans une VM Proxmox derrière un firewall

Après quelques jours de galère à se débattre avec notre firewall pour configurer correctement un serveur vsftpd (Very Secure FTP) avec un nat vers une node OpenVZ de notre serveur proxmox, j'écris ce petit post pour ceux que ça tenterait...

Configuration côté PROXMOX

Tout d'abord il faut préparer correctement le firewall côté proxmox. Plusieurs choses sont nécessaires, il faut activer les modules de net et de tracking de connexion pour FTP:

    modprobe ip_conntrack_ftp
    modprobe ip_nat_ftp
    modprobe nf_conntrack_ftp

Il faut savoir que la VM partage les modules du noyau... Donc ils sont actifs pour toutes vos machines virtuelles.

Pour que ce soit persistant il faut modifier le fichier /etc/modules:

    # /etc/modules: kernel modules to load at boot time.
    #
    # This file contains the names of kernel modules that should be loaded
    # at boot time, one per line. Lines beginning with "#" are ignored.
    # Parameters can be specified after the module name.
    loop
    ip_conntrack_ftp
    ip_nat_ftp
    nf_conntrack_ftp

Une fois fait, il vous faut modifier certaines règles iptables afin d'autoriser la connexion FTP sur votre serveur (notamment ouvrir un plage de port pour le mode PASSIF) et natter le FTP vers votre VM (ici sont IP internet est 10.0.0.2):

    # NAT des ports 20 et 21
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 20 -j DNAT --to 10.10.10.2:20
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j DNAT --to 10.10.10.2:21
    # NAT d'une plage de ports spécifique pour le mde passif
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 13450:13500 -j DNAT --to 10.10.10.2:13450-13500

    # ouverture des ports FTP en INPUT
    iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
    iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
    iptables -t filter -A INPUT -p tcp --dport 13450:13500 -j ACCEPT

    # ouverture des ports FTP en OUTPUT
    iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
    iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
    iptables -t filter -A OUTPUT -p tcp --dport 13450:13500 -j ACCEPT

Une fois fait, vous êtes prêts à configurer votre VM et à installer VSFTPD dessus.

La dernière étape très importante est d'éditer votre configuration /etc/vz/vz.conf:

## IPv4 iptables kernel modules to be enabled in CTs by default
IPTABLES="ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length ipt_state iptable_nat"

L'ajout important si ce n'est pas fait, est d'activer iptable_nat dans le container OpenVZ sinon vous ne serez pas capable de faire du NAT depuis votre VM. Le NAT depuis la VM est nécessaire pour que vous puissiez vous connecter à vous-même via votre URL.

Installation de VSFTPD

Sous debian l'installation est très simple

    apt-get install vsftpd

Attention la configuration nécessite un VSFTPD version > 3.0

Une fois installé il vous faut configurer le serveur en éditant /etc/vsftd.conf:

    # Run standalone?  vsftpd can run either from an inetd or as a standalone
    # daemon started from an initscript.
    listen=YES
    # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
    anonymous_enable=NO
    #
    # Uncomment this to allow local users to log in.
    local_enable=YES
    #
    # Uncomment this to enable any form of FTP write command.
    write_enable=YES
    # Activate directory messages - messages given to remote users when they
    # go into a certain directory.
    dirmessage_enable=YES
    #
    # If enabled, vsftpd will display directory listings with the time
    # in  your  local  time  zone.  The default is to display GMT. The
    # times returned by the MDTM FTP command are also affected by this
    # option.
    use_localtime=YES
    #
    # Activate logging of uploads/downloads.
    xferlog_enable=YES
    #
    # Make sure PORT transfer connections originate from port 20 (ftp-data).
    connect_from_port_20=YES
    #
    # If you want, you can arrange for uploaded anonymous files to be owned by
    # a different user. Note! Using "root" for uploaded files is not
    # recommended!
    chown_uploads=YES
    chown_username=www-data
    # You may restrict local users to their home directories.  See the FAQ for
    # the possible risks in this before using chroot_local_user or
    # chroot_list_enable below.
    chroot_local_user=YES
    # This option should be the name of a directory which is empty.  Also, the
    # directory should not be writable by the ftp user. This directory is used
    # as a secure chroot() jail at times vsftpd does not require filesystem
    # access.
    secure_chroot_dir=/var/run/vsftpd/empty
    #
    # This string is the name of the PAM service vsftpd will use.
    pam_service_name=vsftpd
    #
    # This option specifies the location of the RSA certificate to use for SSL
    # encrypted connections.
    rsa_cert_file=/etc/ssl/private/vsftpd.pem
    # Allow user to write in their home directory
    allow_writeable_chroot=YES
    #
    # Activate PASSIVE mode
    pasv_enable=YES
    pasv_addr_resolve=YES
    pasv_address=<your plublic promox IP>
    pasv_min_port=13450
    pasv_max_port=13500
    file_open_mode=0755

La configuration est relativement simple, nous autorisons uniquement les utilisateurs locaux à se connecter en FTP, le mode anonyme n'est pas possible. Nous demandons de faire un chroot dans le répertoire home de cet utilisateur.

La configuration importante est celle du mode passif (lignes en base du fichier). Tout d'abord on active le mode pasv_enable.

Ensuite, on demande la résolution des addresses pour que le côté client ne génère pas d'erreur d'addresses qui changent via l'option pasc_addr_resolve.

On spécifie l'addresse IP publique de notre serveur principal pour qu'elle soit retournée lors de la résolution via l'option pasv_address

On spécifie la plage de ports autorisés pour le mode passif (celui qu'on ouvre via notre firewall) via les deux options passv_min_port et pasv_max_port.

La dernière option permet de définir les droits d'ouverture des fichiers file_open_mode.

Il ne vous reste plus qu'à ajouter des utilisateurs locaux pour les autoriser à se connecter via FTP.

Un petit redémarrage du serveur FTP:

    service vsftpd restart

Configuration du firewall côté VM

De la même manière que pour votre serveur PROXMOX pincipal, pour que le FTP fonctionne sur votre VM, il vous faut modifier certaines règles iptables afin d'autoriser la connexion FTP sur votre serveur (notamment ouvrir un plage de port pour le mode PASSIF):

    # ouverture des ports FTP en INPUT
    iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
    iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
    iptables -t filter -A INPUT -p tcp --dport 13450:13500 -j ACCEPT

    # ouverture des ports FTP en OUTPUT
    iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
    iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
    iptables -t filter -A OUTPUT -p tcp --dport 13450:13500 -j ACCEPT

    # NAT vers le principal
    iptables -t nat -A POSTROUTING -s 10.0.0.2 -j SNAT --to <your public ip>

La dernière règle est très importante si vous voulez faire du ftp de votre machine vers elle-même en utilisant votre IP publique.

Comments

comments powered by Disqus