Pure-ftpd

Un article de neufbox 4.

Présentation

Pure-ftpd est un serveur de fichiers qui permet de partager les données des périphériques connectés aux ports USB. Vous pouvez le trouver sur ce site.

Configuration

Il se configure par l'interface web de la NB4.

Pour l'utiliser vous devez absolument créer un utilisateur.

Il n'existe pas de fichier de configuration sur la NB4, tout se lance à partir du fichier rc.ftpd qui est lui-même lancé par usb_up_down.

Le fichier rc.ftpd

#!/bin/sh
IPTABLES=/bin/iptables
  LAN_NET="$(net `/bin/nvram get lan_ipaddr` `/bin/nvram get lan_netmask`)"
LAN_BR=`/bin/nvram get lan_ifname`

start () {
        if [ `/bin/nvram get ftpd_active` = "off" ]
        then
                /bin/nvram set ftpd_status down
                exit 0
        fi

        if [ `ls /var/mnt/ -1 | grep -c ".*"` = "0"  ]
        then
                /bin/nvram set ftpd_status down
                exit 0
        fi

        /bin/nvram set ftpd_status starting
        FTPD_LIST_COUNT=`/bin/nvram lcount ftpd_list`

        I=1
        # generating user / password
        echo > /var/pure.pw
        while [ "$I" -le "$FTPD_LIST_COUNT" ]
        do
                username=`/bin/nvram get ftpd_list_n${I}_user`
                password=`/bin/nvram get ftpd_list_n${I}_password`
                logger -s -t ftp -p daemon.debug "Adding $username / $password"
                pure-pw useradd $username -f /var/pure.pw -u $(( 1000 + $I)) -g 999 -d /var/mnt -p $password

                I=$(( $I + 1 ))
        done

        pure-pw mkdb /var/pure.pdb -f /var/pure.pw

        pure-ftpd  -A -c2 -B -C2 -D -E -fftp -H -I15 -L2000:8 -m2 -U99:999 -u1000 -k99 -Z -lpuredb:/var/pure.pdb

        if [ "$?" = "0" ]
        then
                logger -s -t lan_services -p daemon.debug "Running FTP Server                                     [OK]"
                /bin/nvram set ftpd_status up
        else
                logger -s -t lan_services -p daemon.debug "Running FTP Server                                     [KO]"
                exit 1
        fi

        $IPTABLES -A LAN_FILTER -p tcp -m tcp -i $LAN_BR -s $LAN_NET --dport 20 -m state --state NEW -j ACCEPT
        $IPTABLES -A LAN_FILTER -p tcp -m tcp -i $LAN_BR -s $LAN_NET --dport 21 -m state --state NEW -j ACCEPT
}


stop () {
        /bin/nvram set ftpd_status down
        $IPTABLES -D LAN_FILTER -p tcp -m tcp -i $LAN_BR -s $LAN_NET --dport 20 -m state --state NEW -j ACCEPT
        $IPTABLES -D LAN_FILTER -p tcp -m tcp -i $LAN_BR -s $LAN_NET --dport 21 -m state --state NEW -j ACCEPT

        killall -9 pure-ftpd
        rm /var/pure.pw /var/pure.pdb
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                /bin/nvram set ftpd_status starting
                sleep 2
                start
                ;;
esac

Pour être cohérent avec les règles iptables de rc.firewall, j'ai modifié les règles du fichier. LAN_FILTER remplace INPUT dans le fichier original.

Le fichier usb_up_down

#!/bin/sh

start () {
        /etc/init.d/rc.ftpd start
        /etc/init.d/rc.webdav start
}

stop () {
        /etc/init.d/rc.ftpd stop
        /etc/init.d/rc.webdav stop
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        restart)
                stop
                sleep 2 
                start
                ;;
esac

Ce fichier lance également le serveur Webdav.

Problème rencontré

En passant de la version du firmware de 1.2.10 à 1.3.11, le serveur ne fonctionne plus en mode passif.

Il s'agit de 2 modules qui ne sont plus chargés au démarrage, à savoir, ip_nat_ftp.ko et ip_conntrack_ftp.ko.

Pour réintégrer le mode passif, il faut modifier le fichier rc.kmod dans la fonction start() comme ceci :

        $INSMOD $MOD_PATH/ipt_CLASSIFY.ko
        $INSMOD $MOD_PATH/ipt_FTOS.ko
        $INSMOD $MOD_PATH/ip_conntrack_ftp.ko
        $INSMOD $MOD_PATH/ip_nat_tftp.ko
        $INSMOD $MOD_PATH/ip_nat_ftp.ko
        $INSMOD $MOD_PATH/ip_conntrack_tftp.ko

En mettant bien ip_conntrack_ftp.ko avant ip_nat_ftp.ko, sinon erreur au démarrage.

Il ne faut pas oublier d'enlever ces modules à l'arrêt.

        rmmod ip_nat_tftp.ko
        rmmod ip_nat_ftp.ko
        rmmod iptable_nat.ko
        rmmod ip_conntrack_tftp.ko
        rmmod ip_conntrack_ftp.ko