Introducción

En este post vamos a configurar un servidor de correos en nuestro VPS. El nombre del servidor será mail.mariatec.es, que será el nombre que aparecerá en el registro MX.

Gestión de correos desde el servidor

El envío y recepción se hará desde el servidor a trávés de la herramienta mail.

Gestión de correos desde el servidor

Tarea 1

Lo primero que deberemos hacer es realizar un registro DNS en nuestro dominio y añadir un registro A con el nombre mail y la IP del servidor.

🔲 mail.mariatec.es A 82.223.1.72

Y agregamos un registro SPF para evitar que nuestro servidor sea utilizado como servidor de spam.

🔲 mariatec.es SPF “v=spf1 ip4:82.223.1.72 -all”

Abrimos el puerto 25 en el cortafuegos del servidor y configuramos el registro PTR con el fqdn de nuestro VPS.

Una vez terminado esto, nos conectamos a nuestro VPS y comentamos con la configuración:

  • Instalamos postfix y bsd-mailx

    apt install postfix bsd-mailx
    

NOTA: Recuerda que al instalar postfix te pedirá que configures el servidor de correo. En nuestro caso, seleccionamos la opción Internet Site y el nombre del dominio será mariatec.es.

  • Enviaremos un correo a nuestro correo personal para comprobar que todo funciona correctamente.

    echo "Hola, esto es una prueba" | mail -s "Prueba"
    

    Como podemos ver en la siguiente imagen, en el log del correo aparece el correo que hemos enviado y que ha sido recibido correctamente.

Tarea 2

En esta tarea, deberemos cerciorarnos de que podemos recibir correos ennuestro servidor VPS y por ello, vamos a usar el servicio de correo de gmail. Para que esto sea posible, deberemos realizar un nuevo registro MX 10 en nuestro dominio.

🔲 mariatec.es MX 10 mail.mariatec.es

Para comprobar que funciona, accedemos a nuestra cuenta personal de correo y enviamos un correo a nuestro servidor.

Y desde nuestra consola, nos enviaremos un correo y podemos ver que ha llegado correctamente:

Uso de alias y redirecciones

Tarea 3

Para completar esta tarea, configuraremos, mediante cron, un script que nos permita enviar un correo cada minuto con la fecha y hora actual. Para ello, crearemos un script en /usr/local/bin que se llame cronmail.sh y que tenga el siguiente contenido:

#!/bin/bash
echo "=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_="
echo "Fecha y hora actual: $(date)"
echo "=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_="
echo "Uptime: $(uptime)"
echo "=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_=_="
echo "Estado de los procesos:"
ps

Le damos permisos de ejecución y comprobamos que funciona correctamente:

chmod +x /root/cronmail.sh
---
bash /root/cronmail.sh

Ahora, crearemos un archivo en /etc/cron.d que se llame cronmail y que tenga el siguiente contenido:

MAILTO=root
* * * * * root /root/cronmail.sh

Esperamos un minuto y comprobamos que el correo ha llegado correctamente:

Lo que hemos hecho es crear un script que se ejecuta cada minuto y que envía un correo con la fecha y hora actual, el uptime del servidor y el estado de los procesos.

El paso que viene ahora crear un alias para que los correos que se envíen a root se envíen a nuestro correo personal.

nano /etc/aliases
---
root:   mariajesus

Ejecutamos newaliases para que se actualice el archivo de alias y comprobamos que funciona correctamente:

Por último, creamos una redirección para que los correos que se envíen a root se envíen a nuestro correo personal.

nano /home/mariajesus/.forward
---
correo@gmail.com

Para asegurar el envío

Tarea 4

En esta tarea, deberemos configurar el DomainKeys Identified Mail (DKIM) para que los correos que envíe nuestro servidor sean firmados digitalmente. Para ello, instalaremos el paquete opendkim y opendkim-tools y crearemos un archivo de configuración en /etc/opendkim.conf que tenga el siguiente contenido:

apt install opendkim opendkim-tools -y
Domain mariatec.es
Selector dkim2023
KeyFile /etc/dkimkeys/dkim2023.private
#Socket local:/var/opendkim/opendkim.sock
Socket inet:8891@localhost
PidFile /var/opendkim/opendkim.pid
TrustAnchorFile /usr/share/dns/root.key

Tras esto, modificaremos el archivo /etc/default/opendkim para que se ejecute en el puerto 8891 y no en el socket local.

SOCKET=inet:8891@localhost

