Inicio | Fotos | Artículos | Linux | Java | Música | Libro de visitas | Enlaces | weblog

Aquí describiré cómo configurar un servidor Linux (o "GNU/Linux" como prefieren algunos puristas) para enviar y recibir correo, con las siguientes características:

El software a emplear será de Código Abierto, como por ejemplo Software Libre GNU, BSD, etc. En casos que se indique, para algunas características agregaré código escrito por mí, que se considera bajo la licencia GNU GPL v3.

Sistema operativo y software de base

El servidor podrá ser cualquier PC que tengan dando vueltas por ahí o un servidor hecho y derecho; todo depende de para qué lo quieran usar, cuál será el volumen de correo que manejará y qué tanto se toleran las fallas que este pueda tener.

El sistema operativo será GNU/Linux. Cualquier distribución vendrá bien, yo utilizaré casi exclusivamente software que esté disponible en código fuente y que bajaré y compilaré yo mismo. Personalmente, yo utilizo Fedora; cuando mencione algún comando específico de esa distribución aclararé cómo se realiza lo mismo en otras distribuciones (y si no menciono alguna que Uds. conocen, díganmelo). Por lo tanto, se requiere sí o sí que se tengan las herramientas básicas de compilación, como GNU Make, GNU GCC o equivalentes.

Servidor de correo

El servidor de correo que yo utilizaré en esta descripción será el servidor qmail. Es ampliamente utilizado por numerosas empresas, como por ejemplo Yahoo!, y es de probada efectividad. Es un sistema muy extensible y además está disponible en código fuente; la página del qmail es abundante en documentación y consejos útiles.

En parte de esta explicación me ayudaré del excelente documento Life with qmail (en inglés). En este documento también se bajarán ucspi-tcp-0.88 y daemontools-0.76, utilizados como herramientas de apoyo, configuración e inicio automático del sistema.

Este es un resumen de las actividades que realizaremos en esta sección:

Bajando el software

Empecemos por bajar este software:

wget http://www.qmail.org/netqmail-1.06.tar.gz
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz
wget http://woodsheep.jp/qmail-conf/qmail-conf-0.60.tar.gz

¿Qué es cada cosa?

Nota muy muy importante:a partir de este momento se asume que el usuario con el que ustedes están trabajando es un usuario no privilegiado. Se indicará con un signo $ los "prompts" del intérprete de comandos que se ejecutarán, indicándose especialmente los comandos que requieran permisos de root, y colocando el signo # delante de tales comandos.

Compilación de aplicaciones de soporte

Primero instalamos lo más fácil: las aplicaciones de soporte: daemontools y ucspi-tcp.

---Obtener permisos de root---
# mkdir -p /package
# chmod 1755 /package
# cd /package
---Fin de permisos de root---

Luego hay que copiar el paquete daemontools-0.76.tar.gz y el daemontools-errno-patch a la carpeta /package que acabamos de crear. Ahora extraemos y aplicamos el parche:

---Obtener permisos de root---
# tar xvf daemontools-0.76.tar.gz
# cd admin/daemontools-0.76
# patch -Np1 -i ../../daemontools-0.76.errno.patch
# package/install
# ln -s /command/* /usr/sbin
---Fin de permisos de root---

El último mensaje que aparece en la instalación es:

Adding svscanboot to inittab...
init should start svscan now.

Eso quiere decir que intentará iniciar el programa svscan, encargado de lanzar y/o reiniciar los futuros procesos de qmail, desde el archivo /etc/inittab. Verifiquemos si efectivamente están iniciados los procesos pidiendo ps -ef:

# ps -ef
<---otros procesos que no vienen al caso --->
root 4744 1 0 01:35 ? 00:00:00 /bin/sh /command/svscanboot
root 4746 4744 0 01:35 ? 00:00:00 svscan /service
root 4747 4744 0 01:35 ? 00:00:00 readproctitle service errors:................

Si ven eso, es que la instalación de daemontools fue exitosa.

¿Qué es la línea punteada?

El daemontools es ante todo un iniciador de procesos, pero también es un mini mini mini logger. Es decir que es capaz de registrar los mensajes que emiten los procesos que tiene asociados. Ahora, ¿qué pasa si nos quedamos sin espacio en el disco rígido o alguna condición grave impide que se puedan grabar los mensajes en los archivos de log? Para eso es que los errores se van registrando también en la línea de comandos del proceso readproctitle. Ahora esa línea punteada indica que no hay ningún mensaje para grabar, está todo bien.

