Publica tu how-to

Dinos como hacer lo que sabes hacer, mándanos un email a wdonet@gmail.com y lo publicamos (dos días máximo) o si te interesa unirte al equipo de redactores, también háznoslo saber por correo.

Servidor de correo personal con postfix - MTA

Esta es la parte 1 de una serie de posts que vienen de 'Servidor de correo personal con postfix'.

Para configurar el servidor, vamos a asumir que, teniendo una dirección IP dinámica, se cuenta con un nombre de dominio dinámico, por ejemplo como el que ofrece DynDNS.

Recordar que el MTA, Mail Transfer Agent es el encargado de mandar los mensajes de correo que salgan del servidor, así como de recibir en primer instancia los mismos para entregárselos al MDA que los debe dejar en los buzones correctos.

Como MTA utilizaremos Postfix, un MTA bastante popular hoy en día en servidores GNU/Linux.
Cabe decir que si no se tiene MTA, el comando mail nativo de GNU/Linux permite enviar emails únicamente a los usuarios de la misma máquina que funge como servidor. Fuera de eso no se puede enviar ningún tipo de correo (ni en la misma LAN ni por internet a otros dominios de correo): se necesita configurar el MTA (además de que para usar solamente mail este tutorial pierde todo su sentido...)

Instalación
El primer paso será instalar Postfix.
Se puede descargar el código fuente del sitio oficial, o se puede instalar la versión que venga en la distribución GNU/Linux que se esté utilizando.

En el caso de Debian Lenny, se debe instalar el paquete llamado postfix

En esta distribución, esto instala por default también libsasl2-2, paquete necesario para la autenticación con gmail que se pretende instalar.

En otras palabras, la instalación requiere de instalar Postfix con soporte para SASL.

Además, para los certificados públicos de autenticación, se requerirá instalar OpenSSL (paquete openssl), que incluya los certificados Thawte y Equifax. Estos se encuentran en el paquete ca-certificates.


Configuración
El siguiente paso es configurar el software.

Postfix se configura en los archivos del directorio /etc/postfix (o al menos ahí es por default en Debian)

  • main.cf
Este archivo contiene las configuraciones principales de Postfix.
Las configuraciones principales son:
#poner aqui el nombre de tu dominio
myorigin = nombredominio.homelinux.net

#autenticación para Gmail
smtp_use_tls=yes
smtp_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

#mas abajo explicamos como generar el archivo cacert.pem
smtp_tls_CAfile = /etc/postfix/cacert.pem

#SASL para autenticación con Gmail
smtp_sasl_auth_enable = yes


#mas abajo explicamos sobre el archivo passwd
smtp_sasl_password_maps = hash:/etc/postfix/sasl/passwd

smtp_sasl_security_options = noanonymous

#nombre del dominio, con que coincida con myorigin basta
mydomain = $myorigin
 
#el nombre del host seria el nombre de la maquina servidor
#que tenga tu servidor cuando instalaste GNU/Linux y el
#nombre de tu dominio
myhostname = nombremaquinaservidor.$mydomain
 
#con que nombres se identifica tu destino de correo local
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost
 
#quienes pueden enviar correos usando este servidor. es
#MUY importante ajustar esta opcion a lo que se quiera. Yo
#lo tengo asi (valor 'host') para solo enviar desde mi
#maquina servidor. El valor 'subnet' (default) permite que
#maquinas en la misma subred del servidor envien correos
#desde el server. El valor 'class' permite que el server
#envie correos desde cualquier máquina en la misma clase
#de red (A,B,C) en que se esté - con una máquina con IP

#dinámica proporcionada por un ISP provocaría que todas
#las máquinas de la subred del ISP envíen correos desde el
#servidor, MUCHO CUIDADO CON ESTO!
mynetworks_style = host

#si se quiere que otras maquinas puedan enviar correos
#desde este servidor, tambien se puede establecer la
#opcion mynetworks a un rango de IPs (en notación CIDR).
#MUCHO CUIDADO con esto, no dejarlo abierto a todo el
#internet, o los spammers abusarán de tu servidor para
#enviar correos desde aquí. Esto además seguro que
#provocará la cancelación de tu servicio con tu ISP...
 
#este es importante: con el se le dice a postfix que se
#conecte al relay de gmail para enviar correos
relayhost = [smtp.gmail.com]:587

#que tipo de mensajes loggeara postfix. Yo lo deje asi por
#hacer pruebas, pero no tiene que ser tan detallado
notify_classes = 2bounce, delay, policy, protocol, resource, software

#desde que interfaces de red de tu maquina se puede enviar
#correos...
inet_interfaces = all

#en donde estaran los alias para usar en las direcciones
#de correo usuario@dominio (se explica mas adelante)
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