Y modificamos el archivo /etc/postfix/main.cf para señalar el modo de firma de los correos y el puerto en el que se ejecuta el servicio de opendkim.

milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = $smtpd_milters

Cuando tengamos todo esto configurado, generamos la clave privada y pública para el selector dkim2023. También le cambiamos el propietario al usuario opendkim y reiniciamos los servicios.

cd /etc/dkimkeys
opendkim-genkey -s dkim2023 -d mariatec.es -b 2048
chown opendkim:opendkim dkim2023.private dkim2023.txt

Para que postfix pueda usar la clave, deberá tener la siguiente estructura:

dkim2023._domainkey     IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3gaVO68xhAlj7yNqNHEPh2zJDF+Mz5Zt9nsb54fElkvjUhAWUc+YiQ2yb+5tSo2EXjZV8LZCogkdKWkJniAmID/ZcyxZZB3XDa7nWpVJGF1JlOPXw+gJonq3Pdii945bIBR91ZcPR9KBL2TUZX0mHs1I1DlyXEALjajI5v2qbUFIVVCM6Kvv2qHB1FKhbkXozOW/ILoQr6unUp"
          "Y4pFGzgZBkUUWQVTHCJ/J9d2VIjN1lp1Ro3sV788PoU8Mk9piRmyW3+p1hoh6qeTqFv9QekD4jsiWBHuWM7mo3vLBoO4lzMsvcyPuAgaqsy2oEuq3RvtO23mNoqwtA5QmNGrQsBwIDAQAB" )  ; ----- DKIM key dkim2023 for mariatec.es

Y en el registro TXT del DNS colocaremos la clave pública:

v=DKIM1; h=sha256; k=rsa; p=p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3gaVO68xhAlj7yNqNHEPh2zJDF+Mz5Zt9nsb54fElkvjUhAWUc+YiQ2yb+5tSo2EXjZV8LZCogkdKWkJniAmID/ZcyxZZB3XDa7nWpVJGF1JlOPXw+gJonq3Pdii945bIBR91ZcPR9KBL2TUZX0mHs1I1DlyXEALjajI5v2qbUFIVVCM6Kvv2qHB1FKhbkXozOW/ILoQr6unUp

Reiniciamos los servicios y comprobamos que funciona correctamente.

systemctl restart opendkim postfix
netstat -tulpn | grep 8891

Como podemos ver en las siguientes capturas, en la cabecera del correo se añade la información de la firma.

Y en la web de dkimvalidator podemos comprobar que la firma es correcta.

Para luchar contra el SPAM

Tarea 5

Le ha llegado el turno a la tarea 5. En esta tarea vamos a configurar Postfix para que tenga en cuenta el registro SPF de los correos que recibe. Para ello, vamos a instalar el paquete postfix-policyd-spf-python.

sudo apt install postfix-policyd-spf-python -y

Modificaremos el archivo /etc/postfix/main.cf para que se ejecute el servicio de policyd-spf y para que se ejecute el servicio de opendkim. Con la siguiente sentencia le estaremos indicando a postfix para comprobar el SPF de los correos que recibe.

policy-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

Reiniciamos el servicio de postfix y comprobamos que funciona correctamente.

systemctl restart postfix

tail -f /var/log/mail.log

Tarea 6

Le toca el turno a la protección contra el SPAM. Para ello, vamos a instalar el paquete spamassassin y habilitaremos el servicio.

sudo apt install spamassassin spamc -y
sudo systemctl enable --now spamassassin

Modificamos el fichero /etc/default/spamassassin y agregaremos las líneas necesarias para que se actualice la base de datos de spamassassin.

CRON=1

Y en el fichero /etc/postfix/master.cf agregaremos la siguiente línea para que el servicio de postfix ejecute el servicio de spamassassin.

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
submission inet n       -       y       -       -       smtpd
  -o content_filter=spamassassin
spamassassin unix -     n       n       -       -       pipe
  user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Y para configurar que los emails que se detecten como SPAM, reciban una etiqueta en el asunto, modificaremos el fichero /etc/spamassassin/local.cf y descomentamos la siguiente línea.

rewrite_header Subject *****SPAM*****

Reiniciamos los servicios y comprobamos que funciona correctamente.

systemctl restart postfix spamassassin

Comprobaremos que funciona, enviando un correo a nuestro email en nuestro VPS y comprobando que se ha etiquetado como SPAM. Por ello, usaremos The GTUBE para enviar un correo que se detecte como SPAM.

Comprobando que el email se ha etiquetado como SPAM, miraremos también el log de mail para comprobar que se ha ejecutado el servicio de spamassassin.

