Configurando un relay SMTP ligero con Postfix en un contenedor LXC

Written by

in

Objetivo

Configurar un relay SMTP ligero en un contenedor LXC, utilizando Postfix, para que cualquier VM o contenedor de la red local del homelab pueda enviar alertas y notificaciones sin necesidad de configurar contraseñas individuales en cada servicio. Todo el tráfico se centraliza y reenvía hacia una cuenta de correo externa.

Diagnóstico y problemas resueltos

Descarte de Proxmox Mail Gateway

Inicialmente se evaluó Proxmox Mail Gateway (PMG), pero se descartó por su elevado consumo de recursos (~4GB de RAM). Postfix, en cambio, consume menos de 15MB de RAM en reposo — una diferencia enorme para un homelab con recursos limitados.

Apertura de la interfaz local

La configuración por defecto de Postfix viene limitada a loopback-only (solo escucha a la propia máquina). Se abrió a toda la red local con inet_interfaces = all, para que otros equipos de la LAN puedan usar el relay.

Bloqueo del puerto 587 por el ISP

El proveedor de internet tenía bloqueado el puerto 587 saliente, lo que generaba un error de Connection timed out en la cola de correo. La solución fue cambiar al puerto 465 con cifrado SSL/TLS implícito (smtp_tls_wrappermode = yes), que no estaba bloqueado.

Validación estricta del remitente

Muchos hostings de correo exigen que el encabezado From: coincida exactamente con la cuenta autenticada. Si no coincide, el mensaje es rechazado aunque la autenticación sea correcta.

Configuración final de main.cf

El archivo /etc/postfix/main.cf quedó configurado así para permitir la escucha interna y la salida segura por el puerto 465:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, localhost.$mydomain, localhost

# Servidor de destino en puerto seguro 465
relayhost = [smtp.tudominio.com]:465

# Escuchar en todas las interfaces del contenedor
inet_interfaces = all

# Redes locales autorizadas a enviar correos sin contraseña
mynetworks = 127.0.0.0/8, 192.168.0.0/24

recipient_delimiter = +
compatibility_level = 2

# --- Configuración de autenticación segura (salida al hosting) ---
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login

# Parámetros obligatorios para el puerto 465 (SSL directo)
smtp_tls_wrappermode = yes
smtp_tls_security_level = encrypt
smtp_tls_supported_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, >=TLSv1.2

Archivo de credenciales

El archivo /etc/postfix/sasl_passwd contiene la contraseña del buzón emisor, indexada para el puerto 465:

[smtp.tudominio.com]:465    [email protected]:contraseña

Comandos utilizados

Instalación de dependencias

apt update && apt install postfix libsasl2-modules sasl2-bin mailutils -y

Indexar la contraseña en la base de datos de Postfix

postmap /etc/postfix/sasl_passwd

Asignar permisos seguros al archivo de contraseñas

chmod 600 /etc/postfix/sasl_passwd

Reiniciar el servicio

systemctl restart postfix

Diagnóstico y pruebas

Ver el estado de la cola de correos (pendientes o rebotados):

mailq

Forzar el envío de los correos retenidos en la cola:

postfix flush

Enviar un correo de prueba manual respetando el remitente obligatorio:

echo "Esta es una prueba de alerta desde el relay del homelab." | mail -s "Test Relay Homelab" -a "From: [email protected]" [email protected]

Estado de recursos

El contenedor LXC, con apenas 1 vCPU y 512MB de RAM, quedó en excelentes condiciones de salud tras la configuración. Postfix consume alrededor de 15MB de RAM y 0% de CPU en reposo, sin afectar el rendimiento de otros servicios que corran en el mismo contenedor.