#postfix debe saber como acceder al MDA. En este caso
#usamos procmail...
mailbox_command = procmail -a "$EXTENSION"
 
#otras opciones...
mailbox_size_limit = 0
recipient_delimiter = +
html_directory = /usr/share/doc/postfix/html

#con esta opcion le decimos a Postfix que queremos que los
#mails se reciban en un directorio Mail dentro del
#directorio $HOME del usuario... podriamos especificar un
#archivo estilo /var/mail (sin / al final) para que
#coloque todos los emails en un solo archivo. Pero para
#configurar correcta y facilmente procmail y sobre todo
#spambayes, y para tener mejor control, va a ir todo en un
#directorio especificado aqui...

home_mailbox = Mail/

  • sasl/passwd
En este archivo se colocará la autenticación al relay (Gmail) que usará nuestro servidor:
[smtp.gmail.com]:587    unacuenta@gmail.com:unacontraseña
Es importante proteger este archivo correctamente, cambiando sus permisos:
$ chmod 600 /etc/postfix/sasl/passwd
Por último, hay que convertir el archivo a un formato adecuado para Postfix, para lo cual existe la utilidad postmap:
$ postmap /etc/postfix/sasl/passwd

  • cacert.pem
Para autenticarse correctamente con Gmail, además del usuario y password, es importante utilizar un certificado público de seguridad válido. Según la fuente en que me basé, son necesarios los certificados de Thawte y/o Equifax, que se colocan en este archivo de la siguiente manera:
$ cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem >> /etc/postfix/cacert.pem
$ cat /etc/ssl/certs/Equifax_Secure_CA.pem >> /etc/postfix/cacert.pem

Obviamente, es importante localizar los archivos origen *.pem en la instalación que se tenga.

  • /etc/aliases
Este archivo contiene los alias que Postfix reconocerá para sus usuarios especiales, de forma que sepa a qué buzón real redireccionar los mensajes que vayan a estos usuarios... En este archivo colocar entonces:
root: nombreusuario
spam: nombreusuario
ham:  nombreusuario

El primer alias es para los correos que se dirijan a la cuenta root del sistema. Los otros dos se usarán para spambayes. Podría haber otros alias también, como postmaster, entre otros. Lo mejor por ahora es no moverlos y dejarlos tal como estén.

Por último hay que dejar el archivo de alias en un formato que Postfix pueda usar:
$ postalias aliases

  • firewall
Y para terminar, no hay que olvidar abrir los puertos pertinentes para que Postfix se pueda comunicar con otros servidores de correo. En particular, el puerto a abrir es el TCP 25, el puerto por default del protocolo SMTP.

Aquí cabe hacer una aclaración. Mi ISP es Prodigy Infinitum, y luego de unos quebraderos de cabeza, me di cuenta utilizando nmap que el puerto 25 lo podía tener abierto en mi servidor, pero visto desde afuera parecía como si estuviera cerrado (con lo que podría tener un servidor de correo para mi LAN, pero no más). Investigando supe que Telmex, la compañía que lleva el servicio de Prodigy Infinitum en México, cierra por defecto a sus usuarios de domicilio particular el puerto 25, para evitar abusos y spam y demás. Lo que tuve que hacer (quien sabe si tu lo tengas que hacer también, dependerá de tus condiciones) fue interactuar con ellos, así que tuve que salirme de mi segura consola dentro de mi servidor, llamar por teléfono a Telmex y pedir que me abrieran el puerto 25. Según lo que estipula la medida es posible hacer esto para que se abra el puerto 25. Aclaré que sería para propósitos de 'mi trabajo' y de uso particular exclusivamente. Prometiendo no solamente no mandar spam ni abusar del servicio, sino también configurar correctamente mi máquina (jamás dije que era un servidor, no fueran a sospechar equivocadamente que haría otra cosa) para que nadie abusara del servicio (recuerda la configuración my_networks_style y my_networks en main.cf). Y está claro que no abuso del servicio... el sistema de correo electrónico es muy quisquilloso (y con razón), y es capaz de detectar la fuente de spam fácilmente, etiquetar a los servidores que son fuente del mismo, y si se reporta esto a Telmex, bien podría cerrarme el puerto, o cancelarme el servicio! incluso si no soy yo la fuente del spam, bastará que lo configure mal para provocar esto...

  • Gmail
Como parte de la configuración del servidor, puesto que se va a usar Gmail como el relay para enviar correos, es necesario configurar este servicio para poder obtener un servidor completo. A lo que me refiero con esto es que, ya configurado Postfix, el servidor, en teoría, ya puede enviar correos (cosa que se probará un poco más adelante), pero aún así los correos irían con el remitente de la cuenta de Gmail usada como relay. Lo ideal sería que aparecieran los correos como si vinieran del servidor (con el nombre de usuario y dominio del mismo), no de Gmail.

