Migración de Servidor de Correo (Postfix/Dovecot): Guía Completa con Cero Downtime
Migrar un servidor de correo es una de las operaciones más críticas y sensibles en la administración de servidores. A diferencia de las migraciones de sitios web o bases de datos, los servicios de correo manejan comunicación continua en tiempo real donde cualquier pérdida de datos o tiempo de inactividad extendido puede tener consecuencias empresariales graves. Esta guía completa proporciona instrucciones paso a paso para migrar servidores de correo Postfix y Dovecot con mínimo downtime y cero pérdida de correos electrónicos.
Entendiendo la Complejidad de la Migración de Servidores de Correo
La migración de servidores de correo presenta desafíos únicos:
- Tolerancia Cero para Pérdida de Correo: Cada email debe preservarse y entregarse
- Servicio Continuo: El correo fluye 24/7 sin períodos predecibles de calma
- Múltiples Componentes: MTA (Postfix), MDA (Dovecot), DNS (registros MX), autenticación
- Datos de Usuario: Buzones, carpetas, configuraciones, filtros y preferencias
- Gestión de Reputación: Reputación de IP y registros SPF/DKIM/DMARC
- Complejidad de Protocolos: Protocolos SMTP, IMAP, POP3, submission y autenticación
- Conexiones con Estado: Sesiones IMAP activas y transferencias de correo en curso
Una migración exitosa requiere coordinar todos estos elementos mientras se mantiene la disponibilidad del servicio.
Fase de Planificación Pre-Migración
Evaluación del Entorno Actual
Document su configuración actual del servidor de correo:
# Check Postfix version and configuration
postconf -n > /tmp/postfix-config.txt
postconf -d | grep -E "version|mail_version"
# Check Dovecot version and configuration
dovecot -n > /tmp/dovecot-config.txt
doveconf -n > /tmp/dovecot-detailed.txt
# List all email domains
postconf -h virtual_mailbox_domains
postconf -h mydestination
# Check mailbox locations
postconf -h virtual_mailbox_base
postconf -h home_mailbox
# Count mailboxes and get sizes
find /var/mail -type d -name "cur" | wc -l
du -sh /var/mail
du -sh /var/vmail
# Check active connections
netstat -an | grep :25 | grep ESTABLISHED | wc -l
netstat -an | grep :993 | grep ESTABLISHED | wc -l
# Review queue
mailq | tail -1
Documentar Registros DNS
# Check current MX records
dig +short MX yourdomain.com
# Check SPF record
dig +short TXT yourdomain.com | grep "v=spf1"
# Check DKIM records
dig +short TXT default._domainkey.yourdomain.com
# Check DMARC record
dig +short TXT _dmarc.yourdomain.com
# Check reverse DNS
dig +short -x your-server-ip
Inventario de Componentes de Correo
- Dominios de correo y dominios virtuales
- Cuentas de usuario y contraseñas
- Tamaños de buzones y almacenamiento total
- Filtrado de spam (SpamAssassin, rspamd)
- Antivirus (ClamAV)
- Alias y reglas de reenvío
- Listas de correo
- Certificados SSL/TLS
- Métodos de autenticación (SASL, usuarios virtuales)
- Backend de base de datos (si usa MySQL/PostgreSQL)
Checklist de Pre-Migración
Complete estas tareas antes de la migración:
- Documentar todas las configuraciones de Postfix y Dovecot
- Exportar todas las cuentas de correo y contraseñas
- Registrar todas las configuraciones DNS (MX, SPF, DKIM, DMARC, PTR)
- Calcular requisitos totales de almacenamiento de buzones
- Verificar procedimientos de respaldo y restauración
- Probar entrega y recepción de correo en servidor origen
- Configurar nuevo servidor con la misma versión de OS
- Instalar versiones idénticas o más nuevas de Postfix/Dovecot
- Configurar reglas de firewall (25, 465, 587, 993, 995)
- Obtener certificados SSL para nuevo servidor
- Configurar DNS inverso para IP del nuevo servidor
- Preparar herramientas de monitoreo para ambos servidores
- Crear cronograma detallado de migración
- Notificar a usuarios de posible breve interrupción del servicio
- Programar migración durante período de bajo volumen de correo
- Preparar procedimientos de rollback
Proceso de Migración Paso a Paso
Paso 1: Preparar el Nuevo Servidor de Correo
Instale y configure el sistema base:
# Update system
sudo apt update && sudo apt upgrade -y
# Install Postfix and Dovecot
sudo apt install postfix dovecot-core dovecot-imapd \
dovecot-pop3d dovecot-lmtpd -y
# Install additional tools
sudo apt install postfix-mysql dovecot-mysql \
spamassassin clamav clamav-daemon -y
# Install mail utilities
sudo apt install mailutils swaks mutt -y
Paso 2: Transferir Archivos de Configuración
Copie configuraciones del servidor origen:
# On source server: Create configuration backup
sudo tar czf /tmp/mail-configs.tar.gz \
/etc/postfix \
/etc/dovecot \
/etc/aliases \
/etc/mailname
# Transfer to new server
scp /tmp/mail-configs.tar.gz user@new-server:/tmp/
# On new server: Extract and review
cd /tmp
tar xzf mail-configs.tar.gz
# Review and adjust for new server
# Check for IP addresses and hostnames that need updating
grep -r "old-server-ip" etc/
# Backup default configs and install transferred ones
sudo cp -r /etc/postfix /etc/postfix.original
sudo cp -r /etc/dovecot /etc/dovecot.original
sudo cp -r /tmp/etc/postfix/* /etc/postfix/
sudo cp -r /tmp/etc/dovecot/* /etc/dovecot/
# Update hostname and IP references
sudo sed -i 's/old-server-ip/new-server-ip/g' /etc/postfix/main.cf
sudo sed -i 's/old.hostname.com/new.hostname.com/g' /etc/postfix/main.cf
Paso 3: Configurar Certificados SSL/TLS
Configure certificados para correo seguro:
# Install Certbot
sudo apt install certbot -y
# Obtain certificates
sudo certbot certonly --standalone \
-d mail.yourdomain.com \
--agree-tos \
--email [email protected]
# Or copy existing certificates
scp -r user@old-server:/etc/letsencrypt /tmp/
sudo cp -r /tmp/letsencrypt /etc/
# Configure Postfix to use certificates
sudo nano /etc/postfix/main.cf
# Add or update:
# smtpd_tls_cert_file=/etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem
# smtpd_tls_key_file=/etc/letsencrypt/live/mail.yourdomain.com/privkey.pem
# smtpd_tls_security_level=may
# smtp_tls_security_level=may
# Configure Dovecot certificates
sudo nano /etc/dovecot/conf.d/10-ssl.conf
# ssl = yes
# ssl_cert = </etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem
# ssl_key = </etc/letsencrypt/live/mail.yourdomain.com/privkey.pem
Paso 4: Migrar Cuentas de Usuario
Transfiera datos de autenticación de usuarios:
# If using virtual users with MySQL
# On source server: Export users database
mysqldump -u root -p mail_db > /tmp/mail_users.sql
# Transfer to new server
scp /tmp/mail_users.sql user@new-server:/tmp/
# On new server: Import users
mysql -u root -p << 'EOF'
CREATE DATABASE mail_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'secure_password';
GRANT ALL PRIVILEGES ON mail_db.* TO 'mailuser'@'localhost';
FLUSH PRIVILEGES;
EOF
mysql -u root -p mail_db < /tmp/mail_users.sql
# If using system users or password files
# Copy password files
sudo scp user@old-server:/etc/dovecot/users /etc/dovecot/
Paso 5: Sincronizar Datos de Correo
Este es el paso más crítico. Use múltiples pases de sincronización:
# Method 1: Direct filesystem sync with rsync
# Create initial sync (can run while old server is active)
sudo rsync -avz --progress \
user@old-server:/var/vmail/ \
/var/vmail/
# Set correct permissions
sudo chown -R vmail:vmail /var/vmail
sudo chmod -R 700 /var/vmail
# Method 2: Using dsync (Dovecot's replication tool)
# On new server: Configure dsync
sudo nano /etc/dovecot/conf.d/10-mail.conf
# mail_location = maildir:/var/vmail/%d/%n
# Sync individual mailbox
doveadm -o mail_fsync=never sync \
-u [email protected] \
-R -l 30 -N \
tcp:old-server.ip:12345
# Sync all mailboxes script
cat > /root/sync-all-mailboxes.sh << 'EOF'
#!/bin/bash
USERS=$(mysql -u mailuser -ppassword mail_db -sN \
-e "SELECT email FROM users WHERE active=1")
for USER in $USERS; do
echo "Syncing $USER..."
doveadm sync -u $USER \
-l 30 -N \
tcp:old-server-ip:12345
done
EOF
chmod +x /root/sync-all-mailboxes.sh
Paso 6: Configurar Firma DKIM
Configure DKIM en el nuevo servidor:
# Install OpenDKIM
sudo apt install opendkim opendkim-tools -y
# Generate DKIM keys
sudo mkdir -p /etc/opendkim/keys/yourdomain.com
cd /etc/opendkim/keys/yourdomain.com
sudo opendkim-genkey -s default -d yourdomain.com
sudo chown opendkim:opendkim default.private
# Configure OpenDKIM
sudo nano /etc/opendkim.conf
# Add:
# Domain yourdomain.com
# KeyFile /etc/opendkim/keys/yourdomain.com/default.private
# Selector default
# Socket inet:8891@localhost
# Configure Postfix to use OpenDKIM
sudo nano /etc/postfix/main.cf
# Add:
# milter_default_action = accept
# milter_protocol = 6
# smtpd_milters = inet:localhost:8891
# non_smtpd_milters = inet:localhost:8891
# Start services
sudo systemctl restart opendkim postfix
# Display public key for DNS
sudo cat /etc/opendkim/keys/yourdomain.com/default.txt
Paso 7: Configurar Sincronización Continua
Mantenga sincronización durante la migración:
# Create continuous sync script
cat > /root/continuous-mail-sync.sh << 'EOF'
#!/bin/bash
LOG="/var/log/mail-sync.log"
while true; do
echo "=== Sync started at $(date) ===" >> $LOG
# Sync mail data
rsync -avz --delete \
--exclude 'dovecot.index*' \
--exclude 'dovecot-uidlist*' \
user@old-server:/var/vmail/ \
/var/vmail/ >> $LOG 2>&1
# Fix permissions
chown -R vmail:vmail /var/vmail
echo "=== Sync completed at $(date) ===" >> $LOG
sleep 300 # Sync every 5 minutes
done
EOF
chmod +x /root/continuous-mail-sync.sh
nohup /root/continuous-mail-sync.sh &
Paso 8: Probar el Nuevo Servidor
Antes de cambios DNS, pruebe exhaustivamente el nuevo servidor:
# Test SMTP submission (port 587)
swaks --to [email protected] \
--from [email protected] \
--server new-server-ip:587 \
--auth LOGIN \
--auth-user [email protected] \
--auth-password userpassword \
--tls
# Test IMAP connection
openssl s_client -connect new-server-ip:993 -crlf
# a1 LOGIN [email protected] password
# a2 LIST "" "*"
# a3 SELECT INBOX
# a4 LOGOUT
# Test using mail client with hosts file override
echo "new-server-ip mail.yourdomain.com" | sudo tee -a /etc/hosts
# Configure mail client to connect to mail.yourdomain.com
# Verify:
# - Login works
# - Folder list displays
# - Messages are visible
# - Can send email
# - Can receive email
sudo sed -i '/mail.yourdomain.com/d' /etc/hosts
Paso 9: Preparación DNS
Reduzca valores TTL 24-48 horas antes de la migración:
# Check current TTL
dig MX yourdomain.com | grep -A1 "ANSWER SECTION"
# Update MX record TTL to 300 seconds (5 minutes)
# This allows faster propagation during cutover
# Current MX record (example):
# MX 10 mail.yourdomain.com. 86400 IN -> old-server-ip
# Update to:
# MX 10 mail.yourdomain.com. 300 IN -> old-server-ip
Paso 10: El Proceso de Cambio
Ejecute la migración final:
# Step 1: Final synchronization
# Stop continuous sync
pkill -f continuous-mail-sync.sh
# Perform final rsync
sudo rsync -avz --delete \
user@old-server:/var/vmail/ \
/var/vmail/
# Or using dsync for active mailboxes
/root/sync-all-mailboxes.sh
# Step 2: Configure new server to accept mail
# Ensure services are running
sudo systemctl start postfix dovecot opendkim
sudo systemctl enable postfix dovecot opendkim
# Verify services
sudo systemctl status postfix dovecot
# Check ports are listening
sudo netstat -tulpn | grep -E "(25|587|993)"
# Step 3: Update DNS records
# Update MX record: mail.yourdomain.com -> new-server-ip
# Update A record: mail.yourdomain.com -> new-server-ip
# Step 4: Monitor both servers
# On old server: Watch for incoming connections
sudo tail -f /var/log/mail.log | grep "status=sent"
# On new server: Watch for incoming connections
sudo tail -f /var/log/mail.log
# Step 5: Parallel operation period
# Keep both servers running for 24-48 hours
# Some mail servers may cache DNS for longer periods
Paso 11: Gestión de Cola
Maneje cola de correo durante la migración:
# On old server: Monitor queue
mailq
# Process remaining queue
sudo postqueue -f
# If needed, relay queue to new server
sudo postconf -e "relayhost = [new-server-ip]"
sudo systemctl reload postfix
sudo postqueue -f
# Watch queue drain
watch -n 10 'mailq | tail -1'
# On new server: Monitor incoming relayed mail
sudo tail -f /var/log/mail.log | grep relay
Verificación Post-Migración
Pruebas Exhaustivas
# Test inbound email delivery
echo "Test from external" | mail -s "Inbound Test" [email protected]
# Test outbound email delivery
echo "Test to external" | mail -s "Outbound Test" [email protected]
# Test IMAP functionality
# Connect with Thunderbird/Outlook and verify:
# - Folder structure intact
# - All messages visible
# - Can move/delete messages
# - Can create new folders
# - Search functionality works
# Check mail logs for errors
sudo tail -100 /var/log/mail.log | grep -i error
sudo tail -100 /var/log/mail.log | grep -i warning
# Verify DKIM signing
echo "DKIM test" | mail -s "DKIM Test" [email protected]
# Check reply for DKIM=pass
# Test SPF
dig +short TXT yourdomain.com | grep spf
# Monitor server load
htop
iostat -x 1 5
# Check disk space
df -h /var/vmail
Verificaciones de Entregabilidad de Correo
# Test against major providers
echo "Test to Gmail" | mail -s "Deliverability Test" [email protected]
echo "Test to Outlook" | mail -s "Deliverability Test" [email protected]
# Check blacklist status
host new-server-ip
# Then check IP at: mxtoolbox.com/blacklists.aspx
# Verify SPF, DKIM, DMARC
# Send test email to: [email protected]
# Or use: mail-tester.com
Procedimientos de Rollback
Si ocurren problemas, ejecute rollback:
# Emergency rollback steps
# 1. Revert DNS records
# Change MX record back to old-server-ip
# Update A record for mail.yourdomain.com
# 2. Ensure old server is operational
# On old server:
sudo systemctl start postfix dovecot
sudo systemctl status postfix dovecot
# 3. Process any queued mail on new server
# Relay queue to old server
sudo postconf -e "relayhost = [old-server-ip]"
sudo systemctl reload postfix
sudo postqueue -f
# 4. Sync any new mail back to old server (if users connected)
rsync -avz /var/vmail/ user@old-server:/var/vmail/
# 5. Notify users
echo "Mail service has been restored to previous configuration" | \
mail -s "Service Notice" [email protected]
# 6. Document issues for analysis
echo "Rollback executed at $(date): [reason]" >> /var/log/migration.log
Estrategias de Mitigación de Riesgos
Split-Horizon DNS
# Use different mail servers for sending/receiving temporarily
# Receiving: Keep MX pointing to old server
# Sending: Configure SMTP clients to use new server
# This allows testing outbound mail while receiving stays stable
Migración Gradual de Usuarios
# Migrate users in batches
# Create user groups
cat > /root/migrate-group1.txt << 'EOF'
[email protected]
[email protected]
[email protected]
EOF
# Sync specific users
while read email; do
doveadm sync -u $email tcp:old-server-ip:12345
done < /root/migrate-group1.txt
# Update MX records for specific domains if hosting multiple
# Or use email client reconfiguration for specific users
Solución de Gateway de Correo
# Use a third-party email gateway during migration
# Configure MX to point to gateway
# Gateway delivers to both old and new servers
# Provides redundancy during migration
Monitoreo y Alertas
# Create monitoring script
cat > /root/monitor-mail-server.sh << 'EOF'
#!/bin/bash
LOG="/var/log/mail-monitor.log"
while true; do
echo "=== $(date) ===" >> $LOG
# Check services
systemctl is-active postfix dovecot opendkim >> $LOG
# Check queue size
QUEUE=$(mailq | tail -1 | awk '{print $5}')
echo "Queue size: $QUEUE" >> $LOG
# Check disk space
DISK=$(df -h /var/vmail | awk 'NR==2 {print $5}' | sed 's/%//')
echo "Disk usage: $DISK%" >> $LOG
# Alert if issues
if [ "$DISK" -gt 85 ]; then
echo "ALERT: Disk usage above 85%" | \
mail -s "Mail Server Alert" [email protected]
fi
if [ "$QUEUE" -gt 100 ]; then
echo "ALERT: Mail queue has $QUEUE messages" | \
mail -s "Mail Queue Alert" [email protected]
fi
sleep 300
done
EOF
chmod +x /root/monitor-mail-server.sh
nohup /root/monitor-mail-server.sh &
Optimización de Rendimiento
# Postfix optimization
sudo nano /etc/postfix/main.cf
# Add optimizations:
# default_process_limit = 100
# smtpd_client_connection_count_limit = 50
# smtpd_client_connection_rate_limit = 100
# anvil_rate_time_unit = 60s
# Dovecot optimization
sudo nano /etc/dovecot/conf.d/10-master.conf
# service imap-login {
# process_min_avail = 4
# service_count = 1
# process_limit = 100
# }
# service imap {
# process_limit = 1024
# }
# MySQL optimization for virtual users
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# innodb_buffer_pool_size = 512M
# query_cache_size = 0
# max_connections = 200
sudo systemctl restart postfix dovecot mysql
Desmantelamiento del Servidor Antiguo
Después de 1-2 semanas de operación estable:
# 1. Verify no mail is arriving at old server
sudo tail -100 /var/log/mail.log
# 2. Archive old server logs
sudo tar czf /backup/old-mail-server-logs-$(date +%F).tar.gz \
/var/log/mail* \
/var/log/dovecot* \
/var/log/syslog*
# 3. Final backup of old mailboxes
sudo tar czf /backup/old-vmail-final-$(date +%F).tar.gz /var/vmail
# 4. Stop services
sudo systemctl stop postfix dovecot opendkim spamassassin clamav-daemon
# 5. Remove from DNS if separate hostname
# Delete A record for old.mail.domain.com
# 6. Keep server accessible for 30 days for emergency data recovery
# 7. Document decommissioning
echo "Old mail server decommissioned on $(date)" >> /var/log/migration.log
Conclusión
La migración de servidor de correo es un proceso complejo pero manejable cuando se aborda metódicamente. Factores clave de éxito incluyen:
- Planificación Exhaustiva: Documentar todo antes de comenzar
- Pruebas Exhaustivas: Probar todos los componentes antes de cambios DNS
- Sincronización Continua: Mantener buzones sincronizados durante migración
- Gestión DNS: Reducir TTLs temprano y monitorear propagación
- Operación Paralela: Ejecutar ambos servidores durante período de transición
- Monitoreo: Vigilar ambos servidores para problemas durante migración
- Comunicación con Usuarios: Mantener usuarios informados de posibles impactos
- Cambio Gradual: No apresure el proceso; permita tiempo para verificación
Siguiendo esta guía y adaptándola a su entorno específico, puede migrar exitosamente servidores de correo Postfix/Dovecot con mínimo downtime y cero pérdida de correos electrónicos. Recuerde que el correo es infraestructura crítica de misión—planifique conservadoramente, pruebe exhaustivamente y ejecute cuidadosamente.
La inversión en procedimientos de migración adecuados paga dividendos al evitar pérdida catastrófica de correos, mantener confianza del usuario y asegurar continuidad del negocio a lo largo de la transición.


