Servidor de correo con docker

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

 

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *