A continuación veremos como instalar un servidor SMTP con Postfix y un servidor IMAP con Dovecot que nos permitirá enviar y recibir emails usando nuestro nombre de dominio. Disponer de este servicio nos va a permitir:

  • Recibir notificaciones de nuestro sistema a nuestra cuenta interna o external de email.
  • Enviar y recibir correos usando nuestro dominio personal loquequieras@midominio.com.
  • Acceder a nuestro correo por IMAP o POP3

Requisitos previos

Para seguir este post vamos a necesitar lo siguiente:

  1. Un registro DNS del tipo A apuntando a la dirección IP de nuestro servidor.
  2. Un registro DNS del tipo MX apuntando a la dirección IP de nuestro servidor de correo. Un registro MX indica donde está el servidor de correo de tu dominio.
  3. Un registro DNS del tipo TXT o SPF. Este tipo de registro, garantiza al receptor que el correo proviene del remitente correcto. Si no lo configuramos muchos servicios marcaran nuestros correos como sospechosos de ser SPAM.
  4. Un registro DNS del tipo PTR. Este registro, es el contrario a un registro del tipo A, dado un dominio devuelve una IP, solo podremos obtenerlo si disponemos de una IP publica estática. Igual que con el registro SPF si no lo creamos, muchos servicios rechazarán nuestro correo o lo marcarán como SPAM.

En adelante, usaré en los ejemplos, mi registro del tipo A lynksthings.com y mi registro de tipo MX mail.lynksthings.com.


Instalación Postfix

Instalamos Postfix con el siguiente comando:

$ sudo DEBIAN_PRIORITY=low apt install postfix

Durante la instalación, una interfaz ncurses nos guiará por la configuración inicial:

  1. Tipo de configuración: sitio de Internet
  2. Nombre del correo: lynksthings.com es el registro DNS de tipo A no el MX
  3. Destinatario de correo de los usuarios ‘postmaster’ y ‘root’: pi es el nombre del usuario principal
  4. Destinos aceptados para el correo: $myhostname, lynksthings.com, mail.lynksthings.com, localhost.lynksthings.com, localhost
  5. Forzar actualizaciones sincronizadas: No
  6. Redes locales: 127.0.0./8
  7. Límite del tamaño del buzón de correo: 0
  8. Carácter de extensión: +
  9. Protocolos de Internet: ipv4

Ya podemos mandar emails, lo comprobamos usando telnet al puerto 25 y enviando un correo a una cuenta de email externa:

$ telnet localhost 25
EHLO lynksthings.com
MAIL FROM:pi@lynksthings.com
RCPT TO:miemaildegmail@gmail.com
DATA
Subject: Test
Hola soy un email
.

En este punto ya tendremos un nuevo correo en nuestra cuenta de correo. Algunos servicios como Gmail, nos marcará el correo como inseguro ya que no ha sido cifrado durante el envío y podría ser modificado por alguien mal intencionado.


Cifrado del correo entrante y saliente

Lo primero de todo es obtener un certificado SSL válido, usaremos Let’s Encrypt

  • Instalamos certbot:
$ sudo apt install certbot
  • Obtenemos los certificados para nuestro servidor de correo (si tenemos algún servicio como nginx escuchando en el puerto 80, hay que pararlo temporalmente para obtener el certificado):
$ sudo certbot certonly --standalone -d mail.lynksthings.com
  • Configuramos postfix para usar los certificados al enviar correo:
$ sudo postconf -e 'smtpd_tls_cert_file = /etc/letsencrypt/live/mail.lynksthings.com/fullchain.pem'
$ sudo postconf -e 'smtpd_tls_key_file = /etc/letsencrypt/live/mail.lynksthings.com/privkey.pem'

$ sudo postconf -e 'smtp_tls_security_level = may'
$ sudo postconf -e 'smtpd_tls_security_level = may'
$ sudo postconf -e 'smtp_tls_note_starttls_offer = yes'
$ sudo postconf -e 'smtpd_tls_loglevel = 1'
$ sudo postconf -e 'smtpd_tls_received_header = yes'

$ sudo systemctl restart postfix

Enviamos nuevamente el correo a la cuenta de correo externa:

$ telnet localhost 25
EHLO lynksthings.com
MAIL FROM:pi@lynksthings.com
RCPT TO:miemaildegmail@gmail.com
DATA
Subject: Test
Hola soy un email cifrado
.

Está vez, gmail no nos advierte de que el correo es inseguro, con esto queda verificado que el correo saliente de nuestro servidor va cifrado.


Autenticación SMTP

Nuestro servidor SMTP está listo para enviar y recibir correo, pero no queremos que cualquiera lo utilice, por lo que tenemos que configurar algún tipo de autenticación. Ahora es cuando entra en escena Dovecot. Veamos como configurarlo.

  • Instalamos Dovecot
$ sudo apt install dovecot-core
  • Editamos /etc/dovecot/dovecot.conf
listen = *
  • Editamos /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
  • Editamos /etc/dovecot/conf.d/10-master.conf