Pasemos al ucspi-tcp. Al ucspi-tcp también hay que parcharlo como al daemontools. El parche lo podemos sacar de la instalación del qmail.

Descomprimimos entonces el qmail:

Nota: volvemos al directorio donde bajamos los paquetes de la sección "Bajando el software".

$ tar xvf netqmail-1.06.tar.gz

Ahora nos ocupamos del ucspi-tcp:

$ tar xvf ucspi-tcp-0.88.tar.gz
$ cd ucspi-tcp-0.88
$ patch -Np1 -i ../netqmail-1.06/other-patches/ucspi-tcp-0.88.errno.patch
$ make
---Obtener permisos de root---
# make setup check

Listo. Ahora pasemos al "plato fuerte": la instalación del qmail.

Preparativos: creando usuarios y grupos

Tenemos que hacer algunos preparativos antes de instalar el qmail: crear directorios, crear usuarios y crear grupos.

Estos pasos tienen que hacerse con permisos de root.

---Obtener permisos de root---
# mkdir /var/qmail
# groupadd nofiles
# useradd -g nofiles -d /var/qmail/alias alias
# useradd -g nofiles -d /var/qmail qmaild
# useradd -g nofiles -d /var/qmail qmaill
# useradd -g nofiles -d /var/qmail qmailp
# groupadd qmail
# useradd -g qmail -d /var/qmail qmailq
# useradd -g qmail -d /var/qmail qmailr
# useradd -g qmail -d /var/qmail qmails

Compilación e instalación

Ahora es momento de compilar el fuente, e instalarlo:

Nota: Volvemos al directorio donde bajamos los paquetes descargados en el punto "Bajando el software".

$ cd netqmail-1.06
$ make
--- Obtener permisos de root ---
# make setup check

Configuración

Primero de todo debemos establecer:
Forma de inicio de qmail. Por esto no se preocupen, más adelante voy a mostrar un script para init-system-V que hará fácil el inicio del qmail. Lo que hay que decidir es si se va a trabajar con Maildir o Mailbox. Maildir, es un directorio dentro del cual se depositan los mensaes cada uno como archivo individual. Mailbox, es un solo archivo donde se almacenan consecutivamente cada uno de los mensajes. Yo recomiendo Maildir, es lo mejor y además es lo que viene bárbaro para integrar con el Courier-IMAP que describiremos más adelante. Grabar este script como /var/qmail/rc:

#!/bin/sh

# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start "`cat /var/qmail/control/defaultdelivery`" splogger qmail

Esto inicia el qmail con las instrucciones default de entrega, y llama al splogger, que se encargará de usar la maquinaria Syslog para dejar los logs de qmail en los logs del sistema que se hayan configurado (en el caso del Fedora, es en /var/log/maillog).

Ahora, darle permisos de ejecución al /var/qmail/rc:

chmod +x /var/qmail/rc

Bien. Ahora, una configuración básica del qmail. Ir al directorio del fuente del netqmail-1.06 y ejecutar esto:

./config-fast mi.nombre.de.dominio

Esto crea una serie de archivitos de control en el directorio /var/qmail/control que controlan el comportamiento del qmail:

defaultdomain: este archivo contiene una sola línea con el nombre de dominio que hay que agregar a las direcciones de correo que no especifican el dominio. Esto es bárbaro para simplemente mandar un email dirigido a fulanito cuya casilla está en nuestro mismo dominio.
rcpthosts: varias líneas indicando en cada una un nombre de dominio que se considera local, es decir, que el qmail tomará como propio y aceptará mensajes.
me: nuestro propio dominio. Indispensable. Asegurarse que tiene el propio nombre de dominio de la computadora donde se instala el qmail.
locals: dominios que se consideran locales, o sea, están en esta misma computadora. Como mínimo, debe tener el nombre del propio servidor y localhost.
defaultdelivery: forma "default" de entregar mensajes. Hay que crearlo especialmente con el contenido:

./Maildir/

Ahora llegó el momento de configurar los servicios de entrega de mensajes y de SMTP via qmail. Para ello, contamos con unos programitas muy interesantes que escribió el seņor Tetsu Ushijima, para configurar los servicios.

Estos programitas construyen servicios que se aprovechan de la maquinaria del ucspi-tcp y daemontools que instalamos antes, los cuales, como ya hemos visto, constituyen una capa que compite con (y es totalmente incompatible con) tcpd y xinetd de los sistemas Linux tradicionales. El objetivo de esta instalación es constituir un entorno "Seguro" para la instalación del qmail, ya que todos estos programitas fueron creados por el mismo programador del qmail.

