Despliegue de Postfix de Solo Envío con DKIM en Docker en Ubuntu
Esta guía despliega el contenedor Docker boky/postfix con OpenDKIM y TLS en Ubuntu 22.04 (1 GB RAM, 1 vCPU). El servidor solo envía correos mediante sesiones autenticadas o desde localhost en el puerto 587. Incluye generación automática de claves DKIM y monta certificados de Let's Encrypt. Requisitos previos: un dominio gestionado en Cloudflare y un VPS con el puerto de salida 25 permitido por tu proveedor de hosting.
Preparación del Servidor
Actualizar paquetes:
apt update && apt upgrade -y
Eliminar paquetes antiguos de Docker:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
Instalar Docker oficial:
apt update
apt install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Instalar Certbot:
apt install certbot
Añadir un registro A en Cloudflare: mail → IP del VPS, con proxy deshabilitado. Emitir el certificado:
certbot certonly --standalone -d mail.yourdomain.com
Crear un gancho de renovación para reiniciar el contenedor:
nano /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh
Contenido:
#!/bin/bash
docker restart postfix
Hacerlo ejecutable: chmod +x /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh.
Creación de Usuario y docker-compose
Crear un usuario sin privilegios:
useradd -m emailuser -G docker -s /bin/bash
passwd emailuser
su emailuser
Crear docker-compose.yml:
services:
postfix:
image: boky/postfix
container_name: postfix
restart: unless-stopped
ports:
- "587:587"
volumes:
- ./dkim:/etc/opendkim/keys
- /etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem:/etc/opendkim/keys/mail.crt:ro
- /etc/letsencrypt/live/mail.yourdomain.com/privkey.pem:/etc/opendkim/keys/mail.key:ro
environment:
HOSTNAME: mail.yourdomain.com
DOMAIN: yourdomain.com
DKIM_SELECTOR: mail
DKIM_DOMAINS: yourdomain.com
DKIM_KEY_LENGTH: 2048
ENABLE_DKIM: 1
ENABLE_TLS: 1
TLS_KEY: /etc/opendkim/keys/mail.key
TLS_CERT: /etc/opendkim/keys/mail.crt
SMTP_USER: [email protected]|password
RELAY_NETWORKS: 127.0.0.1/32
FORCE_HELO: 1
LOG_TO_STDOUT: 1
ALLOWED_SENDER_DOMAINS: mail.yourdomain.com
DKIM_AUTOGENERATE: "true"
Ejecutar: docker compose up -d. Después de la generación de claves, eliminar DKIM_AUTOGENERATE.
Configuración DNS
En el directorio ./dkim, encontrar el archivo .txt con la clave pública. Extraer la línea como:
v=DKIM1; h=sha256; k=rsa; s=email; p=MNOGO_SIMVOLOV
(unir las partes de la clave sin corchetes ni comillas). Añadir registro TXT en Cloudflare:
- Name:
mail._domainkey - Content: cadena de la clave
Registro SPF para el dominio:
- Name:
yourdomain.com - Content:
v=spf1 a mx ip4:YOUR_VPS_IP -all
rDNS y Puerto 25
Contactar a tu proveedor:
- Abrir el puerto de salida 25.
- Configurar rDNS para
mail.yourdomain.com→ IP del VPS.
Pruebas
Probar en mail-tester.com o appmaildev.com. Entrar en el contenedor:
docker exec -it postfix bash
echo -e "Subject: DKIM Test\n\nThis is a test message" | sendmail -f [email protected] [email protected]
Resultado esperado: 10/10 en los probadores, los correos llegan a la bandeja de entrada de Gmail.
- DKIM: generación automática de claves de 2048 bits.
- SPF: restringe el envío por IP.
- TLS: Let's Encrypt con renovación automática.
- Auth: SMTP_USER para relay.
Puntos Clave
- El contenedor boky/postfix incluye Postfix + OpenDKIM listo para usar.
- Montar volúmenes para claves y certificados con
:ropor seguridad. - RELAY_NETWORKS=127.0.0.1/32 bloquea envíos externos no autenticados.
- Deshabilitar AUTOGENERATE después de la generación de DKIM.
- rDNS es crítico para la entregabilidad con proveedores principales.
— Editorial Team
Aún no hay comentarios.