martes, febrero 17, 2015

Postfix - Configurando un servidor de correo en debian / raspberry pi

La mayor parte de las instrucciones de este artículo están extraídas del magnífico artículo de Sam Hobbs y que forma parte de una serie más completa de instalar un servidor de correo completo con servidor web etc.

Requerimientos

En mi caso sólo pretendo configurar mi Rasberry Pi para que sea capaz de enviar correos electrónicos y recibir algunos correos electrónicos en las cuentas de usuario o reenviarlos a cuentas exteriores. ¿no me explico bien? A ver si así:
  • Quiero poder enviar correos electrónicos desde las cuentas de usuario (como "pi") y desde algunas programas como el fail2ban o el php.
  • Los correos que se reciban para ciertos usuarios (como "pi") estarán disponibles al loguearse por ssh.
  • Quiero que existan ciertas direcciones virtuales (como gonzalo@zoogon.net) que cuando reciban correo lo reenvíen directamente a mi cuenta de gmail.
  • Las cuentas de correo NO serán accesibles por pop3 ni imap, para eso hace falta más software. Accederé directamente desde la línea de comandos.
  • Quiero que la instalación esté protegida para que nadie pueda hacer envíos de correo desde este servidor.

Prerrequisitos

Debes disponer de un dominio propio. En mi caso lo he contratado con NameCheap y las pantallas de configuración que mostraré serán las de ellos. Otros servicios de dominio deberían servirte igual mientras te permitan crear subdominios y especificar si los registros son tipo A, txt y registros MX (date una vuelta por este artículo si no sabes de lo que estoy hablando)

Lo normal sería que tu Raspberry Pi esté configurada con una ip fija detrás de un router. Asegúrate de que tienes redirigido el puerto 25 del router a la RPi. Si además tu ip externa es dinámica (lo que sería normal) puedes utilizar el cliente ddclient para mantener tus registros DNS actualizados (ejemplo con namecheap y raspberry pi)

Con sudo hostname nombre-maquina.dominio.com establece el nombre de tu máquina. (debe ser completo o fqn) Deberías verlo actualizado en /etc/hostname

$ cat /etc/hostname 
rpi.midominio.net

Preparando los dominios

En tu registrador de DNS tiene que ofrecerte la posibilidad de configurar a qué servidores mail tiene que vincular los correo midominio.net. En mi configuración puedes ver que tengo definidos dos subdominios rpi y mail del tipo A (que corresponden con una dirección). En realidad, para mi caso ambos dominios están vinculados a la misma máquina pero lo he preparado por si quisiera instalar un segundo servidor de correo para backup.

El registro de subdominio @ con los valores de v=spf1 mx a ~all del tipo TXT Record es importante porque muchos servidores de correo no reconocerán el nuestro como válido si no lo incluimos.

En la parte de definir los servidores de correo lo que estoy indicando con la @ es que para cualquier correo que llegue a mis direcciones debe redirigir el mensaje a mail.midominio.net y en caso de no encontrarlo lo debe hacer  rpi.midominio.net. El valor MX PREF indica la prioridad a la hora de seleccionarlos.

En el artículo de Sam sobre configurar correctamente un DNS tienes unas buenas explicaciones de qué significa cada cosa.

Instalando y configurando postfix

Voy a ir rápido en muchas de las instrucciones.  Te recomiendo que le des un vistazo al artículo que menciono al principio del post si quieres profundizar. La única diferencia es que yo no he llegado a instalar dovecot para acceder por pop3 e imap.

Comienza instalando postfix y las herramientas de mail

$sudo apt-get update && sudo apt-get install postfix mailutils

Te preguntará que tipo de servicio deseas instalar, le decimos que "sitio en internet". Si hemos configurado el hostname correctamente lo cogerá. Tendrás algunos warnings referentes a ipv6, no te preocupes enseguida lo solucionaremos.

Editar /etc/postfix/main.cf y añade lo siguiente al final del archivo

#usar sólo el protoclo ipv4, evitamos mensajes de warning
inet_protocols = ipv4

#establecemos restricciones para que no cualquiera se pueda 
#conectar a nuestra máquina y hacer envíos a direcciones 
#de correo externas
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination

#establecemos unas restricciones en el saludo a la máquina
smtpd_helo_required = yes
smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname
        check_helo_access hash:/etc/postfix/helo_access

virtual_alias_maps = hash:/etc/postfix/virtual

Puedes ver referencias a dos archivos que vamos a crear. El primero /etc/postfix/helo_access sirve para spammers que pretendan hacerse pasar por nuestras máquinas.  Debería contener los dominios que tenemos registrados para el correo, en mi caso:

midominio.net          REJECT          Get lost - you're lying about who you are
mail.midominio.net     REJECT          Get lost - you're lying about who you are
rpi.midominio.net      REJECT          Get lost - you're lying about who you are

El segundo contendrá los mapeos de direcciones virtuales que queremos introducir

webadmin@midominio.net mi-correo-en@gmail.com
rpi@midominio.net       pi

Esto significa que cualquier correo que llegue a webadmin@midominio.net saldrá rebotado a mi cuenta de gmail. Cualquier correo que llegue a nombre de rpi@midominio.net se dirigirá a la bandeja de entrada del usuario "pi". Cualquier otro correo entrante será rechazado.