service auth {
...
   # Postfix smtp-auth
   unix_listener /var/spool/postfix/private/auth {
      mode = 0660
   }
  • Editamos /etc/dovecot/conf.d/10-ssl.conf
ssl = required
...
ssl_cert = </etc/letsencrypt/live/mail.lynksthings.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.lynksthings.com/privkey.pem
  • Configuramos Postfix para usar Dovecot
$ sudo postconf -e 'smtpd_sasl_type = dovecot'
$ sudo postconf -e 'smtpd_sasl_path = private/auth'
$ sudo postconf -e 'smtpd_sasl_local_domain ='
$ sudo postconf -e 'smtpd_sasl_security_options = noanonymous'
$ sudo postconf -e 'broken_sasl_auth_clients = yes'
$ sudo postconf -e 'smtpd_sasl_auth_enable = yes'
$ sudo postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
  • Reiniciamos Dovecot y Postfix
$ sudo systemctl restart dovecot
$ sudo systemctl restart postfix

Ahora para mandar un email, necesitamos autenticarnos mediante AUTH PLAIN:

$ printf '\0%s\0%s' pi $PASSWORD | openssl base64
XXXXXXXXX
$ telnet localhost 25
EHLO lynksthings.com
AUTH PLAIN XXXXXXXXX
MAIL FROM:pi@lynksthings.com
RCPT TO:miemaildegmail@gmail.com
DATA
Subject: Test
Hola soy un email
.

Recepción de correo y acceso IMAP en las cuentas locales

  • Creamos la estructura del directorio de correo para los usuarios nuevos.
$ sudo maildirmake.dovecot /etc/skel/Maildir
$ sudo maildirmake.dovecot /etc/skel/Maildir/.Drafts
$ sudo maildirmake.dovecot /etc/skel/Maildir/.Sent
$ sudo maildirmake.dovecot /etc/skel/Maildir/.Spam
$ sudo maildirmake.dovecot /etc/skel/Maildir/.Trash
$ sudo maildirmake.dovecot /etc/skel/Maildir/.Templates
  • Copiamos la estructura para el usuario actual.
$ sudo cp -r /etc/skel/Maildir /home/$USER/
$ sudo chown -R $USER:$USER /home/$USER/Maildir
$ sudo chmod -R 700 /home/$USER/Maildir
$ sudo adduser $USER mail
  • Configuramos Postfix para usar $HOME/Maildir para almacenar los correos destinados al usuario.
sudo postconf -e 'home_mailbox = Maildir/'
  • Editamos /etc/dovecot/conf.d/10-mail.conf.
mail_location = maildir:~/Maildir
  • Instalamos el soporte para IMAP.
$ sudo apt install dovecot-imapd
  • Activamos IMAP editando /etc/dovecot/conf.d/10-master.conf.
  inet_listener imap {
    port = 143
  }
  • Reiniciamos Dovecot y Postfix.
$ sudo systemctl restart dovecot
$ sudo systemctl restart postfix

Ahora podemos enviarnos un correo a nuestro usuario desde gmail u otro servidor externo, veremos aparecer el correo como un fichero en la estructura de directorios.

$ tree Maildir/
Maildir/
├── cur
├── dovecot-uidlist
├── dovecot-uidvalidity
├── dovecot-uidvalidity.607c39b1
├── dovecot.index.cache
├── dovecot.index.log
├── dovecot.list.index.log
├── new
│   └── 1618765727.V802I9f171M658037.raspberrypi
└── tmp

Para configurar un cliente de correo externo, usamos los siguientes datos:

ENTRANTE IMAP:
user: pi (usuario del sistema)
password: pass (pass del sistema)
server: mail.lynksthings.com
security: STARTTLS

SALIENTE SMTP:
pi (usuario del sistema)
password: pass (pass del sistema)
server: mail.lynksthings.com
security: STARTTLS

Mapeo de alias virtuales y redirección de usuarios

Para redirigir una cuenta de usuario del sistema a otro usuario, por ejemplo si queremos que los correos del usuario root lleguen a la cuenta del usuario pi, simplemente añadimos una entrada al fichero /etc/aliases, después regeneramos la base de datos.

$ sudo vi /etc/aliases
# See man 5 aliases for format
root: pi
sudo postalias /etc/aliases

Podemos crear tantos alias virtuales como queramos y que los correos acaben en una misma cuenta usando alias virtuales, solo hay que añadir entradas al fichero /etc/postfix/virtual.

En el ejemplo todo email dirigido a sysadmin@lynksthings.com terminará en el buzón de pi@lynksthings.com.

  • Activamos los alias virtuales en Postfix.
$ sudo postconf -e 'virtual_alias_maps = hash:/etc/postfix/virtual'
  • Añadimos los alias que necesitemos.
$ sudo vi /etc/postfix/virtual
sysadmin@lynksthings.com pi@lynksthings.com
  • Recargamos la configuración.
$ sudo postmap /etc/postfix/virtual
$ sudo systemctl restart postfix

Opciones de seguridad

  • Para terminar añadimos varias recomendaciones de seguridad a Postfix
$ sudo postconf -e 'smtpd_helo_required = yes'
$ sudo postconf -e 'smtpd_helo_restrictions = reject_non_fqdn_helo_hostname,reject_invalid_helo_hostname,reject_unknown_helo_hostname'
$ sudo postconf -e 'disable_vrfy_command = yes'
$ sudo postconf -e 'smtpd_delay_reject = yes'
$ sudo postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,reject_invalid_hostname,reject_non_fqdn_hostname,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_sender_domain,reject_rbl_client sbl.spamhaus.org,reject_rbl_client cbl.abuseat.org'

$ sudo systemctl restart postfix