Instala un Servidor de Email en Google Cloud, Linux y Sendgrid (Plan Gratuito)

Si estás buscando instalar un servidor de email para tu negocio o sitio web personal usando tu dominio (ej. [email protected]) con tecnología Google Cloud, aquí te voy a mostrar como.

Lo atractivo de Google Cloud, es que, al dia en que escribo este artículo, ofrece (dependiendo del pais en donde estés) crédito para que pruebes su plataforma. En mi caso, en Australia está ofreciendo $300 cuando te das de alta por primera vez y los consumas cuando uses su infraestructura, o bien, expire en 365 dias.

Cuando montas un servidor Linux en Google Cloud, por cuestiones de seguridad Google bloquea el puerto 25 (puerto usado en servidores por defecto para enviar emails y en muchos casos, SPAM) y sugiere en su página web que envíes emails por medio de un servicio externo como SendGrid, Mailgun, entre otros. Estos servicios ofrecen un nivel gratis que probablemente te sea suficiente. Por ejemplo, SendGrid te permite (al dia en que se creó este artículo) enviar 100 emails por dia sin cobro. (Julio 2019)

En este caso voy a explicar como montar el servidor de email MailCow en Linux y Google Cloud usando SendGrid como servicio para el envío de emails.

Escenario

Voy a enfocar este artículo en crear un servidor exclusivamente para la aplicación de correo electrónico (emails), en lugar de tener un solo servidor en donde tengamos varios servicios, como servidor web (ej. Apache,MySQL, PHP), correo electrónico, etc…

Por cuestiones de seguridad, es recomendado tener servidores separados, en caso de que uno tenga problemas, solo un servicio (o grupo de servicios) estará temporalmente inhabilitado, mientras otros continuarán funcionando.

Servidor de email (correos) – MailCow Docker

MailCow es una aplicación docker lo cual me parece bastante rápida y atractiva visualmente. En pocas palabras, una aplicación docker trabaja con contenedores y la idea principal es que una vez que instalamos la aplicación no tenemos que lidiar con librerias, dependencias, etc. Viene todo en un paquete, independientemente del servidor y versión de Linux en donde se instale. Si quieres aprender mas sobre que es una aplicación docker, puedes dar clic aquí.

SMTP Relay – SendGrid

Como mencionamos al principio de este artículo, si la idea es montar todo en un servidor Linux en Google Cloud, Google por defecto bloquea el puerto 25. Podríamos configurar Linux para que envíe emails usando un puerto diferente, pero en este artículo usaremos un servicio externo que asista con el envío de emails.

Es decir, nuestro servidor de email (Linux), gestionará nuestros emails, en él crearemos nuevas cuentas, recibiremos y guardaremos los emails entrantes, contactos, etc y SendGrid, nos ayudará solamente con el envío de mensajes.

En el plan gratis, SendGrid permite enviar 100 emails diarios.

Google Cloud DNS – Configuración

El primer paso que tenemos que dar es configurar nuestro servidor de DNS (Domain Name System) para poder administrar el dominio que usaremos en el servidor.

  • En nuestra consola de Google Cloud, damos clic en Network Services > Cloud DNS
  • Da clic en Create Zone para activar y administrar nuestro dominio en Google Cloud
    • Zone Type: Público
    • Zone Name: Escribe el nombre de tu dominio como referencia
    • DNS name: Escribe tu dominio exacto. Para fines de referencia, en este artículo usaré dominio.com
    • Clic en Create/Crear

Antes de direccionar tu dominio a Google Cloud, es importante configurarlo.

DNS NameTypeTTL (Seconds)Data
autoconfig.dominio.com.CNAME300mail.dominio.com.
autodiscover.dominio.com.CNAME300mail.dominio.com.
dominio.com.MX30010 mail.dominio.com
dominio.com.TXT300“‘v=spf1” “include:sendgrid.net” “~all'”
mail.dominio.comMX3000 mail.dominio.com

Hasta este punto, nos hace falta crear una entrada con el IP público del servidor. Una vez que creemos nuestro servidor Linux y Google le asigne una IP, volveremos esta sección de administración de dominio y agregaremos una entrada mas especificando el IP asignado.

Crear un servidor virtual Linux en Google Cloud

  • El primer paso es ir a Compute Engines > VM Instances
  • Da clic en “Create instance”

El siguiente paso es crear la instancia/servidor a detalle y asignarle recursos, en este caso voy a seleccionar una región en Estados Unidos que sea la más económica y unos recursos básicos.

  • Name: mail-server
  • Region: us-east1 (South Carolina) – dependiendo de la región seleccionada será el precio de tu servidor.
  • Zone: us-east1-b
  • Machine family: General-purpose
  • Machine type: Custom
  • Cores: 1 vCPU
  • Memory: 3.75 GB

Nota: La ventaja de usar servicios como Google Cloud es que dependiendo del uso del servidor te irá haciendo recomendaciones, por ejemplo, si recibes demasiados emails y el servidor se estresa mas de lo normal, Google te hará recomendaciones para que incrementes memoria RAM, espacio de alacenaje, etc. y con un solo clic, podrás implementar estas recomendaciones. De igual manera si el servidor es subutilizado.

  • Boot Disk: Debian GNU/Linux 9 (Stretch)
  • Firewall: Selecciona las opciones “Allow HTTP traffic / Allow HTTPS traffic”
  • Da clic en Management, security, disks, networking, sole tenancy
  • Da clic en “Networking”
  • Da clic en Network interfaces “default”
  • Da clic en Primary internal IP y selecciona “Create IP address”

Asígnale un nombre a la nueva dirección IP que te sirva como referencia en caso de que en un futuro requieras mas direcciones IP y así lleves un buen inventario de los recursos que vas creando, en este caso lo nombraré mail-server.

  • Da clic en “RESERVE”
  • Selecciona “Done” para guardar y “Create” para generar la nueva instancia/servidor Linux.

Una vez que el nuevo servidor Linux ha sido creado, toma nota de la direccion de IP asignada a tu servidor y agregala en la configuracion de DNS.

  • Vamos de regreso a Network Services > Cloud DNS selecciona tu dominio y agrega la siguiente entrada.
  • Da clic en Add Record Set y pon los siguientes datos:
    • DNS Name: mail.dominio.com
    • Resource record type: A
    • IPv4 address: 24.174.67.158 (en tu caso, agrega el IP asignado a tu servidor)
  • Da clic en Create

La nueva entrada se verá algo similar a la siguiente tabla

DNS nameTypeTTL (seconds)Data
mail.dominio.com.A30024.174.67.158

Configurar reglas de Firewall (Cortafuegos)

Por defecto, cuando se crea un nuevo servidor solo algunos puertos son abiertos, por lo que es necesario habilitar los puertos requeridos para que el servidor pueda enviar y recibir emails.

Estos son los puertos que necesitamos habilitar en nuestro Firewall para que nuestro servidor Linux pueda funcionar como servidor de emails.

TCP: 25, 465, 587, 143, 993, 110, 995, 4190

  • En la consola de Google Cloud da clic en VPC Network > Firewall rules

Esta es la información que debes poner:

  • Name: mail-server
  • Targets: All instances in the network
  • Source IP Ranges: 0.0.0.0/0
  • Specified protocols and ports: TCP: 25, 465, 587, 143, 993, 110, 995, 4190
  • Da clic en Create

Se verá algo similar a esto:

Puertos que hay que habilitar para que el servidor de correo elctrónico pueda enviar y recibir emails

Apunta tu dominio al servidor de Google

Ve a la sección de administración de tu dominio con la empresa donde lo adquiriste (GoDaddy, Crazy Domains, etc) y direcciona tu dominio al servidor en Google Cloud.

En mi caso, Google Cloud me asignó los siguientes nombres de dominio. (ver imagen abajo).

Servidor 1: ns-cloud-d1-googledomains.com.
Servidor 2: ns-cloud-d2-googledomains.com.
Servidor 3: ns-cloud-d3-googledomains.com.
Servidor 4: ns-cloud-d4-googledomains.com.

Nombre de servidores para apuntar dominio al servidor en Google Cloud

Ahora es momento de configurar nuestro servidor Linux e instalar MailCow. A continuación vamos a empezar con las líneas de comando en la terminal SSH. No serán muchas, si acaso alrededor de unas 20 líneas (o tal vez unas pocas más).

