Mostrando entradas con la etiqueta postfix. Mostrar todas las entradas
Mostrando entradas con la etiqueta postfix. Mostrar todas las entradas

Manejo de colas de correo en Postfix

Postfix es un excelente servidor de correo del que ya hemos hablado en este blog en numerosas ocasiones. Además de poder trabajar por su cuenta, también es el motor en Zimbra, del que también se han comentado cosas en numerosas ocasiones.
Como servidor de correo, tiene determinados comandos que pueden resultar muy útiles a la hora de administrar las colas de correo y los mensajes.
  • postqueue
    Es el comando que nos permite administrar directamente la cola de mensajes.
    • -f
      Intenta enviar todos los mensajes que están en las colas.
    • -p
      Muestra todos los mensajes que están en la cola.
    • -s domain
      Intenta enviar todos los mensajes que salgan del 'domain' especificado.
  • postfix
    • flush
      Intenta enviar todos los mensajes del servidor.
    • start | stop | abort
      Arranca, para o para forzosamente el servicio postfix.
    • reload
      Recarga la configuración del servidor de correo.
    • status
      Muestra el estado actual del servicio.
  • postsuper
    • -d ALL
      Elimina todos los mensajes de la cola de correo.
    • -d ALL deferred
      Elimina todos los mensajes 'rebotados' que tenga el servidor.
  • postcat -q ID
    Visualiza el correo con el ID especificado.
  • qshape
    Muestra los correos con forma de árbol.
Por supuesto, estos comandos, como casi todos los comandos GNU/Linux se pueden concatenar y crear combinaciones que nos ayuden y faciliten la administración del servidor de correo.
  • Número de mensajes en la cola de correo
    shell> postqueue -p | tail -n 1 | cut -d ' ' -f5
    
  • Borra todos los mensajes recibidos de un destino
    shell> mailq | grep '^[A-Z0-9]' | grep @domain | \
           cut -f1 -d ' ' | tr -d \* | \
           postsuper -d
    
Leer más

IP de salida en Postfix

Seguimos hablando de Postfix y de variables de configuración que, según qué instalación, pueden ser interesantes. Hoy vamos a ver cómo indicarle al servidor de correo la IP para el correo de salida que debe emplear (variable smtp_bind_address). Por defecto, dicha variable no se suele configurar y es el propio servicio el que se encarga de salir por el interfaz que mejor le convenga. En caso de que teniendo un servidor con más de una IP de salida, nos interese que el correo salga por una concreta, simplemente con indicarlo en el fichero de configuración (/etc/postfix/main.cf) nos llegaría.
smtp_bind_address = 192.168.0.2
Una vez reiniciado Postfix, la salida de correos se producirá por dicha IP y, por lo tanto, por el interfaz en el que esté configurada.
Leer más

Reescribiendo direcciones de correo

Postfix, quizás el servidor de correo más extendido en la actualidad tiene miles de facilities interesantes. Una de ellas, y de la que vamos a hablar hoy es la reescritura de la dirección de correo (address rewriting). Esta funcionalidad sirve, por ejemplo, para que todos los correos internos del servidor, lleven como origen una dirección diferente a la real, pudiendo así facilitar una pregunta al administrador en caso de que el correo la generase.
Para poder poner a funcionar las reglas de reescritura, lo primero es crear el fichero /etc/postfix/generic. Este fichero, que será una tabla de mapeos admite expresiones regulares. Por ejemplo,
/^(.*)@(.*).localdomain$/  dudas@local.net
En este caso, todos los correos que salgan del servidor local (fqdn *.localdomain) se enviará con la dirección de origen dudas@local.net. Si alguno de los receptores quiere responder, el mail será entregado a una dirección pública conocida y no a un servidor de la red local.
Por supuesto, tras configurar el fichero generic hay que hacer uso del comando postmap, como para casi todos los ficheros externos de configuración de postfix.
shell> postmap /etc/postfix/generic
Una vez lo tengamos, simplemente lo añadimos a la configuración general (/etc/postfix/main.cf).
smtp_generic_maps = regexp:/etc/postfix/generic
Y reiniciamos el servicio.

Nota

Cada vez que modifiquemos el fichero generic tendremos que volver a crear la tabla de mapeos (postmap) y reiniciar el servicio.
Leer más

Seguridad en postfix: Deshabilitar VRFY

Hoy es uno de esos días en los que te dedicas a leer documentación y manual de servicios y descubres, como no podía ser de otra forma, parámetros cuando menos interesantes y que suelen ser olvidados. Este olvido puede traer, como veréis, problemas de revelación de datos que debemos de evitar. Hablamos, concretamente del parámetro verify de postfix. Este parámetro sirve para lo siguiente,
shell> telnet local.com 25
Trying 192.168.0.25...
Connected to mail.com.
Escape character is '^]'.
220 mail.local.com ESMTP Postfix
vrfy javier@local.com
252 2.0.0 javier@local.com
vrfy empty@local.com
550 5.1.1 empty@local.com: Recipient address rejected: local.com
exit

