Serveurs FTP virtuels avec wu-ftpd

Winfried Trümper, ( winni@xpilot.org)
avec l'aide de Brian Grossman, ( brian@SoftHome.Net)
Traduit par David Tilloy, ( dav@neuronnexion.fr)

Version 1.2 - 27 janvier 1997
Ce document décrit comment paramétrer les serveurs ftp virtuels.

1. Introduction

Linux offre la possibilité d'exécuter plusieurs "serveurs" sur une seule machine. De nombreuses personnes se servent déjà de cette possibilité afin de disposer de plus d'un service WWW sur leur machine Linux, e.g.

                www.sharpers.com                (192.168.55.37)
                www.usurers.com                 (192.168.55.38)
                www.swindlers.com               (192.168.55.39)

apparaissent comme trois machines distinctes, mais ne sont en réalité qu'une seule et unique machine Linux assurant ces services.

La technique utilisée derrière cette fonction est appelée "multihome" et est basée sur la capacité de Linux d'assigner plusieurs adresses IP à une seule interface réseau (carte ethernet ou modem). En fait, vous n'avez pas besoin de disposer de plusieurs cartes ethernet pour que Linux soit à l'écoute de plusieurs addresses/noms sur le réseau. Linux manipule les adresses IP additionnelles à l'aide d' "interfaces virtuelles" qui représentent physiquement le meme matériel, mais sont logiquement distinguées à l'aide de leurs adresses IP par les logiciels (et le noyau).

Ces interfaces virtuelles sont nommées de manière similaire que l'interface réelle sur laquelle elles pointent, et ont simplement comme suffixe un (plus ou moins) numéro arbitraire.

Le terme propre pour chaque interface virtuelle est "alias ip". Pour les hotes virtuels, la commande ifconfig donne la (lourde) sortie:

        interface adresse IP   address de diffusion      masque
        ------------------------------------------------------------
        eth0      192.168.55.37    192.168.55.63     255.255.255.224

        eth0:0    192.168.55.38    192.168.55.63     255.255.255.224
        eth0:1    192.168.55.39    192.168.55.63     255.255.255.224
        eth0:2    192.168.55.40    192.168.55.63     255.255.255.224
        eth0:3    192.168.55.41    192.168.55.63     255.255.255.224
             ^-- numéro de l'alias ip
         
Pour disposer et utiliser cette facilité des alias ip, vous avez besoin d'un "module" pour votre noyau Linux, qui peut etre intrégré dans le noyau à la compilation ou chargé à la volée par la commande (en tant que root):
                insmod ipalias

La plupart des distributions actuelles distribuent ce module, donc je ne passerai pas plus de temps à décrire comment le créer (note: Si vous ne l'avez pas, lisez le document Linux Kernel-HOWTO).

L'alias ip pour les hotes définis ci-dessus ont été créé avec un petit script lors du démarrage:

8<----- couper ici 8<-----
#!/bin/sh

NETMASK="255.255.255.224"      # remplacez par votre masque de réseau
BROADCAST="192.168.55.63"      # remplacez par votre adresse de diffusion
MAIN_IF="eth0"                 # interface "de base"

IPALIASES="192.168.55.38   192.168.55.39   192.168.55.40 \
           192.168.55.41   192.168.55.42   192.168.55.43 \
           192.168.55.44   192.168.55.45   192.168.55.46"

# Vous n'avez plus besoin de modifier quoi que ce soit après ce point
i=0
for ALIAS in $IPALIASES
do
    /sbin/ifconfig  ${NETTYPE}:${i}  ${ALIAS} \
                    broadcast ${BROADCAST}  netmask ${NETMASK}
    /sbin/route add -host ${ALIAS} dev ${NETTYPE}:${i}
    i=$[$i+1]
done
8<----- couper ici 8<-----

Si vous avez d'autres questions à propos des alias ip, consultez le document Linux "IP Alias mini-HOWTO" et le fichier "Documentation/aliases.txt" dans le répertoire contenant les sources du noyau Linux (généralement, dans le répertoire "/usr/src/linux").

2. Services et Serveurs Virtuels

Si un nom d'hote appartient à une interface virtuelle, c'est ce que l'on nomme communément un "hote virtuel". Un démon qui exécute un service sur un hote virtuel (ou sur une interface virtuelle) est appelé "serveur virtuel".

2.1 Serveurs WWW Virtuels

Nous avons déjà donné un exemple de 3 serveurs WWW virtuels précédemment:

                www.sharpers.com, www.usurers.com, www.swindlers.com

La configuration d'une grande partie de ces démons http que je connaisse (c.f. l'excellente conception du "Roxen Challenger" ou le largement répandu "Apache") pour utiliser ces serveurs virtuels est facile, et largement documentée. En quelques mots: attachez simplement le port www (num 80) à l'interface réseau virtuelle avec l'adresse ip/nom désiré pour chaque serveur WWW que vous exécutez. Il n'y a aucune astuce.

Lisez le document Linux "Virtual Web mini-HOWTO" si vous désirez plus d'informations sur cette technique.

2.2 Addresses de courrier virtuelles

Dans le cas le plus simple, vous souhaitez recevoir chaque courrier pour tous les hotes virtuels, et pour les domaines concernés:

                www.sharpers.com, www.usurers.com, www.swindlers.com,
                    sharpers.com,     usurers.com,     swindlers.com

Meme la configuration de "smail" ou de "sendmail" (les démons qui se charge du traffic de courrier sur votre machine Linux) est relativement simple: ajoutez les noms/domaines additionnels dans "/etc/smail/config" (ajoutez 'hostnames=' et 'domains=') respectivement "/etc/mail/sendmail.cw" (un nom de domaine par ligne).

Pour implémenter un "réel" domaine virtuel à l'aide de smail, regarder la FAQ sur smail (smail-FAQ), disponible sur

http://www.sbay.org/smail-faq.html

2.3 Serveurs ftp virtuels

Le concept de serveur ftp virtuel n'est pas supporté par défaut dans les démons ftp que je connaisse.

Le très largement diffusé "wu-ftpd" dispose d'un patch réalisé par Brian Grossman brian@SoftHome.Net pour réaliser un service FTP distinct du serveur FTP anonyme traditionnel. Vous trouverez des précisions pour récupérer ce patch dans le chapitre 3.

Il semble qu'il n'y ait pas d'autres patch disponible pour réaliser cette opération.

L'idée générale du patch multihote de Brian est de faire opérer à wu-ftpd un "chroot()" sur

                REPERTOIRE_DE_BASE_DU_COMPTE_FTP/NOM_D_HOTE_DEMANDE/

au lieu de juste faire un chroot() sur

                                REPERTOIRE_DE_BASE_DU_COMPTE_FTP/

Dans l'exemple présenté précedemment, l'utilisateur qui se connecte sur "ftp.swindlers.com" par un compte ftp anonyme est bloqué dans "/home/ano-ftp/ftp.swindlers.com/" au lieu de "/home/ano-ftp/". Vous pouvez imaginer que la configuration de base est simple et ne diffère que très peu de la configuration d'un serveur anonyme simple.

Gloire à Brian pour cette stratégie de configuration simple et efficace.

Laissez moi m'assurer que vous disposez de cette version spéciale de wu-ftp déjà compilée par vous meme, ou que vous vous etes procuré le binaire, et laissez moi vous renvoyer pour toute question à la fin de ce document.

Je vais vous donner un exemple de la vie courante, et vous expliquer les manipulations que j'ai effectuées pour un de mes clients (je n'ai changé que le nom de ses machines par des noms fictifs...).

(a) Creéz un répertoire "/home/ano-ftp" pour les différents serveurs ftp anonymes.

                mkdir  /home/ano-ftp  &&  cd /home/ano-ftp
                mkdir  ftp.sharpers.com  ftp.usurers.com  ftp.swindlers.com

Vous obtenez alors comme arborescence:

        /home/ano-ftp/
                  |-- ftp.sharpers.com
                  |-- ftp.swindlers.com
                  `-- ftp.usurers.com

(b) Copiez les fichiers nécessaires pour un service ftp anonyme depuis le répertoire "/home/ftp" du serveur déjà configuré dans les répertoires nouvellements créés.

                cd     /home/ano-ftp/ftp.sharpers.com
                cp -a  /home/ftp/* .

                cd     ../ftp.swindlers.com
                cp -a  /home/ftp/* .

                cd     ../ftp.usurers.com
                cp -a  /home/ftp/* .

N'oubliez pas d'effacer les fichiers superflus du répertoire "pub/" (ou simplement, ne les copiez pas). Par exemple, le répertoire "/home/ftp" de la distribution Debian ressemble à ceci:

        /home/ftp                       Permissions   Propr  Groupe Taille
                |-- bin                 d--x--x--x   2 root   root       
                |   |-- gzip            ---x--x--x   1 root   root   45121
                |   |-- ls              ---x--x--x   1 root   root   22945
                |   `-- tar             ---x--x--x   1 root   root   77769
                |
                |-- etc                 d--x--x--x   2 root   root       
                |   |-- group           -r--r--r--   1 root   root      18
                |   |-- passwd          -r--r--r--   1 root   root      44
                |   `-- pathmsg         -r--r--r--   1 root   root     172
                |
                |-- lib                 d--x--x--x   2 root   root
                |   |-- ld-linux.so.1   -r-xr-xr-x   1 root   root   21375
                |   |-- libc.so.5.2.18  -rwxr-xr-x   1 root   root  536252
                |   `-- libc.so.5 -> libc.so.5.2.18
                |
                |-- pub                 dr-xr-xr-x   3 root   root
                |   `-- whatever
                |
                `-- welcome.msg         -rw-r--r--   1 root   root     323

(c) Changez le répertoire de base du compte ftp anonyme par "/home/ano-ftp" en éditant le fichier "/etc/passwd".

        ftp:*:11:11:Anonymous FTP:/home/ano-ftp:/bin/sh
                                  ^^^^^^^^^^^^^
                                répertoire de base

Ces trois étapes décrivent la configuration minimale, et permettent déjà la séparation des zones ftp pour chacun des 3 hotes virtuels. Mon travail actuel était un peu plus compliqué, puisque j'ai du activer les quotas sur les disques (limitant l'espace disque consommable par utilisateur/groupe) dans chacun des répertoires incoming, donc l'histoire continue:

(d) Activez les zones de téléchargement dans le fichier de configuration de wu-ftp "/etc/ftpd/ftpaccess"

8<----- couper ici 8<-----
upload  /home/ano-ftp/www.sharpers.de  *         no
upload  /home/ano-ftp/www.sharpers.de  /incoming yes sharpers ftp 0660 nodirs
upload  /home/ano-ftp/www.swindlers.de *         no
upload  /home/ano-ftp/www.swindlers.de /incoming yes swindler ftp 0660 nodirs
upload  /home/ano-ftp/www.usurers.de   *         no
upload  /home/ano-ftp/www.usurers.de   /incoming yes usurers  ftp 0660 nodirs
#                                                |      |      |    |     |
#                    téléchargements autorisés --+      |      |    |     |
#     les fichiers téléchargés appartiennent            |      |    |     |
#                            à cet utilisateur ---------+      |    |     |
#                          idem pour le groupe ----------------+    |     |
# droits d'accès pour les fichiers téléchargés ---------------------+     |
#        création de répertoires non autorisée ---------------------------+
8<----- couper ici 8<-----

Maintenant, chaque fichier téléchargé sur ce serveur ftp appartient à un utilisateur séparé, pour qui les quotas peuvent etre activés.

(e) Configurer les quotas sur les disques.

Je vous suggère de lire: "/usr/doc/quotas.txt" et le Linux "Quota mini-HOWTO".

* Ajoutez "usrquota=/etc/quota/ano-ftp.users" dans les options de montage de la partition "/home/an-ftp" qui se trouve dans "/etc/fstab".

* Crééz "/etc/quota/ano-ftp.users" à l'aide de la commande "touch".

* Activez les quotas par la commande "quotaon"

* Fixez les quotas avec "edquota swindlers", etc.

Quotas pour l'utilisateur swindlers:

            /dev/sdb8: blocks in use: 0, limits (soft = 0, hard = 10000)
                       inodes in use: 1, limits (soft = 0, hard = 1000)

L'espace disque correspondant dépend de la taille en block du système de fichier que vous avez créé (le standard est 1 block = 1 kb).

3. Disponibilité

Le patch multihote (20kb) pour wu-ftpd peut etre téléchargé depuis

    ftp://ftp.softhome.net/pub/users/brian/multihomed-wu-ftpd-2.4-23.patch

S'il vous plait, lisez-le pour plus de détails sur le copyright.

Les sources de "wu-ftpd" sont disponibles à plusieurs endroits sur le net, utilisez archie pour trouver le serveur le plus proche de vous mettant à disposition ces sources. Changez le répertoire ou a été décompressé les sources et tapez

            patch < ../multihomed-wu-ftpd-2.4-23.patch

pour concaténer le patch avec les sources. La FAQ sur wu-ftpd est disponible à l'adresse

http://www.hvu.nl/ koos/wu-ftpd-faq.html