Dovecot es un servidor IMAP y POP3: da acceso a clientes de correo como Thunderbird, Outlook o las apps de correo del móvil a los buzones que llena Postfix. También proporciona el servicio de autenticación que usa Postfix para que esos mismos clientes puedan enviar correo a través del servidor. En este tutorial añadirás Dovecot a un servidor Postfix existente en Ubuntu 24.04, ofrecerás IMAP en el puerto 993 y POP3 en el 995 con un certificado de Let's Encrypt, y activarás el envío autenticado en el puerto 587.

Requisitos previos

Para seguir este tutorial necesitas:

  • Un servidor con Ubuntu 24.04 LTS en el que Postfix ya reciba correo para your_domain, configurado como en la guía "Cómo montar un servidor de correo Postfix en Ubuntu 24.04". En concreto:
    • Postfix entrega en Maildir/ dentro del directorio personal de cada usuario (home_mailbox = Maildir/).
    • Existe un certificado de Let's Encrypt en /etc/letsencrypt/live/mail.your_domain/.
    • UFW está activado con SSH permitido.
  • Un usuario no root con privilegios sudo.
  • Un usuario de Linux cuyo buzón vas a leer, llamado your_user en esta guía. En esta configuración cada cuenta de correo es un usuario del sistema con contraseña; si necesitas cuentas de correo que no sean usuarios de Linux, sigue en su lugar la guía de Postfix y Dovecot con buzones virtuales.

Paso 1: Instalar Dovecot

Instala el núcleo de Dovecot junto con los servidores IMAP y POP3:

sudo apt update
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d

Los paquetes activan automáticamente los protocolos imap y pop3 y arrancan el servicio. dovecot --version debe mostrar una versión 2.3, que es para la que está escrita la configuración de esta guía. Comprueba el estado del servicio:

sudo systemctl status dovecot --no-pager
● dovecot.service - Dovecot IMAP/POP3 email server
     Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; preset: enabled)
     Active: active (running) since ...

La configuración de Dovecot está repartida en archivos pequeños dentro de /etc/dovecot/conf.d/, que incluye /etc/dovecot/dovecot.conf. Solo tienes que cambiar unos pocos.

Paso 2: Apuntar Dovecot al Maildir

Por defecto, Ubuntu configura Dovecot para leer archivos mbox en /var/mail. Postfix entrega en ~/Maildir, así que ambos tienen que coincidir. Abre los ajustes de correo:

sudo nano /etc/dovecot/conf.d/10-mail.conf

Busca la línea mail_location y cámbiala por:

mail_location = maildir:~/Maildir

A continuación, asegúrate de que todas las cuentas tienen las carpetas estándar para que los clientes guarden los enviados y los borradores en el mismo sitio. Abre las definiciones de buzones:

sudo nano /etc/dovecot/conf.d/15-mailboxes.conf

Añade auto = subscribe a los buzones Drafts, Junk, Trash y Sent para que se creen y se suscriban automáticamente:

namespace inbox {
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
}

Deja el resto del archivo sin cambios.

Paso 3: Configurar la autenticación

Por defecto, Dovecot autentica a los usuarios del sistema mediante PAM (!include auth-system.conf.ext en 10-auth.conf), que es lo que necesita esta configuración. Dos cambios hacen que funcione bien con los clientes de correo. Abre los ajustes de autenticación:

sudo nano /etc/dovecot/conf.d/10-auth.conf

Establece estos valores:

disable_plaintext_auth = yes
auth_username_format = %Ln
auth_mechanisms = plain login
  • disable_plaintext_auth = yes rechaza contraseñas en conexiones sin cifrar. Es el valor por defecto, pero conviene dejarlo explícito.
  • auth_username_format = %Ln pasa el usuario a minúsculas y quita el dominio, así que se puede iniciar sesión como your_user@your_domain o como your_user. Muchos clientes rellenan la dirección de correo completa por defecto.
  • auth_mechanisms = plain login añade el mecanismo LOGIN que usan las versiones antiguas de Outlook. Ambos envían la contraseña en claro dentro de la conexión TLS, y por eso en el siguiente paso TLS pasa a ser obligatorio.

Paso 4: Activar TLS con el certificado de Let's Encrypt

Abre los ajustes de SSL:

sudo nano /etc/dovecot/conf.d/10-ssl.conf

Sustituye las líneas ssl, ssl_cert y ssl_key y fija el protocolo mínimo:

ssl = required
ssl_cert = </etc/letsencrypt/live/mail.your_domain/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.your_domain/privkey.pem
ssl_min_protocol = TLSv1.2

El < delante de la ruta es obligatorio: indica a Dovecot que lea el valor desde el archivo. ssl = required rechaza la autenticación en cualquier conexión que no haya negociado TLS.