Creo que tras ver el ejemplo, ya os imagináis para qué sirve el comando vrfy de postfix. Sí, efectivamente, para poder averiguar si un usuario existe en el servidor o no. Como puedes comprender, crear un pequeño script que se conecte a un servidor de correo de un dominio y liste las cuentas de correo que éste tiene, muy complicado no resulta.
Por lo tanto, si queremos evitar que alguien se nos conecte al servidor y haga un descubrimiento de las cuentas de correo en él configuradas, debemos de ir al fichero de configuración de postfix (/etc/postfix/main.cf) y deshabilitar el uso del comando vrfy.
disable_vrfy_command = yes
Tras incluir la línea aquí arriba citada y reiniciar el servicio, si intentamos la conexión ya se nos advertirá de que no es posible.
shell> telnet local.com 25
Trying 192.168.0.25...
Connected to local.com.
Escape character is '^]'.
220 mail.local.com ESMTP Postfix
vrfy javier@local.com
252 2.5.2 Cannot VRFY user; try RCPT to attempt delivery (or try finger)
expn root
502 5.7.0 Sorry, we do not allow this operation
Leer más

Postfix con restricción de dominios salientes

Aunque en la mayoría de los casos cuando montamos un servidor de correo es para que éste pueda enviar correos a todo el mundo, es cierto que nunca está demás delimitar en ciertos equipos aquellos dominios a los que mandar información.
Dicho de otra forma, si estás manejando equipos, pongámosle en una DMZ, y quieres que todos ellos envíen mails a cualquier lado, la mejor solución es poner en todos tu servidor principal como relay. Así todos los correos que salgan de la red pasarán por un mismo punto y desde ahí los podrás controlar.
Si esta idea te parece compleja, pero quieres aun así controlar "un poco" aquello que puede salir por correo de tus equipos, entonces una forma de hacerlo es configurar un pequeño transport especialmente diseñado para que únicamente deje enviar correos a determinados dominios, descartando el resto de forma automática.
Para ello, lo primero es crear el fichero /etc/postfix/transport con el siguiente contenido:
net.domain.com         :
domai.com              :
example.com            :
*              discard :
Y a continuación crear el correspondiente .db con postmap, tal que así:
shell> postmap /etc/postfix/transport
Y ya por último, añadir esta nueva configuración al servidor postfix (/etc/postfix/main.cf) y hacer un restart del mismo.
transport_maps = hash:/etc/postfix/transport
Si todo fue correcto, todos aquellos correos que lleven de destino un dominio diferente al de los aceptados, tendrán un discard automático.
shell> tail -f /var/log/mail.log
Jun 07 18:37:08 server postfix/discard[65384]: AF7634BC35:
to=xyzgmail.com,
relay=none, delay=0.07, delays=0.07/0.01/0/0, dsn=2.0.0, status=sent (gmail.com)
Leer más

Postfix: Permission denied

El otro día estaba intentando enviar mails desde una aplicación web, corriendo en un Apache con un servidor con Red Hat y, qué raro, los correos no se enviaban y la función siempre daba fallo. El código PHP sabía que estaba correcto y con Postfix también correctamente configurado, tuve que investigar un poco más el motivo.
Tras ver un poco por los logs, concretamente en el fichero relacionado con el sistema de correo (/var/log/maillog), vi que se estaba llenando de líneas como las que siguen:
postfix/sendmail[8500]: fatal: chdir /var/spool/postfix: Permission denied
postfix/sendmail[9316]: fatal: chdir /var/spool/postfix: Permission denied
postfix/sendmail[9764]: fatal: chdir /var/spool/postfix: Permission denied
Tras un poco más de investigación me acordé de que Red Hat trae SELinux y que probablemente me estuviese molestando un poco. Lo primero que hice fue comprobarlo para estar seguro y nada mejor para ello que el comando getsebool.
shell> getsebool -a | grep mail
   allow_postfix_local_write_mail_spool --> on
   httpd_can_sendmail                   --> off
   logging_syslogd_can_sendmail         --> off
Bien, efectivamente aquí tenemos el problema. La variable httpd_can_sendmail está a off, con lo cual deshabilita|bloquea|prohibe cualquier posibilidad de envío de correos desde el servidor. Así que vamos a habilitarla.
shell> setsebool httpd_can_sendmail 1
Tras este sencillo comando, comprobamos que el nuevo valor se estableció correctamente,
shell> getsebool -a | grep httpd_can_sendmail
   httpd_can_sendmail --> on
