Seleccionar página

Todo sobre Qmail

Llevo ya unos cuantos años de retraso para profundizar en el funcionamiento de Qmail. He decidido ponerme las pilas y empezar a desguazarlo.

Generalidades

Al contrario que otra serie de programas MTAs antiguos, Qmail está constituido oir una serie de unos 10 pequeños programas, en estrecha interrelación, cada uno de los cuales apenas supera los 30 Kbs de código. Otros programas, tipo exim o sendmail, están constituidos por un graaaan ejecutable, que hace de todo. Esta arquitectura modular, agiliza muchas cosas, entre otras su funcionalidad y su mantenimiento.

Cada uno de los pequeños modulos con los que cuenta Qmail realiza una función diferente. Por ejemplo, qmail-lspawn se dedica a generar entregas locales, mientras que qmail-clean borra la cola de ficheros de mensajes que han sido completamente procesados.

Al contrario que otro tipo de MTAs, Qmail no necesita privilegios globales de superusuario abrir y atender el puerto 25 y realizar entregas locales. En su caso, por ejemplo, sólo qmail-lspawn es ejecutado como root y realiza las entregas locales. Esto se llama el principio del menor privilegio.

Sobre los ficheros de configuración, Qmail usa varios ficheros pequeños para configurarse, en vez de tener un fichero de configuración gigante. El fichero de configuración global es /var/qmail/control. Los ficheros de configuración particulares van a la home de cada usuario.

¿Qué hace un MTA?

Se puede dividir el proceso del manejo de email a través de internet en dos partes. Primero, hablaremos de los MUAs (mail user agentes). Es el programa que unusuario tiene localmente instalado en su ordenata para leer, descargar y enviar correo. Ejemplos: Outlook, eudora, pine… Digamos que el usuario maneja localmente sus mensajes, los mueve de bandeja, los indexa, los busca… lo que no hace es enviarlos a otro usuario. Para éso está el MTA (mail transfer agent).

Cuando un usuario envía un email con su MUA, lo inyecta a un MTa remoto (como pudiera ser Qmail). Este MTA, examina la dirección de destino. Si es local (el dominio está dentro de la jurisdicción del propio MTA), lo deposita en la bandeja local del destinatario. Si no es local, intenta buscar el host al cual tiene que enviar el mensaje y lo envía.

Cada uno de esto pasos es susceptible de fallar. Si el fallo es permanente, se devuelve un mensaje de error al destinatario. Si el fallo es temporal, el mensaje se queda en la cola de espera del MTA de turno, reintentándose de vez en cuando.

Los 5 demonios de Qmail

5 demonios Qmail

Qmail tiene 5 demonios (en cursiva) que corren paralelamente y aproximadamente una decena de programas que son invocados bien por estos demonios, bien por otros programas.

El demonio principal es qmail-send, que getiona la cola de correo y se encarga de hacer el envío tanto local como remoto. Está conectado con dos demonios: qmail-lspawn y qmal-rspawn, que realizan las entregas remotas y locales, usando a su vez qmail-local y qmail-remote.

Una vez que el correo ha sido procesado, con todas las entregas bien existosas o bien fallidas, qmail-send le indica a qmail-clean que borre del Queue los ficheros implicados en el proceso.

El quinto demonio, tcpserver, lo abordaré más tarde.

¿Cómo viaja un mensaje a través de Qmail?

El mensaje entra a Qmail o por un programa dentro del propio sistema o bien por una conexión SMTP entrante. Independientemente de donre entre, el programa que lo ha originado ejecutará qmail-queue, que copiará el mensaje a un fichero en el directorio queue, copiará el envelope del emisor y del destinatario a otro segundo fichero y se lo notificará a qmail-send.

Si el mensaje ha sido originado localmente, qmail-queue será llamado por qmail-inject o newinject, que le añadirá las líneas que le falten a la cabecera del mensaje y retocará los campos de las direcciones. Es perfectamente legítimo que un programa que envía mensajes pueda llamar directamente a qmail-queue. La mayoría de las veces, qmail-inject es llamado directamente desde sendmail.

Si el mensaje viene desde un sistema remoto, nuestro quinto demonio, tcpsever, estará escuchando todas las conexiones smtp que vengan del puerto 25. Cada vez que llega una conexión, ejecuta qmail-smtpd, que recibe el mensaje vía smtp y llama a qmail-queue para poner en cola el nuevo mensaje.

Como he dicho antes, independientemente de donde venga el mensaje, qmail-queue escribe el mensaje en un fichero temporal en el directorio queue/todo, poniendo una nueva línea «recivido:» en la parte superior y copiará el envelope del emisor y del destinatario a otro segundo fichero. Luego avisará a qmail-send escribiendo un trigger en un fichero socket.

Posteriormente, qmail-send cogerá el mensaje de la pila queue/todo, analizará los destinatarios posibles y verá si es local, virtual o remoto.

Para los mensajes locales, le indica a qmail-lspawn que ejecute qmail-local para realizar cada entrega local. Para cada una de ellas, qmail-local ajusta el contexto del usuario que controla la dirección de entrega (user id, group id, directorio home y unas pocas variables de entorno) y luego realiza las acciones indicadas en el fichero .qmail de la dirección de entrega. Dependiendo del contenido del fichero .qmail del directorio home del usuario receptor, la entrega local puede almacenar el mensaje en un mailbox, proporcionar una dirección diferente para enviar el mensaje, ejecutar un programa que maneje el mensaje, o cualquier combinación de ellas.

Para cada dirección de email remota, qmail-send notifica insta a qmail-rspawn a que ejecute qmail-remote para realizar las entregas remotas. Cada una de ellas se realiza mediante una sesión separada SMTP (ésta quizá es uno de los puntos más controvertidos de Qmail).

Para las entregas en dominios virtuales, qmail-send reescribe cada dirección virtual transformándolas en una dirección local modificada, usando la información de los ficheros virtualdomains. Una vez que es traducido a la correspondiente dirección local, el mensaje es entregado igual que cualquier otro mensaje local.

Para cada uno de estos tipos de entregas, locales o remotas, el programa spawn devuelve un informe de status a qmail-send. Cada una de las entregas ha podido ser exitosa, temporalmente fallida y permanentemente fallida. Una entrega que ha sido catalogada como fallida temporalmente será intentada de nuevo hasta que el mensaje sea catalogado como demasiado viejo, por defecto en una semana, o frecuentemente menos. Si la entrega ha fallado, bien inicialmente o tras varios reintentos, se produce un informe rebotado que es enviado por email al remitente del mensaje.

Una vez que todas las direcciones de los mensajes han sido exitosas o han fracasado, qmail-send indica a qmail-clean que borre los ficheros de los mensajes de la cola.