En este post, explicaré como montar un servidor de correo completo y no morir en el intento. Un servidor de correo se compone de 2 partes principalmente. MTA (mail delivery agent) en este caso será postfix y MDA (mail delivery agent) en este caso dovecot. Además de esto, se va a utilizar RSPAMD. Un potente gestor de SPAM que incluye filtros de graylist, dkim… Y para los certificado se utilizará letsencrypt.
El proyecto que he utilizado es el de hardware/mailserver
En este ejemplo hay que sustituir dominio.tld por el dominio que se quiera utilizar.
Pasos previos
Para empezar, es necesario tener 3 cosas previamente instaladas que vamos a utilizar. Docker, docker-compose y traefik.
Despliegue de docker
Una vez instalado esto, solo queda crear el proyecto y el docker-compose
mkdir mail
vim mail/docker-compose.yml
version: '3'
services:
server:
image: hardware/mailserver:1.1-stable
domainname: dominio.tld
hostname: mail
restart: always
ports:
- "25:25"
- "143:143"
- "465:465"
- "587:587"
- "993:993"
- "4190:4190"
environment:
- DBPASS=(password_DB)
- RSPAMD_PASSWORD=(password_RSPAMD)
# se pueden añadir varios dominios separados por comas
- ADD_DOMAINS=dominio.tld
- DISABLE_DNS_RESOLVER=true
- ENABLE_FETCHMAIL=true
# Si se quiere tener algún relay
- RELAY_NETWORKS=91.134.241.237/32
volumes:
- server:/var/mail
- traefik_acme:/etc/letsencrypt/acme
depends_on:
- db
- redis
networks:
- back
- traefik
links:
- db:mariadb
depends_on:
- certs
labels:
- "traefik.backend=mail-spam"
- "traefik.frontend.rule=Host:spam.dominio.tld"
- "traefik.domain=dominio.tld"
- "traefik.docker.network=traefik"
- "traefik.port=11334"
postfixadmin:
image: hardware/postfixadmin
domainname: dominio.tld
hostname: mail
restart: always
environment:
- DBPASS=(password_DB)
depends_on:
- server
- db
networks:
- back
- traefik
links:
- db:mariadb
- server:mailserver
labels:
- "traefik.backend=mail-postfix"
- "traefik.frontend.rule=Host:postfix.dominio.tld"
- "traefik.domain=dominio.tld"
- "traefik.docker.network=traefik"
- "traefik.port=8888"
rainloop:
image: hardware/rainloop
restart: always
volumes:
- rainloop:/rainloop/data
depends_on:
- server
- db
networks:
- back
- traefik
links:
- db:mariadb
- server:mailserver
labels:
- "traefik.backend=mail-webmail"
- "traefik.frontend.rule=Host:webmail.dominio.tld"
- "traefik.domain=dominio.tld"
- "traefik.docker.network=traefik"
- "traefik.port=8888"
certs:
image: httpd:alpine
labels:
- "traefik.backend=mail-certs"
- "traefik.frontend.rule=Host:mail.dominio.tld"
- "traefik.docker.network=traefik"
db:
image: mariadb
restart: always
environment:
- MYSQL_ROOT_PASSWORD=(contraseña_DB_root)
- MYSQL_DATABASE=postfix
- MYSQL_USER=postfix
- MYSQL_PASSWORD=(contraseña_DB)
volumes:
- db:/var/lib/mysql
networks:
- back
labels:
- "traefik.enable=false"
redis:
image: redis:alpine
restart: always
command: redis-server --appendonly yes
volumes:
- redis:/data
networks:
- back
labels:
- "traefik.enable=false"
volumes:
redis:
db:
rainloop:
server:
traefik_acme:
external: true
networks:
back:
traefik:
external:
name: traefik
Una vez definido el docker-compose, hay que levantarlo del siguiente modo:
docker-compose up -d
Y aquí ya empezará a levantar todos los servicios. Dará error en la parte de certs pero es porque está traefik levantado y tiene el puerto 443 ocupado.
Configuración DNS
Ahora toca configurar los DNS de una manera correcta.
Registro A
El primero registro que hay que tener es el de mail.
mail.dominio.tld. A IP
Registro MX
Ahora el siguiente es el de MX
dominio.tld MX 10 mail.dominio.tld.
Registro DKIM
A continuación vamos a crear el DKIM. Esto vale para validar que el servidor de correo es autentico. Para esto se utiliza una key pública que se creará en la carpeta: /var/mail/dkim/dominio.tld/public.key
mail._domainkey. TXT any "v=DKIM1; k=rsa; p=YOUR DKIM Public Key"
Registro SPF
Siguiente registro que hay que crear es el SPF. Esto vale para verificar la autenticidad de los servidores SMTP
dominio.tld. TXT "v=spf1 a mx ip4:IPV4_Servidor ~all"
Registro DMARC
Ahora vamos con el DMARC. Esto junto con SPF y DKIM protege la parte from del envelope
_dmarc.dominio.tld. TXT "v=DMARC1; p=reject; rua=mailto:postmaster@dominio.tld; ruf=mailto:admin@dominio.tld; fo=0; adkim=s; aspf=s; pct=100; rf=afrf; sp=reject"
Pues con esto ya se tendría en producción un servidor de correo. Ahora para acceder a las URL
URLs
URL de posfixadmin
Desde aquí se configurarán todos los dominios de correo y cuentas de las que se quiera disponer
https://postfix.dominio.tld

URL RSPAMD
Aquí se podrán ver los correos que han entrado y en que situación están
https://spam.dominio.tld

URL Webmail
Para poder acceder al mail desde un navegador
https://webmail.dominio.tld


buenas tardes, disculpa amigo sabes que hago todo el proceso y al final el postfixadmin me da este problema DEBUG INFORMATION:
Connect: Access denied for user ‘postfix’@’192.168.32.1’ (using password: YES)
Please check the documentation and website for more information.
creo que es un problema de comunicacion con la db, agregue la db a otra network donde tengo un adminer y tampoco puedo accder desde el adminer a la db, no se que pueda ser exactamente le ha sucedido?
Buenas, revisa que las variables de la base de datos sean las correctas. Este error es por que postfix no se puede conectar a la base de datos.
Un saludo