Y ahora desde la aplicación web ya me permite enviar correos de forma satisfactoria.
Leer más

Zimbra: Limitar número de destinatarios

Si el otro día hablamos de cómo limitar el número máximo de correos que pueden salir del servidor en un período de tiempo, hoy vamos a ver cómo limitar el número máximo de destinatarios de correos. Esto no es más que el número máximo de direcciones que se podrán poner el el "To:".
Para aplicar los cambios en caliente,
shell> postconf -e smtpd_client_recipient_rate_limit=50
Y si deseamos que estos cambios sean permamentes (/opt/zimbra/postfix/conf/main.cf),
smtpd_client_recipient_rate_limit = 50
Y a continuación reiniciamos el servicio,
shell> zmmtactl restart
Leer más

Zimbra: Limitar número de correos salientes

Casi todos los servidores de correo están en la actualidad un poco restringidos con la cantidad de correo que puede enviar. Bien por no saturar las líneas, bien por seguridad, bien por que al administrador de gustó la idea.
El detalle que es en una instalación limpia de postfix/Zimbra, esta restricción no está habilitada y aunque no debería de pasar nada, quizás no esté demás aplicársela. No es por molestar a los usuarios, es para evitar, por ejemplo, un envío masivo de spam en caso de que una cuenta sea comprometida.
Para habilitarla, bastaría con editar el fichero de configuración de postfix, /opt/zimbra/postfix/conf/main.cf y agregar,
smtpd_client_message_rate_limit = 5
anvil_rate_time_unit = 60
Tras ello, hacer un restart del servicio MTA
shell> zmmtactl restart
Con ello conseguimos limitar a 5 la cantidad de correo que sale de Zimbra por usuario cada minuto. 5 mensajes por minuto ya da para escribir considerablemente.

En caso de que deseemos aplicar los cambios en caliente, también es posible,
shell> postconf -e anvil_rate_time_unit=60s
shell> postconf -e smtpd_client_message_rate_limit=5
Leer más

mutt para envío de correo

mutt es un cliente de correo en consola para GNU/Linux. Es muy similar a mail, pero mucho más potente, ya que permite manejar todo un buzón remoto de correo, así como conectarse a servidores remotos para el envío de correos.
Hoy vamos a ver cómo configurar nuestro sistema para que envíe correos a través de una dirección de Gmail o de Google App Engine. Realmente mutt permite enviar correo empleando un servidor de correo local, por ejemplo un postfix en localhost, pero a algunos servidores eso tipo de envíos no les termina de gustar, sino que los mail's deben de ir desde un servidor "real". Es por ello que vamos a configurar mutt para que saque todos los correos a través de la cuenta de gmail que tengamos para tal efecto.
Para ello, lo primero es instalar mutt en el sistema,
shell> apt-get install mutt
Y a continuación configurar en la home del usuario que enviará los correos el ficheros de configuración de mutt, el .muttrc con el siguiente contenido,
set from = "YOUR_USER@gmail.com"
set realname = "YOUR NAME"
set smtp_url = "smtp://YOUR_USER@smtp.gmail.com:587/"
set smtp_pass = "YOUR_PASSWD"
Tras ello, simplemente al enviar un mail con mutt, éste automáticamente se conectará a los servidores de Google para efectuar a través de ellos el envío.
En caso de que tengáis una cuenta de Google App Engine y queráis hacer uso de esta técnica, bastará con introducir vuestro usuario completo "YOUR_USER@domain.com" en los lugares que corresponda, quedando la configuración final tal que así,
set from = "YOUR_USER@domain.com"
set realname = "YOUR NAME"
set smtp_url = "smtp://YOUR_USER@domain.com@smtp.gmail.com:587/"
set smtp_pass = "YOUR_PASSWD"

La entrada mutt para envío de correo la puedes leer en Puppet Linux.
Leer más

Control de colas de correo desde Zabbix

Hoy vamos a ver cómo podemos controlar las colas de correo de Zimbra (y en general de postfix) desde nuestra herramienta de monitorización.
Antes de comenzar, vamos a hacer una breve introducción a qshape, una utilidad nativa de postfix que permite controlar la antigüedad de los correos. Dicho de otra forma, nos permite saber cuánto tiempo lleva un correo en una cola. Todos sabemos que ne postfix hay 4 colas principales, active, deferred, hold e incoming. Si hacemos uso qshape podremos saber exactamente cuanto correo hay en cada cola. Veamos un ejemplo.
shell> qshape deferred
              T  5 10 20 40 80 160 320 640 1280 1280+
       TOTAL  3  0  0  0  1  0   0   0   0    0     2
    yahoo.es  1  0  0  0  1  0   0   0   0    0     0
 hotmial.com  1  0  0  0  0  0   0   0   0    0     1
    gmail.es  1  0  0  0  0  0   0   0   0    0     1