Configurar servidor Linux via SSH (línea de comando)

Clic en SSH para iniciar la consola.

Una vez que establezcas conección vamos a actualizar el servidor, escribe la siguiente línea de comando

sudo apt-get update

El siguiente comando nos va a ayudar a instalar Docker

curl -sSL https://get.docker.com/ | CHANNEL=stable sh

Una vez que Docker ha sido instalado vamos a poner una línea de comando que nos permita actuar en modo administador

sudo -i

Vamos a echar a andar Docker compose con la siguiente línea de comando

curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Ahora, vamos a instalar Git y clonar MailCow, también vamos a asegurarnos de que umask sea igual a 0022 (esto hará que solo admin tendrá privilegios de escritura, los demás usuarios de lectura) – entra los siguientes comandos:

umask
0022
apt-get install git
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

A continuación generaremos un archivo de configuración en donde especificaremos nuestro dominio (continuando con este ejercicio, en mi caso será mail.dominio.com) y la zona horaria. En mi caso estoy en Australia, Melbourne. Por lo que pondré +10

./generate_config.sh

Te preguntará por tu Hostname FQDN, donde administras tu servidor de email via web. En mi caso quí escribo mail.dominio.com y tecleo “enter”

Hostname (FQDN): mail.dominio.com

Y zona horaria, aquí escribo +10 y tecleo “enter”

Timezone [UTC]: +10

Si en un futuro quieres cambiar estos datos lo puedes hacer editando el siguiente archivo (te lo dejo como referencia)

nano mailcow.conf

El siguiente paso es ejecutar el archivo composer y echar a andar MailCow por primera vez usando el parámetro -d, estas son las siguientes dos líneas de comando:

docker-compose pull

En mi caso, este comando tomó un tiempo en ser ejecutado por el servidor (paciencia). Una vez que el servidor haya hecho lo suyo, entra el siguiente comando para iniciar MailCow.

docker-compose up -d

Si todo va bien hasta aquí, MailCow ya habrá iniciado y podremos configurarlo por medio de la interfaz web.

En tu navegador pon la direccion:

mail.dominio.com (en tu caso, usa tu nombre de dominio).

Nombre de usuario y contraseña por defecto son:

Usuario: admin
Contraseña: moohoo

De regreso a la terminal, vamos a confirmar que el certificado SSL haya iniciado correctamente poniendo el siguiente comando:

docker-compose logs acme-mailcow

Pues ya tienes tu servidor de Email y MailCow arriba. Los siguientes paso son, configurar MailCow, crear una cuenta de email y hacer que nuestro servidor envíe emails por medio de SendGrid.

Configuración de MailCow

Abre tu navegador y pon la dirección de tu servidor. En mi caso mail.dominio.com

Usuario: admin
Contraseña: moohoo

Una vez que accedas a la interfaz web de configuración, cambia el password en Configuration > Configuration & Details y da clic en Edit.

Por defecto y por preferencia personal dejo todo en idioma inglés (hay mas tutoriales e información en ese idioma), así que continuaré el tutorial haciendo referencia a términos en inglés.

A continación, vamos a crear nuestro dominio en el servidor de email y crear el primer correo electrónico.

Da clic en Configuration > Mail Setup

Da clic en la pestaña Domains y da clic en el boton + Add domain
Damos de alta nuestro dominio en el servidor de Email y damos clic en Add domain and restart SOGo

Una vez que hayamos dado de alta nuestro dominio, ahora podremos agregar nuestro primer cuenta de email al servidor.

Da clic en la pestaña Mailboxes y da clic en + Add mailbox

En este ejemplo agregaré un email javier @ dominio.com con un espacio de 3 GB.

Hasta este punto, ya hemos creado nuestro servidor Linux, configurado nuestro DNS, hemos instalado nuestro servidor de email y creado nuestra primer cuenta de email. El último paso es hacer que todo esto funcione con SendGrid para el envío de emails. Aquí puedes darte un descanso, estirar las piernas, pon una bebida a helar que estamos a punto de terminar con este tutorial.

Configurar SMTP relay – SendGrid

