  Virtual Services Howto

  Brian Ackerman, (brian@nycrc.net)
  v2.1, 15 August 1998
  , (linusben@bawi.org)
  06 April 1999

    ýۿ  (virtualize) ϴ Ϳ  
  û  .
  ______________________________________________________________________

  

  1. Ұ
     1.1 ʿ ĵ
     1.2 
     1.3 ǵ(Feedback)
     1.4   (Revision History)
     1.5 ۱/

  2. IP ٸ(IP Aliasing)
  3. Virtuald
     3.1 Ұ
     3.2 Inetd
     3.3  
     3.4 ҽڵ

  4.  ũƮ
     4.1 Virtfs
     4.2 Virtexec
     4.3 (Note)

  5. DNS
  6. Syslogd
     6.1 
     6.2 Solution
        6.2.1 Setup Links
        6.2.2 Syslogd.init
     6.3  Syslogd
        6.3.1 ϳ ũ Ѱ syslogd
        6.3.2 ϳ ο ϳ syslogd

  7.  FTP
     7.1 Inetd
     7.2 ͸ FTP(Anonymous FTP)
     7.3  FTP ڵ

  8.  
     8.1 Virtuald ϱ
        8.1.1  !(Not recommended)
        8.1.2 Inetd
        8.1.3 Httpd.conf
        8.1.4 
        8.1.5 Httpd.init
     8.2 Apache VirtualHost  ϱ
        8.2.1 Access.conf
        8.2.2 Httpd.conf
        8.2.3 Srm.conf
        8.2.4 Httpd.init
     8.3   ÷ο(File Descriptor Overflow)
        8.3.1 
        8.3.2  ġ 
     8.4 ϳ IP  
        8.4.1 IP ϱ
        8.4.2 
     8.5   

  9.  /POP 
     9.1 
     9.2 ذå
     9.3 Sendmail ̿ ذå
        9.3.1 Ұ
        9.3.2 Sendmail   
        9.3.3 Sendmail  ϱ
        9.3.4 Sendmail  
        9.3.5    Sendmail : The Hack (PRE8.8.6)
        9.3.6    Sendmail : Sendmail ο  (POST8.8.6)
        9.3.7 Sendmail.init
        9.3.8 Inetd 
     9.4 Qmail ̿ 
        9.4.1 Ұ
        9.4.2   
        9.4.3  (Domain Master User) 
        9.4.4 Tcpserver
        9.4.5 Qmail.init
        9.4.6 ҽ(Source)
        9.4.7 ҽ(Source)
     9.5  (Acknowledgement)

  10.   (Virtual Samba)
     10.1 
     10.2 Inetd
     10.3 Smb.init

  11. ٸ  
  12. 
  13.  Ǵ ׵(FAQ)

  ______________________________________________________________________

  1.  Ұ

  1.1.  ʿ ĵ

  ý  񽺸 ϴ    ƴ, 
   ̻ 䱸Ѵ.    ӽ ü ϴ
    Թ(primer) ƴϴ.

   Ͽ   Ʒ 鿡 ؼ  ظ ϰ
  ִٴ Ͽ ̷ ̴:(ѱ ڷ   Դϴ.
  翬?-)

  o   Ŀ ϰ IP ٸ(aliasing)  IP Alias mini-HOWTO
      IP Aliasing ϱ mini-HOWTO

  o  Ʈũ   NET-3 HOWTO

  o  inetd  NET-3 HOWTO

  o  Ʒ   Ʈũ Ű (Sendmail) ѱ۰
      ġ(Apache) ġ(Apache)-ѱۻƮ Qmail (SAMBA)

  o  DNS  DNS HOWTO DNS ù

  o   ý    Linux Systems Administrators's
     Guide KLDP ý  

  o      WWW Ͽ

      Ϳ  Ȯ ٸ, ũ Ѿư 
   Ȯϰ ϱ ٶ.  ׿ ؼ  Ͽ 
      ̴. õ HOWTO ڿ  
  ϴ   ̴.

  1.2.  

  (virtual)   ϳ ӽſ  Ʈũ ī
  ̵  IP ּҸ νϵ ϴ  ִ. IP
  ٸ(aliasing)  Ʈũ ī尡    񿡼
  ϳ ̻ IP ּҸ ϴ Ŀ ɼ̴.   Ŀ ڿ
   ȯ ̷(̰ ſ  ̷) ڴ
  ġ ϳ ̻   ִ ó νϰ ȴ.

  ̷  ȯ(multiplexing) ϳ  ȣϴ Ͱ
     (www.domain1.com www.domain2.com )
  ȣ  ִ. ϰԵ κ (FTP, web, mail) 
   ٷ  ֵ Ǿ ʴ. ̵ ϰ ۵Ű
  ؼ  Ӹ ƴ϶ ҽ ڵ嵵 Ѿ Ѵ.  
   ̷  Ѽ  ӽ    Ѵ.

     ؼ   ʿϴ.  (virtuald) 
    Ĺݿ ٷ ̴.

  1.3.  ǵ(Feedback)

    Ű Ʈǰ ҽڵ峪   
   Ȯ ̴.    Ưκ Һиϴٰ Ǹ
  Ÿ   ̳  email .  
  Ͽ   κ  ʵ ̸ Ư(specific)
  κ  Ȯϰ ְ, Һи κ ġ  
  ǥ ֱ ٶ. ϳ ߿   VIRTSERVICES HOWTO
   ־   ̴. ׷  ٸ ϵ 
  Ϸ ޵ ̱  õ  ִ. ( ģ  
      ʴ´ٴ  ˰ ִ.)

      ̹Ƿ ״ ؼ  
  ٶ.     ϰ Ѵٸ,  ýۿ ´ 
  ־  ̴.     ٸ   .
  ġ   ϰ ġ ߻  ޼  
  شٸ  װ    ǰ 忡 Ἥ  ̴.

  1.4.    (Revision History)

  V1.0

   

  V1.1

  ߾   κ  

  V1.2

  ¥ 

  V2.0

  HTML ũ 

   

  ο  ɼ

  ο Qmail 

  Syslogd 

  FTP 

  Virtuald ⺻ ɼ

  ο (SAMBA) 

  FAQ 

  V2.1

   н(path) /usr/local  Changed all paths to /usr/local.

  Virtuald VERBOSELOG  ɼ ߰

  Virtualmailfilter setuid/setgid  

  Virtualmailfilter excel  

  Virtualmailfilter ҹ  .

  Virtualmailfilter ȯ  Ȯ 

  Virtualmailfilter/virtmaildelivery mbox ڵ 

  Qmail tcpserver.init pop  ߰

  FAQ ٸ γ  ߰

  Virtmailfilter Ȩ 丮 virtmaildelivery  κ 

  1.5.  ۱/

    ۱ Copyright (c) 1997 by The Computer Resource Center
  Inc.   ִ.

    纻     ü(, )
  ؼ    ϴ.   ϰ Ǵµ,
  ٸ ڸ  Ѵٴ  Ѵ.   
  Ǹ  ̷   ؼ Computer Resource
  Center  ˷ֱ ٶ.

         ̷  ִ.

    纻    ۱ǿ  ÿ 㰡  
  ǰ   Ե  ȴ.

  ϸ, 츮   θ ؼ   θ ⸦
  ٶ.  , 츮    ۱   ֱ⸦
  ϹǷ,      ˱⸦ ٶ.

  2.  IP ٸ(IP Aliasing)

  IP ٸ  ȣ ӽ Ű   ʿ Ŀ
  ɼ̴. ̹ ̰Ϳ  ̴-Ͽ ִ.  IP aliasing
   IP Aliasing ϱ mini-HOWTO ̰  ϴ
  ˰ ʹٸ   ϶.

  3.  Virtuald

  3.1.  Ұ

   Ʈũ  2 IP 巹/Ʈ  ̷.
  Ʈũ α׷  API(Applications Program Interface) 
  API Ҹ.  ġ ִ ϰ  ۵ϱ 
  Ʈũ   ͸ ְ޴  Ͽ д 
  صȴ.   ּҸ ִ Լ getsockname̴.
  Virtuald getsockname Ͽ  ý  IP 
   ǴѴ. Virtuald   о ش IP Ҵ
  丮 ޴´. ׸ chroot ؼ  񽺿 
   Ѱش. Chroot Ʈ 丮 缳Ͽ Ӱ 
  Ʈ Ʈ ϱ   丮  α׷鿡 
  õȴ. Ʈũ α׷ ؼ   ġ ƹϵ
  Ͼ  ó ϰ  ̴. Virtuald inetd 
  α׷ Ǿ  񽺶    ִ.

  3.2.  Inetd

  Inetd ܺο Ʈũ   õ (  POP
  û)   Ʈ ϰ ִٰ û   
  ִ Ʈũ super server̴. Inetd Ʈũ 
  ϸ鼭 Ư α׷  Ʈũ  ִ  Ѵ. ̷
     񽺰 Ʈũ  ʿ   ʿϰ
  Ǵ    ִ.

  ǥ /etc/inetd.conf   :

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

   񽺸   /etc/inetd.conf    ȴ:

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

  3.3.   

   񽺵  IP 丮 ϰ  
     Ͽ  ȴ.  ϳ ü  
  (master config file)  ƴϸ   ϵ ؼ
   񽺿  ٸ Ʈ    ִ.  
   :

  # This is a comment and so are blank lines

  # Format IP SPACE dir NOSPACES
  10.10.10.129 /virtual/domain1.com
  10.10.10.130 /virtual/domain2.com
  10.10.10.157 /virtual/domain3.com

  # Default option for all other IPs
  default /

  3.4.  ҽڵ

  Ʒ virtuald α׷  C ҽ ڵ̴. ̰ ϰ
  /usr/local/bin Ʒ 0755 ۹̼ ġ϶.(ڿ ׷ 
  root Ѵ.) Ͻÿ VERBOSELOG ɼ   ִµ
  (  ɼǸ Ѵ), ̰    Ѵ.

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

  #undef VERBOSELOG

  #define BUFSIZE 8192

  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)
          {
                  syslog(LOG_ERR,"getipaddr: getsockname failed: %m");
                  return -1;
          }
          if (!(ipptr=inet_ntoa(virtual_addr.sin_addr)))
          {
                  syslog(LOG_ERR,"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")))
          {
                  syslog(LOG_ERR,"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,' ')))
                  {
                          syslog(LOG_ERR,"iptodir: strchr failed");
                          return -1;
                  }
                  *bufptr++=0;
                  if (!strcmp(buffer,ipaddr))
                  {
                          strncpy(dirbuf,bufptr,sizeof(dirbuf)-1);
                          *dir=dirbuf;
                          break;
                  }
                  if (!strcmp(buffer,"default"))
                  {
                          strncpy(dirbuf,bufptr,sizeof(dirbuf)-1);
                          *dir=dirbuf;
                          break;
                  }
          }
          if (fclose(fp)==EOF)
          {
                  syslog(LOG_ERR,"iptodir: fclose failed: %m");
                  return -1;
          }
          if (!*dir)
          {
                  syslog(LOG_ERR,"iptodir: ip not found in conf file");
                  return -1;
          }
          return 0;
  }

  int main(int argc,char **argv)
  {
          char *ipaddr,*dir;

          openlog("virtuald",LOG_PID,LOG_DAEMON);

  #ifdef VERBOSELOG
          syslog(LOG_ERR,"Virtuald Starting: $Revision: 1.49 $");
  #endif
          if (!argv[1])
          {
                  syslog(LOG_ERR,"invalid arguments: no conf file");
                  exit(0);
          }
          if (!argv[2])
          {
                  syslog(LOG_ERR,"invalid arguments: no program to run");
                  exit(0);
          }
          if (getipaddr(&ipaddr))
          {
                  syslog(LOG_ERR,"getipaddr failed");
                  exit(0);
          }
  #ifdef VERBOSELOG
          syslog(LOG_ERR,"Incoming ip: %s",ipaddr);
  #endif
          if (iptodir(&dir,ipaddr,argv[1]))
          {
                  syslog(LOG_ERR,"iptodir failed");
                  exit(0);
          }
          if (chroot(dir)<0)
          {
                  syslog(LOG_ERR,"chroot failed: %m");
                  exit(0);
          }
  #ifdef VERBOSELOG
          syslog(LOG_ERR,"Chroot dir: %s",dir);
  #endif
          if (chdir("/")<0)
          {
                  syslog(LOG_ERR,"chdir failed: %m");
                  exit(0);
          }
          if (execvp(argv[2],argv+2)<0)
          {
                  syslog(LOG_ERR,"execvp failed: %m");
                  exit(0);
          }

          closelog();

          exit(0);
  }

  4.   ũƮ

  4.1.  Virtfs

    ڽŸ 丮  .   chroot
  Ϸ Ѵٸ,   ̺귯 ̳ʸ ϵ, 
    ϴ  ʿϴ.     ο
  ؼ /virtual/domain1.com Ѵ.

     ũ  ʿϰ , װ ο ӽŰ
  Ʈũ ī带 ġϴ ͺٴ  ϴ.   
  ϰ ʹٸ ϵ ũ ̿  ִµ,    
  ϸ 2M ణ Ѵ  ϰ ȴ. ,  ũƮ
   Ϲ ý    Ͻýۿ  
  Ϸ  ̴.

    virtfs ũƮ ִ:

  #!/bin/sh

  echo '$Revision: 1.49 $'

  echo -n "Enter the domain name: "
  read domain

  if [ "$domain" = "" ]
  then
          echo Nothing entered: aborting
          exit 0
  fi

  leadingdir=/virtual

  echo -n "Enter leading dir: (Enter for default: $leadingdir): "
  read ans

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

  newdir=$leadingdir/$domain

  if [ -d "$newdir" ]
  then
          echo New directory: $newdir: ALREADY exists
          exit 0
  else
          echo New directory: $newdir
  fi

  echo Create $newdir
  mkdir -p $newdir

  echo Create bin
  cp -pdR /bin $newdir

  echo Create dev
  cp -pdR /dev $newdir

  echo Create dev/log
  ln -f /virtual/log $newdir/dev/log

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

  echo Create etc/skel
  mkdir -p $newdir/etc/skel

  echo Create 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 Create home/c/crc
  mkdir -p $newdir/home/c/crc
  chown crc.users $newdir/home/c/crc

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

  echo Create proc
  mkdir -p $newdir/proc

  echo Create sbin
  cp -pdR /sbin $newdir

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

  echo Create usr
  mkdir -p $newdir/usr

  echo Create usr/bin
  cp -pdR /usr/bin $newdir/usr

  echo Create usr/lib
  mkdir -p $newdir/usr/lib

  echo Create usr/lib/locale
  cp -pdR /usr/lib/locale $newdir/usr/lib

  echo Create usr/lib/terminfo
  cp -pdR /usr/lib/terminfo $newdir/usr/lib

  echo Create usr/lib/zoneinfo
  cp -pdR /usr/lib/zoneinfo $newdir/usr/lib

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

  echo Create usr/sbin
  cp -pdR /usr/sbin $newdir/usr

  echo Linking usr/tmp
  ln -s /tmp $newdir/usr/tmp

  echo Create var
  mkdir -p $newdir/var

  echo Create var/lock
  cp -pdR /var/lock $newdir/var

  echo Create var/log
  mkdir -p $newdir/var/log

  echo Create var/log/wtmp
  cp /dev/null $newdir/var/log/wtmp

  echo Create var/run
  cp -pdR /var/run $newdir/var

  echo Create var/run/utmp
  cp /dev/null $newdir/var/run/utmp

  echo Create var/spool
  cp -pdR /var/spool $newdir/var

  echo Linking var/tmp
  ln -s /tmp $newdir/var/tmp

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

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

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

  exit 0

  4.2.  Virtexec

   ȯ濡 ɾ Ű ؼ  chroot ̿Ͽ
  丮   ɾ ؾ߸ Ѵ.   ɿ ؼ
  ̷    ִ Ư нũƮ virtexec ҰѴ:

  #!/bin/sh

  echo '$Revision: 1.49 $'

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

  if [ "$BNAME" = "virtexec" ]
  then
          echo Cannot run virtexec directly: NEED a symlink
          exit 0
  fi

  if [ "$FIRST4CHAR" != "virt" ]
  then
          echo Symlink not a virt function
          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 No virtual environments exist
          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.49 $'

  if [ ! -d "$newdir" ]
  then
          echo New directory: $newdir: NOT EXIST
          exit 0
  else
          echo New directory: $newdir
  fi

  echo bname: $BNAME

  echo realbname: $REALBNAME

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

  echo Changing to $newdir
  cd $newdir

  echo Running program $REALBNAME

  chroot $newdir $REALBNAME $*

  exit 0

   ũƮ Ǳ ؼ  ýۿ  dialog α׷
  ġǾ ־ Ѵٴ  ϶. virtexec ϱ ؼ
   ɺ ũ ָ ȴ.    .

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

  ũ Ų  virtvi Ű  ý vi ų ̴.
   virtpasswd  ý  йȣ ٲ ̰,
  virtmailq    ť(queue) Ȯ ̴.  ϴ
  ŭ virtexec   ִ.   α׷  ̺귯
  ʿ Ѵٸ ̳ʸ   Ͻýۿ ġų 
  ִ.

  4.3.  (Note)

    ũƮ /usr/local/bin ġߴ.  ̿ܿ 
  Ͻýۿ ְ  ͵ /usr/local ξ. ũƮ
  /usr/local ִ   Ͻý  ʴ´. 
  Ͻý Ѿ ȵǴ ߿ ϵ ݵ  ýۿ
  ŵǾ Ѵ.  ,  ýۿ ssh ġǾ ִµ, 
    ý  Ű(private key)  ʱ
  , virtfs Ų Ŀ    ýۿ ̰
  ߴ.  resolv.conf ٲٰ,  ȿ ִ ٸ ε
  ̸   ͵ ߴ. ̷ ͵δ /etc/hosts
  /etc/HOSTNAME  ִ.

   virtexec ɺ ũŲ α׷̴:

  o  virtpasswd --  йȣ 

  o  virtadduser --  ߰

  o  virtdeluser --  

  o  virtsmbstatus -- (SAMBA)  

  o  virtvi --  

  o  virtmailq -- ť Ȯ

  o  virtnewaliases -- ٸ ̺  

  5.  DNS

  DNS     ִ. ̰ DNS HOWTO.   ϶.

  6.  Syslogd

  6.1.  

  Syslogd Ϲ н ýۿ Ǵ ý  ̴.
  Syslogd FIFO Ҹ Ư   ε, FIFO ϳ
    ۵ϴ Ư ̴.  ʿ   
  д ʿ Ÿ ȴ. Syslogd д ʿ  ͸
  ٸ ִ. C Լ   ʿ 𰡸   ִ
  Լ ִµ, α׷  Լ Ѵٸ,   
  syslogd  ȴ.

  Chroot ϴ ȯ濡 syslogd (/dev/log) о FIFO
   ʰ ȴ. ̰   ȯ濡 syslogd  
  ٴ  ǹѴ.

  6.2.  Solution

  6.2.1.  Setup Links

  Syslogd ɾ ο  شٸ ٸ FIFO ã  ִ:

  syslogd -p /virtual/log

  ׸ /virtual/log /dev/log ɺ ũŲ:

  ln -sf /virtual/log /dev/log

  ׸  /dev/log 纻  Ϸ ϵ帵ũ Ų:

  ln -f /virtual/log /virtual/domain1.com/dev/log

  virtfs ũƮ ̹   Ѵ. /virtual ũ 
   ְ /dev/log ϵ帵ũǾ ִ ̱ , ̵ 
  inode ڸ   ͸ Ű ִ.   /dev/log
   ÿ ۵̱  chroot ̰   .  
  ȯ濡  ޼ ϳ ҿ ϵȴٴ  ϶.
  ,  Ϳ ϴ ڷḸ ɷ  α׷ 
     ̴.

  6.2.2.  Syslogd.init

  syslogd.init   syslogd   /dev/log FIFO
      Ź /dev/log ϵ帵ũѾ Ѵ. 
   syslogd.init  ִ:

  #!/bin/sh

  . /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/syslogd
          ;;
    stop)
          echo -n "Shutting down system loggers: "
          killproc syslogd
          killproc klogd
          echo
          rm -f /var/lock/subsys/syslogd
          ;;
    *)
          echo "Usage: syslogd {start|stop}"
          exit 1
  esac

  exit 0

  6.3.   Syslogd

  6.3.1.  ϳ ũ Ѱ syslogd

     ϳ Ͻý ļ ٸ ũ ִ
    ýۿ ϰ Ѵٸ, ϵ ũ ؼ  ٸ
  ũ   ٴ  ϱ ٶ. ̰  ο
  ؼ  ٸ ũ  syslogd Ѿ Ѵٴ
   ǹѴ.  ,   /virtual1 13  
  ְ, /virtual2 15   ִٸ, 13 ο
  ؼ /virtual1/log ϵ ũ Ų ,  syslogd -p
  /virtual1/log     syslogd Ų. 
   /virtual2 15 ٸ  /virtual2/log ϵ帵ũ
  Ų  syslogd -p /virtual2/log   syslogd Ų.

  6.3.2.  ϳ ο ϳ syslogd

     ϵ ϳ ġ ߽Ű  ʴٸ 
  ο ؼ syslogd  ų  ִ. ̰ μ ID
  ϱ  ϰ   ƴ, ̰ ϴ  
  ̴.  syslogd.init Ͽ  chroot /virtual/domain1.com
  syslogd  ο  syslogd ų  ִ. ̰
  chroot ȿ  syslogd Ű   /var/log ƴ϶
  /virtual/domain1.com/var/log ϵ ̴.  ýۿ Ϲ
  syslogd Ŀ   klogd Ű   .

  7.   FTP

  7.1.  Inetd

  Wu-ftpd ü  ýۿ °   ִ. , 
  ο ؼ и йȣ    .  ,
   bob@domain1.com    bob@domain2.com   ,   
   ϳ ̸ bob2 ٲٴ  ̿ ٸ  ̸
  ؾ Ѵ.      ο ؼ 
  Ͻý  ִٸ,  йȣ    ֱ 
  ̷  ذ  ִ.  virtnewuser ũƮ ̿Ͽ
  ڸ  virtpasswd ũƮ ̿ؼ йȣ  ָ
    Ȳ      ִ.

  wu-ftpd  inetd.conf Ʈ  :

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

  7.2.  ͸ FTP(Anonymous FTP)

  ̰ virtuald    ʴ´. 켱
  /virtuald/domain1.com/etc/passwd ȿ Ϲ   FTP
  ڸ Ѵ.

  ftp:x:14:50:Anonymous FTP:/var/ftp:/bin/false

  ׸ ͸ FTP  丮 Ѵ.  ο ؼ
   ٸ йȣ   ֱ  ͸ FTP 
     ִ. FTP  ̹ chroot 
  /virtual/domain1.com 丮 Ǿ ֱ   ߰ε
  տ  ʿ .

  7.3.   FTP ڵ

  Wu-ftpd 湮 ׷(guest group)̶  Ѵ. ̰
  ̿ϸ  ڵ鿡 ؼ ٸ FTP    ִ. 
  FTP  Ư   chroot ̿ؼ ڰ  丮
        ִ.     ȿ 
   ڵ ߰Ѵٸ  ڵ ý ϵ  
   ȴ.
  湮 ׷ /virtual/domain1.com/etc/ftpaccess Ͽ ߰ȴ.

  /virtual/domain1.com/etc/passwd ȿ Ʈ  ϴ Ȩ
  丮 chroot 丮 /./ иѴ.

  guest1:x:8500:51:Guest FTP:/home/g/guest1/./incoming:/bin/false

    湮 Ȩ ͸ FTP ϴ   
  ش.   ο ؼ йȣ   ϱ 
   ο 湮  ϴ, ׸   
  ڵ 湮 ׷ Ǿ ִ   ִ. ٽ ѹ
  ϴµ, ̹ chroot ؼ FTP  /virtual/domain1.com
  丮 Ǿ ֱ  ξտ  ߰  
  ʿ .

  8.   

  8.1.  Virtuald ϱ

  8.1.1.   !(Not recommended)

  ġ ⺻     ش. ġ 
      ϴ  ϴ  α׷̴.
  inetd ؼ  α׷ Ǵ   밡 ʿ ϸ,
  α׷ ϱ ؼ ׻ inetd ۵Ǿ Ѵٴ 
  ִ.  ̷   ð  ε, ٸ Ʈũ
  񽺿 ̷  ߵ   񽺿 ׷ 
  ̴. ġ  ʹ  û      ִ
    ִµ,   ũ  Ը Ʈ ߿
     ִ.

   ϸ, ġ  virtuald Բ Ͽ  ý
  ϴ    ̴. virtuald ϴ 
  ϰ ϴ 񽺰 ο     
    쿡  κ ä ̴.  virtuald ̹
  Ϻϰ  ý ϴ  ڵ带 üϱ   ƴϴ.

      ׷ ϰ  ϴ  鿡Դ 
  ȿ  .

  8.1.2.  Inetd

  /etc/inetd.conf  ϶.

  vi /etc/inetd.conf # Add this line
  www stream tcp nowait www /usr/local/bin/virtuald \
          virtuald /virtual/conf.www httpd -f /var/www/conf/httpd.conf

  8.1.3.  Httpd.conf

  /var/www/conf/httpd.conf ϶.

  vi /var/www/conf/httpd.conf # Or wherever you put the Apache config files
  It should say:
  ServerType standalone

  Replace it with:
  ServerType inetd

  8.1.4.  

  ׸ ġ  Ϲ ϴ  Ѵ.

  8.1.5.  Httpd.init

  inetd ؼ ġ   httpd.init ʿ.

  8.2.  Apache VirtualHost  ϱ

  ġ     -  access.conf ,  httpd.conf , srm.conf
  . ġ ο      ʿ .
  ,   Ϸ  ִ  ξ ϰ ϱⰡ
  ٰ Ǳ   Ͽ   Ÿ 
  ϰڴ.

  8.2.1.  Access.conf

     丮   ϴµ ȴ. 
   ο   ٸ ɼ   ִ ִ
    ִ.

  # /var/www/conf/access.conf: Global access configuration

  # Options are inherited from the parent directory
  # Set the main directory with default options
  <Directory />
  AllowOverride None
  Options Indexes
  </Directory>

  # Give one domain a passwd protected directory
  <Directory /virtual/domain1.com/var/www/html/priv>
  AuthUserFile /var/www/passwd/domain1.com-priv
  AuthGroupFile /var/www/passwd/domain1.com-priv-g
  AuthName PRIVSECTION
  AuthType Basic
  <Limit GET PUT POST>
  require valid-user
  </Limit>
  </Directory>

  # Give another domain Server Side Includes
  <Directory /virtual/domain2.com/var/www/html>
  Options IncludesNOEXEC
  </Directory>

  8.2.2.  Httpd.conf

    ġ  ֵ ɼ Ѵ.   ο
  ؼ  ٸ ɼ ϴ Ϳ    ִ.

  # /var/www/conf/httpd.conf: Main server configuration file

  # Begin: main conf section

  # Needed since not using inetd
  ServerType standalone

  # Port to run on
  Port 80

  # Log clients with names vs IP addresses
  HostnameLookups on

  # User to run server as
  User www
  Group www

  # Where server config, error and log files are
  ServerRoot /var/www

  # Process Id of server in this file
  PidFile /var/run/httpd.pid

  # Internal server process info
  ScoreBoardFile /var/www/logs/apache_status

  # Timeout and KeepAlive options
  Timeout 400
  KeepAlive 5
  KeepAliveTimeout 15

  # Number of servers to run
  MinSpareServers 5
  MaxSpareServers 10
  StartServers 5
  MaxClients 150
  MaxRequestsPerChild 30

  # End: main conf section

  # Begin: virtual host section

  # Tell server to accept requests for ip:port
  # I have one for each IP needed so you can explicitly ignore certain domains
  Listen 10.10.10.129:80
  Listen 10.10.10.130:80

  # VirtualHost directive allows you to specify another virtual
  # domain on your server.  Most Apache options can be specified
  # within this section.
  <VirtualHost www.domain1.com>

  # Mail to this address on errors
  ServerAdmin webmaster@domain1.com

  # Where documents are kept in the virtual domain
  DocumentRoot /virtual/domain1.com/var/www/html

  # Name of the server
  ServerName www.domain1.com

  # Log files Relative to ServerRoot option
  ErrorLog logs/domain1.com-error_log
  TransferLog logs/domain1.com-access_log
  RefererLog logs/domain1.com-referer_log
  AgentLog logs/domain1.com-agent_log
  # Use CGI scripts in this domain
  ScriptAlias /cgi-bin/ /var/www/cgi-bin/domain1.com/
  AddHandler cgi-script .cgi
  AddHandler cgi-script .pl
  </VirtualHost>

  <VirtualHost www.domain2.com>

  # Mail to this address on errors
  ServerAdmin webmaster@domain2.com

  # Where documents are kept in the virtual domain
  DocumentRoot /virtual/domain2.com/var/www/html

  # Name of the server
  ServerName www.domain2.com

  # Log files Relative to ServerRoot option
  ErrorLog logs/domain2.com-error_log
  TransferLog logs/domain2.com-access_log
  RefererLog logs/domain2.com-referer_log
  AgentLog logs/domain2.com-agent_log

  # No CGI's for this host
  </VirtualHost>
  # End: virtual host section

  8.2.3.  Srm.conf

     û  񽺸    
       Ѵ.  ο ؼ ̰
  ٲ ʿ . ġ ⺻ ϴ    ״
   ýۿ ص ۵ ̴.

  8.2.4.  Httpd.init

  httpd.init Ͽ ؼ Ư   . ġ ǥ
   ̿϶.

  8.3.    ÷ο(File Descriptor Overflow)

  8.3.1.  

  ̰  (standalone style) ġ  شȴ.
  inetd ؼ    ٸ ΰ   
     ̺ ´.

  ġ    α ϵ μ  Ǵٸ 
   (file descriptor) ȴ.   μ ؼ
  256   ڸ   ִٴ  ִ.  
   Ѵٸ    ڵ ʿϰ ȴ. 
  ϳ ġ  μ ʹ   ϰ Ѵٸ
   ̺ ĳ(overflow)  ִ. ̰ Ư αװ ۵
    , CGI   ִٴ  ǹѴ.

  8.3.2.   ġ 

    ο ؼ ټ  ڸ  ִٰ ϸ
   ġ  50  ƹ  ų  ִ.
  ,  ̷ Ȳ  ߻Ѵٸ /var/www1
  1-25  ġ  Ҵϰ, /var/www2
  26-50 ġ  Ҵϴ    ִ.
  ̰    ڽŸ  , α 丮 
  ȴ.    ڽŸ Listen VirtualHost 丮
   ־ Ѵ. httpd.init Ͽ   
  ־ Ѵٴ   .

  8.4.  ϳ IP  

  8.4.1.  IP ϱ

  HTTP(HyperText Transfer Protocol)  1.1  ̸
  Ŭ̾Ʈ ˸  ߰Ǿ. ̰ Ŭ̾Ʈ  ã
   IP 巹  ã ʿ䰡 ٴ  ǹѴ.  ΰ
     IP 巹   ٸ  Ʈ ٹ 
  ִ. ġ   Ȱ,   ٸ Listen 
  ʿ䰡 ٴ  ٸ.  (ΰ   IP  
  Listen   ȴ.)

  8.4.2.  

    Ǵ  virtuald  ϱ ؼ IP
  巹 Ѵٴ ̴.   virtuald ·δ 
  ο  Ǯ 丮 chroot ٸ   . ,
   ϳ IP ؼ   ֱ   ο
  ؼ  Ǯ 丮   Ұϴ. IP ϴ
    Ŭ̾Ʈ IP Ǯ 丮  ؾ Ѵ.  ̰
  ̸ ؼ ϴ Ϳ   ϰ ,
   IP Կ ־ ʿ 밡 ̴.

  8.5.    

   Ͽ    ý ġ    
  ִ ְ ִ. κ    ̽
  ´.   ȣÿ     ˰ʹٸ WWW HOWTO, 
  ϰų, ġ   ( Apache Ʈ   ִ)
  Ȥ ApacheWeek ãƺ.

  9.   /POP 

  9.1.  

      û  ϰ ִ.  
   ý Ѵٰ Ѵ.  װ ϴ  
  ο ϵ ˻ϴ ̴.    Ư  ٸ
      ִ. ,  ӽ  ̳
  bob@domain1.com bob@domain2.com      
  ְ ȴ.  ̵  ٸ ̰ θ bob  ٸ 
    ȴ.

  9.2.  ذå

     ̸ ڸ ٿ, Ȥ  ڸ տ
  ٿ ߺǴ ڰ ƴ   ִ  ִ.(: bob1,
  bob2 Ȥ dom1bob, dom2bob)   mail̳ pop ļ ̷
  ȯ  ʰ ̷  ְ  ִ. ܺη  
   ̷   굵ο ؼ  ̸ ϰ  
  ִ.

    ذå ΰ̴. ϳ sendmail ̿ϴ ̰, ٸ
  ϳ Qmail ̿ϴ ̴. Sendmail ̿ ذå  
  ߰Ͽ sendmail  ġϴ ̴. ,    
  sendmail Ȱ ȴ.      ο ؼ
  ϳ sendmail queue mode Ǿ Ѵٴ   ִ.
  50 Ȥ  ̻ senmail queue μ Žð ý ٻڰ
   ̴.

  Qmail ̿ϴ ذå  Qmail ʿ ʰ, ϳ
  queue 丮 ̿ܿ  ϴ.   Qmail virtuald
   ʱ  ߰ α׷ ʿ Ѵ.  sendmail ̿
      ʿ Ѵٰ ϴ´. , Qmail  
   ذå  غ  Ǿִ  .

    α׷ ٸ α׷ ٴ  ϴ  ƴϴ.
  Sendmail ġ   ذå, Qmail ̿ϴ 
  Ƹ   ذå   ִ.

  9.3.  Sendmail ̿ ذå

  9.3.1.  Ұ

     ý ڽ /etc/passwd ȿ  Ѵ.
  ̰ bob@domain1.com bob@domain2.com  ٸ ڷ
  /etc/passwd ȿ ϵǾ ִٴ  ǹϸ,  α׷ 
  ڸ ϴ  ƹ  .  ڽŸ Ǯ 丮
    Ƿ ٸ   ýۿ ؼ  ٸ Ϸμ
    ϰ ȴ.

  9.3.2.  Sendmail   

  Ϲ /etc/sendmail.cf  m4  .  ϴ 
   :

  divert(0)
  VERSIONID(`tcpproto.mc')
  OSTYPE(linux)
  FEATURE(redirect)
  FEATURE(always_add_domain)
  FEATURE(use_cw_file)
  FEATURE(local_procmail)
  MAILER(local)
  MAILER(smtp)

  9.3.3.  Sendmail  ϱ

  /virtual/domain1.com/etc/sendmail.cf   ο   ֵ
  Ѵ:

  vi /virtual/domain1.com/etc/sendmail.cf # Approximately Line 86
  It should say:

  #Dj$w.Foo.COM

  Replace it with:

  Djdomain1.com

  9.3.4.  Sendmail  

  /virtual/domain1.com/etc/sendmail.cw  ȣƮ̸ Ѵ.

  vi /virtual/domain1.com/etc/sendmail.cw
  mail.domain1.com
  domain1.com
  domain1
  localhost

  9.3.5.     Sendmail : The Hack (PRE8.8.6)

  , sendmail  ҽ ڵ ȯ ʿ Ѵ. Sendmail
  /etc/sendmail.cw    ִµ, ⿡ sendmail 
  (ܺ ٸ ӽ ƴ)   ӽŵ ̸ ϵǾ
  ִ.  Sendmail ο ӽ  ġ鿡  ˻Ͽ 
  Ʈ  IP  ʱȭѴ.     ӽ 
    ̿  ְް      ִ.
  Sendmail ٸ    巹 ϰ  
   Ǯϰ ȴ.  , bob@domain1.com
  fred@domain2.com  ´ٰ . ׷ domain1.com
  sendmail domain2.com ÷ νϰ  domain1.com Ǯ
  ̴.  (翬 domain2.comδ    ̴.) 
   sendmail Ѿ Ѵ. (  v8.8.5 ׽Ʈغ
   ƹ  .)

  vi v8.8.5/src/main.c # Approximately Line 494
  It should say:

  load_if_names();

  Replace it with:

  /* load_if_names(); Commented out since hurts virtual */

     ̿  ְ ʿ䰡  쿡 
   ̿϶. (Ƹ κ  ׷ϰ)

  ̰  ذ ̴. , ֵ ̴ ġ eth0
   ʴ´.  ,    IP eth0  
  Ǹ ̰ ÷   ̴.   ̰ (dummy)
  IP virtual1.maindomain.com(10.10.10.157) ̿Ѵ.   
  ȣƮ   ,    ε  
  ʴ´.     ssh ϴ IP  ý
   Ȯϴ ̱⵵ ϴ.

  9.3.6.     Sendmail : Sendmail ο 
  (POST8.8.6)

  Sendmail V8.8.6ʹ ߰ Ʈũ ̽ 
  ž(disable loading)  ο ɼ .  ڵ带 ٲ
  ʿ  Ǿµ, ̰ DontProbeInterfaces Ѵ.

  /virtual/domain1.com/etc/sendmail.cf ϶.

  vi /virtual/domain1.com/etc/sendmail.cf # Add the line
  O DontProbeInterfaces=True

  9.3.7.  Sendmail.init

  Sendmail   Ұϰ ׻ inetd ؼ ǰ
  ȴ.    ȿ̰ ϴ  ð ɸ, 
   ϴ Ʈ ̷     Ʈũ
  ϴٸ ϳ ýۿ     ϴ 
    ƴϴ.  -bd ÷(flag)   ʵ ϶.
    ο ؼ
   sendmail -q  Ͽ ޵  ϵ鿡  ť ۾
  ϰ ϴ ͵  . ο sendmail.init   :

  #!/bin/sh

  . /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

  9.3.8.  Inetd 

  Pop ٸ   ġ ̴.  inetd Ʈ
     Ʈ Բ  ʿ䰡 ִ. inetd.conf Ʈ
  sendmail pop    :

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

  9.4.  Qmail ̿ 

  9.4.1.  Ұ

    qmail-local  ý ϱ ,  Ȩ
  丮  .qmail  ۵ ʰ ȴ. , 
    ü ٸ (aliasing) ϴ  
  (domain master user) ´.   ܺ α׷ 
   .qmail-default    ְ  ̴.  
  ο  ޵Ǳ ؼ ̵  α׷ ؾ  ̴.

    α׷ ʿѵ,   ϳ setuid root ·
  ȴ.    α׷ ϴ μ  root ƴ
  ڷ ٲٰ, ٽ ι° α׷ Ų.   
  Ʈ  ̷  ʿ    ̴.

    virtuald  ʿ伺  . Qmail ſ 
  α׷̶ Ϲ virtuald  ʿ ʴ´. Qmail
     α׷  ̿ϵ Ǿ. 
     κ Qmail  μ ߰   
  ְ Ѵ.

   Qmail Ѵٸ   ο  
  ̸    ִ. ̰  ο  и Qmail
    ƴϱ  ϴ.  Ŭ̾Ʈ α׷(
  elm, mutt )  Ƿ   ̸ νϴ 
  Ȯ .

  9.4.2.    

  Qmail  ϴ    ޾Ƶ  ֵ
  Ǿ Ѵ. Ʒ ɾ ϶.

  echo "domain1.com:domain1" >> /var/qmail/control/virtualdomains

  9.4.3.   (Domain Master User) 

   /etc/passwd Ͽ domain1 ڵ ߰Ѵ.  /bin/false
     (the domain master) α ϰ
  .   domain1 .qmail ϵ ߰  ְ,
    ϵ   Ͽ ߼۵ȴ.  ̸ 
  ڸ ϸ  ̸    ִٴ  ϱ
  ٶ.  ڵ õȴ. ̰ domain12 ڿ
  domain123̶ ڰ  ڷ νĵǱ  Qmail ȥ
   ִٴ  ǹѴ.    ̸  Ǹ
  ̱ ٶ.

     Ͽ   .qmail  . ٸ
  ý ٸ -   ͳ ȣƮ-   
  ߰ȴ.

  echo "user@domain1.com" > /home/d/domain1/.qmail-mailer-daemon
  echo "user@domain1.com" > /home/d/domain1/.qmail-postmaster
  echo "user@domain1.com" > /home/d/domain1/.qmail-root

    .qmail-default  . ̰   
   ɷְ  ̴.

  echo "| /usr/local/bin/virtmailfilter" > /home/d/domain1/.qmail-default

  9.4.4.  Tcpserver

  Qmail Maildir  ϴ Ư pop ʿ Ѵ.  pop
  α׷   ýۿ ° Ǿ Ѵ. Qmail ڴ
  tcpserver(inetd ) Qmail Բ   ϴµ, 
   inetd ſ tcpserver Ͽ.

  Tcpserver   ʿ  ʴ´.   ࿡
  ־ ȴ.     popper ϱ 
  tcpserver.init ִ.

  #!/bin/sh

  . /etc/rc.d/init.d/functions

  QMAILDUSER=`grep qmaild /etc/passwd | cut -d: -f3`
  QMAILDGROUP=`grep qmaild /etc/passwd | cut -d: -f4`

  # See how we were called.
  case "$1" in
    start)
          echo -n "Starting tcpserver: "
          tcpserver -u 0 -g 0 0 pop-3 /usr/local/bin/virtuald \
                  /virtual/conf.pop qmail-popup virt.domain1.com \
                  /bin/checkpassword /bin/qmail-pop3d Maildir &
          echo -n "pop "
          tcpserver -u $QMAILDUSER -g $QMAILDGROUP 0 smtp \
                  /var/qmail/bin/qmail-smtpd &
          echo -n "qmail "
          echo
          touch /var/lock/subsys/tcpserver
          ;;
    stop)
          echo -n "Stopping tcpserver: "
          killall -TERM tcpserver
          echo -n "killing "
          echo
          rm -f /var/lock/subsys/tcpserver
          ;;
    *)
          echo "Usage: tcpserver {start|stop}"
          exit 1
  esac

  exit 0

  9.4.5.  Qmail.init

   Ǵ ǥ Qmail ʱ ũƮ ٷ   ִ.
  Qmail ̰  ؾ ϴ     Բ
  ȴ.

  9.4.6.  ҽ(Source)

  Qmail   񽺸 ϱ ؼ ΰ  ٸ
  α׷ ʿϴ.  ϳ virtmailfilter̰, ٸ ϳ
  virtmaildelivery̴.  virtmailfilter  C ҽ ڵ尡 ִ.
   α׷ /usr/local/bin 4750  , root ,
  nofiles ׷ ġǾ Ѵ.

  #include <sys/wait.h>
  #include <unistd.h>
  #include <string.h>
  #include <stdlib.h>
  #include <stdio.h>
  #include <ctype.h>
  #include <pwd.h>

  #define VIRTPRE                 "/virtual"

  #define VIRTPWFILE              "etc/passwd"
  #define VIRTDELIVERY            "/usr/local/bin/virtmaildelivery"
  #define VIRTDELIVERY0           "virtmaildelivery"

  #define PERM                    100
  #define TEMP                    111
  #define BUFSIZE                 8192

  int main(int argc,char **argv)
  {
          char *username,*usernameptr,*domain,*domainptr,*homedir;
          char virtpath[BUFSIZE];
          struct passwd *p;
          FILE *fppw;
          int status;
          gid_t gid;
          pid_t pid;

          if (!(username=getenv("EXT")))
          {
                  fprintf(stdout,"environment variable EXT not set\n");
                  exit(TEMP);
          }

          for(usernameptr=username;*usernameptr;usernameptr++)
          {
                  *usernameptr=tolower(*usernameptr);
          }

          if (!(domain=getenv("HOST")))
          {
                  fprintf(stdout,"environment variable HOST not set\n");
                  exit(TEMP);
          }

          for(domainptr=domain;*domainptr;domainptr++)
          {
                  if (*domainptr=='.' && *(domainptr+1)=='.')
                  {
                          fprintf(stdout,"environment variable HOST has ..\n");
                          exit(TEMP);
                  }
                  if (*domainptr=='/')
                  {
                          fprintf(stdout,"environment variable HOST has /\n");
                          exit(TEMP);
                  }

                  *domainptr=tolower(*domainptr);
          }

          for(domainptr=domain;;)
          {
                  snprintf(virtpath,BUFSIZE,"%s/%s",VIRTPRE,domainptr);
                  if (chdir(virtpath)>=0)
                          break;
                  if (!(domainptr=strchr(domainptr,'.')))
                  {
                          fprintf(stdout,"domain failed: %s\n",domain);
                          exit(TEMP);
                  }

                  domainptr++;
          }

          if (!(fppw=fopen(VIRTPWFILE,"r+")))
          {
                  fprintf(stdout,"fopen failed: %s\n",VIRTPWFILE);
                  exit(TEMP);
          }

          while((p=fgetpwent(fppw))!=NULL)
          {
                  if (!strcmp(p->pw_name,username))
                          break;
          }

          if (!p)
          {
                  fprintf(stdout,"user %s: not exist\n",username);
                  exit(PERM);
          }

          if (fclose(fppw)==EOF)
          {
                  fprintf(stdout,"fclose failed\n");
                  exit(TEMP);
          }

          gid=p->pw_gid;
          homedir=p->pw_dir;

          if (setgid(gid)<0 || setuid(p->pw_uid)<0)
          {
                  fprintf(stdout,"setuid/setgid failed\n");
                  exit(TEMP);
          }

          switch(pid=fork())
          {
                  case -1:
                          fprintf(stdout,"fork failed\n");
                          exit(TEMP);
                  case 0:
                          if (execl(VIRTDELIVERY,VIRTDELIVERY0,username,homedir,NULL)<0)
                          {
                                  fprintf(stdout,"execl failed\n");
                                  exit(TEMP);
                          }
                  default:
                          if (wait(&status)<0)
                          {
                                  fprintf(stdout,"wait failed\n");
                                  exit(TEMP);
                          }
                          if (!WIFEXITED(status))
                          {
                                  fprintf(stdout,"child did not exit normally\n");
                                  exit(TEMP);
                          }
                          break;
          }
          exit(WEXITSTATUS(status));
  }

  9.4.7.  ҽ(Source)

  ⿡ virtmaildelivery  C ҽ ڵ尡 ִ. ̰
  /usr/local/bin 0755 , ڿ ׷  root
  ġǾ Ѵ.

  #include <sys/stat.h>
  #include <sys/file.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  #include <stdio.h>
  #include <errno.h>
  #include <time.h>

  #define TEMP                    111
  #define BUFSIZE                 8192
  #define ATTEMPTS                10

  int main(int argc,char **argv)
  {
          char *user,*homedir,*dtline,*rpline,buffer[BUFSIZE],*p,mail[BUFSIZE];
          char maildir[BUFSIZE],newmaildir[BUFSIZE],host[BUFSIZE];
          int fd,n,nl,i,retval;
          struct stat statp;
          time_t thetime;
          pid_t pid;
          FILE *fp;

          retval=0;

          if (!argv[1])
          {
                  fprintf(stdout,"invalid arguments: need username\n");
                  exit(TEMP);
          }

          user=argv[1];

          if (!argv[2])
          {
                  fprintf(stdout,"invalid arguments: need home directory\n");
                  exit(TEMP);
          }

          homedir=argv[2];

          if (!(dtline=getenv("DTLINE")))
          {
                  fprintf(stdout,"environment variable DTLINE not set\n");
                  exit(TEMP);
          }

          if (!(rpline=getenv("RPLINE")))
          {
                  fprintf(stdout,"environment variable RPLINE not set\n");
                  exit(TEMP);
          }

          while (*homedir=='/')
                  homedir++;
          snprintf(maildir,BUFSIZE,"%s/Maildir",homedir);
          if (chdir(maildir)<0)
          {
                  fprintf(stdout,"chdir failed: %s\n",maildir);
                  exit(TEMP);
          }

          time(&thetime);
          pid=getpid();
          if (gethostname(host,BUFSIZE)<0)
          {
                  fprintf(stdout,"gethostname failed\n");
                  exit(TEMP);
          }

          for(i=0;i<ATTEMPTS;i++)
          {
                  snprintf(mail,BUFSIZE,"tmp/%u.%d.%s",thetime,pid,host);
                  errno=0;
                  stat(mail,&statp);
                  if (errno==ENOENT)
                          break;

                  sleep(2);
                  time(&thetime);
          }
          if (i>=ATTEMPTS)
          {
                  fprintf(stdout,"could not create %s\n",mail);
                  exit(TEMP);
          }

          if (!(fp=fopen(mail,"w+")))
          {
                  fprintf(stdout,"fopen failed: %s\n",mail);
                  retval=TEMP; goto unlinkit;
          }

          fd=fileno(fp);

          if (fprintf(fp,"%s",rpline)<0)
          {
                  fprintf(stdout,"fprintf failed\n");
                  retval=TEMP; goto unlinkit;
          }

          if (fprintf(fp,"%s",dtline)<0)
          {
                  fprintf(stdout,"fprintf failed\n");
                  retval=TEMP; goto unlinkit;
          }

          while(fgets(buffer,BUFSIZE,stdin))
          {
                  for(p=buffer;*p=='>';p++)
                          ;

                  if (!strncmp(p,"From ",5))
                  {
                          if (fputc('>',fp)<0)
                          {
                                  fprintf(stdout,"fputc failed\n");
                                  retval=TEMP; goto unlinkit;
                          }
                  }

                  if (fprintf(fp,"%s",buffer)<0)
                  {
                          fprintf(stdout,"fprintf failed\n");
                          retval=TEMP; goto unlinkit;
                  }
          }

          p=buffer+strlen(buffer);
          nl=2;
          if (*p=='\n')
                  nl=1;
          for(n=0;n<nl;n++)
          {
                  if (fputc('\n',fp)<0)
                  {
                          fprintf(stdout,"fputc failed\n");
                          retval=TEMP; goto unlinkit;
                  }
          }

          if (fsync(fd)<0)
          {
                  fprintf(stdout,"fsync failed\n");
                  retval=TEMP; goto unlinkit;
          }

          if (fclose(fp)==EOF)
          {
                  fprintf(stdout,"fclose failed\n");
                  retval=TEMP; goto unlinkit;
          }

          snprintf(newmaildir,BUFSIZE,"new/%u.%d.%s",thetime,pid,host);
          if (link(mail,newmaildir)<0)
          {
                  fprintf(stdout,"link failed: %s %s\n",mail,newmaildir);
                  retval=TEMP; goto unlinkit;
          }

  unlinkit:
          if (unlink(mail)<0)
          {
                  fprintf(stdout,"unlink failed: %s\n",mail);
                  retval=TEMP;
          }

          exit(retval);
  }

  9.5.   (Acknowledgement)

  Qmail  ذå ϰ   Vicente Gonzalez
  (vince@nycrc.net)  Ѵ. Ƹ Vince   
    ְ, Qmail   Ͽ  HOWTO Ե 
   ǰ    ϶.

  10.    (Virtual Samba)

  10.1.  

   SAMBA ſ ϱ . Ʒ ϵ ϰ  
  ̴.

  o  /virtual/domain1.com/etc/smb.conf FILE

  o  /virtual/domain1.com/var/lock/samba DIRECTORY

  o  /virtual/domain1.com/var/log DIRECTORY

  o  /usr/local/bin/virtsmbstatus SYMLINK /usr/local/bin/virtexec

  10.2.  Inetd

  /etc/inetd.conf Ѵ.

  vi /etc/inetd.conf # Add this line
  netbios-ssn stream tcp nowait root /usr/local/bin/virtuald \
          virtuald /virtual/conf.smbd smbd

  10.3.  Smb.init

   inetd ؼ ǹǷ  smb.init  ʿ ʴ.

  11.  ٸ  

  ٸ  񽺵     ִ.

  o  virtfs Ű ϰ ̺귯   ýۿ
     ִ´.

  o  ̰ /etc/inetd.conf ִ´.

  o  /virtual/conf.service  .

  o  ʿ ٸ  ũƮ .

  12.  

  ̰ ʿ  ̴ܰ. ٽѹ ϴµ, ȸ Computer
  Resource Center .      ְų  
    ִٸ,  װ ˷ֱ ٶ.

       Դ.    
     ¸    ־, ٽ ʿ伺
     鿡  ְ  Ϳ ؼ ϰ
  Ѵ. ϱ  FAQ  о ش  ׿  
  ִ Ȯֱ ٶ. ٽѹ    е鿡
    Ѵ.  Brian

  13.   Ǵ ׵(FAQ)

  Q1. sendmail.init syslogd.init ϴ. ̰͵
  /usr/local/bin ְ Ű  ϴ.

  A1.   ϵ init ũƮ Ѵ.  α׷ ǻͰ ó
  õ  init̶ α׷  ȴ. init α׷
  /usr/local  ̳ʸ   ʴ´.  ýۿ init
  ũƮ ϱ   Linux System Administrators Guide
  Linux Getting Started Guide ϶.

  Q2.    /etc/sendmail.cf ־ϴ.

  divert(0)
  VERSIONID(`tcpproto.mc')
  OSTYPE(linux)
  FEATURE(redirect)
  FEATURE(always_add_domain)
  FEATURE(use_cw_file)
  FEATURE(local_procmail)
  MAILER(local)
  MAILER(smtp)

    ̻ϰ µ   Դϱ?

  A2.  ̰ /etc/sendmail.cf   ȵȴ. sendmail.cf
  sendmail ϱ       ϱ
   ʴ.   m4 α׷̳ ̰ ũθ ̿Ͽ
  sendmail.cf   ν    ϴ 
  Ϲ̴.  ε sendmail    ũ̴.
  ũθ ̿ؼ sendmail ϴ  ˰ Ѵٸ sendmail
    ϱ ٶ.  /etc/sendmail.cf    virtfs
  ũƮ ̿Ͽ /virtual/domain1.com/etc/sendmail.cf 
  ϴ   .  ׸ sendmail.cf   ο
  ° ؾ ȴ.

  Q3.  virtuald  Ҽ ֽϱ? װ   
  ΰ?   װ    ֽϱ?

  A3.  Virtuald  񽺸 ϱ  α׷   C
  α׷̴.   α׷ ҽ   ִ ٷ  HOWTO
  ԵǾ ִ.  C α׷ó ̰͵  make virtuald 
    ִ.  ̳ʸ  /usr/local/bin ´.
  Ϲ Ʈũ  α׷  (wrapper) virtuald
    /etc/inetd.conf ߰ؾ   ִ.

  Q4.   ýۿ dialog µ?

  A4.  dialog   ũƮ ̾α ˾    ְ
  ִ α׷̴.   Ұ  virtual  ũƮ 
  Ű ؼ  α׷ ݵ ʿϴ. dialog sunsite.
      ̴.  α׷  ſ  
  ġ    ̴.

  Q5.   syslogd ۵    ?

  A5.  virtuald ۵  Ʒ ޼
  syslogd(/var/log/messages)  ȴ:

  Nov 19 17:21:07 virtual virtuald[10223]: Virtuald Starting: $Revision: 1.49 $
  Nov 19 17:21:07 virtual virtuald[10223]: Incoming ip: 204.249.11.136
  Nov 19 17:21:07 virtual virtuald[10223]: Chroot dir: /virtual/domain1.com

   Chroot dir ޽ chroot ý  ̷  virtuald 
   ȴ.   ޽ Ÿٸ  syslogd
  ̶   ִ.     ý  
  α ޽ syslogd   ȮѴٸ, ̰  
  syslogd °   Ȯ  ִ.

     ð ɼ VERBOSELOG ѳ ʾҴٸ virtuald
      ̴. ̷   syslogd
  Ǵ Ȯ  ִ    ý ϴ
    syslogd ΰ ϴ  ϴ
  ̴.

  Q6.   Ͻýۿ  Ÿ(quota) Ϸ  ?

  A6.   ϴ  Ÿ Ѵ.  Quota mini-HOWTO 
  ϶.

  ,  ٸ 쿡 uid ȥ ־ ȵȴٴ 
  ϶.   uid ȥ ´ٸ ڵ Ÿ ϰ 
  ̴. Ÿ  uid  ϰ, ο Ÿ 
   ̿ܿ   uid    .

  Q7.  inet.conf Ʈ ִ \ ǥô  ?

  A7.    Ͽ  ٿ      ٹٲ
  ǥϴ ̴.    ǥø   ܾ  ġ 
   ϰ ϴ ǵ.  \ ְ ϳ ٷ  
  ٲپ .

  Q8.  passwd ٸ login α׷    permission denied
  ޽ ɴϴ.  FTP su    no modules loaded for
  service XXX  ɴϴ.   ׷?

  A8.  ̰͵ PAM  ޽̴.   ũƮ PAM 
   ۼϿ.   ۼ virtfs ũƮ /etc/pam.d,
  /usr/lib/cracklib_dict.*, /lib/security, Ȥ ׹ PAM 䱸ϴ
  ϵ ϴ κ   ʴ. PAM ̵ ϵ ʿ
  Ѵ.  virtfs ũƮ Ͽ ̵ ϵ ϰ
  ٸ ̵   ̴.

  Q9.  virtuald tcpd hosts.allow hosts.deny ϵ  
  ֳ?

  A9.  . ణ  ϴ.

  켱 ҽ κκ ٲ Ѵ.

  arguments Ȯϴ κп Ʒ  ÷ؾ Ѵ.

          if (!argv[3])
          {
                  syslog(LOG_ERR,"invalid arguments: no program to run");
                  exit(0);
          }

  exec     ٲ Ѵ.

   :

          if (execvp(argv[2],argv+2)<0)

   :

          if (execvp(argv[2],argv+3)<0)

   inetd.conf  Ѵ.

   :

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

   :

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

   /virtual/domain1.com/etc/hosts.allow 
  /virtual/domain1.com/etc/hosts.deny  Ͽ ̿  ִ.

  Q10.   ȣƮ CGI ų  ֳ?

  A10.    , /cgi-bin     ִ
  chroot  ۿ   Ѵ.  , /var/www/cgi-
  bin/domain1.com  .  Ŭ̾Ʈ /cgi-bin  
  ֵ ϴ    α׷ ų  ִ
  ȸ οϴ ̴. ̰ Ȼ ū    ִ. ϶!
    ׸ ڼ ˻ ʴ ý۵鿡 ؼ ƿ cgi
      Ҵ.

  Q11.   ϵ    ٸϴ.  ؾ ?

  A11.   Ͽ ⺻ ΰ ° Ѵ: ýV BSD
  װ̴.   ϴ  ýV   Ͽ
  ϰ ִ.  ý ο  񽺴  ۵Ѵ.
  BSD   ϵ鿡   ý ó ϰų 
  LDP Ʈ ϶.

  Q12.  ſ  ´µ, ȸ ų ȸſ   ð
  ɸϴ. ?

  A12.  Ƹ   VIRTSERVICES HOWTO   ʾƼ
  ׷ ̴.  Ʈũ ڷ    Ŭ̾Ʈ
  ϴ  ʿ   ϰ ִٴ   ְ, ֱ
  ٶ.  Ͽ    Ȯ ´ٸ 2Ͽ 3 ȿ
  ׻     ̴. Ȯ   ʾҴٸ 
  VIRTSERVICES Ϲڽ ɷ   ̰, ׷ ĥ
  Ȥ     ä ġǾ  𸥴.

  Q13.  virtuald 100M Ʈ ȯ濡 ۵ϳ?

  A13 Ʈũ ī ӵ virtuald ۵ϴ ο ƹ 
  . 10M Ʈ ȯ濡 100M Ʈ Ʈũ ī带 ص 
  ۵Ѵٴ  Ȯ .

  Q14.  sendmail virthost ̺   ֳ?

  A14.  ȵȴ. ̰ sendmail  ο   ޱ 
  ̴. virtuald  sendmail ؼ и  chroot  ȯ
  Ѵ. virtuald ġ Ŀ sendmail  ο ؼ
  Ϲ  Ѵ.

  Q15.   telnet ġ  ֳ?  root  
  ڵ ڽŵ  ϰ   ֳ?

  A15.       ̰,  ϸ  
   ϴ   ǰ ̴.   ̹  ߵ,
    inetd ϴ  񽺴 virtuald ̿Ͽ  񽺷
       ȵ  ϳ ٴ ̴.
   ̴. telnet  񽺸 Ͽ  ̵ 
  𸣰, ̷   ӽ     ڸ
  ʿ ̴.  ̿ õ   ִ:

  o   ܺο ϴ ų Ͽ  μ Ű,
     ܺη  ῡ  ҽ IP ּҸ ʱȭϱ ؼ Ŀ
     ŷؾ߸ Ѵ.   ȣƮ̸ ϱ ؼ
     gethostname  ۵ ʿϴ. ̷ ۾ õ ڿԴ
      Ŀ ŷϴ  , ʺڵ鿡Դ 
      ʴ´.

  o   ڵ ڳ ϴ  ϴ   α׷
       ڽ ų  ֵ ϴ Ͱ 
     ̴. ˷ ִ ħ  root  ǰų, 
      ýۿ ջ   ִ.

  o    ýۿ ؼ root telnet  ϴ  ſ
      ̴.   ý root raw device  
     ְ, chroot ̰ ʱȭϰų ý Ű 
     μ Ű     ִ.

  o    ڳ 񽺰 Ǹ Ʈũ 񽺰   ִ 
     CPU ð  ̴.

  o   ڳ ȼ  Ʈũ ̴.  ؽƮ 
     йȣ Ʈũ Ͽ  ȴ.  ִ ڰ
      йȣ ˰ ȴٸ  ڴ ̸ ̿ ý
     ϰ, ıų  ִ.

  o     ȯ ġ Ŀ ̴.   
     ̺귯  , ׸    ϵ ʿϰ
     ȴ. 6G  ϵ ũ ݼ  ϰ  ̴.

  ⺻  ýۿ ؼ login ϴ  ¥ 
  ̴.  ̰ ȴٸ,  ӽſ ȣϴ  Ʈ
  迡   ִ.  Ư Ʈ ڿ    ֵ
  ϰ Ѵٸ, ssh  α  ִ ڵ ߰, ,
   ϰ   ִ  μ  α׷(ũƮ
  ƴ) ۼϴ   ̴.  α׷ ޴ ⵿ (menu
  driven) Ǿ ϸ, ܼ 㰡 ʰ, root Ǵ 
  Ѿ Ѵ. ׷ ؼ   root  ٸ
  ڷ ٲ ʿ䰡 ִ. ̷ ġ  ý ̶
  ϰ .  root telnet̳ ssh  ϴ 
   . ̷ ġ  ҷ ̴.   ýۿ
  Ұϰ telnet  ʿ䰡 ִٸ ذ ּȭ   ִ
  ӽ ϶.  ڶ ̷Ա ̾߱ߴµ
  ڳ   ϰ, ̻ ð  ʰڴ.

  Q16.  virtuald Virtual-Services HOWTO  ϸ Ʈ,
  , rpm, tar   ֳ?

  A16.   ƹ͵ .  HOWTO    ϰִ 
  񽺿 õ Ʈ ̴.    ٷ  κп
   HOWTO ã ִ.

  Q17.  Ϲ  virtexec Ϸ ߴ  chroot: operation not
  permitted ޽ ɴϴ. ?

  A17.
   Chroot  root ѵ ý ̴.   ̰
  ų  ִ.  virtexec ũƮ  chroot  α׷ Ű
    ũƮ Ű Ѵٸ   ̵
  ʿϴ.

  Q18.  pop sendmail ߴµ, pop  ۵ ʴ°
  .   óұ?

  A18.   pop α׷  /usr/spool/mail  ϵ  
  Ѵ.  ˱δ qpop    ذϱ  
   ־ Ѵ. ҽ ڵ带 ٽ ϰų
  /virtual/domain1.com/usr/spool   /virtual/domain1.com/var/spool
  ϵ ũ Ű ȴ.

  Q19.     α׷  ʰ,  XXX α׷
  µ, ۵  ʴ±. ?

  A19.   ̸ θ Ǵ Ϲ 鿡  Ϸ
  ߴ. ,    ڽ Ư ϴ  ִٴ
  ͵ ˰ ִ. ̷      شٸ, 
   Ǯ  õ  ̰, Ҿ  FAQ ȭ ϴ
  ۾  ̴.      ߿  
  Ų  α׷ 𿡼 ° ϴ ̴.
  (ftp://ftp.domain1.com/subdir/subdir/file.tgz  )

  Q20.  virtexec    symlink not a virt function  ޽
  ߻մϴ. ̰  ̰, װ  ؾ մϱ?

  A20.  virtexec ó 4 ڸ 0° argument ϰ 
  ̸  ȯ濡 Ű ȴ.   virtpaswd passwd
  Ų.   ó ϴ  ڰ  virt  ƴ϶ 
  ޽  ȴ. virtexec  ũƮ  ֱ 
  ϱ  ̴. bash Ÿ е ޴   ũƮ
  α׷ֿ       ̴.

  Q21.  virtualdʹ   Qmail̳ SAMBA, Apache  ؼ
   ֽϴ.

  A21.     α׷ Ǹ  ̹  ִ.
   α׷ 쿡 www.(Ű ̸).org   
  Ʈ õǾ ִ. ׷  񽺿  鿡
  ؼ ̵ Ʈ  ó ã ٶ.

  Q22.    ٸ domain1.com  ִµ, 
  ڲ ǵƿɴϴ.   ׷?

  A22.  Virtmaildelivery ޵Ǵ ȯ 鿡 ؼ  
  /virtual/domain1.com 丮 ǴѴ. ̰  ּҸ
  Ȯϱ   DNS Ȯ   ʴ´.  ,  ּҰ
  submail.mail.domain1.com ȴٸ, virtmaildelivery ּҿ ؼ
  Ȯ ϰ, ʴ mail.domain1.com, domain1.com, com Ȯϸ鼭
  ּҸ ˻ϰ ȴ. ̷ δ  ٸ ּҸ
  Ȯϰ ˾Ƴ  .

  ,  굵 ° ƴ  ٸ  ִٸ,
    ɺ ũ   ϴ:

  cd /virtual
  ln -s domain1.com domain1alias.com

  virtmaildelivery  丮  ϴ 丮 ν
  ̰ ( ɺ ũӿ ұϰ),  user@domain1.com
  user@domainalias.com ο   ְ ȴ. virtexec 
   θ ̾α ڽ ǥѴٴ  ϶.  
  ý  ̱ ,     ϳ  
  ִ.