Como podéis observar, se le pasa como parámetro la cola que nos interesa y nos devuelve la cantidad de mail's que hay en ella. La primera columna representa el nombre del destino, que como se puede observar suelen ser nombres mal escritos. La segunda columna, representada como una T, representa el total de los mail's en cola y el resto de columnas lo mismo pero por minutos.

Para poder graficar y controlar estos valores, primero necesitamos tener un pequeño script que nos los devuelva. Así que aquí os dejo el que yo hice (no muy currado).
#!/usr/bin/perl
#
# Usage: zabbix_qshape <queue> <time>
# <queue>: active, deferred, hold, incoming
# <time>: T (all), 5,10,20,40,80,160,320,640,1280,1280+
# Returns the number of messages in <queue> for <minutes>

use strict;

my $num_args = $#ARGV + 1;
if ($num_args != 2) {
   print "Usage: zabbix_qshape <queue> <time>\n";
   exit;
} else {
   my $queue = @ARGV[0];
   my $time = @ARGV[1];
   my %tindex = ('T' => 2,
      '5' => 3,
      '10' => 4,
      '20' => 5,
      '40' => 6,
      '80' => 7,
     '160' => 8,
     '320' => 9,
     '640' => 10,
    '1280' => 11,
   '1280+' => 12);
   my $index=$tindex{$time};
   if(!$index) {
      print "Usage: zabbix_qshape <queue> <time>\n";
      exit;
   }
   my $command = "sudo /opt/zimbra/postfix/sbin/qshape.pl $queue \
                 | grep TOTAL \
                 | awk {'print \$$index'}";
   my $sal = qx@$command@;
   chomp($sal);
   print "$sal\n";
}
Con este pequeño script al pasarle una cola y un tiempo, nos devuelve el número de mail's que están en dicha cola. De forma más gráfica,
shell> perl /usr/local/bin/zabbix_qshape deferred T
3
Así que ahora sólo queda crear un nuevo item que se encargue de monitorizarlo. Puesto que queda más limpio, soy de los que prefiere emplear el UserParameter del fichero de configuración, creando ahí una nueva key_ que se encargue de controlar esto. Puesto que le vamos a pasar 2 parámetros, vamos a crearla con opciones.
UserParameter=zimbra.queue[*], /usr/local/bin/zabbix_qshape $1 $2
Ahora ya sólo queda crear los items que deseamos monitorizar, tal que así:
Name                    : Zimbra monitor: $1
Type                    : Zabbix agent
Key                     : zimbra.queue[deferred, T]
Type of information     : numeric (unsigned)
Data type               : Decimal
Update interval (in sec): 300
Applications            : Zimbra
De la forma que la hemos creado, tenemos una única key_ a la que le podemos pasar como parámetros la cola y el tiempo y lógicamente, mostrarlos como parte del nombre. En el ejemplo anterior la key_ creada es para la cola deferred. Para monitorizar el resto de colas, las key's a crear serán:
zimbra.queue[active, T]
zimbra.queue[hold, T]
zimbra.queue[incoming, T]
Sólo para terminar, un detalle importante es el empleo de sudo en el comando. Algunos ya os habréis dado cuenta, pero para los que no, simplemente deciros que antes de que esto funcione debemos de añadir la siguiente línea al fichero /etc/sudoers.
zabbix  ALL=NOPASSWD: /opt/zimbra/postfix/sbin/qshape.pl
Como nota adicional decir que el comando qshape de zimbra está localizado bajo /opt/zimbra/bin/qshape, pero como todo el sistema Zimbra está preparado para ser ejecutado con el usuario zimbra. Sin embargo, la instalación de postfix ofrece también dicho comando, localizado /opt/zimbra/postfix/sbin/qshape.pl al que sí le podemos añadir fácilmente permisos con sudo para el usuario zabbix.
Leer más

Limitando conexiones fallidas en postfix

Este pequeño truco sirve tanto para postfix como para Zimbra (ya que recordar que por debajo realmente está ejecutando un sistemas postfix). Cuando un servidor de correo comienza a recibir una gran cantidad de spam, el servidor mantiene una tremenda cantidad de conexiones abiertas y éstas consumen recursos. Para evitar el consumo tan excesivo de recusos, podemos optar por editar el fichero de configuración de postfix, main.cf y agregar,
smtpd_soft_error_limit = 2
smtpd_hard_error_limit = 3
y reiniciar postfix, o bien ejecutar los siguientes comandos, que harán lo mismo,
postconf -e 'smtpd_hard_error_limit = 3'
postconf -e 'smtpd_soft_error_limit = 2'
Estas dos líneas lo que hacen es que el servidor postfix deniegue las conexiones a los clientes SMTP que tienen muchos fallos. Para más información, aquí.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios