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