tail -f /var/log/mail.log -n 26

Tarea 7

Nuestro servidor de correo deberá tener antivirus que se encargue de detectar y eliminar los virus que se encuentren en los correos que recibe. Para ello, vamos a instalar el paquete clamav y habilitaremos el servicio.

apt install clamsmtp clamav-daemon arc arj bzip2 cabextract lzop nomarch p7zip pax tnef unrar-free unzip -y

systemctl enable --now clamav-daemon

El siguiente paso el fichero /etc/postfix/master.cf y agregaremos la siguiente línea para que el servicio de postfix ejecute el servicio de clamav.

scan unix -       -       n       -       16       smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
127.0.0.1:10025 inet n       -       n       -       16       smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks_style=host
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

Y en el fichero /etc/postfix/main.cf y le indicamos el socket que usará el servicio de clamav.

content_filter = scan:127.0.0.1:10026

Reconfiguramos clamav-daemon de forma que le indiquemos los hilos de procesador que usará y el resto de parámetros.

dpkg-reconfigure clamav-daemon

Y reiniciamos los servicios.

systemctl restart postfix clamav-daemon

NOTA : Será normal que ClamAV tarde un poco en arrancar, ya que tiene que actualizar la base de datos de virus.

Para probarlo, enviaremos un correo con X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* para probar que se detecta como virus.

Comprobando que el email se ha etiquetado como virus, miraremos también el log de mail para comprobar que se ha ejecutado el servicio de clamav.

Gestión de correos desde un cliente

Tarea 8

Aquí vamos a configurar el buzón de los usuarios para que puedan acceder a él desde un cliente de correo. Y para ello, el primer paso es modificar la configuración de postfix, en el fichero /etc/postfix/main.cf para que use el buzón Maildir añadiendo al final del fichero home_mailbox = Maildir/.

Reiniciamos el servicio de postfix y tras esto, la función mail dejará de funcionar, ya que no encontrará el buzón Maildir en el directorio /var/mail. Para ello, instalaremos mutt:

apt install mutt -y
systemctl restart postfix

Y configuramos mutt:

set mbox_type=Maildir
set mbox="~/Maildir"
set folder="~/Maildir"
set spoolfile="~/Maildir"
set record="+.Sent"
set postponed="+.Drafts"
set mask="!^\\.[^.]"

Para probar que funciona, enviaremos un correo a nuestro buzón y comprobaremos que se ha recibido correctamente.

Realizado esto, podemos decir que tenemos un buzón de correo funcionando correctamente como Maildir en vez de mbox.

Tarea 9

Vamos a configurar el protocolo IMAP instalando el paquete dovecot-imapd y habilitaremos el servicio.

apt install dovecot-imapd -y
systemctl enable --now dovecot
netstat -tulpn | grep dovecot

Paramos nginx para que no interfiera con el puerto 80.

sudo systemctl stop nginx

Y generamos un certificado SSL para el servidor de correo.

certbot certonly --standalone -d mail.mariatec.es

Modificamos la configuración de dovecot en el fichero /etc/dovecot/dovecot.conf para que use el certificado SSL que hemos generado. Una vez configurado, reiniciamos el servicio y también el servicio de nginx.

ssl_cert = </etc/letsencrypt/live/mail.mariatec.es/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.mariatec.es/privkey.pem
systemctl restart dovecot
systemctl restart nginx

INCISO: Vamos a realizar primero la configuración de postfix para que mande correos desde un cliente remoto, ya que si no, no podremos probar el servicio de IMAP. Después de esto, instalaremos un webmail.

Tarea 11

Los mismos certificados que hemos generado antes para cifrar los emails enviados y recibidos. Para ello, modificamos el fichero /etc/postfix/main.cf y añadimos las siguientes líneas:

smtpd_tls_cert_file = /etc/letsencrypt/live/mail.mariatec.es/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.mariatec.es/privkey.pem

smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes

Acto seguido, configuraremos el fichero master.cf y modificamos la directiva submission para que use el puerto 587 y el fichero smtpd.conf para que use el puerto 465.

submission inet n       -       y       -       -       smtpd
  -o content_filter=spamassassin
  -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_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Ahora, a dovecot, le indicamos qué debe hacer para autenticarse. Lo haremos en el fichero /etc/dovecot/conf.d/10-master.conf y añadimos las siguientes líneas:

service auth {
  ...
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
  }
  ...
}