Para ello, se tiene que acceder a la cuenta de Gmail, acceder a Configuración y ahí a la pestaña de Cuentas e Importación. Agregar la cuenta del servidor y realizar el proceso de verificación, que consiste en introducir un código de verificación que debe llegar al correo indicado... ups, aún falta configurar el correo entrante para hacer esto. Volveremos a ello hasta el final, pero más valía anotarlo aquí para saber que aún es parte de la configuración del MTA y que queda pendiente a que podamos recibir correos...


Uso del MTA

Postfix ya puede usarse, y de hecho vamos a probarlo en breve.

Por ahora resumiremos los comandos de Postfix más importantes.

En primera instancia, una vez configurado todo, debe reiniciarse el servicio de Postfix, lo cual puede hacerse con
$ /etc/init.d/postfix restart
(o donde quiera que residan los scripts que dan inicio a los servicios del sistema). Pero en vez de ello, Postfix también cuenta con una opción que permite reinciar  y cargar las configuraciones de nueva cuenta, sin necesidad de reiniciar el servicio del sistema:
$ postfix reload
Si existen correos en cola de espera para ser enviados, puede pedírsele a Postfix que los envíe, vaciando la cola, con:
$ postfix flush
Para ver la mencionada cola de salida de correos se utiliza el comando
$ mailq
Así mismo, es importante saber en donde se almacenan los logs del sistema. Postfix genera por default tres archivos de históricos en /var/log:

mail.error : con los errores que hubiera encontrado
mail.warn : con las advertencias que hubieran surgido
mail.info : con el resto de información de logging que se hubiera presentado


Prueba del MTA
Para probar Postfix, podemos hacer uso, por ahora, del comando mail de GNU/Linux.

Previamente debemos crear el subdirectorio $HOME/Mail (o donde quiera que lo hayamos configurado en el archivo main.cf de Postfix).

Hecho eso usamos:
$ mail direcciondestino@dominio.com
Con direcciondestino alguna cuenta de correo de prueba fuera del servidor.

Luego ponemos el subject, INTRO, y escribimos el correo. Al terminar tecleamos ^D (Ctrl + D) y nada en el campo Cc: y el correo debería de llegar a la dirección especificada.

Hay que monitorear los logs para checar y corregir cualquier problema que pudiera surgir.

Claro está, si no se ha configurado Gmail, el correo parecerá venir de parte de la cuenta de Gmail.

Otra forma de probar el servidor es mediante una sesión en Telnet, sabiendo previamente como funciona el protocolo SMTP...

Y obviamente, aún queda configurar la recepción de correos, para poder recibir respuesta...

Continuamos entonces con el MDA...

