Differences between current version and predecessor to the previous major change of HowToVirtualServicesHOWTO.
Other diffs: Previous Revision, Previous Author, or view the Annotated Edit History
Newer page: | version 3 | Last edited on Monday, October 25, 2004 4:55:15 am | by AristotlePagaltzis | |
Older page: | version 2 | Last edited on Friday, June 7, 2002 1:07:48 am | by perry | Revert |
@@ -1,2964 +1 @@
-
-
-
-Virtual Services Howto
-
-
-
-----
-
-!!!Virtual Services Howto
-
-!!Brian Ackerman, brian@nycrc.netv2.1, 15 August 1998
-
-
-----
-''This document came about to satisfy the ever increasing need
-to know how to virtualize a service. ''
-----
-
-
-
-
-!!1. Introduction
-
-
-****1.1 Knowledge Required
-
-****1.2 Purpose
-
-****1.3 Feedback
-
-****1.4 Revision History
-
-****1.5 Copyright/Distribution
-
-
-
-
-
-!!2. IP Aliasing
-
-
-
-
-!!3. Virtuald
-
-
-****3.1 Introduction
-
-****3.2 Inetd
-
-****3.3 Config File
-
-****3.4 Source
-
-
-
-
-
-!!4. Shell Scripts
-
-
-****4.1 Virtfs
-
-****4.2 Virtexec
-
-****4.3 Notes
-
-
-
-
-
-!!5. DNS
-
-
-
-
-!!6. Syslogd
-
-
-****6.1 Problem
-
-****6.2 Solution
-
-****6.3 Multiple Syslogd's
-
-
-
-
-
-!!7. Virtual FTP
-
-
-****7.1 Inetd
-
-****7.2 Anonymous FTP
-
-****7.3 Virtual FTP Users
-
-
-
-
-
-!!8. Virtual Web
-
-
-****8.1 Running With Virtuald
-
-****8.2 Running With Apache !VirtualHost
-
-****8.3 File Descriptor Overflow
-
-****8.4 Sharing Servers With One IP
-
-****8.5 More Information
-
-
-
-
-
-!!9. Virtual Mail/Pop
-
-
-****9.1 Problem
-
-****9.2 Solution
-
-****9.3 Sendmail Solution
-
-****9.4 Qmail Solution
-
-****9.5 Acknowledgement
-
-
-
-
-
-!!10. Virtual Samba
-
-
-****10.1 Setup
-
-****10.2 Inetd
-
-****10.3 Smb.init
-
-
-
-
-
-!!11. Virtual Other
-
-
-
-
-!!12. Conclusion
-
-
-
-
-!!13. FAQ
-----
-
-!!1. Introduction
-
-!!1.1 Knowledge Required
-
-
-
-Creating a virtual services machine is not all that difficult, however,
-more than fundamental knowledge is required. This document is not a primer
-to how to fully configure a Linux machine.
-
-
-
-
-
-In order to understand this HOWTO document it is assumed that you
-are thoroughly familiar with the following:
-
-
-
-
-
-**** Compiling a Linux kernel and adding IP aliasing support
-IP alias mini-HOWTO
-****
-
-**** Setting up and configuring of network devices
-NET-3 HOWTO
-****
-
-**** Setting up of inetd
-NET-3 HOWTO
-****
-
-**** Various network packages like
-Sendmail
-Apache
-Qmail
-SAMBA
-****
-
-**** Setting up DNS
-DNS HOWTO
-****
-
-**** Understanding basic system administration
-Linux Systems Administrators's Guide
-****
-
-**** Understanding how to setup a Web Server
-WWW HOWTO
-****
-
-
-
-If you are uncertain of how to proceed with any of the above it is STRONGLY
-recommended that you use the html links provided to familiarize yourself with all
-packages. I will NOT reply to mail regarding any of the above. Please
-direct your questions to the appropriate author of the HOWTO.
-
-
-
-
-!!1.2 Purpose
-
-
-
-The purpose of virtual services is to allow a single machine to
-recognize multiple IP addresses without multiple network cards.
-IP aliasing is a kernel option that allows you to assign each network
-device more than one IP address. The kernel then multiplexes
-(swaps between them very fast) in the background and to the user it
-appears like you have more than one server.
-
-
-
-
-
-
-This multiplexing allows multiple domains (www.domain1.com,
-www.domain2.com, etc.) to be hosted by the same machine for the same
-cost as hosting one domain. Unfortunately, most services (FTP, web, mail)
-were not designed to handle muliple domains. In order to make them work
-properly you must modify both configuration files and source code.
-This document describes how to make these modifications in the setting
-up of a virtual machine.
-
-
-
-
-
-A deamon is also required in order to make virtual services function. The
-source for this daemon (virtuald) is provided later in this document.
-
-
-
-
-!!1.3 Feedback
-
-
-
-This document will expand as packages are updated and source or configuration
-modifications change. If there are any portions of this document that
-are unclear please feel free to email me with your suggestions or
-questions. So that I do not have to go searching through the entire
-HOWTO please make certain that all comments are as specific as possible
-and include the section where the uncertainty lies. It is important that
-all mail be addressed with VIRTSERVICES HOWTO in the subject line. Any other mail
-will be considered personal and all my friends know that I do not ever
-read my personal mail so it will probably get discarded with theirs.
-
-
-
-
-
-Please note that my examples are just that, examples and should not
-be copied verbatim. You may have to insert your own values. If you
-are having trouble, send me mail. Include all the pertinent configuration files
-and the error messages you get when installing and I will look
-them over and reply with my suggestions.
-
-
-
-
-!!1.4 Revision History
-
-
-
-__V1.__
-
-
-Initial version
-
-
-
-
-
-__V1.1__
-
-
-Fixed error in Virtual Web Section
-
-
-
-
-
-__V1.2__
-
-
-Fixed the date
-
-
-
-
-
-__V2.__
-
-
-
-Updated html links.
-
-
-Web updates.
-
-
-New Sendmail option.
-
-
-New Qmail section.
-
-
-Syslogd updates.
-
-
-FTP updates.
-
-
-Virtuald default option.
-
-
-New SAMBA section.
-
-
-FAQ updates.
-
-
-
-
-
-__V2.1__
-
-
-Changed all paths to /usr/local.
-
-
-Added virtuald VERBOSELOG compile option.
-
-
-Fixed setuid/setgid bug in virtmailfilter.
-
-
-Fixed execl bug in virtmailfilter.
-
-
-Fixed capitialization bug in virtmailfilter.
-
-
-Fixed environment variable sanity check in virtmailfilter.
-
-
-Removed mbox code from virtmailfilter/virtmaildelivery.
-
-
-Added tcpserver.init pop section for Qmail.
-
-
-Added alias domain name question to the FAQ.
-
-
-Fixed virtmailfilter to send home directory to virtmaildelivery.
-
-
-
-
-!!1.5 Copyright/Distribution
-
-
-
-This document is Copyright (c) 1997 by The Computer Resource Center Inc.
-
-
-
-
-
-A verbatim copy may be reproduced or distributed in any medium
-physical or electronic without permission of the author. Translations
-are similiarly permitted without express permission if it includes a
-notice on who translated it. Commercial redistribution is allowed
-and encouraged; however please notify
-Computer Resource Center of any such
-distributions.
-
-
-
-
-
-Excerpts from the document may be used without prior consent
-provided that the derivative work contains the verbatim copy or
-a pointer to a verbatim copy.
-
-
-
-
-
-Permission is granted to make and distribute verbatim copies
-of this document provided the copyright notice and this permission
-notice are preserved on all copies.
-
-
-
-
-
-In short, we wish to promote dissemination of this information through
-as many channels as possible. However, I do wish to retain copyright
-on this HOWTO document, and would like to be notified of any plans
-to redistribute this HOWTO.
-
-
-
-----
-
-!!2. IP Aliasing
-
-
-IP aliasing is a kernel option that needs to be set up in order
-to run a virtual hosting machine. There is already a mini-HOWTO on
-IP aliasing.
-Consult that for any questions on how to set it up.
-
-
-
-----
-
-!!3. Virtuald
-
-!!3.1 Introduction
-
-
-
-Every network connection is made up of two IP address/port pairs.
-The API (Applications Program Interface) for network programming is
-called the Sockets API. The socket acts like an open file and by
-reading/writing to it you can send data over a network connection.
-There is a function call getsockname that will return the
-IP address of the local socket. Virtuald uses getsockname
-to determine which IP on the local machine is being accessed. Virtuald reads
-a config file to retrieve the directory associated with that IP. It will
- chroot to that directory and hand the
-connection off to the service. Chroot resets / or the root
-directory to a new point so everything higher in the directory tree is cut
-off from the running program. Therefore, each IP address gets their own
-virtual filesystem. To the network program this is transparent
-and the program will behave like nothing happened. Virtuald
-in conjunction with a program like inetd can then be used to
-virtualize any service.
-
-
-
-
-!!3.2 Inetd
-
-
-
-Inetd is a network super server that listens at multiple ports
-and when it receives a connection (for example, an incoming pop
-request), inetd performs the network negotiation and hands the
-network connection off to the specified program. This prevents
-services from running idly when they are not needed.
-
-
-
-
-
-A standard /etc/inetd.conf file looks like this:
-
-
-
-
-ftp stream tcp nowait root /usr/sbin/tcpd \
-wu.ftpd -l -a
-pop-3 stream tcp nowait root /usr/sbin/tcpd \
-in.qpop -s
-
-
-
-A virtual /etc/inetd.conf file looks like this:
-
-
-
-
-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 Config File
-
-
-
-Each service gets a config file that will control what IPs and
-directories are allowed for that service. You can have one
-master config file or several config files if you want each service
-to get a different list of domains. A config file looks like
-this:
-
-
-
-
-# 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 Source
-
-
-
-This is the C source code to the virtuald program. Compile it and
-install it in /usr/local/bin with permission 0755, user root, and
-group root. The only compile option is VERBOSELOG which will turn
-on/off logging of connections.
-
-
-
-
-#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(,(struct sockaddr *)&virtual_addr,&virtual_len)<)
-{
-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 ;
-}
-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]=;
-if (*buffer=='#' || *buffer==)
-continue;
-if (!(bufptr=strchr(buffer,' ')))
-{
-syslog(LOG_ERR,"iptodir: strchr failed");
-return -1;
-}
-*bufptr++=;
-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 ;
-}
-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();
-}
-if (!argv[[2])
-{
-syslog(LOG_ERR,"invalid arguments: no program to run");
-exit();
-}
-if (getipaddr(&ipaddr))
-{
-syslog(LOG_ERR,"getipaddr failed");
-exit();
-}
-#ifdef VERBOSELOG
-syslog(LOG_ERR,"Incoming ip: %s",ipaddr);
-#endif
-if (iptodir(&dir,ipaddr,argv[[1]))
-{
-syslog(LOG_ERR,"iptodir failed");
-exit();
-}
-if (chroot(dir)<)
-{
-syslog(LOG_ERR,"chroot failed: %m");
-exit();
-}
-#ifdef VERBOSELOG
-syslog(LOG_ERR,"Chroot dir: %s",dir);
-#endif
-if (chdir("/")<)
-{
-syslog(LOG_ERR,"chdir failed: %m");
-exit();
-}
-if (execvp(argv[[2],argv+2)<)
-{
-syslog(LOG_ERR,"execvp failed: %m");
-exit();
-}
-closelog();
-exit();
-}
-
-
-
-
-----
-
-!!4. Shell Scripts
-
-!!4.1 Virtfs
-
-
-
-Each domain should get their own directory structure. Since you are
-using chroot you will require duplicate copies of the shared
-libraries, binaries, conf files, etc. I use /virtual/domain1.com for
-each domain that I create.
-
-
-
-
-
-I realize that you are taking up more disk space but it is cheaper than
-a whole new machine and network cards. If you really want to preserve space
-you can hard link the files together so only one copy of each binary exists. The
-filesystem that I use takes up a little over 2M. However, this script attempts to
-copy all the files from the main filesystem in order to be as generic as possible.
-
-
-
-
-
-
-Here is a sample virtfs script:
-
-
-
-
-#!/bin/sh
-echo '$Revision: 1.49 $'
-echo -n "Enter the domain name: "
-read domain
-if [[ "$domain" = "" ]
-then
-echo Nothing entered: aborting
-exit
-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
-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
-
-
-
-
-
-!!4.2 Virtexec
-
-
-
-
-To execute commands in a virtual environment you have to
- chroot to that directory and then run the command.
-I have written a special shell script called virtexec
-that handles this for any command:
-
-
-
-
-#!/bin/sh
-echo '$Revision: 1.49 $'
-BNAME=`basename $`
-FIRST4CHAR=`echo $BNAME | cut -c1-4`
-REALBNAME=`echo $BNAME | cut -c5-`
-if [[ "$BNAME" = "virtexec" ]
-then
-echo Cannot run virtexec directly: NEED a symlink
-exit
-fi
-if [[ "$FIRST4CHAR" != "virt" ]
-then
-echo Symlink not a virt function
-exit
-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
-fi
-dialog --clear --title 'Virtexec' --menu Pick 20 70 12 $list 2> /tmp/menu.$$
-if [[ "$?" = "" ]
-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
-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
-
-
-
-Please note that you must have the dialog program installed on
-your system for this to work. To use virtexec just symlink a
-program to it. For example,
-
-
-
-
-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
-
-
-
-Then if you type virtvi or virtpasswd or virtmailq it will allow you
-to vi a program, change a user's password or check the mail queue on
-your virtual system. You can create as many virtexec symlinks as
-you want. Please note that if your program requires a shared library
-it has to be in the virtual filesystem as well as the binary.
-
-
-
-
-!!4.3 Notes
-
-
-
-I install all the scripts in /usr/local/bin. Anything that I do not want
-to put on the virtual filesystem I put in /usr/local. The script does
-not copy any of the files in /usr/local to the virtual filesystem. Any files
-that are important to not cross virtual filesystems should be removed. For
-example, ssh is installed on my system and I did not want the private key for
-the server available on all the virtual filesystems so I remove it
-from each virtual filesystem after I run virtfs. I also change
-resolv.conf and remove anything that has the name of another domain
-on it for legal reasons. For example, /etc/hosts and /etc/HOSTNAME.
-
-
-
-
-
-The programs that I symlink to virtexec are:
-
-
-
-
-
-**** virtpasswd -- change a user password
-****
-
-**** virtadduser -- create a user
-****
-
-**** virtdeluser -- delete a user
-****
-
-**** virtsmbstatus -- see SAMBA status
-****
-
-**** virtvi -- edit a file
-****
-
-**** virtmailq -- check out the mailq
-****
-
-**** virtnewaliases -- rebuild alias tables
-****
-
-
-
-
-----
-
-!!5. DNS
-
-
-You can configure DNS normally. There is a HOWTO on
-DNS.
-
-
-
-----
-
-!!6. Syslogd
-
-!!6.1 Problem
-
-
-
-Syslogd is the system logging utility commonly used on UNIX systems. Syslogd
-is a daemon that opens a special file called a FIFO. A FIFO is a special file
-that acts like a pipe. Anything that is written to the write side will come out
-the read side. Syslogd waits for data from the read side. There
-are C functions that write to the write side. If your program uses these C
-functions your output will go to syslogd.
-
-
-
-
-
-Remember that we have used a chroot environment and the FIFO that
-syslogd is reading from (/dev/log) is not present. That means all the virtual
-environments will not log to syslogd.
-
-
-
-
-!!6.2 Solution
-
-
-!Setup Links
-
-
-
-Syslogd can look to a different FIFO if you tell it on the command
-line so run syslogd with the argument:
-
-
-
-
-syslogd -p /virtual/log
-
-
-
-Then symlink /dev/log to /virtual/log by:
-
-
-
-
-ln -sf /virtual/log /dev/log
-
-
-
-Then hard link all the /dev/log copies to this file by running:
-
-
-
-
-ln -f /virtual/log /virtual/domain1.com/dev/log
-
-
-
-The virtfs script above already does this. Since /virtual is one contiguous
-disk and the /dev/log's are hard linked they have the same inode number and point
-to the same data. The chroot cannot stop this so all your
-virtual /dev/log's will now function. Note that all the messages from all
-the environments will be logged in one place. However, you can write separate
-programs to filter out the data.
-
-
-
-
-!Syslogd.init
-
-
-This version of the syslogd.init file hard links the /dev/log's each time
-you start it because syslogd deletes and creates the /dev/log FIFO each
-time it runs. Here is a modified syslogd.init file:
-
-
-
-
-#!/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
-
-
-
-
-
-!!6.3 Multiple Syslogd's
-
-
-!One Per Disk
-
-
-If you run out of space on one filesystem and you have to break up your virtual
-domains onto different disks remember that hard links will not cross disks. That
-means you will have to run a separate syslogd for each group of domains on a disk.
-For example, if you had thirteen domains on /virtual1 and fifteen domains on
-/virtual2, you would hard link thirteen domains to /virtual1/log and run one
-syslogd with syslogd -p /virtual1/log and hard link fifteen other domains
-to /virtual2/log with a syslogd running with syslogd -p /virtual2/log .
-
-
-
-
-!One Per Domain
-
-
-If you do not want to centralize the logs to one place you could also run
-one syslogd per domain. This wastes process ID's so I do not recommend it but it
-is easier to implement. You would have to alter your syslogd.init file to
-run syslogd as chroot /virtual/domain1.com syslogd for each domain.
-This will run each syslogd within the chroot and the logs will be in
-/virtual/domain1.com/var/log rather than all combined in /var/log.
-Do not forget to run a syslogd normally syslogd for the
-main system and a kernel logger klogd .
-
-
-
-----
-
-!!7. Virtual FTP
-
-!!7.1 Inetd
-
-
-
-Wu-ftpd comes with built in support to make it virtual. However, you
-cannot maintain separate password files for each domain. For example, if
- bob@domain1.com and bob@domain2.com both want
-an account you would have to make one of them bob2 or have one of
-the users choose a different user name. Since you now have a virtual
-filesystem for each domain you have separate password files and this
-problem goes away. Just create a virtnewuser script and a virtpasswd
-script in the way mentioned above and you are all set.
-
-
-
-
-
-The inetd.conf entries for wu-ftpd:
-
-
-
-
-ftp stream tcp nowait root /usr/local/bin/virtuald \
-virtuald /virtual/conf.ftp wu.ftpd -l -a
-
-
-
-
-
-!!7.2 Anonymous FTP
-
-
-
-These are unaffected by the virtuald setup. For an anonymous
-user just create the FTP user in /virtual/domain1.com/etc/passwd like you
-would normally.
-
-
-
-
-ftp:x:14:50:Anonymous FTP:/var/ftp:/bin/false
-
-
-
-Then setup the anonymous FTP directory. You have separate password files for
-each domain so you can restrict which domain has an anonymous
-FTP account. Please note that since the FTP server is already chrooted
-into the /virtual/domain1.com directory you do not have to prefix any
-paths with it.
-
-
-
-
-!!7.3 Virtual FTP Users
-
-
-
-Wu-ftpd supports something called a guest group. This allows you
-to create different FTP areas for each user. The FTP server does
-a chroot to the specified area so the user cannot go
-outside that directory tree. If you create the users within a
-virtual domain this way they will not be able to view the
-system files.
-
-
-
-
-
-Add the guest's group to the /virtual/domain1.com/etc/ftpaccess file.
-
-
-
-
-
-Create an entry in /virtual/domain1.com/etc/passwd with the chroot
-dir and the starting home directory separated by /./ :
-
-
-
-
-guest1:x:8500:51:Guest FTP:/home/g/guest1/./incoming:/bin/false
-
-
-
-
-
-
-Then setup guest's home like you would for anonymous FTP. You have separate
-password files for each domain so you can specifiy which domains have guest
-accounts and which users within a domain are guest users. Please note that since
-the FTP server is already chrooted into the /virtual/domain1.com directory you do
-not have to prefix any paths with it.
-
-
-
-----
-
-!!8. Virtual Web
-
-!!8.1 Running With Virtuald
-
-
-!Not recommended
-
-
-Apache has their own support for virtual domains. This is the only
-program I recommend using the internal virtual domain mechanism. When
-you run something through inetd there is a cost, the program has to
-start up each time you run it. This results in slower response time, which
-is perfectly fine for most services but is completely unacceptable for web service.
-Apache also has a mechanism for stopping connections when too many come in, which
-can be critical for even medium volume sites.
-
-
-
-
-
-Simply stated, virtualizing Apache with virtuald is a really bad idea. The whole
-point of virtuald is to fill the gap created when services DO NOT have their
-own internal mechanism to do the job. Virtuald is not meant to replace good code
-that already completes the task at hand.
-
-
-
-
-
-The above not withstanding
here is how to do it for those who are foolhardy enough
-to do so.
-
-
-
-
-!Inetd
-
-
-Edit /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
-
-
-
-
-
-!Httpd.conf
-
-
-Edit /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
-
-
-
-
-
-!Configuration
-
-
-Then configure each instance of the Apache server like you would
-normally for single domain use.
-
-
-
-
-!Httpd.init
-
-
-An httpd.init file is not needed since the server is run through
-inetd.
-
-
-
-
-!!8.2 Running With Apache !VirtualHost
-
-
-
-Apache has three configuration files access.conf , httpd.conf ,
-and srm.conf . Newer versions of Apache have made the three
-configuration files unnecessary. However, I find that breaking up the configuration
-into three sections makes it easier to manage so I will be keeping with that style in
-this HOWTO document.
-
-
-
-
-!Access.conf
-
-
-This configuration file is used to control the accessibility of
-directories in the web directory structure. Here is a sample configuration
-file that shows how to have different options for each domain.
-
-
-
-
-# /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>
-
-
-
-
-
-!Httpd.conf
-
-
-This configuration file is used to control the main options for the
-Apache server. Here is a sample configuration file that shows
-how to have different options for each domain.
-
-
-
-
-# /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
-
-
-
-
-
-!Srm.conf
-
-
-This configuration file is used to control how requests are
-serviced and how results are formatted. You do not have to
-edit anything here for the virtual domains. The sample
-config file from Apache should work.
-
-
-
-
-!Httpd.init
-
-
-Nothing special has to be done to the httpd.init file. Use
-a standard one that comes with the Apache configuration.
-
-
-
-
-!!8.3 File Descriptor Overflow
-
-
-!Warning
-
-
-This only applies to the standalone style Apache server. A server
-run through inetd does not interact with the other domains so it has
-the whole file descriptor table.
-
-
-
-
-
-Every log file that the Apache server opens is another
-file descriptor for the process. There is a limit of 256 file descriptors
-per process in Linux. Since you have multiple domains you are using
-a lot more file descriptors. If you have too many domains running off of one
-Apache web server process you can overflow this table. This would mean
-that certain logs would not work and CGI's would fail.
-
-
-
-
-!Multiple Apache Servers
-
-
-If you assume five file descriptors per domain you can have 50 domains
-running on your Apache server without any problems. However, if you
-find your server having problems like this you could create /var/www1
-with an Apache server in charge of domain1 - domain25 and /var/www2 with
-an Apache server in charge of domain26 - domain50 and so on.
-This would give each server their own configuration, error, and log
-directory. Each server should be configured separately with their
-own Listen and !VirtualHost directives. Do not forget to run multiple
-servers in your httpd.init file.
-
-
-
-
-!!8.4 Sharing Servers With One IP
-
-
-!Saving IPs
-
-
-The HTTP (!HyperText Transfer Protocol) version 1.1 added a feature that
-communicates the name of the server to the client. This means that the
-client does not need to look up the server from its IP address. Therefore,
-two virtual servers could have the same IP address and be different web
-sites. The Apache configuration is the same as above except that you do not have
-to put in a different Listen directive since the two domains will have
-the same IP.
-
-
-
-
-!Drawback
-
-
-The only problem is that virtuald uses IP addresses to distinguish between
-domains. In its current form virtuald would not be able to chroot
-to different spool directories for each domain. Therefore, mail would only
-be able to respond as one IP and there would no longer be a unique spool
-directory for each domain. All the web sharing IP clients
-would have to share that IPs spool directory. That would mean duplicate
-usernames would be an issue again. However, that is the price
-you pay for sharing IPs.
-
-
-
-
-!!8.5 More Information
-
-
-
-This HOWTO only shows how to implement virtual support on the Apache web server.
-Most web servers use a similar interface. For more information on virtual web
-hosting consult the
-WWW HOWTO,
-the documentation for Apache at
-Apache's Site, or the
-documentation at
-!ApacheWeek.
-
-
-
-----
-
-!!9. Virtual Mail/Pop
-
-!!9.1 Problem
-
-
-
-Virtual mail support is in ever increasing demand. Sendmail says
-it supports virtual mail. What it does support is listening
-for incoming mail from different domains. You can then specify to
-have the mail forwarded somewhere. However, if you forward it to
-the local machine and have incoming mail to bob@domain1.com
-and bob@domain2.com they will go to the same mail folder. This is a
-problem since both bob's are different people with different mail.
-
-
-
-
-!!9.2 Solution
-
-
-
-You can make sure that each user name is unique by using a
-numbering scheme: bob1, bob2, etc or prepending a few characters
-to each username dom1bob, dom2bob, etc. You could also hack
-mail and pop to do these conversions behind the scenes but
-that can get messy. Outgoing mail also has the banner
-maindomain.com and you want each subdomain's outgoing mail
-banner to be different.
-
-
-
-
-
-I have two solutions. One works with sendmail and one works
-with Qmail. The solution with sendmail should work with a stock install of
-sendmail. However, it shares all the limitations built into sendmail.
-It also requires that one sendmail has to be run in queue mode for
-each domain. Having 50 or more sendmail queue processes that wake
-up every hour can put a little strain on a machine.
-
-
-
-
-
-The solution offered with Qmail does not require multiple instances of Qmail
-and can run out of one queue directory. It does require an extra program
-since Qmail does not rely on virtuald. I believe a similar procedure can be
-done with sendmail. However, Qmail lends itself to this solution more
-readily.
-
-
-
-
-
-I do not endorse any one program over the other. The sendmail install
-is a little more straight forward but Qmail is probably the more powerful
-of the two mail server packages.
-
-
-
-
-!!9.3 Sendmail Solution
-
-
-!Introduction
-
-
-Each virtual filesystem gives a domain its own /etc/passwd. This
-means that bob@domain1.com and bob@domain2.com are different users
-in different /etc/passwds so mail will be no problem. They also
-have their own spool directories so the mail folders will be
-different files on different virtual filesystems.
-
-
-
-
-!Create Sendmail Configuration File
-
-
-Create /etc/sendmail.cf like you would normally through m4. I used:
-
-
-
-
-divert()
-VERSIONID(`tcpproto.mc')
-OSTYPE(linux)
-FEATURE(redirect)
-FEATURE(always_add_domain)
-FEATURE(use_cw_file)
-FEATURE(local_procmail)
-MAILER(local)
-MAILER(smtp)
-
-
-
-
-
-!Edit Sendmail Configuration File
-
-
-Edit /virtual/domain1.com/etc/sendmail.cf to respond as your virtual domain:
-
-
-
-
-vi /virtual/domain1.com/etc/sendmail.cf # Approximately Line 86
-It should say:
-#Dj$w.Foo.COM
-Replace it with:
-Djdomain1.com
-
-
-
-
-
-!Sendmail Local Delivery
-
-
-Edit /virtual/domain1.com/etc/sendmail.cw with the local hostnames.
-
-
-
-
-vi /virtual/domain1.com/etc/sendmail.cw
-mail.domain1.com
-domain1.com
-domain1
-localhost
-
-
-
-
-
-!Sendmail Between Virtual Domains: The Hack (PRE8.8.6)
-
-
-However, sendmail requires one minor source code modification.
-Sendmail has a file called /etc/sendmail.cw and it contains all machine names
-that sendmail will deliver mail to locally rather than forwarding
-to another machine. Sendmail does internal checking of all
-the devices on the machine to initialize this list with the
-local IPs. This presents a problem if you are mailing
-between virtual domains on the same machine. Sendmail will be
-fooled into thinking another virtual domain is a local address and
-spool the mail locally. For example, bob@domain1.com sends mail
-to fred@domain2.com. Since domain1.com's sendmail thinks domain2.com
-is local, it will spool the mail on domain1.com and never send it to
-domain2.com. You have to modify sendmail (I did this on v8.8.5 without
-a problem):
-
-
-
-
-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 */
-
-
-
-Note only do this if you need to send mail between virtual domains which
-I think is probable.
-
-
-This will fix the problem. However, the main ethernet device eth0
-is not removed. Therefore, if you send mail from a virtual IP to the
-one on eth0 on the same box it will delivery locally. Therefore, I
-just use this as a dummy IP virtual1.maindomain.com (10.10.10.157). I never
-send mail to this host so neither will the virtual domains. This
-is also the IP I would use to ssh into the box to check if the system is ok.
-
-
-
-
-!Sendmail Between Virtual Domains: New Sendmail Feature (POST8.8.6)
-
-
-As of Sendmail V8.8.6, there is a new option to disable loading of the
-extra network interfaces. This means you do NOT have to alter the
-code in any way. It is called !DontProbeInterfaces .
-
-
-
-
-
-Edit /virtual/domain1.com/etc/sendmail.cf
-
-
-
-
-vi /virtual/domain1.com/etc/sendmail.cf # Add the line
-O !DontProbeInterfaces=True
-
-
-
-
-
-!Sendmail.init
-
-
-Sendmail cannot be started stand alone anymore so you have to
-run it through inetd. This is inefficient and will result in
-lower start up time but if you had such a high hit site you would
-not share it on a virtual box with other domains. Note that you
-are NOT running with the -bd flag. Also note that
-you need a sendmail -q running for each domain to
-queue up undelivered mail. The new sendmail.init file:
-
-
-
-
-#!/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
-
-
-
-
-
-!Inetd Setup
-
-
-Pop should install normally with no extra effort. It will
-just need the inetd entry for it with the virtuald part added.
-The inetd.conf entries for sendmail and 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 Solution
-
-
-!Introduction
-
-
-This solution takes over the delivery responsibilities of qmail-local, so
-use of the .qmail files in the virtual home directories will not work. However,
-each domain will still get a domain master user that will control aliasing for
-the whole domain. Two external programs will be used for that domain masters
-.qmail-default file. The mail will be passed through these two programs in
-order to deliver mail for each domain.
-
-
-
-
-
-Two programs are required since one of them is run setuid root. It is a small
-program that changes to a non-root user and then runs the second program. Consult
-your nearest security related site for a discussion as to why this is necessary.
-
-
-
-
-
-This solution bypasses the need for using virtuald. Qmail is flexible enough
-to not require a general virtuald setup. Qmail's design utilizes the chaining of
-programs together to deliver mail. This design makes it very easy to insert the virtual
-section into the Qmail delivery process without altering a stock install of Qmail.
-
-
-
-
-
-A note that since you are using one Qmail any unqualified domain name will be
-expanded with the domain of the main server. This is because you do not
-have a separate Qmail server for each domain. Therefore, make sure that your client
-(Eudora, elm, mutt, etc.) knows to expand all of your unqualified domain names.
-
-
-
-
-!Setup Virtual Domains
-
-
-Qmail has to be configured to accept mail for each of the virtual domains
-you will be serving. Type the following commands.
-
-
-
-
-echo "domain1.com:domain1" >> /var/qmail/control/virtualdomains
-
-
-
-
-
-!Setup Domain Master User
-
-
-Add to your main /etc/passwd file the user domain1. I would make the shell
-/bin/false so that the domain master cannot log in. That user will be
-able to add .qmail files and all mail for domain1 will route through that
-account. Note that usernames can only be eight characters long and domain
-names can be longer. The remaining characters are truncated. That means
-that user domain12 and domain123 are going to be the same user and Qmail
-might get confused. So be careful in your master domain user naming
-convention.
-
-
-
-
-
-Create the domain master's .qmail files with the following commands. Add
-any other system aliases at this point. For example, webmaster or hostmaster.
-
-
-
-
-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
-
-
-
-Create the domain master's .qmail-default file. This will filter all mail
-to the virtual domain.
-
-
-
-
-echo "| /usr/local/bin/virtmailfilter" > /home/d/domain1/.qmail-default
-
-
-
-
-
-!Tcpserver
-
-
-Qmail requires a special pop that can support the Maildir
-format. The pop program has to be virtualized. The author
-of Qmail recommends using tcpserver (an inetd replacement) with
-Qmail so my examples use tcpserver and NOT inetd.
-
-
-
-
-
-Tcpserver does not require a config file. All the information can be passed
-to it via the command line. Here is the tcpserver.init file that you would use
-for the mail daemon and popper:
-
-
-
-
-#!/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
-
-
-
-
-
-!Qmail.init
-
-
-You can use the standard Qmail init script provided. Qmail comes with very
-good documentation describing how to set this up.
-
-
-
-
-!Source
-
-
-You require two other programs to get virtual mail working with Qmail. They
-are virtmailfilter and virtmaildelivery. This is the C source to virtmailfilter.
-It should be installed in /usr/local/bin with permissions 4750, user root, and
-group 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)>=)
-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)<)
-{
-fprintf(stdout,"setuid/setgid failed\n");
-exit(TEMP);
-}
-switch(pid=fork())
-{
-case -1:
-fprintf(stdout,"fork failed\n");
-exit(TEMP);
-case :
-if (execl(VIRTDELIVERY,VIRTDELIVERY0,username,homedir,NULL)<)
-{
-fprintf(stdout,"execl failed\n");
-exit(TEMP);
-}
-default:
-if (wait(&status)<)
-{
-fprintf(stdout,"wait failed\n");
-exit(TEMP);
-}
-if (!WIFEXITED(status))
-{
-fprintf(stdout,"child did not exit normally\n");
-exit(TEMP);
-}
-break;
-}
-exit(WEXITSTATUS(status));
-}
-
-
-
-
-
-!Source
-
-
-You require two other programs to get virtual mail working with Qmail. They
-are virtmailfilter and virtmaildelivery. This is the C source to virtmaildelivery.
-It should be installed in /usr/local/bin with permissions 0755, user root, and
-group 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=;
-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)<)
-{
-fprintf(stdout,"chdir failed: %s\n",maildir);
-exit(TEMP);
-}
-time(&thetime);
-pid=getpid();
-if (gethostname(host,BUFSIZE)<)
-{
-fprintf(stdout,"gethostname failed\n");
-exit(TEMP);
-}
-for(i=;i<ATTEMPTS;i++)
-{
-snprintf(mail,BUFSIZE,"tmp/%u.%d.%s",thetime,pid,host);
-errno=;
-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)<)
-{
-fprintf(stdout,"fprintf failed\n");
-retval=TEMP; goto unlinkit;
-}
-if (fprintf(fp,"%s",dtline)<)
-{
-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)<)
-{
-fprintf(stdout,"fputc failed\n");
-retval=TEMP; goto unlinkit;
-}
-}
-if (fprintf(fp,"%s",buffer)<)
-{
-fprintf(stdout,"fprintf failed\n");
-retval=TEMP; goto unlinkit;
-}
-}
-p=buffer+strlen(buffer);
-nl=2;
-if (*p=='\n')
-nl=1;
-for(n=;n<nl;n++)
-{
-if (fputc('\n',fp)<)
-{
-fprintf(stdout,"fputc failed\n");
-retval=TEMP; goto unlinkit;
-}
-}
-if (fsync(fd)<)
-{
-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)<)
-{
-fprintf(stdout,"link failed: %s %s\n",mail,newmaildir);
-retval=TEMP; goto unlinkit;
-}
-unlinkit:
-if (unlink(mail)<)
-{
-fprintf(stdout,"unlink failed: %s\n",mail);
-retval=TEMP;
-}
-exit(retval);
-}
-
-
-
-
-
-!!9.5 Acknowledgement
-
-
-
-Thank you
-Vicente Gonzalez (vince@nycrc.net) for helping
-make the Qmail solution possible. You can certainly mail your thanks to Vince, however all questions
-and comments including issues regarding Qmail, about this HOWTO should continue to be directed to
-me.
-
-
-
-----
-
-!!10. Virtual Samba
-
-!!10.1 Setup
-
-
-
-Virtual SAMBA is very simple to install. Make sure that the following files are
-setup properly:
-
-
-
-
-
-****/virtual/domain1.com/etc/smb.conf FILE
-****
-
-****/virtual/domain1.com/var/lock/samba DIRECTORY
-****
-
-****/virtual/domain1.com/var/log DIRECTORY
-****
-
-****/usr/local/bin/virtsmbstatus SYMLINK /usr/local/bin/virtexec
-****
-
-
-
-
-
-!!10.2 Inetd
-
-
-
-Edit /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
-
-
-
-An smb.init file is not needed since the server is run through
-inetd.
-
-
-
-----
-
-!!11. Virtual Other
-
-
-
-
-
-Any other service should be a similar procedure.
-
-
-
-
-
-**** Run virtfs to add the binaries and libraries to the virtual filesystem.
-****
-
-**** Add it to /etc/inetd.conf.
-****
-
-**** Create a /virtual/conf.service file.
-****
-
-**** Create any virtual scripts that need to be made.
-****
-
-
-
-
-----
-
-!!12. Conclusion
-
-
-Those are all the steps you need. Again mail any responses to
-Computer Resource Center. If you have a
-question or an update to the document let me know and I will add it.
-
-
-
-
-
-The document has met with a very good response. I thank all the people who sent
-me questions as they are helping to shape the document to meet the needs of users
-everywhere. Before you ask a question I urge you to read the FAQ to see if it
-has been already asked and answered. Thanks again.
-Brian
-
-
-----
-
-!!13. FAQ
-
-
-__Q1__. I created sendmail.init and syslogd.init. I put them in /usr/local/bin and tried to
-run them but I got errors.
-
-
-
-
-
-__A1__. These files are called init scripts. They are run by the program init when
-your computer boots. They do not go with the /usr/local binaries. Consult the
-Linux System Administrators Guide or the Linux Getting Started Guide for information
-on how to use the init scripts system.
-
-
-
-
-
-__Q2__. I put these lines into /etc/sendmail.cf
-
-
-
-
-divert()
-VERSIONID(`tcpproto.mc')
-OSTYPE(linux)
-FEATURE(redirect)
-FEATURE(always_add_domain)
-FEATURE(use_cw_file)
-FEATURE(local_procmail)
-MAILER(local)
-MAILER(smtp)
-
-
-
-And I got really stange output. Why?
-
-
-
-
-
-__A2__. You do not put these lines directly in /etc/sendmail.cf. The sendmail.cf
-file was written to be easy for sendmail to understand and hard for humans to read.
-Therefore, to make it easy to configure we use a program called m4 and its macro
-capabilities to create the sendmail.cf file. The FEATURE lines are actually macros
-that expand to sendmail configuration statements. See the sendmail docs on how to
-configure sendmail through this method. Also note that you create a main
-/etc/sendmail.cf file and the virtfs script then copies this to
-/virtual/domain1.com/etc/sendmail.cf. Then you edit that sendmail.cf file to
-respond as your domain.
-
-
-
-
-
-__Q3__. Where do I get virtuald, what is it, and how do I use it?
-
-
-
-
-
-__A3__. Virtuald is C source that I wrote to run a virtual service.
-It is included with this HOWTO. You compile it like a normal C program
- make virtuald . The resulting binary is placed into
-/usr/local/bin. Add lines to /etc/inetd.conf that use virtuald as a wrapper to a normal
-network server program.
-
-
-
-
-
-__Q4__. I do not have dialog installed on my system?
-
-
-
-
-
-__A4__. Dialog is a program that allows you to put dialog pop up windows
-into your shell scripts. It is required for my virtual shell script
-examples to work. You can get a copy of dialog at
-sunsite.
-It compiles very easily and should be no problem to install.
-
-
-
-
-
-__Q5__. How can I know if virtual syslogd is working?
-
-
-
-
-
-__A5__. When virtuald runs it should output the following messages to
-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
-
-
-
-The Chroot dir message is sent by virtuald after the chroot system
-call is performed. If this message appears virtual syslogd is working. If the
-service you are virtualizing logs messages to syslogd and you see them that
-is also a sign that virtual syslogd is correctly setup.
-
-
-
-
-
-Note that if you have not turned on the compile time option VERBOSELOG,
-virtuald will not log at all. The only way to tell if virtual syslogd is
-working at that point is if the daemon you are virtualizing independently
-logs something to syslogd.
-
-
-
-
-
-__Q6__. How can I setup quotas across virtual filesystems?
-
-
-
-
-
-__A6__. You setup quotas like you would normally. See the
-Quota mini-HOWTO.
-However, you have to make sure there are no uid conflicts across domains. If there are
-conflicts you will have users sharing a quota. Set aside a range of uid's that you know will
-have quota's enabled and tell your domains that they cannot have any users in that range except the
-ones registered to have a quota.
-
-
-
-
-
-__Q7__. What is this \ notation in all the inetd.conf entries?
-
-
-
-
-
-__A7__. That is just a method of breaking up config files across two lines.
-I did that so the line would word wrap in a nice place. You can just ignore the \
-and join the two lines back together.
-
-
-
-
-
-__Q8__. When I run passwd or other login programs I get permission denied .
-When I run FTP or su I get no modules loaded for service XXX . Why?
-
-
-
-
-
-__A8__. Those are PAM error messages. I wrote these scripts before PAM was out.
-My virtfs script does not copy /etc/pam.d, /usr/lib/cracklib_dict.*, /lib/security or any of the
-other files PAM requires. PAM needs these to function. If you edit my virtfs
-script to copy these files the problem will go away.
-
-
-
-
-
-__Q9__. Can virtuald work with tcpd hosts.allow and hosts.deny files?
-
-
-
-
-
-__A9__. Yes it can with some modifications.
-
-
-
-
-
-First the source has to be changed in two places.
-
-
-
-
-
-This has to be inserted where the arguments are checked.
-
-
-
-
-if (!argv[[3])
-{
-syslog(LOG_ERR,"invalid arguments: no program to run");
-exit();
-}
-
-
-
-The exec line has to be changed from:
-
-
-
-
-if (execvp(argv[[2],argv+2)<)
-
-
-
-to:
-
-
-
-
-if (execvp(argv[[2],argv+3)<)
-
-
-
-Second the inetd.conf lines have to be changed from:
-
-
-
-
-ftp stream tcp nowait root /usr/local/bin/virtuald \
-virtuald /virtual/conf.ftp wu.ftpd -l -a
-
-
-
-to:
-
-
-
-
-ftp stream tcp nowait root /usr/local/bin/virtuald \
-virtuald /virtual/conf.ftp tcpd wu.ftpd -l -a
-
-
-
-Third edit the /virtual/domain1.com/etc/hosts.allow and
-/virtual/domain1.com/etc/hosts.deny files accordingly.
-
-
-
-
-
-__Q10__. Can my virtual hosts run CGI's?
-
-
-
-
-
-__A10__. Yes they can but I recommend putting the /cgi-bin in a place
-outside of the chroot that only you have access to. For example,
-/var/www/cgi-bin/domain1.com. Giving clients access to /cgi-bin is giving them
-the opportunity to run programs on your sever. This is a big security hole. Be
-careful. I do not let any cgi run on my systems that I have not personally
-inspected for bugs.
-
-
-
-
-
-__Q11__. My configuration files are different from your examples. What do I do?
-
-
-
-
-
-__A11__. There are two basic configuration styles: SystemV and BSD. The examples provided
-in the HOWTO are based on SystemV style configuration files. Virtual services works equally
-well on either system. For information on BSD style configuration files consult the origin
-of your distribution or the nearest LDP site.
-
-
-
-
-
-__Q12__. I sent you mail and have not heard a response from you or your response
-took a long time. Why?
-
-
-
-
-
-__A12__. Probably because you did not put VIRTSERVICES HOWTO in your subject header.
-Please bear in mind that I am a network administrator and that among the other things I do
-in my 20 hour days is administering my own virtual boxes and those of my clients. Mail
-that is properly addressed is always responded to within two or three days. Mail that is improperly
-addressed does not get filtered into my VIRTSERVICES mailbox and can lie around unnoticed for
-days or weeks.
-
-
-
-
-
-__Q13__. Does virtuald work under 100Mbit?
-
-
-
-
-
-__A13__ The speed of the network card is unrelated to whether virtuald will work or
-not. Try making sure that your server works under 10Mbit and that your 100Mbit network card
-works normally without a virtual server.
-
-
-
-
-
-__Q14__. Should I use sendmail's virthost table?
-
-
-
-
-
-__A14__. No. That is sendmail's feature to accept info for multiple domains. Virtuald
-gives each sendmail its own separate chroot environment. Install virtuald and then configure
-sendmail like you would normally for each domain.
-
-
-
-
-
-__Q15__. Can I setup virtual telnet on my machine? What about creating
-a virtual root account so clients can administer their own domains?
-
-
-
-
-
-__A15__. These questions come to me quite often and to be honest, I am getting
-a bit tired of them. The answer, as stated numerous times in the documentation, is
-that any service run through inetd can be virtualized using virtuald so there is
-nothing to stop you from doing either of the above. Nothing except common sense.
-Whatever benefits you might derive from allowing telnet are heavily outweighed
-by the cost to the virtual box (and thus the sites you are supposed to be
-hosting in a responsible manner) in terms of security. Here are just a few
-issues involved:
-
-
-
-
-
-**** In order to completely fool an incoming telnet session you have to hack the kernel
-to get multiple procs working, reset your source IP address for outgoing connections,
-fool gethostname so it uses the virtual hostname and not the system hostname, etc.
-If you are an advanced user then by all means hack the kernel. For the newbie I do not
-recommend it.
-****
-
-**** By allowing users to come into your box via telnet you allow them to run arbitrary
-programs. Through known hacks you can get root and cause damage to the system.
-****
-
-**** Giving a root telnet account on a virtual box is very bad. A root virtual user
-can still read raw device files which nullifies the chroot , shutdown the system, and
-can kill other processes on the system.
-****
-
-**** The programs that these telnet sessions are running take up valuable CPU time
-that the network services could be using.
-****
-
-**** Telnet is an insecure network service. Plain text passwords are sent out over
-the net. If a malicious user gets this password he/she can use the above mentioned
-attacks to harm your system.
-****
-
-**** Your virtual environments will have to be bigger. You will need more shared
-libraries, more configuration files, and more binaries. A six gigabyte disk can
-run out of space really fast.
-****
-
-
-
-
-
-
-The bottom line is that allowing login's on a virtual box is a really bad idea. If
-permitted, every site hosted on that machine is at risk. If you want to allow a site
-holder to administer users then you are advised to write (not script) the code
-necessary to run the virtual processes that allow them to add, delete or modify users
-upon login through ssh. This should be completely menu driven, should never allow a console
-and should not run as root. In order to accomplish this you will have to change
-ownership of the pertinent files from root to some other user. If done in this manner
-it is marginally safe to incorporate into a virtual machine. There is never an
-acceptable time to allow root login's either through telnet or ssh. Doing so is
-simply an invitation to disaster. If there is an overwhelming reason to run telnet
-then the site should be hosted on a dedicated machine where the only risk is to the
-individual site. No responsible administrator would ever do otherwise and so I will
-waste no more time on this issue.
-
-
-
-
-
-__Q16__. Is there an rpm, tar, web site, mailing list, etc. associated with
-virtuald and the Virtual-Services HOWTO?
-
-
-
-
-
-__A16__. Currently there is nothing like that available. This HOWTO is the
-only source of information to everything I do concerning this project. I find
-the HOWTO to be fairly self contained making the need for other pieces of information
-superfluous.
-
-
-
-
-
-__Q17__. When I try to run virtexec as a regular user I get chroot: operation not permitted . Why?
-
-
-
-
-
-__A17__. Chroot is a root restricted system call. Only the superuser can execute
-it. The virtexec script runs the chroot program which is why you need to be root
-in order to run it.
-
-
-
-
-
-__Q18__. I setup pop and sendmail but popping mail does not seem to
-work. How come?
-
-
-
-
-
-__A18__. Some pop programs come with /usr/spool/mail as their place for mail
-files. I know that qpop has to be manually editted to fix this. Either recompile
-the source to your program or symlink /virtual/domain1.com/usr/spool to
-/virtual/domain1.com/var/spool.
-
-
-
-
-
-__Q19__. I did not use the program mentioned in your HOWTO, I used program
-XXX. It does not work. Why?
-
-
-
-
-
-__A19__. I tried to make sure to use the most generic of each server in
-my examples. However, I know that everyone has their favorite version of each
-server. Send me as much information as possible and I will try to figure out
-how to solve your problem and document it in the FAQ. The most important
-piece of information to send me is where to get the version of the software
-you are running (in the form ftp://ftp.domain1.com/subdir/subdir/file.tgz).
-
-
-
-
-
-__Q20__. When I run virtexec is says symlink not a virt function .
-What does this mean and how do I fix it?
-
-
-
-
-
-__A20__. Virtexec is a program that will take its zero argument, strip
-off the first four characters, and run the remaining name in the virtual
-environment. For example, virtpasswd runs passwd. If the first four characters
-that it strips off are not virt it complains and outputs that
-error message. Virtexec is written in shell script and should be fairly simple
-to follow. Refer to the manual pages on bash or whatever shell you run for
-questions about shell script programming.
-
-
-
-
-
-__Q21__. I have a question about Qmail, SAMBA, Apache, etc. that is unrelated
-to the virtuald setup or how the package interfaces to virtuald.
-
-
-
-
-
-__A21__. All the packages described here are fully documented. Some even
-have full web sites like www.packagename.org dedicated to them. Please
-consult them about questions dealing with the package that are unrelated to their
-virtual hosting functionality.
-
-
-
-
-
-__Q22__. I have several domain aliases to domain1.com but mail keeps bouncing
-from the aliases. How come?
-
-
-
-
-
-__A22__. Virtmaildelivery relies on the environment variables passed to it to
-determine which /virtual/domain1.com directory to deliver to. It does
-not perform any DNS lookups to determine the address of the mail. However,
-if the address is submail.mail.domain1.com, virtmaildelivery will
-first try that address and then mail.domain1.com and then domain1.com and
-then com in that order until either a match happens or there is no domain name
-left.
-
-
-
-
-
-However, if you have domain aliases that are not subdomains of one
-another you have to create symlinks like so:
-
-
-
-
-cd /virtual
-ln -s domain1.com domain1alias.com
-
-
-
-That way virtmaildelivery will be fooled into thinking that both directories
-exist even though one is a symlink and mail will be able to be delivered to
-user@domain1.com or user@domain1alias.com. Note that virtexec will list both of
-the domains in the dialog box when your run it. You can choose either one
-since they will be the same virtual filesystem
.
-
-
-
-
-
-
-----
+Describe
[HowToVirtualServicesHOWTO
] here.