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.
- Postfix entrega en
- Un usuario no root con privilegios
sudo. - Un usuario de Linux cuyo buzón vas a leer, llamado
your_useren 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 = yesrechaza contraseñas en conexiones sin cifrar. Es el valor por defecto, pero conviene dejarlo explícito.auth_username_format = %Lnpasa el usuario a minúsculas y quita el dominio, así que se puede iniciar sesión comoyour_user@your_domaino comoyour_user. Muchos clientes rellenan la dirección de correo completa por defecto.auth_mechanisms = plain loginañade el mecanismoLOGINque 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=encryptrechaza 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:
| Ajuste | Valor |
|---|---|
| Usuario | your_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 failedcon una contraseña correcta: revisasudo grep 'auth' /var/log/mail.log | tail. Un mensajepam_authenticate() failedindica que la contraseña es incorrecta o que la cuenta está bloqueada. Prueba directamente consudo 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_mailboxdebe devolverMaildir/ydoveconf 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/authcomo 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).
