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.
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:
- Courier IMAP: servicio POP3 e IMAP para poder chequear los mensajes
- Roundcube Webmail: un Webmail para chequear la casilla