Instalando qmail

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:

  • Envío y recepción de e-mails, y distintos filtros anti-spam
  • Conservación del correo en el servidor y lectura del mismo mediante protocolo IMAP
  • Integración con Webmail

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:

  • Bajar de internet los softwares necesarios para hacer andar un servidor qmail básico.
  • Compilar e instalar las aplicaciones de soporte que necesita el qmail, como ser, ucspi-tcp y daemontools
  • Preparar directorios y usuarios para una instalación de qmail básica
  • Compilar e instalar el qmail
  • Verificar el funcionamiento de todo el sistema

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?

  • netqmail-1.06 es el qmail-1.05 junto con una serie de parches y arreglos que fueron reunidos por Charles Cazabon, Dave Sill, Henning Brauer, Peter Samuel, y Russell Nelson. Gente toda esa muuuuy inteligente, asiduos contribuyentes del qmail.
  • ucspi-tcp es un paquete que maneja las conexiones entrantes e implementa reglas de control de acceso, un poco como lo hace el tcpd de los sistemas Unix, y compite con el xinetd, que realiza la misma función.
  • daemontools es un paquete que se encarga de iniciar automáticamente los componentes del qmail cuando se inicia la computadora o estos se cuelgan. Este último paquete requiere un parche, el daemontools errno patch, para adecuar la forma de capturar errores a las distribuciones más modernas de GNU/Linux.

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.

Nota para usuarios de systemd

Algunas de las distribuciones de Linux más modernas incluyen un nuevo sistema de inicialización
llamado systemd, que reemplaza al viejo y venerable
SystemV que Linux heredó del AT&T Unix System V de los años ’70. Describir systemd está fuera
del alcance de este texto, pero se indicarán los cambios que hay que hacer para instalar las herramientas
de qmail dentro de este esquema. Sorpresivamente, no se requieren grandes cambios.

Compilación de aplicaciones de soporte

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

$ mkdir -p /package
$ chmod 1755 /package
$ cd /package

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:

$ tar xvf daemontools-0.76.tar.gz
$ cd admin/daemontools-0.76
$ patch -Np1 -i ../../daemontools-0.76.errno.patch
—Obtener permisos de root—
# package/install

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.

systemd: Siendo /etc/inittab una parte del SystemV, systemd lo inutiliza, y llegado este punto, no pasa nada,
es decir, los procesos que deberían lanzarse no se lanzan. La instalación de hecho edita el archivo
inittab, el cual es incluído por compatibilidad, pero no se utiliza.

Si bien se podrían modificar estas instrucciones completamente para quitar de en medio a daemontools, lo
más fácil es lanzar svscan desde la maquinaria del systemd, realizando los siguientes pasos:

1. Crear el archivo /lib/systemd/system/qmail.service y colocarle este contenido:

[Unit]
Description=qmail service
After=local-fs.target network.target</p>
[Service]
#ExecStart=/usr/local/bin/svscan /service
ExecStart=/bin/sh /command/svscanboot
ExecStop=/usr/local/bin/svc -dx /service/* /
service/*/log
Type=simple
NonBlocking=yes

[Install]
WantedBy=multi-user.target

2. Iniciar svscan utlizando systemd:

service qmail start

3. Configurar para que systemd inicie svscan al iniciar el sistema:

ln -s /lib/systemd/system/qmail.service /etc/systemd/system/multi-user.target.wants/qmail.service

Ahora sí que se observa la lista de procesos anterior!

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

nPasemos 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:
1. 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).

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

./config-fast

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.
locals: dominios que se consideran locales, o sea, están en esta misma computadora.
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

r
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 &
quot;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 &lt; /etc/tcp.smtp
chmod 644 /etc/tcp.smtp.cdb
echo "Reloaded /
etc/tcp.smtp."
;;
help)
cat &lt;&lt;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 &amp; 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

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:

Be the first to comment

Leave a Reply

Your email address will not be published.


*