211.2 - Gestión de entrega

Peso: 2

Formatos de buzón de correo

mbox vs Maildir

CaracterísticamboxMaildir
FormatoUn solo archivo por buzónUn directorio con un archivo por mensaje
Ruta típica/var/mail/usuario~/Maildir/
BloqueoRequiere bloqueo del archivoNo requiere bloqueo
ConcurrenciaProblemático con acceso simultáneoSeguro con acceso concurrente
NFSProblemático sobre NFSFunciona bien sobre NFS
RendimientoSe degrada con buzones grandesConstante independientemente del tamaño

Estructura de Maildir

~/Maildir/
├── cur/           # Mensajes leídos
├── new/           # Mensajes nuevos (no leídos)
├── tmp/           # Mensajes en proceso de entrega
├── .Sent/         # Carpeta de enviados
│   ├── cur/
│   ├── new/
│   └── tmp/
├── .Drafts/       # Carpeta de borradores
└── .Trash/        # Carpeta de papelera

Para el examen: Maildir es el formato recomendado para servidores modernos. Cada mensaje es un archivo individual en los subdirectorios new/, cur/ y tmp/. No requiere bloqueo de archivos y funciona bien con NFS.

Configuración del formato en Postfix

# Para usar Maildir (directorio por usuario)
home_mailbox = Maildir/
 
# Para usar mbox (archivo único)
home_mailbox = Mailbox
# o dejar que use /var/mail/usuario por defecto

Procmail

Procmail es un MDA y filtro de correo local que permite clasificar y procesar correo según reglas definidas por el usuario.

Configuración global y de usuario

ArchivoÁmbito
/etc/procmailrcConfiguración global (todos los usuarios)
~/.procmailrcConfiguración personal del usuario

Integración con Postfix

# En /etc/postfix/main.cf
mailbox_command = /usr/bin/procmail -a "$EXTENSION"

Formato de reglas .procmailrc

# ~/.procmailrc
 
# Variables de entorno
MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
LOGFILE=$HOME/procmail.log
VERBOSE=yes
 
# Regla: filtrar correo de una lista de distribución
:0
* ^List-Id:.*linux-users
.linux-users/
 
# Regla: mover spam a carpeta Junk
:0
* ^X-Spam-Status: Yes
.Junk/
 
# Regla: copiar correo del jefe a una carpeta especial
:0 c
* ^From:.*jefe@ejemplo.com
.importante/
 
# Regla: descartar correo de un remitente
:0
* ^From:.*spam@molesto.com
/dev/null
 
# Regla: ejecutar un programa externo
:0 w
* ^Subject:.*reporte
| /usr/local/bin/procesar_reporte.sh

Flags de las reglas Procmail

FlagDescripción
:0Inicio de regla (sin flags adicionales)
:0 cCopia: entrega una copia y continúa procesando
:0 fFiltro: pasa el mensaje por un programa y continúa
:0 wWait: espera a que el programa externo termine
:0 hSolo cabeceras (header)
:0 bSolo cuerpo (body)
:0 HCondición aplicada a cabeceras (por defecto)
:0 BCondición aplicada al cuerpo del mensaje

Destinos de entrega

DestinoDescripción
/ruta/archivoEntregar a un archivo mbox
/ruta/directorio/Entregar a un directorio Maildir (con barra final)
| programaRedirigir al stdin de un programa
! usuario@dominioReenviar a otra dirección
/dev/nullDescartar el mensaje

Para el examen: La barra final (/) en el destino es crítica: indica Maildir. Sin barra, Procmail trata el destino como un archivo mbox.

Sieve

Sieve es un lenguaje estándar de filtrado de correo del lado del servidor, generalmente integrado con Dovecot o Cyrus.

Integración con Dovecot

# /etc/dovecot/conf.d/90-sieve.conf
plugin {
    sieve = ~/.dovecot.sieve
    sieve_dir = ~/sieve
    sieve_global_dir = /etc/dovecot/sieve/
}

Sintaxis de filtros Sieve

# ~/.dovecot.sieve
require ["fileinto", "reject", "vacation"];
 
# Mover correo de listas a carpeta
if header :contains "List-Id" "linux-users" {
    fileinto "Listas.Linux";
}
 
# Rechazar correo de un remitente
if address :is "from" "spam@molesto.com" {
    reject "No acepto correo de esta dirección";
}
 
# Respuesta automática de vacaciones
if true {
    vacation :days 7 :subject "Fuera de oficina"
        "Estoy de vacaciones. Responderé a mi regreso.";
}
 
# Mover spam detectado
if header :contains "X-Spam-Status" "Yes" {
    fileinto "Junk";
}

Acciones Sieve principales

AcciónDescripción
keepMantener en la bandeja de entrada (acción por defecto)
fileinto "carpeta"Mover a una carpeta específica
redirect "email"Redirigir a otra dirección
reject "mensaje"Rechazar con un mensaje
discardDescartar sin notificación
vacationRespuesta automática de vacaciones

Usuarios virtuales

Los usuarios virtuales permiten gestionar buzones de correo sin necesidad de crear cuentas del sistema.

Configuración en Postfix

# /etc/postfix/main.cf
 
# Dominios virtuales
virtual_mailbox_domains = dominio1.com, dominio2.com
 
# Mapa de buzones virtuales
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 
# Directorio base de buzones
virtual_mailbox_base = /var/mail/vhosts
 
# UID y GID del propietario de los buzones
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
# /etc/postfix/vmailbox
info@dominio1.com       dominio1.com/info/
admin@dominio1.com      dominio1.com/admin/
ventas@dominio2.com     dominio2.com/ventas/
# Generar la base de datos
postmap /etc/postfix/vmailbox

Mapas de transporte de Postfix

Los transport maps permiten definir cómo y a dónde se entrega el correo según el destino:

# /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
 
# /etc/postfix/transport
ejemplo.com        smtp:[correo.ejemplo.com]:25
interno.local      local:
.backup.com        relay:[backup-mx.ejemplo.com]
# Generar la base de datos
postmap /etc/postfix/transport

Filtrado de contenido

SpamAssassin

SpamAssassin es un filtro antispam que analiza el correo y asigna puntuaciones:

# Configuración: /etc/spamassassin/local.cf
required_score 5.0
rewrite_header Subject [SPAM]
report_safe 0
 
# Integración con Postfix vía header_checks o content_filter
# En main.cf:
content_filter = spamassassin
 
# En master.cf:
spamassassin unix -     n       n       -       -       pipe
  user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

amavisd-new

amavisd-new es una interfaz entre el MTA y los filtros de contenido (antivirus y antispam):

# Integración con Postfix en main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024
 
# En master.cf
smtp-amavis     unix    -       -       -       -       2       smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
 
# Puerto de retorno
127.0.0.1:10025 inet    n       -       -       -       -       smtpd
    -o content_filter=
    -o local_recipient_maps=

Para el examen: amavisd-new actúa como intermediario entre Postfix y los filtros de contenido. El correo se envía al puerto 10024, se procesa y se devuelve al puerto 10025.

ClamAV

ClamAV es el antivirus de código abierto más utilizado en servidores de correo Linux:

# Actualizar firmas
freshclam
 
# Integración típica: ClamAV se integra con amavisd-new
# En /etc/amavis/conf.d/15-content_filter_mode
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
Componente ClamAVFunción
clamdDemonio antivirus residente en memoria
clamscanEscaneo bajo demanda
freshclamActualización de firmas de virus
clamav-milterIntegración directa con MTA vía milter

Resumen de archivos clave

ArchivoFunción
~/.procmailrcReglas de filtrado Procmail del usuario
/etc/procmailrcReglas globales de Procmail
~/.dovecot.sieveReglas de filtrado Sieve del usuario
/etc/postfix/vmailboxMapa de buzones virtuales
/etc/postfix/transportMapa de transporte
/etc/spamassassin/local.cfConfiguración de SpamAssassin
/etc/amavis/conf.d/Configuración de amavisd-new

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • Maildir con barra final (/), mbox sin barra — en Postfix, home_mailbox = Maildir/ crea un directorio Maildir con subdirectorios cur/, new/, tmp/. Sin barra, se trata como archivo mbox. En Procmail, el destino .carpeta/ (con /) es Maildir; sin barra es mbox. Este detalle es trampa constante.

  • Procmail: :0 c copia el mensaje y continua, :0 sin c mueve y detiene — sin el flag c, el mensaje se entrega al destino y se deja de procesar. Con c se hace una copia y se continua evaluando las siguientes reglas.

  • amavisd-new escucha en puerto 10024 y devuelve en 10025 — Postfix envia al 10024, amavisd-new procesa (antivirus + antispam) y devuelve al 10025. Si la pregunta pide los puertos de la cadena de filtrado, son estos.

  • postmap es OBLIGATORIO despues de editar archivos de mapa — tras modificar /etc/postfix/vmailbox, /etc/postfix/transport u otros mapas hash, se debe ejecutar postmap /etc/postfix/archivo para regenerar el .db. Sin esto, Postfix usa la version anterior.

  • virtual_mailbox_domains y mydestination son mutuamente excluyentes — un dominio NO puede estar en ambas directivas. Si esta en mydestination, Postfix lo trata como local. Si esta en virtual_mailbox_domains, lo trata como virtual.

  • Sieve usa fileinto para mover, redirect para reenviar, discard para descartarfileinto "Junk" mueve a carpeta. redirect "otro@email.com" reenvia. reject "mensaje" rechaza con notificacion. discard descarta silenciosamente. No confundir redirect con reject.

  • SpamAssassin: required_score 5.0 es el umbral por defecto — un mensaje con puntuacion >= 5.0 se marca como spam. Bajar el umbral aumenta la deteccion pero tambien los falsos positivos.

  • freshclam actualiza las firmas de ClamAV, no escaneafreshclam descarga actualizaciones de firmas de virus. El escaneo lo hace clamscan (bajo demanda) o clamd (demonio residente). No confundir los componentes.

  • Procmail: ! usuario@dominio reenvia, | programa ejecuta un pipe — el caracter ! al inicio del destino reenvia el correo. El pipe | ejecuta un programa externo pasandole el mensaje por stdin.