Los programitas vienen en el paquete qmail-conf-0.60 que hemos bajado antes. Ahora descomprimimos este paquete, y también el djbdns. La instalación y configuración de un servidor de DNS está fuera del alcance de este tutorial y se considera ya instalado; la descarga y compilación que se hace en este punto del djbdns es solamente para aprovecharse de algunos de sus componentes, que son requeridos por el qmail-conf.

Nota: en este momento volvemos a la carpeta donde se descargó el software del apartado "Bajando el software"

$ tar xvf qmail-conf-0.60.tar.gz
$ cd qmail-conf-0.60
$ tar xvf ../djbdns-1.05.tar.gz

Bien, ahora tenemos que crear el archivo Makefile para compilar el qmail-conf.

$ make -f Makefile.ini djbdns=./djbdns-1.05

Hay que parchar el fuente, sobre todo, para que no dé errores de instalación:

$ patch -Np0 -i ../netqmail-1.06/other-patches/djbdns-1.05.errno.patch

Ahora, compilamos e instalamos:

$ make
--- Obtener permisos de root ---
# make setup check

Ahora, los programitas instalados recién tienen que estar en el $PATH. Si preferimos no hacer eso, hacemos symlinks de sus ubicaciones actuales (/var/qmail/bin) al directorio /usr/bin:

# ln -s /var/qmail/bin/qmail-*-conf /usr/sbin

Listo, ahora pasamos a configurar el servicio de entrega de mensajes. Hay que elegir el usuario bajo el cual se almacenarán los registros de log del qmail. Podemos aprovechar el usuario qmaill ya creado antes.

Ahora, el comando. Gracias a la herramienta que nos bajamos, es bien simple:

# qmail-delivery-conf qmaill /var/qmail/service/qmail-send

Genial, ahora conectamos este servicio recién creado con la maquinaria del daemontools así se inicia de manera automática:

# ln -s /var/qmail/service/qmail-send /service

Si todo salió bien, al ejecutar este comando:

# svstat /service/qmail-send /service/qmail-send/log

deberían ver algo parecido a esto:

/service/qmail-send: up (pid 6345) 6 seconds
/service/qmail-send/log: up (pid 6346) 5 seconds

Ahora configuremos un servicio SMTP. Acá hay que elegir el usuario que se va a usar para los demonios de logging y de entrega de mensajes. Para el logging, qmaill ya creado antes, y para entrega, el qmaild. Para eso ejecutamos otro programita de los *conf que bajamos antes:

# qmail-smtpd-conf qmaild qmaill /var/qmail/service/qmail-smtpd

Ahora hay que ir al directorio recién creado, para configurar los IPs desde los que se puede hacer Relay (esto es, permitirles enviar mensajes a cualquier dominio; de lo contrario, el servicio SMTP solamente aceptará mensajes destinados a sí mismo. Sin esto se podría seguir, pero solamente el SMTP serviría para recibir mensajes y no para enviarlos).

cd /var/qmail/service/qmail-smtpd

Cargar este contenido en un archivo que llamarán tcp:

127.0.0.1:allow,RELAYCLIENT=""
192.168.1.:allow,RELAYCLIENT=""

Esta es una configuración por defecto que permitirá a la red 192.168.1.0/24 y al Localhost enviar mensajes a cualquier parte. Este es un archivo de texto que debe ser "compilado" para que sea legible por el ucspi-tcp. En la carpeta a donde fuimos el script qmail-smtp-conf se encargó de crear unas instrucciones en un archivo Makefile, para que solamente haga falta tipear make para compilar el archivito.

Compilamos entonces:

# make

Listo, ahora hace falta iniciar el servicio qmail-smtpd y para eso le indicamos al daemontools que lo haga haciendo un link al directorio /service:

# ln -s /var/qmail/service/qmail-smtpd /service

Me faltaron un par de cosas: vamos a crear algunos enlaces para tener los logs del qmail a mano en /var/log:

# mkdir /var/log/qmail
# cd /var/log/qmail
# test -d smtpd && mv smtpd smtpd.bak
# ln -s /var/qmail/service/qmail-smtpd/log/main smtpd
# test -d qmail-send && mv qmail-send qmail-send.bak
# ln -s /var/qmail/service/qmail-send/log/main qmail-send

Este es el fuente del script para iniciar qmail al inicio (copiado de Life with qmail). Grabar como /etc/rc.d/init.d/qmailctl :

#!/bin/sh

# description: the qmail MTA

PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`

case "$1" in
start)
echo "Starting qmail"
if svok /service/qmail-send ; then
svc -u /service/qmail-send /service/qmail-send/log
else
echo "qmail-send supervise not running"
fi
if svok /service/qmail-smtpd ; then
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
else
echo "qmail-smtpd supervise not running"
fi
if [ -d /var/lock/subsys ]; then
touch /var/lock/subsys/qmail
fi
;;
stop)
echo "Stopping qmail..."
echo " qmail-smtpd"
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo " qmail-send"
svc -d /service/qmail-send /service/qmail-send/log
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat /service/qmail-send
svstat /service/qmail-send/log
svstat /service/qmail-smtpd
svstat /service/qmail-smtpd/log
qmail-qstat
;;
doqueue|alrm|flush)
echo "Flushing timeout table and sending ALRM signal to qmail-send."
/var/qmail/bin/qmail-tcpok
svc -a /service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /service/qmail-send
;;
pause)
echo "Pausing qmail-send"
svc -p /service/qmail-send
echo "Pausing qmail-smtpd"
svc -p /service/qmail-smtpd
;;
cont)
echo "Continuing qmail-send"
svc -c /service/qmail-send
echo "Continuing qmail-smtpd"
svc -c /service/qmail-smtpd
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /service/qmail-send /service/qmail-send/log
echo "* Restarting qmail-smtpd."
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
chmod 644 /etc/tcp.smtp.cdb
echo "Reloaded /etc/tcp.smtp."
;;
help)
cat <<HELP
stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- schedules queued messages for immediate delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
flush -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0
{start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
exit 1
;;
esac

exit 0

Bárbaro, ahora hagamos algunas pruebas para ver si está todo configurado correctamente.

Para empezar creemos el directorio Maildir necesario en la carpeta de nuestro usuario no privilegiado:

cd ~
/var/qmail/bin/maildirmake Maildir

Segundo, debemos tener un archivo llamado .qmail en el directorio del usuario. Este archivo debe existir para toda cuenta del sistema y debe contener las instrucciones que usará el qmail para entregarle mensajes a la persona.

Lo creamos con el siguiente contenido:

./Maildir/

Listo. Ahora, siguiendo las instrucciones de TEST.deliver, vamos a mandar unos mails de prueba y ver qué pasa.

Prueba 1: envío local. Ejecutar este comando:

$ echo to: mi_usuario_no_privilegiado|/var/qmail/bin/qmail-inject

Ahora en el Maildir de ese usuario tiene que haber un mensaje con nada más que el encabezado en la carpeta ~/Maildir/new.

Prueba 2: envío local a una casilla inexistente:

$ echo to: nonexistent | /var/qmail/bin/qmail-inject

Si todo sale bien, tiene que haber un mensaje rebotado en nuestro Maildir.

Prueba 3: envío remoto:

$ echo to: agustin@strellis.com.ar | /var/qmail/bin/qmail-inject

Si reciben ese mensaje, está todo bien.

Bien, ahora es momento de crear algunas direcciones de correo básicas que deben existir:

MAILER-DAEMON - la dirección que todo servidor de mail usa como remitente para los avisos de mensajes rebotados. Es obligatorio que esta cuenta exista y está bueno que esté direccionada a un usuario real.
root - los logs del sistema envían muchos mails al usuario Root. Está bueno que esté asignada a un usuario real.
postmaster - Este es el usuario que administra el servidor de correo. También un usuario obligatorio en todo servidor de correo, también tiene que ser asignado a un usuario real.

Para crear estas cuentas, podemos crear usuarios o mejor todavía crear archivitos en el directorio /var/qmail/alias, que contendrán la dirección de mail de la persona real necesaria:

.qmail-mailer-daemon
.qmail-root
.qmail-postmaster

Por último, les agrego una configuración más: resulta que muchos programas invocan por línea de comandos al que consideran el "enviador default" de correo, o sea, el Sendmail. El qmail, por supuesto, reemplaza Sendmail, pero los usos y costumbres Unix que Linux heredó son bastante fuertes y todavía hay algunos programas ahí afuera que necesitan que exista una manera por línea de comandos de enviar un mensaje que haga la función equivalente del Sendmail. Para eso, ejecutamos este comando para crear un enlace simbólico entre el archivo esperado, /usr/sbin/sendmail, y la versión de ese utilitario que incorpora qmail:

# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

Si llegaron hasta aquí, felicidades por haber instalado un servidor qmail! Ahora iremos mejorando esta instalación con algunos componentes importantes: