Ultimamente me he encontrado con el problema de que las colas de correo en uno de los servidores que administro no paraban de crecer hasta llegar a los 3.000 o 4.000 correos.

La cola llegaba hasta tal punto, que llegaba a parar el qmail del servidor. Usando la interfaz de plesk, es facil eliminarlos, pero es una tarea engorrosa tener que estar pendiente de esto cada X horas, aparte, del problema que supondría que metieran tu ip en una RBL …

El problema

Revisando la cola del correo, observé que la mayoría provenían de anonymous@nombredelamaquina, con Subjects en inglés y a direcciones de correo extranjeras, en su mayoría.

Supuse que alguna de las páginas de mis clientes tendría algún formulario de contacto vulnerable (o algún joomla no actualizado). Cómo la mayoría de gente usa la función mail() de php, en los logs del correo no sabes de donde proviene el correo.

Mi entorno es un ubuntu server, que usa plesk para gestionar los dominios de mis clientes.

La solución

Vamos a hacer un wrapper para sendmail, es decir “engañaremos” al sistema y mandaremos el correo utilizando otro ejecutable, que a continuación crearemos.

Nota: Es una solución que me ha funcionado y me ha ayudado a solucionar el problema que tenía. No garantizo que a tí te funcione, ni me hago responsable de los problemas que te puedan surgir al realizar la siguiente operación. Dependiendo de la versión del sistema operativo que uses, la ruta de los ficheros pueden variar.

Poniendolo en marcha…

Vamos a crear el fichero /var/qmail/bin/sendmail-wrapper. Será el que se encargue de enviar el fichero. Pondremos el siguiente contenido en dicho fichero (ojo, son sólo dos líneas):

#!/bin/sh
  1. (date; echo X-Additional-Header: $PWD ;cat) | tee -a /var/tmp/mail.send|/var/qmail/bin/sendmail-qmail "$@"

Lo que hace, es “imprimir” el email antes de enviarlo dentro del archivo /var/tmp/mail.send, agregando la fecha y hora del envío al principio, y guardando la ruta en donde se encuentra el script que envía el email.

Después de esto, crearemos el ficheros que hará las funciones de log:

touch /var/tmp/mail.send
  1.  
  2. Le aplicamos los permisos correspondientes:
  3.  
  4. <pre lang="c">chmod a+rw /var/tmp/mail.send

Y hacemos que el script que acabamos de crear sea ejecutable:

chmod a+x /var/qmail/bin/sendmail-wrapper
  1.  
  2. Ahora viene cuando engañamos al sistema. Cambiaremos el nombre del binario de sendmail original por otro, que será el que hemos usado en el script que hemos creado:
  3.  
  4. <pre lang="c">mv /var/qmail/bin/sendmail /var/qmail/bin/sendmail-qmail

Y crearemos un enlace simbolico hacia nuestro script:

ln -s /var/qmail/bin/sendmail-wrapper /var/qmail/bin/sendmail

Eso es todo. La solución es bastante simple. Sólo nos queda esperar unos minutos (o horas, o días, eso depende del trafico de cada servidor..) y revisar el log. Podremos saber desde donde se está enviando spam para avisar al cliente.

Si el fichero que has usado como log, pasadas unas horas o días sigue vacío, y ves que en la cola de correo siguen habiendo mensajes provenientes de anonymous@miservidor…. entonces tienes otro problema, posiblemente más complicado que el que he tratado aquí.