Ve a la pagina de SendGrid (sendgrid.com) y crea tu cuenta gratis.

  • Una vez que hayas terminado el proceso de confirmación de cuenta entra a SendGrid y selecciona Settings > API Key
  • Presiona el boton Create API Key
  • Nombra tu API Key – en mi caso pondré mail.dominio.com (para tener como referencia en caso de que en un futuro requira crear un nuevo servidor y llave API)
  • Selecciona Full Access
  • Clic en Create & View

Cuando generes la llave API, copia y pégala en un bloc de notas ya que la vas a necesitar mas adelante.

Configurar MailCow para que envíe emails por medio de SendGrid.

Ya que tenemos la llave API de SendGrid es momento de ponerla en el archivo de configuracion de MailCow para que ambos servidores se puedan autenticar.

De regreso a la consola SSH de tu servidor Linux y vamos a editar el archivo main.cf con el siguiente comando.

sudo nano data/conf/postfix/main.cf

Son 7 líneas las que tienes que actualizar o crear en caso de que no se encuentren en el archivo. Estas son las líneas.

smtp_sasl_auth_enable = yes

smtp_sasl_password_maps = hash:/opt/postfix/conf/smarthost_passwd

smtp_sasl_security_options = noanonymous

smtp_sasl_tls_security_options = noanonymous

smtp_tls_security_level = encrypt

header_size_limit = 4096000

relayhost = [smtp.sendgrid.net]:587

Tip: Al usar nano, presiona las teclas CTRL + W y podras buscar si cierta línea está en el documento, en caso de que esté, nomás sería cuestión de actualizar los valores. Si no está, agregar la línea completa.

  • Cuando hayamos terminado, presionamos las teclas CTRL + O para guardar el archivo, seguido de CTRL + X para finalizar el editor nano.

A continuación, crearemos el archivo con las credenciales de la llave API, en donde username es apikey y password es la llave API generada (y que guardamos en un bloc de notas en un paso anterior) en SendGrid.

echo "smtp.sendgrid.net username:password" > data/conf/postfix/smarthost_passwd

Como referencia, en mi caso la línea de comando se ve así (por seguridad, he borrado el password ya que es la autenticación entre mi servidor Linux y SendGrid)

  • A continuación, escribe los siguientes 4 comandos.
docker-compose exec postfix-mailcow postmap /opt/postfix/conf/smarthost_passwd
docker-compose exec postfix-mailcow chown postfix: /opt/postfix/conf/smarthost_passwd /opt/postfix/conf/smarthost_passwd.db
docker-compose exec postfix-mailcow chmod 600 /opt/postfix/conf/smarthost_passwd /opt/postfix/conf/smarthost_passwd.db
docker-compose exec postfix-mailcow postfix reload

Se verá algo, mas o menos así:

Si has llegado hasta aquí, vamos por buen camino. La última línea de comando reinicia el servidor de email MailCow y el servidor ya te permite enviar emails. En teoría, hasta este punto, tu servidor ya debe de poder recibir y enviar emails usando SendGrid, sin embargo, cuando envíes un correo, al destinatario le saldrá la leyenda “enviado via sendgrid.net” lo cual se ve terrible y poco profesional.

Para solucionar ese problema, tendremos que autenticar nuestro dominio en tu cuenta SendGrid. Al hacer esto le daremos el permiso a SendGrid de enviar emails a nuestro nombre y los servidores que reciban nuestros emails no harán mención de SendGrid.

Autenticar tu dominio en SendGrid.

  • Entra a tu cuenta de SendGrid – Settings > Sender Authentication y da clic en Authenticate Your Domain > Get Started
  • En el siguiente paso selecciona Google Cloud DNS y a la pregunta “Would you also like to brand the links for this domain?” selecciona No.

A continuación, SendGrid te dará instrucciones para que agregues 3 valores (CNAME) mas a tu DNS para autenticar tu dominio con SendGrid. Las instrucciones se ven mas o menos así:

Una vez que agregues los valores CNAME a tu dominio. En SendGrid puedes verificar que los valores hayan sido agregados correctamente.

Listo, este ha sido el último paso. Ahora puedes enviar un correo de prueba para comprobar que todo funciona correctamente.

Espero que esta guía te haya sido de utilidad. Si tienes alguna duda o algo que expresar, no dudes en escribirla en los comentarios abajo.

Site Footer