POSTFIX: limitar la velocidad a la que un usuario en particular puede enviar correos electrónicos

13

Tenemos una configuración de servidor CentOS que aloja nuestros sitios web y nuestro servidor de correo electrónico (usando POSTFIX). Administramos el sistema usando Virtualmin y Webmin respectivamente.

En general, para cada sitio que configuramos, proporcionamos al cliente una cuenta de correo electrónico en nuestro sistema. Un cliente en particular ha decidido que es una buena idea enviar literalmente miles de correos electrónicos a granel. Cuando esto sucede, el servidor de correo dejará de responder y el correo de otros clientes dejará de funcionar mientras se procesa la cola.

¿Hay alguna forma de limitar la tasa de correo electrónico que se envía a un usuario particular del sistema en lugar de a todos? ¿Existe también una configuración que deberíamos cambiar para que nada de lo que un usuario pueda hacer pueda hacer que el servidor de correo comience a fallar para otros usuarios?

Gracias

WarpKid
fuente

Respuestas:

23

Me parece que todas las otras respuestas a esta vieja pregunta son solo de enlace. Así que voy a describir en pocas palabras cómo implementar mi solución favorita para este trabajo.

El enlace que @ 84104 ha sugerido, aunque es muy útil, no se puede usar para implementar correctamente la tasa por remitente. smtpd_clientlos límites no son para el control del tráfico, sino para ayudar con el software del cliente: "Medidas contra clientes que hacen demasiadas conexiones". Aunque uno puede encontrar recomendaciones como este uno que sin duda puede ayudar. Como @E. Yazici ha sugerido que se requiere un complemento para postfix . Personalmente, encuentro policyd según lo recomendado por @Janne Pikkarainen bastante engorroso, aunque se considera un estándar.

Mi complemento favorito es postfwd porque es ligero y fácil. También vale la pena señalar que esto funciona muy fácilmente con Plesk u otro similar, sin afectar el complicado conjunto de archivos de configuración de Plesk. El límite de velocidad de correo electrónico en Plesk solo se implementó en la versión 12, pero las características de la política aún son limitadas.

Primero descargue el último complemento del sitio anterior. Creo que no hay rpm para CentOS, en contraste con Ubuntu y Debian. Sin embargo, se recomienda utilizar la última versión. Más específicamente, la versión 1.32 (que está presente en, por ejemplo, repositorios Ubuntu 14.04LTS) tiene un error desagradable que impide que funcione correctamente. La versión 1.35 soluciona esto.

Asegúrese de que estos módulos PERL estén presentes. Si usa Debian o Ubuntu , puede instalar desde repos para que todas las dependencias se resuelvan automáticamente y luego se reemplacen /usr/sbin/postfwdcon la última versión.

Luego crea el conjunto de reglas. Cree un archivo como /etc/postfwd.cfo /etc/postfix/postfwd.cfy agregue:

id=R001; sender=~/.*/; action=rate(sender/100/86400/REJECT only 100 messages per day for $$sender)
id=R002; sender=~/.*/; action=rate(sender/50/3600/REJECT only 50 messages per hour for $$sender)

El conjunto de reglas anterior tiene obviamente dos reglas que evalúan para todos los remitentes. La sintaxis de la rateacción es:

rate (<item>/<max>/<time in sec>/<action>)

Otros ejemplos de tarifas se pueden encontrar aquí . Se puede encontrar una referencia a la sintaxis en la documentación . Discusión similar se puede encontrar aquí . Si se implementa SASL (p. Ej., Palomar), puede reemplazarlo sendercon seguridad sasl_username. Puede probar la validez del conjunto de reglas con la -Copción:

postfwd -f /etc/postfwd.cf -C

Después, opcionalmente puede crear un usuario y grupo dedicado postfwdbajo el cual postfwd se ejecutará y lo iniciará:

postfwd --daemon -f /etc/postfwd.cf -u postfwd -g postfwd 

En caso de tenerlo instalado desde apt (Debian, Ubuntu, etc.), también debe haber un archivo de configuración debajo /etc/default/postfwdy puede iniciar el servicio correctamente, por ejemplo sudo service postfwd start.

Luego eche un vistazo al registro para verificar que postfwd está escuchando. Postfwd utiliza el mismo registro como postfix (por ejemplo, /var/log/mailo /usr/local/psa/var/log/maillogetc) y una línea como postfwd 1.35 ready for inputdebería ser en su lugar.

Luego, informe a postfix para usar postfwd. Edite el archivo conf de postfix (generalmente /etc/postfix/main.cf) y en la línea:

smtpd_recipient_restrictions = permit_mynetworks,...

agregar check_policy_service inet:127.0.0.1:10040. Tenga en cuenta que el orden en el que coloca esto smtpd_recipient_restrictionstiene una gran importancia y podría terminar pasando mucho tiempo diagnosticando qué podría estar mal. Como se explica en esta pregunta , si un cheque devuelve OK o RECHAZAR, entonces postfix no continúa con el siguiente, por lo que probablemente debería colocar este valor alto.

Por último, para comprobar que esto funciona, puede especificar un límite muy pequeño como 1 o incluso agregar una regla como id=DEFAULT; action=dunno. Cualquier golpe de regla se registra de todos modos. Tenga en cuenta también que el límite de velocidad por remitente no distingue entre múltiples correos electrónicos con un solo destinatario o un solo correo electrónico con múltiples destinatarios.

Luego envíe un correo electrónico desde una cuenta (en ese servidor) y mire el registro:

grep "RULES" /var/log/mail

Otros enlaces: inicio rápido postfwd .

Wtower
fuente
1
una explosión del pasado esta pregunta! gracias por tomarse el tiempo para proporcionar una respuesta tan bien pensada. ¡Estoy impresionado!
WarpKid
1
mi versión de postfix barfs en cualquier smtpd_recipient_restrictionsentrada con un espacio en ella, por lo que tuve que definir postfwd_ratelimit = check_policy_service inet:127.0.0.1:10040en /etc/postfix/main.cf y luego hacer referencia en /etc/postfix/master.cf comosmtpd_recipient_restrictions=...,$postfwd_ratelimit,...
Tom McClure
Para reiniciar postfix en Ubuntu:sudo postfwd -f /etc/postfix/postfwd.cf --pidfile=/var/run/postfwd.pid --reload
Wtower
Al usar Ubuntu 16.04 al menos, descubrí que necesitaba cambiar el comodín en las reglas para usar .+(al menos 1) en lugar de .*(al menos 0) para que las reglas no coincidan con los campos ausentes.
TommyPeanuts
4

Lo que necesita es un complemento de política para Postfix. Hay una docena de complementos de política para Postfix, algunos de ellos tienen una función de limitación de velocidad. Puede encontrar una lista de complementos de política de Postfix aquí .

Emre Yazici
fuente