Configurar postfix a través de un relay host autenticado (Gmail)


En principio sería posible instalar un servidor de correo en cualquier equipo conectado a Internet con una dirección IP pública, pero debido al problema del spam, mucho de los servidores de correo de Internet bloquean el correo no autenticado que venga de direcciones IP dinámicas, que son las habituales en conexiones domésticas.

Una solución es instalar un servidor de correo que no envíe directamente el correo al servidor destino, sino que utilice el equipo smtp.gmail.com para que retrasmita (relay) sus mensajes.

Características del montaje

  • Sistema: Debian GNU/Linux (lenny)
  • postfix 2.5.5
  • DNS correctamente configurado en dyndns.org, supongamos que fuese mimaquina.dyndns.org
  • ddclient instalado y configurado para actualizar el registro DNS en dyndns
  • Cuenta abierta en gmail, supongamos que fuese micuenta@gmail.com

Si instalamos postfix en un equipo con dirección IP dinámica y envíamos un mensaje de correo a determinados dominios (por ejemplo hotmail), nos rebotarán los mensajes y nos aparecerán líneas en el fichero /var/log/mail.log como éstas:

postfix/pickup[6804]: 09B0634680: uid=1000 from=<usuario>
postfix/cleanup[6810]: 09B0634680:message-id=<20081231154700.09B0634680@mimaquina>
postfix/qmgr[6802]: 09B0634680: from=<usuario@mimaquina.dyndns.org>, size=307, nrcpt=1 (queue active)
postfix/smtp[6812]: 09B0634680: to=<una@hotmail.com>,relay=mx2.hotmail.com[65.54.244.40]:25, delay=1.3, delays=0.03/0.04/0.92/0.3, dsn=5.0.0, status=bounced (host mx2.hotmail.com[65.54.244.40] said: 550 DY-001 Mail rejected by Windows Live Hotmail for policy reasons. We generally do not accept email from dynamic IP's as they are not typically used to deliver unauthenticated SMTP e-mail to an Internet mail server. http://www.spamhaus.org maintains lists of dynamic and residential IP addresses. If you are not an email/network admin please contact your E-mail/Internet Service Provider for help. Email/network admins, please visit http://postmaster.live.com for email delivery information and support (in reply to MAIL FROM command))
postfix/smtp[6812]: 09B0634680: lost connection with mx2.hotmail.com[65.54.244.40] while sending RCPT TO

Para evitar esto podemos utilizar otro MTA para que retransmita el correo de nuestro servidor, para lo que debemos tener una cuenta de correo en dicho MTA. Explicaremos a continuación los pasos que hay que dar para hacer eso con el servidor de correo de GMail (smtp.gmail.com).

Características de la conexión

Para enviar correo utilizando el servidor SMTP de Gmail la conexión tiene que estar cifrada con TLS, para lo que debemos añadir la Autoridad Certificadora adecuada (en este caso Thawte) y autenticada, para lo que utilizaremos un nombre de usuario (dirección de correo) y contraseña del servicio.

Configuración de main.cf

Tenemos que editar el fichero y añadir las siguientes líneas:

relayhost = [smtp.gmail.com]:587

Donde indicamos el nombre del equipo que retransmitirá nuestro mensajes (los corchetes ([ ]) son para que no haga la resolución MX) y el puerto de la conexión es el que se utiliza para la conexión entre un cliente y un servidor SMTP (587/TCP message submission).

smtp_use_tls = yes
smtp_tls_CAfile = /etc/postfix/cacert.pem

Para que utilice TLS al enviar correo y confíe en las autoridades certificadoras que se añadan al fichero cacert.pem

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/passwd
smtp_sasl_security_options = noanonymous

donde le decimos a postfix que debe autenticarse mediante SASL y especificamos la ubicación del fichero con la información del nombre de usuario y contraseña.

Datos de autenticación

Creamos el fichero /etc/postfix/sasl/passwd con el siguiente contenido:

[smtp.gmail.com]:587    unacuenta@gmail.com:unacontraseña

Y lo protegemos adecuadamente con:

chmod 600 /etc/postfix/sasl/passwd

El fichero de configuración hay que transformarlo a un fichero indexado de tipo hash mediante la instrucción:

postmap /etc/postfix/sasl/passwd

que creará el fichero /etc/postfix/sasl/passwd.db

Utilización del certificado adecuado

Para añadir la autoridad certificadora Thawte al fichero de certificados que utilizará postfix, hacemos:

cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem >> /etc/postfix/cacert.pem

si no existiesen los ficheros de certificados SSL, debemos instalar el paquete ca-certificates

Actualización (21/08/2009):Ayer al enviar mensajes aparecía la siguiente línea en el registro de correo:

certificate verification failed for smtp.gmail.com[74.125.79.111]:587: untrusted issuer /C=US/O=Equifax/OU=Equifax Secure Certificate Authority

Por lo que parece que el servidor smtp.gmail.com ha cambiado de entidad certificadora :-?, utilizando ahora Equifax en lugar de Thawte, para solucionar esto añadimos Equifax al fichero de certificados que está utilizando postfix:

cat /etc/ssl/certs/Equifax_Secure_CA.pem >> /etc/postfix/cacert.pem

y reiniciamos el demonio de postfix (bastará hacer reload).

Configuración de la cuenta de gmail

Actualización (20/08/2009): Sección añadida para que los corrreos lleguen a destino con el campo «From:» correcto, gracias a nihilanthlnxa y sylon por sus comentarios.

El campo «From:» de un mensaje de correo indica la dirección de correo electrónico del remitente, pero no es obligatorio que sea la dirección de correo del usuario en el servidor de correo que envía el mensaje, sino que es el cliente de correo el que se encarga de rellenar este campo y puede poner el valor que desee. Cuando se utilizan varias cuentas de correo esto permite enviar mensajes con distintos remitentes desde el mismo servidor de correo, pero tiene la contrapartida de que se puede utilizar (y así lo hacen los mensajes de spam) para poner una dirección de correo ilegítima. Gmail sólo permite poner en el campo «From:» direcciones de correo verificadas o pone por defecto la que se corresponde con la cuenta de gmail.

Añadir un remitente nuevo en nuestra cuenta de gmail

Abrimos en el navegador la página de Gmail, vamos a Configuración > Cuentas e importación > Enviar mensaje como y añadimos como nuevo remitente la dirección de correo de nuestro servidor de correo (usuario@mimaquina.dyndns.org). Para verificar que somos usuarios legítimos de la misma gmail nos enviará un mensaje con un código de verificación, que nos llegará a nuestra cuenta local. Una vez verificada la cuenta, gmail permitirá que se envíen mensajes con ese remitente y no lo modificará.

Prueba de funcionamiento

Para comprobar que todo está funcionando correctamente, enviamos un mensaje a una cuenta cualquiera de correo y miramos de nuevo los registros:

postfix/pickup[6703]: 6AFF534680: uid=1000 from=<usuario>
postfix/cleanup[6786]: 6AFF534680: message-id=<20081231154524.6AFF534680@mimaquina>
postfix/qmgr[5935]: 6AFF534680: from=<usuario@mimaquina.dyndns.org>, size=310, nrcpt=1 (queue active)
postfix/smtp[6788]: 6AFF534680:to=<unacuenta@hotmail.com>,relay=smtp.gmail.com[66.249.93.111]:587, delay=2.8, delays=0.04/0.02/1.2/1.6, 
dsn=2.0.0, status=sent (250 2.0.0 OK 1230738538 34sm19633915ugh.10)
postfix/qmgr[5935]: 6AFF534680: removed

Referencias

Los aspectos más importantes están cogidos de Relaying Postfix SMTP via smtp.gmail.com : Ubuntu Tutorials, simplemente he añadido algunos comentarios que me han parecido relevantes.

Configurar postfix a través de un relay host autenticado (Gmail)

34 comentarios en “Configurar postfix a través de un relay host autenticado (Gmail)

  1. Dolser dijo:

    Hola, muy buen post, estoy tratando de configurar lo mismo, pero en Zimbra 5 en Ubuntu Server 64, aca cambia alguna cosas, por ser zimbra, tienes informacion al respecto, has usado alguna vez esta suite opensource de correo?….
    Saludos y Gracias

    Me gusta

  2. Tairux dijo:

    Estimado, segui al pie de la letra su tutorial, pero al mandar un correo a una cuenta de hotmail, me dice este error: Must issue a STARTTLS command first

    a que se deberá eso.
    Utilizando debian 5 lenny, postfix, ip dinamica
    Gracias…..

    Me gusta

  3. Cara dijo:

    Tairux, a mi me pasaba lo mismo hasta que cai en la cuenta que para que tome la configuración hay que reiniciar el Postfix. Lo hice y pronto, estaba funcionando tranquilamente.

    Agradezco al autor del post estuve buscando algo asi durante horas hasta que di con esto.

    Saludos

    Me gusta

  4. Tairux dijo:

    Cara, yo reinicio la maquina, y tambien postfix, y nada, que puede ser, yo creo que debe ser que hay que instalar los certificados a debian, no solamente openssl, ademas creo que van otros paquetes, o configurar correctamente ssl.
    que crees tu?, Saluda
    Tairux

    Me gusta

  5. nihilanthlnxa dijo:

    Saludos.

    Una pregunta: Cuando lo mandaste (que se ve bien claro en el log), ¿revisaste el correo de destino y viste el campo «From»?

    Te pregunto porque yo hice eso y como quiera cambiaba la direccion de emisión.

    Me gusta

  6. sylon dijo:

    Buenas, gracias por el manual.

    Una pregunta, sabes como hacer para enmascarar la dirección de gmail?

    Es decir que cuando envies un mail salga el usuario y no la dirección de gmail?

    Si envio los mails desde consola:

    echo «hola» | mail -s «prueba» mail@mail.com

    como remitente sale el usuario del sistema

    En cambio si uso un cliente de correo sale la dirección de gmail que uso para el smarthost

    Gracias

    Me gusta

    1. El problema que estáis teniendo #nihilanthlnxa y #sylon es que gmail está cambiando la línea From: de vuestros mensajes y poniendo como remitente el usuario de gmail. Esto no tiene nada que ver con la configuración de postfix, es simplemente una precaución que tiene gmail ya que sólo pone como remitentes direcciones verificadas. Tenéis que entrar en la configuración de vuestra cuenta de gmail y añadir una nueva cuenta en «Enviar mensaje como» (verificará que tenéis acceso a la misma mediante un mensaje de correo).

      Modificaré la entrada para explicar esto, gracias por el comentario.

      Me gusta

      1. sylon dijo:

        Ok, gracias, pero para esto como debería tener configurado mi postfix para que me lleguen correos de fuera?, Obvieamente no me llega el código d everificación de gmail.

        Me gusta

  7. Zokeber dijo:

    Saludos,

    Parece ser que que smtp.gmail.com volvió a regresa a su antigua CA, dandome el siguiente error:

    certificate verification failed for smtp.gmail.com[74.125.93.111]:587] untrusted issuer /C=ZA/S
    T=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/emailAddress=premium-server@
    thawte.com

    Esto fue por que solo tenia la CA de Equifax Secure, así que tuve que agregar la de Thawte Consulting, al archivo /etc/postfix/CAcert.pem

    Me gusta

  8. Gracias!!!

    Llevaba tiempo intentando cerrar este punto y no lo conseguia, yo uso RHEL/CentOS y en mi caso los certificados se generan con un script en /etc/pki/tls/certs, simplemente con invocar ‘make’ te permite crear el que necesitas con ‘tus’ datos.
    Siguiendo tu tutorial, gmail acepta ese certificado y empieza a hacer relay.

    Gracias

    Saludos,

    JJ.

    Me gusta

  9. Alberto Guzman dijo:

    Que configuracion termina usando para el envio de correo
    * dominio.org:25
    * dominio.org:587
    *stmp.gmail.com:587

    me perdi en las configuraciones

    Me gusta

  10. J.B dijo:

    Hola a todos he seguido este manual pero encuentro parado en el punto de añadir la autoridad certificadora
    ya que la ruta que aparece en el manual ( cat /etc/ssl/certs/ ) no la tengo en mi sistema.

    Un saludo

    Me gusta

      1. J.B dijo:

        Me parece que el problema es que la distro es CentOS 5.5, porque al intentar instalar ese paquete me dice que no existe.

        yum install ca-certificates
        Loaded plugins: fastestmirror, priorities
        Loading mirror speeds from cached hostfile
        * addons: http://ftp.gui.uva.es
        * base: http://ftp.udl.es
        * extras: http://ftp.udl.es
        * rpmforge: fr2.rpmfind.net
        * updates: centos.crazyfrogs.org
        Setting up Install Process
        No package ca-certificates available.
        Nothing to do

        Me gusta

      2. J.B dijo:

        Si, lo he seguido y generado el certificado sin problema he reiniciado el servicio de postfix, pero no llegan los correos, asi que algo tengo que estar haciendo mal.

        Me gusta

      3. J.B dijo:

        Si ejecuto :

        echo .hola. | mail -s .prueba. micuenta@gmail.com

        El correo llega a micuenta pero no me llega a mi, entonces ya no sé si está fallando, algo de postfix , nagios o el reenvio de gmail.

        Me gusta

  11. Daniel G Zylberberg dijo:

    Revisa los logs de postfix (su cat /var/log/mail.log desde linux).
    Ahi te dice si se entregó o no, si gmail lo está rechazando y por que motivo, etc.

    También si Centos , el router y todo lo que tengas que realmente tengan los puertos abiertos.
    Hay una web que te escanea los puertos. pero te recomiendo que vayas a un cyber y pruebes si el server que tiene postfix levanta.
    Si no podes conectar, probá todo por separado desde telnet.
    chau

    Me gusta

    1. J.B dijo:

      Hola si ejecuto un echo .hola. | mail -s .prueba. micuenta@gmail.com en el maillog me parece lo siguiente:

      Oct 14 13:05:12 nagios sendmail[6043]: o9EB5B5H006043: from=root, size=49, class=0, nrcpts=1, msgid=, relay=root@localhost
      Oct 14 13:05:12 nagios postfix/smtpd[6044]: connect from nagios.miempresa.es[127.0.0.1]
      Oct 14 13:05:12 nagios postfix/smtpd[6044]: 31F4316DDD4: client=nagios.miempresa.es[127.0.0.1]
      Oct 14 13:05:12 nagios postfix/cleanup[6047]: 31F4316DDD4: message-id=
      Oct 14 13:05:12 nagios sendmail[6043]: o9EB5B5H006043: to=micuentadegmail@gmail.com, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:00, mailer=relay, pri=30049, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 31F4316DDD4)
      Oct 14 13:05:12 nagios postfix/qmgr[11795]: 31F4316DDD4: from=, size=533, nrcpt=1 (queue active)
      Oct 14 13:05:12 nagios postfix/smtpd[6044]: disconnect from nagios.miempresa.es[127.0.0.1]
      Oct 14 13:05:15 nagios postfix/smtp[6048]: 31F4316DDD4: to=, relay=smtp.gmail.com[209.85.229.109]:587, delay=3.5, delays=0.06/0.21/1.6/1.7, dsn=2.0.0, status=sent (250 2.0.0 OK 1287054272 h29sm9300772wbc.15)
      Oct 14 13:05:15 nagios postfix/qmgr[11795]: 31F4316DDD4: removed

      Pero mi servidor no tiene la ip 127.0.0.1

      Me gusta

  12. Daniel G Zylberberg dijo:

    127.0.0.1 es lo mismo que localhost, o sea tu maquina.

    fijate que si haces ping localhost te sale:
    silver@server:~$ ping localhost
    PING localhost (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.050 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.051 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.051 ms

    En tu log me llama la atencion 2 cosas, que dice 31F4316DDD4: to=, o sea que el destinatario está vacio.
    Lo mismo para el from= que tambien viene vacio, cuando ahi, debería decir tu direccion.

    Fijate si haciendo esto te sirve de algo:
    apt-get install mailutils

    echo testing | mail -s Bla tucuenta@tuempresa.com (en vez de usar con el dominio de gmail).

    Me gusta

    1. J.B dijo:

      Si hago un ping al localhost me responde, no he podido instalar mailutils ya que estoy con CentOS, y despues de realizar echo testing, no me hado nungun error al ejecutarlo pero no me hallegado ningun mail.

      Me gusta

  13. Fernando dijo:

    hola muy buen manual, no lo he llevado a cabo, sin embargo quería saber si es el motivo así como lo explica tu manual que no se envíen correos a dominios externos, sin embargo si puedo recibir de cualquier domino externo..

    Me gusta

    1. Exacto Fernando, es como tú dices. La recepción de correo depende más de una configuración adecuada del servidor DNS y quizás del cortafuegos. El problema es el envío y aquí se explica una forma de hacerlo desde una dirección IP dinámica.

      Me gusta

  14. Anonymous dijo:

    HELP ME…!!!

    Cuando digito la linea:
    cat /etc/ssl/certs/Equifax_Secure_CA.pem >> /etc/postfix/cacert.pem
    cat: /etc/ssl/certs/Equifax_Secure_CA.pem: No such file or directory

    Me sale ese error No such file or directory, he mandado a hacer un ls /etc/ssl/certs/*.pem y me muestra el siguiente resultado:

    ls: cannot access *.pem: No such file or directory

    Me gusta

  15. Siguiendo el tutorial tuve el error:
    530 5.7.0 Must issue a STARTTLS command first

    El correcto funcionamiento lo obtuve también agregando un archivo /etc/postfix/tls_policy con el exacto inicio del realyhost y este contenido:
    [smtp.gmail.com]:587 encrypt

    En resúmen siguiendo esta explicación: http://askubuntu.com/questions/228938/how-can-i-configure-postfix-to-send-all-email-through-my-gmail-account

    Gracias por el esfuerzo de compartir esto y mantener actualizado tu artículo que es una muy buena y clara referencia.

    Me gusta

  16. Claudia dijo:

    Segui tus onsejos paso a paso pero al ejecutar cat /etc/ssl/certs/Equifax_Secure_CA.pem >> /etc/postfix/cacert.pem en root ubuntu me vota PERMISSION DENIED como soluciono ello

    Me gusta

Deja un comentario