En esta entrada aprenderemos como instalar un servidor SMTP, instalar y configurar todos los componentes necesarios para mantener un servidor de correo, y evitar que este termine llegando como spam a los recipientes de nuestro correo.
Nota: Este tutorial se escribió en Debian 12.
Prerrequisitos
Para empezar, suponemos que si están intentando seguir este tutorial es porque ya tienen un dominio y un proveedor de hosting, si no es así, les recomendamos proveedores como Hostinger u OVH, y para el dominio Namecheap o Name.com deberían ser útiles para obtener un dominio por primera vez.
Como se mencionó anteriormente, estamos ejecutando todos los comandos de este tutorial en Debian 12, por lo que sistemas operativos similares como Ubuntu deberían servir sin mucho problema.
Lo primero que tenemos que hacer es poner el hostname de nuestro servidor de correo, como hostname de nuestra VPS, ya que Postfix (que es el servidor que instalaremos) usa este hostname. Lo pondremos a nuestro FQDN (Fully Qualified Domain Name) que en nuestro caso, sería por ejemplo mail.quadword.org. Para ver nuestro hostname podemos ejecutar:
hostname -f
Lenguaje del código: Bash (bash)
Si tu instalación no tiene tu FQDN como hostname, puedes ponerlo con hostnamectl:
sudo hostnamectl set-hostname fqdn
Lenguaje del código: Bash (bash)
En nuestro caso, el comando sería el siguiente:
sudo hostnamectl set-hostname mail.quadword.org
Lenguaje del código: Bash (bash)
Configurando los DNS de nuestro dominio
Primero, tenemos que configurar un record MX, ya que es el que le dice a nuestro serivdor de correo que mail.quadword.org es el responsable de enviar y recibir correos:
MX record @ mail.quadword.org
Ten en cuenta que cuando se crea el record MX, se tiene que poner @ o tu dominio como nombre del record.
También, como vamos a tener una interfaz tipo GMail, también tendremos un record A que apunte a una dirección IP (y si tu servidor usa IPv6 también pondrías un AAAA):
mail.quadword.org <Dirección IP>
Lenguaje del código: CSS (css)
Nota: Si usas cloudflare, desactiva el proxy para crear un récord A o AAAA para tu servidor de correo, ya que cloudflare no soporta un proxy SMTP o IMAP.
Instalando Postfix
Vamos a empezar a instalar Postfix. Vamos a ejecutar los siguientes comandos:
sudo apt update
sudo apt install postfix -y
Lenguaje del código: Bash (bash)
Cuando ejecutes ese comando te va a pedir un tipo de configuración de correo. Vamos a escoger el segundo tipo: Internet Site.
- No Configuration: El proceso de instalación no va a configurar ningún parámetro.
- Internet Site: Significa que vamos a enviar y recibir correos de otros servidores de correo.
- Internet with smarthost: Significa que vamos a usar Postfix para recibir correos, pero usar otro smart host para enviar correos.
- Satellite system: Significa que usaremos smart host para enviar y recibir correos.
- Local only: los correos serán enviados únicamente entre cuentas locales.
Ahora, vamos a ingresar nuestro dominio, en este caso, es el dominio que vendría después del @. Por ejemplo, si mi dirección de correo es lyx@quadword.org, el dominio sería quadword.org.
Cuando termine de instalar, Postfix automáticamente creará un archivo /etc/postfix/main.cf. Ahora podemos chequear la versión de Postfix con este comando:
postconf mail_version
Lenguaje del código: Bash (bash)
En Debian 12, el resultado de tal comando sería el siguiente:
mail_version = 3.6.4
Ahora, vamos a chequear que nuestro puerto 25 no esté bloqueado. Para comprobarlo podemos usar telnet:
sudo apt install telnet
Lenguaje del código: Bash (bash)
Y ejecutar el siguiente comando:
telnet gmail-smtp-in.l.google.com 25
Lenguaje del código: Bash (bash)
Y la salida debería ser la siguiente:
Trying 64.233.181.26...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP 8926c6da1cb9f-4e1cff12037si4070718173.131 - gsmtp
Lenguaje del código: JavaScript (javascript)
Ahora ya podemos enviar correos, de hecho, podemos comprobarlo desde nuestra terminal. Podemos ejecutar el siguiente comando:
echo "correo de prueba" | sendmail correo@gmail.com
Lenguaje del código: Bash (bash)
En ese comando, sendmail va a leer “correo de prueba” y lo va a enviar como el cuerpo del correo a una cuenta de gmail que hayamos escogido. Lo más probable es que lo recibas en spam, porque aún nos hace falta configurar algunas cositas para evitar este comportamiento y hacer que nuestros correos lleguen a la bandeja principal.
Por defecto, el tamaño máximo de attachments no puede ser más de 10 MB, podemos ver esta configuración si ejecutamos el siguiente comando:
postconf | grep message_size_limit
Lenguaje del código: Bash (bash)
La salida sería la siguiente:
message_size_limit = 10240000
Para incrementarlo a 100 MB, por ejemplo, podemos ejecutar el siguiente comando:
sudo postconf -e message_size_limit=104857600
Lenguaje del código: Bash (bash)
Siempre que hagamos un cambio en la configuración, debemos reiniciar postfix de la siguiente manera:
sudo systemctl restart postfix
Lenguaje del código: Bash (bash)
Por defecto, Postfix usa el hostname del sistema operativo, sin embargo, este puede cambiar, por lo que es buena idea cambiar el hostname directamente en los archivos de configuración de Postfix. Para hacerlo, podemos abrir el archivo de configuración principal de Postfix en un editor como nano:
sudo nano /etc/postfix/main.cf
Lenguaje del código: Bash (bash)
Buscamos myhostname y lo cambiamos por el FQDN de nuestro servidor de correo:
myhostname = mail.quadword.org
Y de nuevo, hay que reiniciar Postfix:
sudo systemctl restart postfix
Una de las cosas que podemos hacer con Postfix es configurar alisases de correo, por ejemplo, si abrimos el archivo /etc/aliases, por defecto habrían solamente dos líneas:
# See man 5 aliases for format
postmaster: root
Lenguaje del código: PHP (php)
Eso lo que hace es que todos los correos que sean enviados a postmaster@quadword.org, los reciba realmente root@quadword.org. Algo que podemos hacer es hacer una nueva regla de root, para redirigirla a nuestro correo personal, por ejemplo:
root: lyx
Lenguaje del código: HTTP (http)
Después de configurar los aliases, tenemos que ejecutar el siguiente comando:
sudo newaliases
Una vez terminadas las configuraciones de Postfix, ya podemos enviar y recibir correos, ahora vamos a instalar un servidor IMAP y habilitar encriptación TLS.
Encriptación TLS
Para más seguridad, vamos a obtener un certificado TLS para nuestro servidor de correo. Primero, vamos a instalar certbot:
sudo apt install certbot
Lenguaje del código: Bash (bash)
Y vamos a instalar también python3-certbot-nginx para generar certificados e instalarlos automáticamente en una instalación de Nginx:
sudo apt install python3-certbot-nginx
Ahora, vamos a crear una nueva configuración de Nginx donde instalar nuestro certificado:
sudo nano /etc/nginx/sites-available/mail.conf
Y pondremos la siguiente configuración:
server {
listen 80;
listen [::]:80;
server_name mail.quadword.org;
root /usr/share/nginx/html;
location ~ /.well-known/acme-challenge {
allow all;
}
}
Lenguaje del código: JavaScript (javascript)
Activamos la configuración:
sudo ln -s /etc/nginx/sites-available/mail.conf /etc/nginx/sites-enabled/
Y recargamos Nginx:
sudo systemctl reload nginx
Cuando ya hayamos generado la configuración de Nginx, podemos generar el certificado ejecutando el siguiente comando:
sudo certbot certonly -a nginx --agree-tos --email correo@dominio.com -d mail.dominio.com
Lenguaje del código: CSS (css)
Antes de utilizar los certificados que acabamos de crear, vamos a activar el servicio de Submission de Postfix, que permite a clientes como Thunderbird enviar correos electrónicos. Para activarlo, vamos a abrir el archivo de configuración principal de Postfix:
sudo nano /etc/postfix/master.cf
Y vamos a agregar las siguientes líneas al final del archivo:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_tls_wrappermode=no
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
Lenguaje del código: PHP (php)
Ahora vamos a especificar la ubicaciónd el certificado en ese mismo archivo de configuración. Busca la sección de TLS o agrega las siguientes líneas al final del archivo (recuerda modificar mail.dominio.com):
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.dominio.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.dominio.com/privkey.pem
smtpd_tls_security_level=may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
Lenguaje del código: JavaScript (javascript)
Y ya vamos a reiniciar postfix:
sudo systemctl restart postfix
Instalando un servidor IMAP
Vamos a instalar Dovecot, un servidor IMAP:
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d
Para activar los protocolos IMAP y POP3 vamos a abrir el archivo de configuración de Dovecot:
sudo nano /etc/dovecot/dovecot.conf
Y agregar la siguiente línea:
Configurando la Autenticación
Vamos a editar el archivo de autenticación:
sudo nano /etc/dovecot/conf.d/10-auth.conf
Y vamos a descomentar la línea:
disable_plaintext_auth = yes
Vamos a buscar la línea:
#auth_username_format = %Lu
Lenguaje del código: PHP (php)
Y cambiarla por:
auth_username_format = %n
Vamos a buscar la línea:
auth_mechanisms = plain
Y vamos a agregarle login:
auth_mechanisms = plain login
Ahora vamos a editar el archivo:
sudo nano /etc/dovecot/conf.d/10-ssl.conf
Y vamos a cambiar ssl = yes a ssl = required para forzar el uso de encriptación:
ssl = required
Y vamos a buscar estas dos líneas:
ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.key
Lenguaje del código: JavaScript (javascript)
Y vamos a cambiar la dirección del certificado por el certificado que creamos anteriormente:
ssl_cert = </etc/letsencrypt/live/mail.dominio.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.dominio.com/privkey.pem
Lenguaje del código: JavaScript (javascript)
Y vamos a agregar la siguiente línea al final del archivo:
ssl_min_protocol = TLSv1.2
Creando nuevos usuarios
Para agregar un nuevo correo, podemos simplemente crear un usuario de unix:
sudo adduser user1
Y podemos iniciar sesión con un cliente de correo como Thunderbird:
Asegurándonos que nuestros correos se envíen
Siempre que enviemos un correo, este va a ser marcado como spam, a menos que configuremos los records SPF y DKIM. Estos son dos records DNS de tipo TXT que nos permiten detectar email spoofing y a legitimizar los servidores de correo electrónico.
Vamos a crear un record TXT de la siguiente forma:
Ahora, vamos a configurar nuestro record DKIM. Para ello, vamos a instalar OpenDKIM:
sudo apt install opendkim opendkim-tools
Agregamos postfix al grupo opendkim:
sudo gpasswd -a postfix opendkim
Ahora, vamos a crear una estructura de directorios para OpenDKIM:
sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
Vamos a cambiar el owner de root a opendkim:
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod go-rw /etc/opendkim/keys
Y vamos a crear la tabla de firmas:
sudo nano /etc/opendkim/signing.table
Y vas a agregar las siguientes líneas a el archivo:
*@quadword.org default._domainkey.quadword.org
*@*.quadword.org default._domainkey.quadword.org
Lenguaje del código: JavaScript (javascript)
Obviamente, vas a reemplazar quadword.org con tu propio dominio. Una vez agregadas esas líneas, guardas el archivo, y creas la tabla de llaves:
sudo nano /etc/opendkim/key.table
Y vamos a poner la ubicación de la llave privada:
default._domainkey.quadword.org quadword.org:default:/etc/opendkim/keys/quadword.org/default.private
Lenguaje del código: JavaScript (javascript)
Ahora, vamos a crear el archivo de hosts de confianza:
sudo nano /etc/opendkim/trusted.hosts
Agrega las siguientes líneas al archivo creado. Esto le dice a OpenDKIM que si un email viene de localhost o del mismo dominio, OpenDKIM debe solamente firmar el correo pero no realizar ningún tipo de verificación:
127.0.0.1
localhost
.quadword.org
Lenguaje del código: CSS (css)
Y finalmente, guarda y cierra el archivo.
Generando el keypair con OpenDKIM
Ya que vamos a usar DKIM para firmar correos salientes, y verificar correos entrantes, necesitamos generar una llave privada y una pública para el verificador. La clave pública será puesta en los records DNS del dominio.
Creamos una carpeta para el dominio:
sudo mkdir /etc/opendkim/keys/quadword.org
Y generamos las llaves utilizando opendkim-genkey:
sudo opendkim-genkey -b 2048 -d quadword.org -D /etc/opendkim/keys/quadword.org -s default -v
Lenguaje del código: JavaScript (javascript)
Recuerda cambiar quadword.org con tu dominio.
Ahora, vamos a hacer opendkim el owner de la llave privada:
sudo chown opendkim:opendkim /etc/opendkim/keys/quadword.org/default.private
Lenguaje del código: PHP (php)
Y vamos a cambiar los permisos, para que solamente el usuario opendkim tenga acceso al archivo:
sudo chmod 600 /etc/opendkim/keys/quadword.org/default.private
Lenguaje del código: PHP (php)
Para ver la llave pública, podemos ejecutar el siguiente comando:
sudo cat /etc/opendkim/keys/quadword.org/default.txt
Lenguaje del código: JavaScript (javascript)
Después del parámetro p= está la llave
En tu gestor de DNS, vas a crear un record TXT, poner default._domainkey como nombre, y como contenido vas a poner todo dentro de los paréntesis, pegarlo en el valor del DNS y eliminar todas las comillas y espacios en blanco, si no eliminas estos carácteres, los demás pasos van a fallar:
Ahora, vamos a probar que la llave funcione, para eso, podemos ejecutar el siguiente comando:
sudo opendkim-testkey -d quadword.org -s default -vvv
Lenguaje del código: JavaScript (javascript)
Y un resultado similar al siguiente debe haber aparecido:
Si no se obtuvo una salida similar a la anterior (que al final diga key OK) lo más probable es que tengas que esperar a que tu registrar de DNS propague los cambios.
Una vez hayamos terminado de configurar nuestras claves DKIM, vamos a conectar postfix con OpenDKIM, esta conexión se llevará a cabo por medio de un socket de Unix, por lo que primero vamos a crear un directorio para almacenar este socket:
sudo mkdir /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
Lenguaje del código: JavaScript (javascript)
Y vamos a editar el archivo de configuración principal de OpenDKIM:
sudo nano /etc/opendkim.conf
Vamos a encontrar la siguiente línea:
Socket local:/run/opendkim/opendkim.sock
Lenguaje del código: JavaScript (javascript)
Y la vamos a reemplazar con la siguiente línea:
Socket local:/var/spool/postfix/opendkim/opendkim.sock
Lenguaje del código: JavaScript (javascript)
Y ya podemos guardar y cerrar el archivo. Ahora vamos a editar el archivo de configuración de Postfix:
sudo nano /etc/postfix/main.cf
Vamos a agregar las siguientes líneas al final de este archivo, para que Postfix pueda llamar a OpenDKIM por medio del protocolo Milter:
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
Lenguaje del código: PHP (php)
Ahora, guardamos, cerramos el archivo, y reiniciamos los servicios:
sudo systemctl restart postfix opendkim
Una vez terminadas esas configuraciones, ya nuestro servidor SMTP debe estar conectado con OpenDKIM, por lo que ya se pueden enviar y recibir correos desde otros servidores de correo.
Antes de que demos por concluida la entrada, puedes ir a https://www.mail-tester.com/ para revisar que puntaje le asigna a tu servidor de correo, con las configuraciones hechas en esta entrada, debes obtener un puntaje similar al siguiente:
Y eso es todo, así de fácil es como instalas un servidor de correo electrónico. Para próximas entradas veremos como podemos usar otros programas como Emacs para ver, recibir, y enviar correos electrónicos.