Publi

Configurar Postfix para enviar correo a través de otro servidor SMTP [Gmail, sendgrid, mailgun y más]

Es una configuración muy común para los servidores de correo saliente. Sirve, por ejemplo para cuando queremos que los correos que enviemos desde nuestro ordenador se hagan a través de otro servidor SMTP, cuando hemos contratado un servicio externo para enviar correo para nuestra empresa, hacer redirecciones temporales o tener un servidor intermedio a la hora de recibir correos (por ejemplo, si queremos aplicar filtros antes de enviar los correos).

Por eso en el título de la entrada está Gmail. Podemos configurar un pequeño servidor de pruebas, o incluso en nuestra máquina local, para que los correos que se envíen con sendmail, o que nos envíen a nuestra máquina, se hagan a través de nuestra cuenta de Gmail (debemos activar el acceso por SMTP, y tendremos que tener cuidado de escuchar solo en localhost o poner reglas de firewall para que no todo el mundo pueda acceder a nuestro puerto de envío de correo). También están los casos de sendgris y mailgun, servicios que podemos utilizar para enviar correos desde un dominio determinado. Estos servicios están bien si desde nuestro servidor se envía un gran volumen de correo (existen muchos más servicios similares).

La otra opción es enviar un correo a través de nuestro propio servidor. Esto puede ser útil en caso de tener varios servidores de envío. Podemos hacer que varios servidores reciban correo y lo envíen a un servidor central. Si uno de los servidores pequeños ve que el central está muy saturado, puede esperar y entregarlo dentro de un rato. También es muy útil la creación de filtros para una empresa, es decir, la empresa tiene contratado el servicio de envío de correo a través de un proveedor externo, pero nosotros queremos tener algo de control como aplicar filtros, revisar virus, o eliminación de metadatos, o que debamos saber si hablan mal de nosotros, que para eso somos administradores de sistemas, aunque no te diré cómo, pero no es muy difícil.

Iré explicando el proceso desde el principio, por lo que si ya has instalado postfix o tienes cierta experiencia con él, podrás saltarte algunas partes. No profundizaré mucho en la configuración de Postfix porque es un mundo, solo en lo que nos atañe para esta tarea.

Instalación de Postfix

Para estos ejemplos he utilizado un equipo con Ubuntu Server 16.04, por lo que vais a ver cosas como apt para instalar los programas. No será muy diferente a hacer todo esto en una Debian, o cualquier otra distribución basada en Ubuntu o Debian. Puede que para otras distribuciones difiera un poco, pero la idea básica es la misma. Lo primero, es instalar Postfix:

sudo apt install libsasl2-modules ca-certificates postfix

Tras eso, veremos una ventana como la siguiente. Aquí podemos elegir configurarlo como Satélite. De hecho, nuestro servidor no hará el envío de correo de forma directa, sino a través de otra máquina.
Postfix como Satélite

La siguiente pregunta del instalador, es el nombre del host. Éste debe ser un FQDN, vamos un nombre que identifique la máquina y que su DNS resuelva. De forma que si desde otra máquina hacemos ping o telnet, la máquina la encontremos y sea esta máquina a la que estamos accediendo:
Elegir dominio de Postfix

El siguiente paso, será especificar el servidor a través del cual vamos a enviar los correos realmente:
Postfix, indicando el servidor Relay

En este punto debemos especificar el host y el puerto. Os pongo aquí varios hosts y puertos de algunos servicios comunes:

  • Gmail. smtp.gmail.com:25
  • Sendgrid. smtp.sendgrid.net:587
  • Mandrill. smtp.mandrillapp.com:587
  • Sparkpost. smtp.sparkpostmail.com:587
  • Mailgun. smtp.mailgun.org:25

O incluso podemos utilizar cualquier otro servidor de correo de otro proveedor (que hay cientos de servicios gratuitos y de pago para esto). Puede que para algunos de los servicios haya que realizar una activación previa del servicio SMTP, o incluso configurar DNS para poder trabajar correctamente.

Por último, debemos revisar, en el fichero /etc/postfix/main.cf que la línea que menciona myhostname tiene nuestro nombre de host de correo (el FQDN que introdujimos en la segunda pantalla).

Configurar servidores SMTP, usuarios y contraseñas

Cualquier servidor hoy en día, debe tener activada la autentificación de usuarios, de modo que no permita que cualquiera envíe correos desde ese servidor. Era muy habitual en el pasado encontrar servidores abiertos desde los que poder enviar cualquier cosa y, tanto en el mundo fantástico y maravilloso de la piruleta, como en el diseño original del sistema de correo debía ser así. El problema es que mucha gente aprovechaba para hacer cosas malas.

El primer acceso que vamos a configurar es el que va desde el servidor de correo Postfix que estamos montando hasta el servidor de correo a través del cual vamos a enviar los mensajes. Para ello creamos el archivo /etc/postfix/sasl_passwd, en realidad, podemos llamarlo como queramos, aunque es una buena idea colocarlo dentro de /etc/postfix. Dentro del archivo incluimos lo siguiente (con los corchetes y todo):

1
[mail.dominio.com]:puerto usuario:contraseña

En esta línea incluiremos el nombre del servidor desde el que realmente enviaremos los correos (Gmail, sendgrid, mailgun…), el puerto, y el nombre de usuario y contraseña desde el que enviaremos los correos. Si, por ejemplo, estamos utilizando nuestra dirección de Gmail para enviar correo, solo podremos utilizar como remitente nuestra propia dirección, aunque tienen por ahí una opción para poder utilizar más direcciones de correo de Google de esta forma. Otros servicios permiten, a través de una clave única enviar correos desde cualquier dirección de correo dentro de un dominio o subdominio, deberá ser nuestro Postfix el que determine qué un usuario no pueda enviar correo con el e-mail de otro.

Una vez tenemos /etc/postfix/sasl_passwd creado, vamos a crear una tabla de búsqueda (lookup-table) para Postfix de esta forma:

sudo postmap /etc/postfix/sasl_passwd

De esta forma creamos el archivo /etc/postfix/sasl_passwd.db . Lo siguiente será proteger los dos archivos de contraseñas, tanto el que no tiene extensión (que, si queremos lo podemos borrar y no pasa nada, o también custodiarlo en otra máquina o con otro usuario, ya como queramos). Para protegerlo, hacemos que solo root sea capaz de acceder a los archivos:

sudo chown root:root /etc/postfix/sasl_passwd.db /etc/postfix/sasl_passwd
sudo chmod 0600 /etc/postfix/sasl_passwd.db /etc/postfix/sasl_passwd

Aunque, si sois frikis como yo, y no queréis escribir mucho podéis hacer lo siguiente (más info aquí):

sudo chown root:root /etc/postfix/sasl_passwd{,.db}
sudo chmod 0600 /etc/postfix/sasl_passwd{,.db}

Por último, tenemos que configurar nuestro servidor relay editando el archivo /etc/postfix/main.cf , primero añadiendo (o verificando) que el relay host está configurado, es decir, el servidor a través del cual enviamos realmente los correos:

1
relayhost = [mail.dominio.com]:puerto

Podemos poner o buscar esta información cerca de myhostname, mydestination, mynetworks.

Ahora, en el mismo archivo, por ejemplo, al final del archivo, podemos poner un comentario y a continuación las siguientes líneas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Configuración de seguridad para el servidor saliente

# Usas SASL para autentificarnos antes de enviar correos
smtp_sasl_auth_enable = yes

# Utilizar el mapa /etc/postifx/sasl_passwd.db
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

# No permitr métodos de autentificación anónima
smtp_sasl_security_options = noanonymous

# Utilizar el fichero de certificados raíz del sistema
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

# Utilizar STARTTLS para enviar los correos
smtp_use_tls = yes

Configurar autentificación en nuestro servidor

Nuestro servidor debe identificarse cuando se conecta para mandar correos a través de otra máquina (como vimos, que puede ser Gmail, Sendgrid, Mailgun, etc). Pero claro, puede que queramos que nuestros usuarios también se identifiquen en nuestro servidor cuando se conecten. De esta forma, cualquier persona no podrá enviar e-mails. Es algo que no es fundamental, pero sí recomendado si no queremos que nuestro servidor se transforme en una máquina zombie que envíe correos sin piedad, lo que puede desembocar en que el servidor de envío a través del cual mandamos los mensajes nos termine desactivando el usuario y, si el dominio es nuestro, éste pierda reputación y nos resulte tremendamente difícil que el mundo no se crea que enviamos SPAM.

Para configurar esta seguridad, vamos a crear una pequeña base de datos local con los usuarios permitidos. Seguro que si tenemos miles de usuarios deberíamos tener métodos de autentificación más grandes y distribuidos, pero, por experiencia en la mayoría de los casos, utilizando SASL, como antes, va muy bien.

Instalaremos algunas utilidades, si no las tenemos ya:

sudo apt install libsasl2-2 sasl2-bin

Ahora, debemos asegurarnos de que el demonio saslauthd se ejecuta automáticamente al iniciar el sistema. Para ello, editaremos /etc/default/saslauthd y nos aseguremos de que la línea que comienza por START y por MECHANISM se mantiene así:

1
2
3
4
5
6
# Should saslauthd run automatically on startup? (default:no)
START=yes
.....
.....
# Example MECHANISMS="pam"
MECHANISMS="sasldb"

Tras ello, reiniciaremos el demonio:

sudo service saslauthd restart

Ahora debemos configurar de nuevo algunas cosas en /etc/postfix/main.cf:

1
2
3
4
5
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain=
smtpd_recipient_restrictions= permit_sasl_authenticated,
        reject_unauth_destination
smtpd_sasl_security_options=noanonymous

Tras esto, debemos crear (o editar) el archivo /etc/postfix/sasl/smtpd.conf donde especificaremos el tipo de autentificación permitida a la hora de conectarnos e intentar enviar correo a través de Postfix. Dejaremos las siguientes líneas:

1
2
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM

Por supuesto, podríamos (y deberíamos) eliminar PLAIN sobre todo, para que nadie pueda identificarse con contraseñas en texto plano. Aunque, la práctica me dice que a veces puede que necesitemos activarlo temporalmente. De hecho, es problema de los usuarios si utilizan PLAIN para identificarse, los clientes de correo siempre intentan identificarse con el método más seguro disponible.

Tras todo esto, reiniciamos Postfix:

sudo service postfix restart

Por último, podemos tener un pequeño problema a la hora de identificar usuarios, y es que, Postfix, muchas veces está configurado con un chroot o una jaula. Eso quiere decir que postfix será incapaz de ver archivos fuera de su jaula, como por ejemplo, el socket de identificación de saslauthd, por lo tanto, no podrá identificar correctamente a los usuarios. Para ello, solo tenemos que introducir el directorio /var/run/saslauthd dentro de la jaula, de esta forma:

sudo mount --bind /var/run/saslauthd /var/spool/postfix/var/run/saslauthd

Este comando deberíamos ejecutarlo siempre que se inicie el sistema, podríamos incluir una línea en /etc/fstab o un script de arranque personalizado.

Manejo de usuarios

Si queremos crear o cambiar la contraseña de los usuarios del sistema deberíamos hacer:

sudo saslpasswd2 -c [nombre de usuario]

O también

sudo saslpasswd2 -c [nombre de usuario]@[dominio]

Para eliminar un usuario podremos utilizar -d en lugar de -c y para listar todos los usuarios del sistema tenemos el comando:

sudo sasldblistusers2

Restringir dispositivos de red

Esto depende de dónde se van a enviar los mensajes. Por seguridad es una buena opción restringir los interfaces de red permitidos para cada servicio que instalamos en nuestros servidores, haciendo que los servicios solo escuchen en aquellos dispositivos para los que estén ofreciendo servicio. Así que, en Postfix también podemos decidir esto. En /etc/postfix/main.cf debemos configurar:

1
inet_interfaces = all

Con esta configuración estaremos escuchando en todos los dispositivos de red que tenga la máquina. Si lo hacemos así, debemos restringir el acceso a puertos (si queremos) a otros usuarios. Podríamos utilizar, en lugar de all, la opción loopback-only si solo escuchamos en localhost. Esto puede ser útil si tenemos un servicio web instalado en este servidor que necesite enviar correos. También podemos poner las direcciones IP o nombres de host desde los que escuchamos separados por comas (si son varios).

Si cambiamos algo aquí tendremos que reiniciar el servidor postfix.

Enviando un mensaje

Es momento de enviar un mensaje de prueba. Tenemos muchas opciones. Podemos utilizar sendmail de la siguiente forma:

/usr/sbin/sendmail correo@destinatario.com
From: direccion@origen
To: correo@destinatario.com
Subject: Asunto del mensaje
Texto del mensaje, que puede tener.
muchas líneas y ser muy largo.

Tras ello, podemos pulsar Control+D y terminaremos de escribir el mensaje. Supuestamente debe haberse enviado si todo está correcto.

También podemos tirar de funciones de varios lenguajes de programación como mail() para PHP. O de scripts como gemail.sh con el que se podrán enviar archivos adjuntos de forma fácil. Por supuesto, también podemos configurar nuestro cliente de correo favorito para enviarlos.

Logs y depuración

Y, como todo en este mundo informático puede fallar, es importante tener a mano los logs. En estos logs podremos ver mensajes que nos dirán qué está pasando en cada momento. Tendremos dos /var/log/mail.log que nos dirá qué está pasando con cada mensaje, IDs de correos, mensajes que entran en cola o no, errores al mandar un mensaje a otro servidor o al recibirlo, etc. También podemos encontrar errores en /var/log/mail.err sobre todo en lo relativo a fallos en el demonio, conexiones que no se han podido establecer o intentos de hacer cosas raras como por ejemplo poner muchas líneas de encabezados en un mensaje (podemos tener 20, 30 líneas, pero cuando alguien intenta meter 100 o 200 líneas, puede que esté intentando hacer algo malo, o que no esté enviando bien el mensaje).

Foto principal: Designed by Freepik

También podría interesarte....

Only 1 comment left Ir a comentario

  1. Antonio /
    Usando Google Chrome Google Chrome 68.0.3440.106 en Windows Windows 7

    amigo buenas tardes he seguido tu guia me parece muy buena ahora tengo una duda si quiero configurar varios clientes con outlook dentro de mi red local como seria la configuracion

Leave a Reply