Dovecot solo lee el certificado al arrancar, así que hay que recargarlo cuando Certbot lo renueva. Certbot ejecuta todos los ejecutables de /etc/letsencrypt/renewal-hooks/deploy/ tras una renovación correcta. Crea un hook:

sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
#!/bin/sh
systemctl reload postfix dovecot

Hazlo ejecutable:

sudo chmod 755 /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh

Paso 5: Abrir los puertos y reiniciar Dovecot

Valida la configuración antes de reiniciar. doveconf -n muestra solo los ajustes que difieren de los valores por defecto y termina con un error si algún archivo tiene un problema de sintaxis:

sudo doveconf -n | grep -E 'mail_location|auth_|ssl'
auth_mechanisms = plain login
auth_username_format = %Ln
mail_location = maildir:~/Maildir
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.your_domain/fullchain.pem
ssl_key = # hidden, use -P to show it

Reinicia Dovecot:

sudo systemctl restart dovecot

Dovecot escucha en los puertos 143 y 110 (en claro con STARTTLS) y en el 993 y el 995 (TLS implícito). Abre solo los puertos con TLS implícito, que admiten todos los clientes actuales:

sudo ufw allow 993/tcp
sudo ufw allow 995/tcp

Comprueba los puertos en escucha:

sudo ss -ltnp | grep dovecot
LISTEN 0      100          0.0.0.0:993       0.0.0.0:*    users:(("dovecot",pid=5120,fd=38))
LISTEN 0      100          0.0.0.0:995       0.0.0.0:*    users:(("dovecot",pid=5120,fd=24))
LISTEN 0      100          0.0.0.0:110       0.0.0.0:*    users:(("dovecot",pid=5120,fd=22))
LISTEN 0      100          0.0.0.0:143       0.0.0.0:*    users:(("dovecot",pid=5120,fd=36))
...

Paso 6: Probar IMAP y POP3

Primero comprueba que Dovecot acepta la contraseña del usuario. doveadm auth test pide la contraseña y hace la misma comprobación que un inicio de sesión desde un cliente:

sudo doveadm auth test your_user
Password:
passdb: your_user auth succeeded
extra fields:
  user=your_user

Ahora abre una sesión IMAP sobre TLS desde el propio servidor:

openssl s_client -connect mail.your_domain:993 -quiet

Primero se muestran los datos del certificado y después el saludo de Dovecot. Escribe los comandos IMAP de uno en uno; cada línea empieza con una etiqueta (a, b, c) que el servidor repite en su respuesta. Sustituye your_password por la contraseña del usuario:

a LOGIN your_user your_password
b LIST "" "*"
c LOGOUT
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot (Ubuntu) ready.
a OK [CAPABILITY ...] Logged in
* LIST (\HasNoChildren \Drafts) "." Drafts
* LIST (\HasNoChildren \Junk) "." Junk
* LIST (\HasNoChildren \Trash) "." Trash
* LIST (\HasNoChildren \Sent) "." Sent
* LIST (\HasNoChildren) "." INBOX
b OK List completed.
c OK Logout completed.

Prueba POP3 en el puerto 995 de la misma forma:

openssl s_client -connect mail.your_domain:995 -quiet
USER your_user
PASS your_password
STAT
QUIT

STAT responde con +OK seguido del número de mensajes y su tamaño total en bytes.

Si un inicio de sesión falla, el motivo está en el log de correo: sudo grep dovecot /var/log/mail.log | tail.

Paso 7: Activar el envío autenticado en Postfix

Los clientes de correo envían a través del puerto 587 (submission), y el servidor tiene que comprobar su contraseña antes de reenviar correo a otros dominios. Postfix puede usar Dovecot para esto mediante un socket Unix.

Abre las definiciones de servicios de Dovecot:

sudo nano /etc/dovecot/conf.d/10-master.conf

Dentro del bloque service auth { ... }, descomenta y completa el listener para Postfix. El socket vive dentro del chroot de Postfix, en /var/spool/postfix:

service auth {
  unix_listener auth-userdb {
    #mode = 0666
    #user =
    #group =
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

Reinicia Dovecot y comprueba que el socket existe:

sudo systemctl restart dovecot
sudo ls -l /var/spool/postfix/private/auth
srw-rw---- 1 postfix postfix 0 Sep 25 11:02 /var/spool/postfix/private/auth

Indica a Postfix que use Dovecot para la autenticación SASL. La ruta es relativa al chroot de Postfix:

sudo postconf -e "smtpd_sasl_type = dovecot"
sudo postconf -e "smtpd_sasl_path = private/auth"

La autenticación se activa solo en el puerto de envío, no en el 25, así que se define en master.cf. Ábrelo:

sudo nano /etc/postfix/master.cf

El archivo de Ubuntu incluye un bloque submission comentado. Sustitúyelo por este (las líneas que empiezan por -o deben estar sangradas con al menos un espacio):

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
  • smtpd_tls_security_level=encrypt rechaza cualquier comando antes de STARTTLS.
  • Las dos restricciones permiten usar este puerto solo a usuarios autenticados, y les dejan enviar a cualquier dominio.

Comprueba la configuración, reinicia Postfix y abre el puerto:

sudo postfix check
sudo systemctl restart postfix
sudo ufw allow 587/tcp

Verifica que el servidor ofrece autenticación después de STARTTLS:

openssl s_client -starttls smtp -connect mail.your_domain:587 -quiet

Escribe EHLO test y pulsa Intro:

250-mail.your_domain
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING

La línea AUTH PLAIN LOGIN confirma que el SASL de Dovecot está activo. Escribe QUIT para cerrar la sesión.

Por último, envía un mensaje real por el puerto de envío con swaks, una herramienta de pruebas SMTP de línea de comandos. Te pedirá la contraseña:

sudo apt install swaks
swaks --to [email protected] --from your_user@your_domain --server mail.your_domain --port 587 --tls --auth LOGIN --auth-user your_user

Las últimas líneas de la salida muestran que el mensaje se aceptó:

<-  250 2.0.0 Ok: queued as 4XbR1c3Vbwz9sWf
 -> QUIT
<-  221 2.0.0 Bye

Paso 8: Proteger los inicios de sesión con Fail2ban

Un servidor IMAP y SMTP público recibe intentos de adivinar contraseñas a las pocas horas de estar en línea. Fail2ban lee el log de correo y bloquea temporalmente las direcciones con fallos repetidos. Instálalo:

sudo apt install fail2ban

Activa las jails incluidas para la autenticación de Dovecot y Postfix en un archivo local, que las actualizaciones del paquete no sobrescriben:

sudo nano /etc/fail2ban/jail.d/mail.local
[dovecot]
enabled = true

[postfix-sasl]
enabled = true

Reinicia Fail2ban y comprueba las jails:

sudo systemctl restart fail2ban
sudo fail2ban-client status
Status
|- Number of jail:      3
`- Jail list:   dovecot, postfix-sasl, sshd

sudo fail2ban-client status dovecot muestra las direcciones bloqueadas en ese momento.

Paso 9: Configurar un cliente de correo

Usa estos ajustes en Thunderbird, Outlook o la app de correo del móvil:

AjusteValor
Usuarioyour_user@your_domain (o your_user)
Servidor entrante (IMAP)mail.your_domain, puerto 993, SSL/TLS, contraseña normal
Servidor entrante (POP3)mail.your_domain, puerto 995, SSL/TLS, contraseña normal
Servidor saliente (SMTP)mail.your_domain, puerto 587, STARTTLS, contraseña normal

Elige IMAP salvo que quieras expresamente descargar los mensajes y borrarlos del servidor. IMAP mantiene el correo y las carpetas en el servidor, así que todos los dispositivos ven el mismo estado.

Solución de problemas

  • auth failed con una contraseña correcta: revisa sudo grep 'auth' /var/log/mail.log | tail. Un mensaje pam_authenticate() failed indica que la contraseña es incorrecta o que la cuenta está bloqueada. Prueba directamente con sudo doveadm auth test your_user.
  • Plaintext authentication disallowed on non-secure connection: el cliente se conectó al 143 o al 110 sin STARTTLS. Cámbialo al puerto 993 o 995 con SSL/TLS.
  • El inicio de sesión funciona pero el buzón está vacío: Dovecot y Postfix no coinciden en la ubicación. postconf home_mailbox debe devolver Maildir/ y doveconf mail_location, maildir:~/Maildir.
  • SASL authentication failure: cannot connect to Dovecot auth server: falta el socket o tiene un propietario incorrecto. Revisa /var/spool/postfix/private/auth como en el paso 7 y reinicia Dovecot.
  • Los clientes avisan sobre el certificado: el cliente debe usar mail.your_domain, el nombre que figura en el certificado, y no la IP ni otro nombre.

Conclusión

Tu servidor ofrece ahora IMAP y POP3 sobre TLS, permite a los usuarios enviar correo autenticado por el puerto 587 y bloquea las direcciones que intentan adivinar contraseñas. Cada cuenta de correo es un usuario de Linux, algo que funciona bien para unas pocas personas. Para alojar varios dominios o buzones que no sean cuentas del sistema, pasa a buzones virtuales entregados por LMTP de Dovecot, y plantéate añadir cuotas y filtros en el servidor con Sieve (dovecot-sieve).