Ha llegado el momento de arrancar definitivamente postfix. Mapeamos ambos archivo virtuales y reiniciamos el servicio.

$sudo postmap /etc/postfix/virtual
$sudo postmap /etc/postfix/helo_access
$sudo service postfix restart

No deberías ver ningún mensaje de error.

Probando el servicio de envío

Antes de nada saber dónde debemos buscar los mensajes de error y log. Prepárate para lanzar los siguientes comandos 

$cat /var/log/mail.log
$cat /var/log/mail.err

En esos logs encontramos la información de los problemas así como los eventos que suceden en postfix: intentos de conexión, correos enviados y recibidos, etc. Estos archivos rotan frecuentemente y podemos verlos ampliados con mail.log.1, mail.log.2...

Empezamos por lo básico e intentamos enviar directamente un mensaje a nuestra cuenta de gmail. Cada línea se introduce por separado:

$ mail mi-cuenta@gmail.com
Cc: 
Subject: mensaje de prueba de postfix
estas son las líneas de contenido del mensaje para acabarlo y enviar pulsa Ctrl+D
$

El comando acaba sin que aparentemente pase nada pero internamente mail se configura con postfix que inserta el mensaje en su cola de salida e inicia el proceso de comunicación con los servidores de gmail para enviar el mensaje. Poco segundos después deberías ver el mensaje en tu bandeja de entrada aunque es muy probable que haya ido a parar a tu bandeja de spam, si es así ábrelo e indica que no es spam para que acepte futuros mensajes.

Puedes comprobar el proceso de comunicación en el mail.log y las últimas líneas deberían ser algo así.

Feb 17 18:27:21 rpi postfix/pickup[7381]: C64EB42481: uid=1000 from=
Feb 17 18:27:21 rpi postfix/cleanup[7395]: C64EB42481: message-id=<20150217172721 .c64eb42481="" rpi.midominio.net="">
Feb 17 18:27:21 rpi postfix/qmgr[7382]: C64EB42481: from=, size=432, nrcpt=1 (queue active)
Feb 17 18:27:22 rpi postfix/smtp[7397]: C64EB42481: to=, relay=gmail-smtp-in.l.google.com[74.125.140.27]:25, delay=0.89, delays=0.18/0.06/0.42/0.22, dsn=2.0.0, status=sent (250 2.0.0 OK 1424194042 ca16si30265556wib.105 - gsmtp)
Feb 17 18:27:22 rpi postfix/qmgr[7382]: C64EB42481: removed
   
Si el mensaje parece que se ha enviado correctamente pero no llega deberías comprobar el mail.log. A mi me ha llegado a pasar que algún servidor de correo tenía mi IP (dinámica) marcada como generadora de spam. Bastón con acceder al mail.log, comprobar por qué me habían rechazado el correo y acceder a un formulario web para solicitar que la volvieran a habilitar como aceptable.

Probando la recepción de correo
Ahora tocaría recorrer el camino inverso. Hay una dirección de correo que corresponde a un usuario de mi sistema pi@rpi.midominio.net. Desde gmail escribo un mensaje a la misma y uno segundos después acceso por ssh de nuevo a la rpi para comprobar que ha llegado y...

$ ssh pi@rpi.midominio.net
Linux rpi.midominio.net 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l
[...]
You have new mail.
pi@rpi ~ $

Lo puedes leer usando el mismo comando mail y pulsando 1

$ mail
"/var/mail/pi": 1 mensaje 1 nuevo
>N   1 Gonzalo Cao Cabeza mar feb 17 18:41  44/1923  mensaje de vuelta
? 1
Return-Path:
X-Original-To: pi@rpi.midominio.net
Delivered-To: pi@rpi.midominio.net
Received: from mail-wg0-f51.google.com (mail-wg0-f51.google.com [74.125.82.51])
by rpi.midominio.net (Postfix) with ESMTPS id ABA6342480
for ; Tue, 17 Feb 2015 18:41:02 +0100 (CET)
Received: by mail-wg0-f51.google.com with SMTP id y19so37464344wgg.10
        for ; Tue, 17 Feb 
[...]

Si examinas el mail.log encontraras unas líneas similares a cuando enviaste el correo.

Nos quedan probar las direcciones que hemos virtualizado. Sólo sirven para recibir correo: en el caso de pi@midominio.net la deberíamos recibir en la misma cuenta del caso anterior y para la cuenta webadmin@midominio.net debería recibirla directamente en mi cuenta de correo de gmail.

Asegurando nuestro servidor

Como ya tengo instalado fail2ban lo único que he tenido que hacer es ampliar los jail activados. Edito el /etc/fail2ban/jail.conf y realizo el siguiente cambio

[postfix]
enabled  = true
port     = smtp,ssmtp
filter   = postfix
logpath  = /var/log/mail.log

Con un simple comando podemos observar si fail2ban ha detectado algún comportamiento extraño.

$ sudo fail2ban-client status postfix
Status for the jail: postfix
|- filter
|  |- File list: /var/log/mail.log 
|  |- Currently failed: 0
|  `- Total failed: 0
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned: 0


1 comentario:

  1. Hola,

    el tutorial ha funcionado perfecto! muchas gracias!

    Una pregunta:

    Los mail me entran a mi gmail como spam. Supongo pq detecta que viene de un relay. Hay alguna manera de solucionarlo?

    graciasssss!!!!

    ResponderEliminar