Esta semana se rompió el disco duro de uno de mis servidores. Fue reemplazado con solo 3 minutos de tiempo de inactividad (gracias a OVH), y ahora mismo el array RAID se está reconstruyendo.
Como es la primera vez que me pasa y el servidor está ejecutando un servicio Mailman en producción, decidí tomarme el tiempo para configurar un servidor MX de respaldo (backup MX). Así es como lo hice.
Ten en cuenta que estoy usando Gentoo, por lo que puede ser ligeramente diferente en otras distribuciones.
El principal problema al configurar un backup MX es lidiar con el spam.
Si el servidor de respaldo acepta un mensaje de spam mientras el servidor principal está caído, y luego lo reenvía al servidor principal cuando vuelve a estar disponible, pero el servidor principal lo rechaza porque la dirección de destino no existe, surge un problema:
Si el servidor de respaldo envía el rebote al remitente
y la dirección del remitente está falsificada
entonces estaremos haciendo backscatter (reenviando spam) y nuestro servidor probablemente terminará en listas negras.
Por tanto, el servidor de respaldo debería rechazar correos entrantes si el servidor principal también lo haría. Eso significa verificar que el destinatario exista.
Lo que hice fue configurar un script en cron que sincroniza las listas de Mailman del servidor principal al servidor de respaldo mediante rsync cada cierto número de minutos.
Se habilita acceso rsync para el servidor de respaldo:
/etc/rsyncd.conf
[mailman]
comment = Mailman sync
path = /var/lib/mailman
list = no
uid = mailman
gid = mailman
hosts allow = IP-ADDRESS-OF-THE-BACKUP-SERVER
hosts deny = *
/etc/bin/mm-sync.sh
#!/bin/shSTART=`date`
# data
rsync -avz –delete MAIN-SERVER::mailman/data /var/lib/mailman/ > /tmp/mm-sync.log
echo >> /tmp/mm-sync.log# lists
rsync -avz –delete MAIN-SERVER::mailman/lists /var/lib/mailman/ >> /tmp/mm-sync.log
echo >> /tmp/mm-sync.log# archives
rsync -avz –delete MAIN-SERVER::mailman/archives /var/lib/mailman/ >> /tmp/mm-sync.log
echo >> /tmp/mm-sync.logEND=`date`
echo $START >> /tmp/mm-sync.log
echo $END >> /tmp/mm-sync.log
mail -s ‘Mailman sync’ root < /tmp/mm-sync.log
Se sincronizan tres carpetas:
data
lists
archives
En realidad solo es necesario sincronizar lists para tener un backup MX, pero sincronizar todo permite que el servidor de respaldo pueda reemplazar completamente al principal si ocurre algo grave.
/etc/cron.d/mm-sync
*/10 * * * * mailman /etc/bin/mm-sync.sh
Esto ejecuta la sincronización cada 10 minutos.
La configuración de Exim es muy similar a la del servidor principal (por ejemplo, usando las mismas reglas de blacklist).
Primero definimos variables similares:
/etc/exim/exim.conf
# Mailman
MM_HOME=/usr/lib/mailman
MM_DATA=/var/lib/mailman
MM_UID=mailman
MM_GID=mailman
domainlist mm_domains=example.com : example2.com
MM_WRAP=MM_HOME/mail/mailman
MM_LISTCHK=MM_DATA/lists/${lc::$local_part}/config.pcksmtp_accept_queue_per_connection = 30
En el servidor de respaldo, los dominios de Mailman no se definen como dominios locales, sino como dominios a los que se hace relay:
domainlist local_domains = @
domainlist relay_to_domains = +mm_domains
hostlist relay_from_hosts = 127.0.0.1 : ::::1
mailman_router:
driver = dnslookup
domains = +mm_domains
require_files = MM_LISTCHK
local_part_suffix_optional
local_part_suffix = -admin : \
-bounces : -bounces+* : \
-confirm : -confirm+* : \
-join : -leave : \
-owner : -request : \
-subscribe : -unsubscribe
transport = remote_smtp
no_more
Esto es muy parecido al router del servidor principal.
Las diferencias son:
usar dnslookup en lugar de accept
usar transporte remote_smtp
añadir la opción no_more
En otras palabras, el router está configurado para entrega remota en lugar de entrega local.
Hay que modificar el router dnslookup para que no procese los dominios de Mailman, ya que estos se gestionan en el router anterior.
dnslookup:
driver = dnslookup
domains = ! +local_domains : ! +mm_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more
Conviene probar tanto direcciones válidas como inválidas:
exim -bt foobar@example.com
Resultado esperado:
router = mailman_router, transport = remote_smtp
host example.com [AAA.BBB.CCC.DDD] MX=10
Para una dirección inexistente:
foobarrr@example.com is undeliverable: Unknown user
Debes añadir el backup MX en el DNS.
Ejemplo:
example.com mail is handled by 10 smtp.example.com.
example.com mail is handled by 20 mx.example.com.
Cuanto menor es el número, mayor es la prioridad.
Para probar el sistema se puede usar swaks, una herramienta para probar servidores SMTP.
Instalación:
sudo emerge swaks
Primera prueba: comprobar que el backup reenvía correos al servidor principal.
swaks –to foobar@example.com –from toto@gmail.com –server mx.example.com
Segunda prueba: simular que el servidor principal está caído usando iptables.
iptables -A INPUT -s BACKUP-SERVER-IP -p tcp –destination-port 25 -j DROP
Enviar un correo y esperar unos minutos.
Después restaurar el acceso:
iptables -D INPUT -s BACKUP-SERVER-IP -p tcp –destination-port 25 -j DROP