16 comentarios:

  1. APORTE ESPECTACULAR NO SE PRO QUE NADIE COMENTO ESTO, ESTA DE LUJO MUCHAS GRACIAS AMIGO DE VERDAD PARA 10 ESTRELLAS

    ResponderEliminar
  2. Me acabas de salvar la vida. Gracias por el aporte.

    ResponderEliminar
  3. muchisimas gracias por los agradecimientos, sobre todo lo que me da gusto es saber que supe entender bien el tema, redactarlo como se debe, y explicarlo adecuadamente para compartir un pedazo de conocimiento que, de todas formas, no genero yo, sino la comunidad en general ;)

    saludos!

    ResponderEliminar
  4. Oyes, una pregunta, en la linea

    myorigin = nombredominio.homelinux.net

    aun no entiendo de donde saco ese dato, mi intención es instalar postfix en mi maquina con conexión a internet, mi ISP es Telmex(aca en México).

    Alguna idea?

    ResponderEliminar
  5. es el nombre de tu host, de tu maquina donde instalaras postfix. El nombre es el del dominio.

    Depende donde instalaras postfix, podria ser que el servidor ya tenga nombre y no tengas que hacer mas nada. Por lo que entiendo es una maquina de tu casa, entonces necesitas antes que nada asignarle un nombre de dominio a tu direccion IP y hacer que el ruteador de Telmex asigne su IP a la de tu maquina, para mas informacion checate estos how-tos que yo mismo publique aqui: http://micro-howto.blogspot.mx/2009/03/servidor-linux-desde-tu-hogar-en-tres.html

    ResponderEliminar
  6. Estoy parado en la parte de los certificados, estoy trabajando con centos

    ResponderEliminar
  7. CentOS también tiene un paquete llamado ca-certificates (que puedes instalar con yum), ya lo has visto? contiene algún certificado que te sirva para esto?

    ResponderEliminar
  8. Estimado Javier, no quiero salir del tema, pero te comento. Yo tengo varios servidores linux con CentOS 6.5 y quiero que cada servidor envíe un correo con el comando mail a una cuenta (admin@dominio.com) de un servidor Zimbra que está en la misma red. Lo he intentado y en los log del zimbra veo un mensaje: Domain not found. Alguna ayuda.....!!!!!

    ResponderEliminar
  9. Estimado, gracias por responder. El zimbra usa sendmail, si es que no me equivoco en la salida: alternatives --config mta.

    Los Centos 6 creo que por default vienen con postfix como mta, pero tambien he instalado el sendmail y no logro enviar un correo de alerta al zimbra que esta en mi red. Gracias de antemano por la ayuda. :)

    ResponderEliminar
  10. a ver, yo lo que haría sería depurar cada parte del sistema para ver donde está el problema. Me dices que los logs de Zimbra te dan un mensaje de error, pero que no eran los servidores CentOS los que iban a enviar los correos? Luego entonces, si los servidores CentOS si estan enviando los correos (ya estas seguro de eso?), el problema no es el MTA de Zimbra, sino quien recibe los correos. Podría ser una configuración donde zimbra, al recibir un correo, lo este reenviando a algun dominio no conocido? Pero si el correo se debe recibir en el mismo servidor zimbra, supongo que debería ser algo como localhost. Checa esas configuraciones!

    ResponderEliminar
  11. Gracias Javier, mira he podido probar que los Server CentOS si envían el correo, porque a una cuenta @gmail.com lo envían y llega normal.
    Por ejem. el hostname de uno de los servers es srv01.empresa.com y cuando envío un correo por consola: mail -s Prueba destinatario1@gmail.com a la cuenta de Gmail llega como remitente: root@srv01.empresa.com
    Lo mismo quiero hacer pero hacia un servidor Zimbra que tengo en mi red (que también tiene dominio público), y en los logs de zimbra como en el mismo server Centos me sale: Domain not found, que es lo único diferente a los logs de correos que si tienen llegada.
    He configurado el /etc/hosts en ambos lados pero sin exito. Gracias,

    ResponderEliminar
  12. pues yo me iría por partes.

    1) desde CentOS puedes pingear el server de zimbra? y al reves? Usando los mismos nombres de dominio o direccion IP que estes usando en el correo. (Alternativa, haz la prueba con puras direcciones IP en lugar de nombres de dominio! que pasa ahi?)
    2) el firewall de zimbra esta correctamente configurado?
    2b) puedes recibir mails desde otro lugar que no sea CentOS, en zimbra?
    2c) ...o al menos desde zimbra hacia zimbra mismo?
    3) la configuracion del MTA de zimbra esta correctamente configurado para recibir emails y depositarlos en un buzon valido?

    y asi...

    ResponderEliminar
  13. OK Javier, revisé todo eso.
    1. Hago ping por ip y por nombre.
    2. El firewall está abajo.
    2b. El Zimbra funciona bien, llegan correos de cualquier dominio, del mismo zimbra, tengo 600 cuentas en ese server en POP, IMAP y Web.
    2c. También desde cuentas del mismo zimbra.
    3. El MTA está configurado para recibir y depositar Email a las cuentas.
    Es extraño...cuando envío a gmail llega bien, cuando envío a hotmail llega aunque sea como no deseado y no llega a mi server zimbra:

    El log que sale srv01
    ===============
    postfix/smtpd[23287]: NOQUEUE: reject: RCPT from unknown[192.168.1.9]: 450 4.1.8 : Sender address rejected: Domain not found; from= to= proto=SMTP helo=

    El log que sale en zimbra
    ===================
    postfix/smtp[1430]: 3B1774033D: to=, relay=mail.domzimbra.com[192.168.1.4]:25, delay=0.06, delays=0.02/0.01/0.01/0.02, dsn=4.1.8, status=deferred (host mail.domzimbra.com[192.168.1.4] said: 450 4.1.8 : Sender address rejected: Domain not found (in reply to RCPT TO command))

    ResponderEliminar
  14. ok, investigando un poco en google, encontre esto: http://www.howtoforge.com/forums/showthread.php?t=42664

    por lo que entiendo el error te aparece porque el postfix no esta resolviendo correctamente el dominio desde donde estas enviando. Como dije, revisa las configuraciones

    ResponderEliminar
  15. Estimado Javier, gracias por todo, en verdad muchas gracias. Lo solucioné, tenía activado postfix_recipient_restrictions.cf, agregué la IP de los servidores centos y llegan los correos sin ningún problema. El link que me pasastes me dió la luz. Graciaassssssssssssss

    ResponderEliminar

Que opinas sobre esta publicación?