  Virtual Services Howto
  Brian Ackerman, brian@nycrc.net
  Adaptation francaise Etienne BERNARD bernard@isia.cma.fr
  v1.2, 4 Novembre 1997

  Ce  document  a ete ecrit pour repondre au nombre grandissant de ques-
  tions sur la maniere de rendre un service virtuel.

  11..  IInnttrroodduuccttiioonn

  11..11..  PPrree--rreeqquuiiss

  Creer une machine  pour  des  services  virtuels  n'est  pas  du  tout
  difficile.   Cependant,   des   connaissances  basiques  ne  sont  pas
  suffisantes. De plus, ce document n'est pas destine a  vous  expliquer
  comment configurer une machine sous Linux.

  Afin  que vous puissiez comprendre cet HOWTO, nous supposerons que les
  documents suivants vous sont tout a fait familiers :

  +o  Compiler un noyau Linux et ajouter le support de l'IP  aliasing  IP
     alias mini-HOWTO

  +o  Installer et configurer des peripheriques reseaux NET-3 HOWTO

  +o  Installer inetd NET-3 HOWTO

  +o  Compiler  et  installer  divers  paquetages  de logiciels en reseau
     comme Le site de Sendmail Le site d'Apache La FAQ de Wu-Ftpd

  +o  Mettre en place le DNS DNS HOWTO

  Si vous n'etes pas certain de la marche a suivre  pour  effectuer  une
  des  actions  precedents, il est FORTEMENT recommande que vous suiviez
  les liens proposes pour vous familiariser avec tous ces paquetages. Je
  ne  repondrai  a AUCUN mail concernant les points precedents. Veuillez
  s'il  vous  plait  rediriger  toute  question  a  l'auteur  du   HOWTO
  approprie.

  11..22..  BBuutt

  Le  but  des services virtuels est de permettre a une seule machine de
  reconnaitre de multiples adresses IP sans avoir  de  multiples  cartes
  reseau.  L'IP  aliasing  est  une  option  du  noyau  qui  vous permet
  d'assigner plus d'une adresse IP  a  chaque  peripherique  reseau.  Le
  noyau  multiplexe  (les  echange  tres rapidement) en tache de fond et
  l'utilisateur a l'impression d'avoir plusieurs cartes reseau  dans  sa
  machine.

  Ce  multiplexage  permet  a  de  multiples domaines (www.domaine1.com,
  www.domaine2.com, etc.) d'etre loges sur la meme machine pour le  meme
  cout  que  pour  un  seul  domaine.  Malheureusement,  la  plupart des
  services (ftp, web, courrier electronique) n'ont pas ete  concus  pour
  gerer   de   multiples   domaines.   Afin  de  les  faire  fonctionner
  correctement,  vous  devrez  modifier  a  la  fois  les  fichiers   de
  configuration  et  le code source. Ce document decrit comment realiser
  ces modifications pour la mise en place d'une machine virtuelle.

  Un demon est  egalement  necessaire  afin  de  faire  fonctionner  les
  services  virtuels.  Le  code source de ce demon (virtuald) est fourni
  plus loin dans ce document.

  11..33..  CCoommmmeennttaaiirreess

  Ce document va grossir au fur et a mesure que  les  paquetages  seront
  mis  a  jour  et que le code source ou que les modifications proposees
  changeront. Si quelque partie de ce document n'est pas claire, envoyez
  moi  vous  questions  ou  suggestions. Afin que je n'ai pas a chercher
  dans le HOWTO  en  entier,  assurez  vous  s'il  vous  plait  que  les
  commentaires  sont  aussi  specifiques  que  possible  et  incluent la
  section ou se trouve le point discutable. Il est  important  que  tout
  mail  ait  un  champ Subject: contenant VIRTSERVICES HOWTO. Tout autre
  mail sera considere comme du mail personnel, et tous mes  amis  savent
  que  je  ne lis pas tout le temps mon mail personnel et il risque donc
  d'etre efface avec le leur.

  Veuillez egalement noter que mes exemples ne sont pas autre chose  que
  des  exemples,  et ne doivent pas etre recopies tels quels. Il se peut
  que vous ayez a inserer vos propres valeurs. Si  vous  rencontrez  des
  problemes,  envoyez  moi  un  mail,  contenant  tous  les  fichiers de
  configuration pertinents et les messages d'erreur que vous avez obtenu
  lors de l'installation. Je vous renverrai mes suggestion.

  11..44..  HHiissttooiirree ddeess cchhaannggeemmeennttss

  V1.0 Document initial.

  V1.1 Correction d'une erreur dans la section sur le web virtuel.

  V1.2 Correction de la date.

  11..55..  CCooppyyrriigghhtt//DDiissttrriibbuuttiioonn

  Ce  document  est  Copyright (c) 1997 par The Computer Resource Center
  Inc.

  Une copie de ce  document  peut  etre  reproduite  ou  distribuee  sur
  n'importe  quel support physique ou electronique sans la permission de
  l'auteur. De la meme  facon,  les  traductions  sont  autorisees  sans
  permission  expresse  si  elle  incluent un mot disant qui l'a traduit
  (NdT:  voir  le  debut  du  document  pour   mes   coordonnees).   Une
  redistribution  commerciale  est  autorise  et encouragee. Dans ce cas
  cependant, faites en part a Computer Resource Center.

  Vous pouvez utiliser des  extraits  de  ce  document  sans  accord  de
  l'auteur,  a  condition que l'oeuvre derivee contienne une copie de ce
  document ou un pointeur vers une copie de ce document.

  Vous avez la permission  d'effectuer  des  copies  ainsi  que  de  les
  distribuer  a  condition  que le paragraphe sur le copyright ainsi que
  cette note soient preserves sur toutes les copies.

  En  bref,  nous  desirons  promouvoir  la   dissemination   de   cette
  information  par  quelque  moyen  que  ce  soit.  Cependant, je desire
  conserver le copyright sur ce  document,  et  aimerait  etre  tenu  au
  courant de tous les plans de redistributions de ce HOWTO.
  22..  IIPP aalliiaassiinngg

  L'IP aliasing est une option du noyau qui doit etre mise en place afin
  de pouvoir faire tourner des services virtuels  sur  une  machine.  Il
  existe  deja  un mini-HOWTO expliquant l' IP aliasing.  Referez vous a
  ce document pour toute question concernant la mise en place  de  cette
  option.

  33..  VViirrttuuaalldd

  33..11..  CCoommmmeenntt ccaa mmaarrcchhee

  Toute  connexion  reseau  est composee de deux paires adresse IP/port.
  L'API (Applications Program Interface, ou Interface  de  Programmation
  d'Applications) pour la programmation reseau est nommee l'API Sockets.
  La socket agit comme un fichier ouvert,  et  vous  pouvez  envoyer  ou
  recevoir  des  donnees  a travers une connexion reseau en lisant ou en
  ecrivant dans la socket. Il  existe  une  fonction,  getsockname,  qui
  retourne   l'adresse   IP   de  la  socket  locale.  Virtuald  utilise
  getsockname pour determiner sur quel adresse IP de la  machine  locale
  la  connexion  a  ete  faite. Virtuald lit un fichier de configuration
  pour recuperer le  repertoire  associe  a  cette  adresse  IP.  Il  va
  utiliser chroot sur ce repertoire et prendre en compte la connexion au
  service. Chroot change le repertoire / (le repertoire  root)  vers  un
  nouveau point, de sorte que tout ce qui est au dessus de ce repertoire
  devient inaccessible pour le programme. Ainsi, chaque  adresse  IP  se
  voit  assigne  un  systeme  vi!   !   !   rtuel  de  fichiers. Pour le
  programme  reseau,  ceci  est  transparent,  et  le  programme  va  se
  comporter  comme  si de rien n'etait. Virtuald, en conjonction avec un
  programme comme inetd, peut etre utilise  pour  virtualiser  n'importe
  quel service.

  33..22..  iinneettdd

  Inetd  est  un  super serveur reseau qui ecoute sur de multiples ports
  et, lorsqu'il recoit  une  demande  de  connexion  (par  exemple,  une
  requete  POP),  inetd  realise  la  connexion et la passe au programme
  specifie. Cela evite de faire tourner des serveurs pour rien lorsqu'il
  n'y a aucune demande pour eux.

  Un fichier /etc/inetd.conf standard ressemble a ceci :

  ftp stream tcp nowait root /usr/sbin/tcpd wu.ftpd -l -a
  pop-3 stream tcp nowait root /usr/sbin/tcpd in.qpop -s

  Un /etc/inetd.conf virtuel ressemble a cela :

  ftp stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.ftp wu.ftpd -l -a
  pop-3 stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.pop in.qpop -s

  33..33..  vviirrttuuaall..ccoonnff

  Chaque  service  se  voit  attribue  un  fichier  de configuration qui
  controlera quelles IPs et quels repertoires  sont  autorises  pour  ce
  service. Vous pouvez avoir un fichier de configuration principal ou de
  nombreux fichiers de configuration si vous desirez que chaque  service
  se  voit  attribuer  une  liste  de  domaines  differente.  Un fichier
  virtual.conf ressemble a ceci :

  # C'est un commentaire, comme le sont les lignes blanches

  # Format IP <SPACE> dir <NOSPACES>
  10.10.10.129 /virtual/foo.bar.com
  10.10.10.130 /virtual/bar.foo.com
  10.10.10.157 /virtual/boo.la.com

  33..44..  LLee ccooddee ssoouurrccee ddee vviirrttuuaalldd

  #include <netinet/in.h>
  #include <sys/socket.h>
  #include <arpa/inet.h>
  #include <stdarg.h>
  #include <string.h>
  #include <syslog.h>
  #include <stdio.h>

  #define BUFSIZE 8192

  main(int argc,char **argv)
  {
          char buffer[BUFSIZE];
          char *ipaddr,*dir;

          logit("Virtuald Starting: $Revision: 1.19 $");
          if (!argv[1])
          {
                  logit("invalid arguments: no conf file");
                  quitting_virtuald(0);
          }
          if (!argv[2])
          {
                  logit("invalid arguments: no program to run");
                  quitting_virtuald(0);
          }
          if (getipaddr(&ipaddr))
          {
                  logit("getipaddr failed");
                  quitting_virtuald(0);
          }
          sprintf(buffer,"Incoming ip: %s",ipaddr);
          logit(buffer);
          if (iptodir(&dir,ipaddr,argv[1]))
          {
                  logit("iptodir failed");
                  quitting_virtuald(0);
          }
          if (chroot(dir)<0)
          {
                  logit("chroot failed: %m");
                  quitting_virtuald(0);
          }
          sprintf(buffer,"Chroot dir: %s",dir);
          logit(buffer);
          if (chdir("/")<0)
          {
                  logit("chdir failed: %m");
                  quitting_virtuald(0);
          }
          if (execvp(argv[2],argv+2)<0)
          {
                  logit("execvp failed: %m");
                  quitting_virtuald(0);
          }
  }

  int logit(char *buf)
  {
          openlog("virtuald",LOG_PID,LOG_DAEMON);
          syslog(LOG_ERR,buf);
          closelog();
          return 0;
  }

  int quitting_virtuald(int retval)
  {
          exit(retval);
          return 0;
  }

  int getipaddr(char **ipaddr)
  {
          struct sockaddr_in virtual_addr;
          static char ipaddrbuf[BUFSIZE];
          int virtual_len;
          char *ipptr;

          virtual_len=sizeof(virtual_addr);
          if (getsockname(0,(struct sockaddr *)&virtual_addr,&virtual_len)<0)
          {
                  logit("getipaddr: getsockname failed: %m");
                  return -1;
          }
          if (!(ipptr=inet_ntoa(virtual_addr.sin_addr)))
          {
                  logit("getipaddr: inet_ntoa failed: %m");
                  return -1;
          }
          strncpy(ipaddrbuf,ipptr,sizeof(ipaddrbuf)-1);
          *ipaddr=ipaddrbuf;
          return 0;
  }

  int iptodir(char **dir,char *ipaddr,char *filename)
  {
          char buffer[BUFSIZE],*bufptr;
          static char dirbuf[BUFSIZE];
          FILE *fp;

          if (!(fp=fopen(filename,"r")))
          {
                  logit("iptodir: fopen failed: %m");
                  return -1;
          }
          *dir=NULL;
          while(fgets(buffer,BUFSIZE,fp))
          {
                  buffer[strlen(buffer)-1]=0;
                  if (*buffer=='#' || *buffer==0)
                          continue;
                  if (!(bufptr=strchr(buffer,' ')))
                  {
                          logit("iptodir: strchr failed");
                          return -1;
                  }
                  *bufptr++=0;
                  if (!strcmp(buffer,ipaddr))
                  {
                          strncpy(dirbuf,bufptr,sizeof(dirbuf)-1);
                          *dir=dirbuf;
                          break;
                  }
          }
          if (fclose(fp)==EOF)
          {
                  logit("iptodir: fclose failed: %m");
                  return -1;
          }
          if (!*dir)
          {
                  logit("iptodir: ip not found in conf file");
                  return -1;
          }
          return 0;
  }

  44..  SSccrriippttss uuttiilleess

  44..11..  vviirrttffss

  Chaque domaine doit avoir une  arborescence  de  repertoires.  Puisque
  vous  utilisez  chroot,  vous  aurez  besoin  de  copies multiples des
  librairies, binaires,  fichiers  de  configuration,  etc...  partages.
  J'utilise  le  repertoire /virtual/domaine.com pour chaque domaine que
  je cree. Je comprends bien que cela represente du gaspillage  d'espace
  disque,  mais  l'espace  disque  est  meilleur  marche qu'une nouvelle
  machine ou que des cartes reseau. Si vous desirez reellement sauver de
  l'espace  disque, vous pouvez lier les fichiers entre eux, afin qu'une
  seule copie de chaque binaire soit presente.

  Voici un fichier virtfs d'exemple :

  #!/bin/bash

  echo '$Revision: 1.19 $'

  echo -n "Saisissez le nom de domaine : "
  read domain

  if [ "$domain" = "" ]
  then
          echo Vous n'avez rien saisi : on arrete la
          exit 0
  fi

  leadingdir=/virtual

  echo -n "Saisissez le nom du repertoire contenant les domaines (defaut: $default): "
  read ans

  if [ "$ans" != "" ]
  then
          leadingdir=$ans
  fi

  newdir=$leadingdir/$domain

  if [ -d "$newdir" ]
  then
          echo Le repertoire $newdir existe deja
          exit 0
  else
          echo Nouveau repertoire : $newdir
  fi

  echo Creation de $newdir
  mkdir -p $newdir

  echo Creation de bin
  cp -pdR /bin $newdir

  echo Creation de dev
  cp -pdR /dev $newdir

  echo Creation de dev/log
  ln -f /virtual/log $newdir/dev/log

  echo Creation d'etc
  mkdir -p $newdir/etc
  for i in /etc/*
  do
          if [ -d "$i" ]
          then
                  continue
          fi
          cp -pd $i $newdir/etc
  done

  echo Creation de etc/skel
  mkdir -p $newdir/etc/skel

  echo Creation de home
  for i in a b c d e f g h i j k l m n o p q r s t u v w x y z
  do
          mkdir -p $newdir/home/$i
  done

  echo Creation de home/c/crc
  mkdir -p $newdir/home/c/crc
  chown crc.users $newdir/home/c/crc

  echo Creation de lib
  mkdir -p $newdir/lib
  for i in /lib/*
  do
          if [ -d "$i" ]
          then
                  continue
          fi
          cp -pd $i $newdir/lib
  done

  echo Creation de proc
  mkdir -p $newdir/proc

  echo Creation de sbin
  cp -pdR /sbin $newdir

  echo Creation de tmp
  mkdir -p -m 0777 $newdir/tmp
  chmod +t $newdir/tmp

  echo Creation de usr
  mkdir -p $newdir/usr

  echo Creation de usr/bin
  cp -pdR /usr/bin $newdir/usr

  echo Creation de usr/lib
  mkdir -p $newdir/usr/lib

  echo Creation de usr/lib/locale
  cp -pdR /usr/lib/locale $newdir/usr/lib

  echo Creation de usr/lib/terminfo
  cp -pdR /usr/lib/terminfo $newdir/usr/lib

  echo Creation de usr/lib/zoneinfo
  cp -pdR /usr/lib/zoneinfo $newdir/usr/lib

  echo Creation de usr/lib/\*.so\*
  cp -pdR /usr/lib/*.so* $newdir/usr/lib

  echo Creation de usr/sbin
  cp -pdR /usr/sbin $newdir/usr

  echo Lien de usr/tmp vers /tmp
  ln -s /tmp $newdir/usr/tmp

  echo Creation de var
  mkdir -p $newdir/var

  echo Creation de var/lock
  cp -pdR /var/lock $newdir/var

  echo Creation de var/log
  mkdir -p $newdir/var/log

  echo Creation de var/log/wtmp
  cp /dev/null $newdir/var/log/wtmp

  echo Creation de var/run
  cp -pdR /var/run $newdir/var

  echo Creation de var/run/utmp
  cp /dev/null $newdir/var/run/utmp

  echo Creation de var/spool
  cp -pdR /var/spool $newdir/var

  echo Lien de var/tmp vers /tmp
  ln -s /tmp $newdir/var/tmp

  echo Creation de var/www/html
  mkdir -p $newdir/var/www/html
  chown webmast.www $newdir/var/www/html
  chmod g+s $newdir/var/www/html

  echo Creation de var/www/master
  mkdir -p $newdir/var/www/master
  chown webmast.www $newdir/var/www/master

  echo Creation de var/www/server
  mkdir -p $newdir/var/www/server
  chown webmast.www $newdir/var/www/server

  exit 0

  44..22..  vviirrtteexxeecc

  Afin d'executer des commandes  dans  un  environnement  virtuel,  vous
  devez  utilise  chroot sur ce repertoire puis lancer la commande. J'ai
  ecris un script shell nomme virtexec se chargeant de  ces  operations,
  pour n'importe quelle commande :

  #!/bin/sh

  echo '$Revision: 1.19 $'

  BNAME=`basename $0`
  FIRST4CHAR=`echo $BNAME | cut -c1-4`
  REALBNAME=`echo $BNAME | cut -c5-`

  if [ "$BNAME" = "virtexec" ]
  then
          echo Vous ne pouvez pas lancer virtexec directement. Il FAUT un lien symbolique
          exit 0
  fi

  if [ "$FIRST4CHAR" != "virt" ]
  then
          echo Le lien ne pointe pas sur une fonction virtuelle
          exit 0
  fi

  list=""
  num=1
  for i in /virtual/*
  do
          if [ ! -d "$i" ]
          then
                  continue
          fi
          if [ "$i" = "/virtual/lost+found" ]
          then
                  continue
          fi
          list="$list $i $num"
          num=`expr $num + 1`
  done

  if [ "$list" = "" ]
  then
          echo Je ne trouve pas d'environnement virtuel
          exit 0
  fi

  dialog --clear --title 'Virtexec' --menu Pick 20 70 12 $list 2> /tmp/menu.$$
  if [ "$?" = "0" ]
  then
          newdir=`cat /tmp/menu.$$`
  else
          newdir=""
  fi
  tput clear
  rm -f /tmp/menu.$$

  echo '$Revision: 1.19 $'

  if [ ! -d "$newdir" ]
  then
          echo Le nouveau repertoire $newdir N'EXISTE PAS
          exit 0
  else
          echo Nouveau repertoire : $newdir
  fi

  echo bname: $BNAME

  echo realbname: $REALBNAME

  if [ "$*" = "" ]
  then
          echo argumentss: aucun
  else
          echo args: $*
  fi

  echo Changement de repertoire vers $newdir
  cd $newdir

  echo Lancement de $REALBNAME

  chroot $newdir $REALBNAME $*

  exit 0

  Veuillez  noter  que vous devez disposer du programme dialog sur votre
  systeme pour que ce script fonctionne. Pour utiliser  virtexec,  creez
  un lien symbolique d'un programme vers celui-ci. Par exemple :

  ln -s /usr/bin/virtexec /usr/bin/virtpasswd
  ln -s /usr/bin/virtexec /usr/bin/virtvi
  ln -s /usr/bin/virtexec /usr/bin/virtpico
  ln -s /usr/bin/virtexec /usr/bin/virtemacs
  ln -s /usr/bin/virtexec /usr/bin/virtmailq

  A  present,  si  vous  tapez virtvi ou virtpasswd ou encore virtmailq,
  cela vous permettra d'editer un fichier, changer le mot de passe  d'un
  utilisateur,  ou  verifier la queue de mail sur votre systeme virtuel.
  Vous pouvez creer autant de liens  vers  virtexec  que  vous  desirez.
  Cependant,  notez  bien que si votre programme necessite une librairie
  partagee, celle-ci doit se trouver sur le systeme de fichiers virtuel.
  Le  binaire doit exister sur le systeme de fichiers virtuel egalement.

  44..33..  NNootteess aa pprrooppooss ddee vviirrttffss eett vviirrtteexxeecc

  J'installe tous les scripts dans /usr/bin. Tout ce que  je  ne  desire
  pas  mettre  sur  un  systeme  de  fichier  virtuel,  je le place dans
  /usr/local. Le script ne touche a rien dans ce repertoire lors  de  la
  copie.  Les  fichiers  ne  devant pas chevaucher plusieurs systemes de
  fichiers  virtuels  doivent  etre  supprimes.  Par  exemple,  ssh  est
  installe  sur  mon systeme, et je n'ai pas voulu que les clefs privees
  soient disponibles  sur  tous  les  systemes  de  fichier.  J'ai  donc
  supprime  le  fichier  des  systemes  de fichiers virtuels apres avoir
  lance virtfs. Je change egalement le resolv.conf et supprime  tout  ce
  qui  contient le nom d'un autre domaine, pour des raisons legales. Par
  exemple, les fichiers /etc/hosts et /etc/HOSTNAME.

  Les programmes pour lesquels je fais un lien symbolique vers  virtexec
  sont :

  +o  virtpasswd -- changer le mot de passe d'un utilisateur

  +o  virtadduser -- ajouter un utilisateur

  +o  virtdeluser -- supprimer un utilisateur

  +o  virtsmbstatus -- consulter l'etat de samba

  +o  virtvi -- editer un fichier

  +o  virtmailq -- verifier la mailq

  +o  virtnewaliases -- reconstruire la table des alias mail

  55..  DDNNSS

  Vous  pouvez  configurer  le  DNS normalement. Ce qui est bien avec ce
  systeme, c'est que tous  les  services  se  comportement  normalement,
  comme s'ils se trouvaient sur des machines physiques differentes. Vous
  pouvez consulter le HOWTO sur le DNS.

  66..  SSyysslloogg

  66..11..  PPrroobblleemmee

  Syslog est l'outil de _l_o_g_g_i_n_g couramment utilise sur les systeme UNIX.
  Syslog est un demon qui ouvre un fichier special appele FIFO. Une FIFO
  est un fichier special, se comportant comme une file  d'attente.  Tout
  ce qui y est ecrit "ressortira" en lecture. Le demon syslog attend les
  donnees en lecture. Il existe des fonctions C  pour  ecrire  dans  les
  FIFO.  Si  vous utilisez ces fonctions C dans vos programmes. Souvenez
  vous que vous avez utilise chroot et que la FIFO /dev/log ne se trouve
  pas   dans  l'environnement  virtuel.  Cela  implique  que  aucun  des
  environnements virtuels ne pourra utiliser syslog. Nous ne pouvons pas
  tout  simplement  copier  le fichier, puisque les programmes utilisent
  /dev/log au lieu du nouveau que nous aurions cree.

  Attention, certaines version de syslog utilisent  une  socket  udp  au
  lieu d'une FIFO. Cependant, ce n'est generalement pas le cas.

  66..22..  SSoolluuttiioonn

  Syslog  peut  scruter  d'autres  FIFO  si  vous  lui dites en ligne de
  commande. Lancer donc syslog avec l'argument :

  syslog -p /virtual/log

  Faites  alors  un  lien  de  /dev/log  vers  /virtual/log   (un   lien
  symbolique) :

  ln -sf /virtual/log /dev/log

  Puis  liez  toutes  les  copies  de  /dev/log  vers ce fichier avec la
  commande (attention, c'est un lien NON symbolique) :

  ln /virtual/log /virtual/domain.com/dev/log

  Le script virtfs ci-dessus le fait pour vous. Puisque /virtual est  un
  disque  entier,  et que les /dev/log sont lies, ils ont le meme numero
  d'inode et pointent vers les memes donnees.  Le  chroot  ne  peut  pas
  empecher  cela,  et  donc  tous  vos  /dev/log virtuels vont a present
  fonctionner. Notez egalement que  tous  les  messages  de  toutes  les
  machines  virtuelles  seront  ecrits  dans un meme fichier. Cependant,
  vous pouvez ecrire des programmes pour filtrer les donnees. Si vous ne
  desirez  pas  ecrire un programme et que vous avez neanmoins besoin de
  fichiers de log separe,  vous  pouvez  lancer  des  programmes  syslog
  differents pour chaque systeme de fichiers virtuel avec la commande :

  syslog -p /virtual/domain1.com/dev/log
  syslog -p /virtual/domain2.com/dev/log

  Cependant,  cela  gaspille  des  processus et je ne le recommande pas.
  Cette version  du  fichier  syslog.init  refait  les  liens  vers  les
  /dev/log  a chaque fois que vous le lancez, au cas ou la configuration
  ait ete endommagee. Voici un syslog.init modifie :

  #!/bin/sh

  # Source function library.
  \&. /etc/rc.d/init.d/functions

  case "$1" in
    start)
          echo -n "Starting dev log: "
          ln -sf /virtual/log /dev/log
          echo done
          echo -n "Starting system loggers: "
          daemon syslogd -p /virtual/log
          daemon klogd
          echo
          echo -n "Starting virtual dev log: "
          for i in /virtual/*
          do
                  if [ ! -d "$i" ]
                  then
                          continue
                  fi
                  if [ "$i" = "/virtual/lost+found" ]
                  then
                          continue
                  fi
                  ln -f /virtual/log $i/dev/log
                  echo -n "."
          done
          echo " done"
          touch /var/lock/subsys/syslog
          ;;
    stop)
          echo -n "Shutting down system loggers: "
          killproc syslogd
          killproc klogd
          echo
          rm -f /var/lock/subsys/syslog
          ;;
    *)
          echo "Usage: syslog {start|stop}"
          exit 1
  esac

  exit 0

  Notez que vous n'avez pas a  mettre  tous  les  systemes  virtuels  de
  fichiers  sur  un seul disque. Cependant, vous devrez lancer un syslog
  different pour chaque partition qui contient  un  systeme  virtuel  de
  fichiers..

  77..  FFTTPP vviirrttuueell

  Wu-ftpd   integre  en  standard  le  support  des  domaines  virtuels.
  Cependant, vous ne pouvez pas utiliser des fichiers de  mot  de  passe
  differents  pour  chaque  domaine. Par exemple, si bob@domaine1.com et
  bob@domaine2.com desirent tous les deux un compte, vous devrez  donner
  a  l'un  des  deux  le  nom  bob2 ou demander a un des utilisateurs de
  choisir un autre nom de login. Puisque  vous  disposez  a  present  de
  systemes  de fichiers differents pour chaque domaine, vous disposez de
  fichiers de mot de passe differents et  ce  probleme  disparait.  Vous
  n'avez  qu'a creer un script virtnewuser et virtpasswd de la facon qui
  est expliquee ci-dessus, et tout fonctionnera. Vous  pouvez  egalement
  disposer d'un ftp _a_n_o_n_y_m_o_u_s dans chaque environnement virtuel, puisque
  ce n'est pas affecte par le systeme de fichiers.

  Les entrees pour wu-ftp dans inetd.conf sont :

  ftp stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.ftp wu.ftpd -l -a

  88..  WWeebb vviirrttuueell

  Apache supporte en standard la gestion des  domaines  virtuels.  C'est
  d'ailleurs  le  seul programme pour lequel je recommande d'utiliser le
  systeme de gestion des domaines virtuels  fourni  avec.  Lorsque  vous
  lancez  un  programme  par  l'intermediaire  d'inetd,  il  y a un cout
  supplementaire, puisque le programme doit demarrer a chaque fois qu'il
  y  a  une  demande  de connexion, et vous obtenez des temps de reponse
  beaucoup  plus  longs,  inacceptables  pour  le  web.  Apache  integre
  egalement  un  mecanisme pour stopper les connexions lorsqu'elles sont
  trop nombreuses.

  Si vous desirez quand meme utiliser inetd pour lancer apache,  ajoutez
  la ligne suivante dans votre fichier inetd.conf :

  www stream tcp nowait www /usr/sbin/virtuald virtuald /virtual/conf.www httpd -f /var/www/conf/httpd.conf

  Dans le fichier /var/www/conf/httpd.conf vous devrez specifier :

  ServerType inetd

  Puis configurez chaque serveur Apache comme pour un seul domaine.

  A  l'heure  ou j'ecris ces lignes, il n'existe pas de HOWTO sur le web
  virtuel. Cependant, je crois qu'il ne va pas tarder a etre ecrit. Dans
  ce  cas,  je  mettrai une reference a ce HOWTO. Si ce document tarde a
  paraitre, et que j'ai assez de demandes, j'ecrirai une  petite  partie
  sur la configuration d'Apache pour les domaines virtuels.

  99..  MMaaiill vviirrttuueell aavveecc PPoopp

  99..11..  AAvviiss aauuxx uuttiilliissaatteeuurrss ddee QQMMaaiill

  Cette section d'applique uniquement a sendmail. Une section pour qmail
  sera ajoutee dans la prochaine version de ce document.

  99..22..  PPrroobblleemmee

  Le support du mail virtuel  est  une  demande  toujours  grandissante.
  Sendmail  affirme  qu'il  supporte  le  mail  virtuel.  En fait, il se
  contente d'etre a l'ecoute de  mail  pour  differents  domaines.  Vous
  pouvez  alors demander a faire suivre le mail quelque part. Cependant,
  si vous le faites suivre sur la machine locale et  que  vous  avez  du
  mail  pour bob@domaine1.com et bob@domaine2.com, ils vont atteindre la
  meme boite. C'est un probleme puisque  les  bob  sont  deux  personnes
  differentes, avec du courrier electronique different.

  99..33..  UUnnee mmaauuvvaaiissee ssoolluuttiioonn

  Vous  pouvez  vous  assurer que chaque nom d'utilisateur est unique en
  utilisant une numerotation des noms d'utilisateurs :bob1, bob2, etc...
  Vous  pourriez  egalement  hacker  le  mail  et  le  pop  pour que ces
  conversions soient invisibles, mais cela peut devenir  desordonne.  Le
  mail  sortant  a pour domaine domaineprincipal.com et vous desirez que
  chaque mail envoye dans chaque  sous-domaine  ait  une  adresse  From:
  differente.

  99..44..  UUnnee bboonnnnee ssoolluuttiioonn

  Chaque  systeme de fichiers virtuel fourni a chaque domaine un fichier
  /etc/passwd. Cela signifie que  bob@domaine1.com  et  bob@domaine2.com
  sont   des  utilisateurs  differents  dans  des  fichiers  /etc/passwd
  differents, donc le mail ne constituera aucun probleme. Ils  possedent
  egalement  chacun un spool de mail, donc les boites aux lettres seront
  des  fichiers  differents  sur  des  systeme  de   fichiers   virtuels
  differents.

  Cependant, sendmail necessite un changement mineur de son code source.
  Sendmail a un fichier nomme /etc/sendmail.cw  qui  contient  tous  les
  noms de machine pour lequel il delivrera le mail localement au lieu de
  le faire suivre a une autre machine. Sendmail  fait  une  verification
  interne de toutes les interfaces reseau de la machine pour initialiser
  cette liste avec les adresses IP locales. Cela presente un probleme si
  vous envoyez de mails entre deux domaines virtuels de la meme machine.
  Sendmail pensera que l'autre domaine virtuel est une adresse locale et
  il  delivrera le mail localement. Par exemple, bob@domaine1.com envoie
  un mail a fred@domaine2.com. Puisque le sendmail de domaine1.com pense
  que  domaine2.com  est  une  adresse  locale,  il va envoyer ce mail a
  domaine1.com et ne  l'enverra  jamais  a  domaine2.com.  Vous  avez  a
  modifier  sendmail  (ce  que  j'ai  fait  sans probleme sur la version
  8.8.5) :

  vi v8.8.5/src/main.c # Environ a la ligne 494
  Vous devriez remplacer la ligne :

  load_if_names();

  Par :

  /* load_if_names(); Commente puisque cela casse les domaines virtuels */

  Notez que cette modification n'est  necessaire  que  si  vous  desirez
  envoyer  du  mail entre des domaines virtuels, ce qui est probable, je
  pense.

  Cela corrigera le probleme. Cependant, l'adaptateur  reseau  principal
  eth0  n'est  pas  supprime.  Ainsi, si vous envoyez un mail depuis une
  adresse IP virtuelle vers une adresse sur eth0 de la meme machine,  il
  sera  delivre  localement.  Pour  cela, j'utilise une adresse IP bidon
  virtuel1.domaine.com (10.10.10.157). Je n'envoie jamais de mail a  cet
  hote,  les  domaines  virtuels  non plus. C'est aussi l'adresse IP que
  j'utiliserai pour me connecter sur la machine via ssh,  pour  verifier
  si le systeme fonctionne.
  Editez /etc/sendmail.cw et mettez-y les domaines locaux.

  vi /etc/sendmail.cw
  mail.domaine1.com
  domaine1.com
  domaine1
  localhost

  Creez  /etc/sendmail.cf  comme  vous  le  feriez  normalement avec m4.
  J'utilise :

  divert(0)dnl
  VERSIONID(`@(#)tcpproto.mc      8.5 (Berkeley) 3/23/96')
  OSTYPE(linux)
  FEATURE(redirect)
  FEATURE(always_add_domain)
  FEATURE(use_cw_file)
  FEATURE(local_procmail)
  MAILER(local)
  MAILER(smtp)

  Editez /etc/sendmail.cf pour repondre sur voter domaine virtuel :

  vi /etc/sendmail.cf # Vers la ligne 86
  Vous devriez avoir :

  #Dj$w.Foo.COM

  Remplacez cette ligne par :

  Djdomaine1.com

  Sendmail ne peut pas etre lance tel quel, vous allez devoir le  lancer
  a  travers  inetd.  C'est un moyen inefficace qui implique un temps de
  reponse plus long, mais si vous avez un site si  occupe  pour  que  la
  difference  soit  importante,  alors vous devriez utiliser une machine
  dediee a ce site. Notez que vous de devez PAS utiliser  l'option  -bd.
  Notez  egalement que vous devez lancer sendmail -q pour chaque domaine
  que vous gerez. Le nouveau fichier sendmail.init est le suivant :

  #!/bin/sh

  # Source function library.
  \&. /etc/rc.d/init.d/functions

  case "$1" in
    start)
          echo -n "Starting sendmail: "
          daemon sendmail -q1h
          echo
          echo -n "Starting virtual sendmail: "
          for i in /virtual/*
          do
                  if [ ! -d "$i" ]
                  then
                          continue
                  fi
                  if [ "$i" = "/virtual/lost+found" ]
                  then
                          continue
                  fi
                  chroot $i sendmail -q1h
                  echo -n "."
          done
          echo " done"
          touch /var/lock/subsys/sendmail
          ;;
    stop)
          echo -n "Stopping sendmail: "
          killproc sendmail
          echo
          rm -f /var/lock/subsys/sendmail
          ;;
    *)
          echo "Usage: sendmail {start|stop}"
          exit 1
  esac

  exit 0

  Pop devrait s'installer normalement, sans effort supplementaire.  Vous
  n'avez qu'a modifier l'entree pour pop dans le fichier inetd.conf pour
  utiliser le demon virtuald. Pour sendmail et pop, cela donne :

  pop-3 stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.pop in.qpop -s
  smtp stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.mail sendmail -bs

  1100..  LLee rreessttee

  Tout autre service devrait suivre une procedure similaire :

  +o  Ajouter  le  binaire  et  les  librairies  au  systeme  virtuel  de
     fichiers.

  +o  L'ajouter dans /etc/inetd.conf

  +o  Creer un fichier /virtual/conf.service.

  +o  Creer tout script virtuel manquant.

  J'ai  fait  des  essais  avec samba et j'ai change un mot de passe pop
  virtuel a travers Eudora. Chacun fonctionne sans  aucun  probleme.  Si
  j'ai   suffisamment   de   demandes,   j'ecrirai   une   section   sur
  l'installation d'un samba virtuel.

  1111..  CCoonncclluussiioonn

  Voici tout ce dont vous avez besoin. J'espere que cet article repond a
  vos  attentes. Vous pouvez utiliser l'email a Computer Resource Center
  pour tout commentaire (NdT: en anglais bien sur).  Si  vous  avez  une
  question, ou si vous me proposez une mise a jour, faites le moi savoir
  et je l'ajouterai.

  1122..  FFAAQQ

  Q1. Pourquoi n'y a-t-il aucun question dans cette FAQ ?

  R1. Parce que personne n'en a encore pose.