Reiniciamos los servicios y comprobamos que todo funciona correctamente. Deberemos abrir los puertos 465 y 993 en el firewall de nuestro VPS.

Para comprobar que funciona correctamente, he usado Thunderbird, configuramos el correo y comprobamos que funciona correctamente.

Ya podemos decir que los correos están sincronizados correctamente entre el servidor y el cliente. También probaremos que, desde Thunderbird, podemos enviar un correo a mi cuenta de gmail y que llega correctamente.

También vamos a probar que podemos responder al email y que se sincronizan correctamente los emails de mi servidor y los emailsdel cliente de correo.

Tarea 10

Ha llegado la hora de instalar un webmail. Para ello, vamos a instalar Roundcube. Para ello, prepararemos el VPS para que pueda instalar Roundcube y sus dependencias.

apt install docker.io

Agregaremos un registro CNAME en nuestro DNS para que el dominio webmail.mariatec.es apunte a la IP del servidor.

🔲 webmail.mariatec.es CNAME mariatec.es

Le toca el turno a roundcube y a su configuración, y para eso empezaremos por crear un directorio en el depositaremos los ficheros de configuración de Roundcube y lo estrenaremos creando el fichero custom.inc.php que contendrá la configuración de la base de datos.

mkdir /root/config-roundcube

nano /root/configs-roundcube/custom.inc.php

Dentro del fichero, añadiremos:

<?php
$config['mail_domain'] = array(
    'mail.mariatec.es' => 'mariatec.es'
);
?>

Echamos a andar el contenedor de docker donde tenemos la aplicación de Roundcube y le pasamos los parámetros necesarios para que funcione correctamente.

docker run -v /root/config-roundcube/:/var/roundcube/config/ -e ROUNDCUBEMAIL_DEFAULT_HOST=ssl://mail.mariatec.es -e ROUNDCUBEMAIL_SMTP_SERVER=ssl://mail.mariatec.es -e ROUNDCUBEMAIL_SMTP_PORT=465 -e ROUNDCUBEMAIL_DEFAULT_PORT=993 -p 8001:80 -d roundcube/roundcubemail

Y en la siguiente imagen podemos ver como el contenedor se ha levantado correctamente.

Paramos de nuevo Nginx y creamos un certificado para el dominio webmail.mariatec.es y lo instalamos en el servidor.

systemctl stop nginx

certbot certonly --standalone -d webmail.mariatec.es

Ya terminada toda la configuración anterior, tendremos que crear un VirtualHost para Nginx que redirija las peticiones a Roundcube y que esté protegido por Let's Encrypt.

nano /etc/nginx/sites-available/webmail.mariatec.es

Dentro del fichero, añadiremos:

server {
        listen 80;
        listen [::]:80;

        server_name webmail.mariatec.es;

        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        ssl    on;
        ssl_certificate /etc/letsencrypt/live/webmail.mariatec.es/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/webmail.mariatec.es/privkey.pem;

        index index.html index.php index.htm index.nginx-debian.html;

        server_name webmail.mariatec.es;

        location / {
                proxy_pass http://localhost:8001;
                include proxy_params;
        }
}

Para que esté habilitado el VirtualHost, tendremos que crear un enlace simbólico en /etc/nginx/sites-enabled/ y reiniciar el servicio de Nginx.

ln -s /etc/nginx/sites-available/webmail.mariatec.es /etc/nginx/sites-enabled/webmail.mariatec.es

systemctl restart nginx

Ahora, ya podemos acceder a Roundcube desde el navegador.

Hacemos una prueba de envío de correo desde Roundcube y comprobamos que funciona correctamente.

En gmail podemos verificar que el correo ha llegado correctamente.

Tarea 12

En la tarea 10 ya hemos comprobado que ya hemos podido enviar y recibir correos desde el servidor de correo. Ahora, vamos a comprobar que el servidor de correo funciona correctamente y que podemos enviar y recibir correos desde el servidor.

Comprobación final

Tarea 13

Última tarea, comprobación final. Para ello, vamos a comprobar que el servidor de correo funciona correctamente y que podemos enviar y recibir correos desde el servidor. Comprobaremos con un correo generado por mail-tester.com y que, con la puntuación que nos da, podemos ver que el servidor de correo funciona correctamente.

Para ello, modificaremos nuestro DNS y añadiremos un registro TXT con el valor que nos da mail-tester.com y que nos permitirá que el servidor de correo sea verificado por mail-tester.com.

🔲 _dmarc.mariatec.es TXT v=DMARC1; p=none;