9. Limitar correos enviados (Ratelimit)
Limitar el número de correos salientes es muy importante en los servidores de correo si no se quiere terminar en listas RBL y con el servidor bloqueado. La instalación de Exim4 en Debian 11 no incluye ninguna configuración activa para limitar el número de correos, ni globales ni por usuario. Exim4 dispone de un limitar interno ratelimit y se configurará de la siguiente manera:
Se establecerá un límite global al servidor, éste incluye todos los correos enviados por el sistema.
Se establecerá un límite máximo por cuenta de correo.
Se pretende controlar de manera separada los correos originados desde programas locales del servidor, como puede ser PHP.
Advertencia
Antes de establecer los límites considera cuales son los máximos permitidos por las grandes plataformas como Google y Microsoft
Las limitaciones actuales en los proveedores ISP son aproximadamente del siguiente orden de magnitud:
20 correos cada 15 minutos
100 correos por hora
500 correos diarios
Estos límites se aplican todos a la vez, es decir, si se alcanza alguno de ellos se produce el bloqueo. Además, otro límite típico es el número de destinatarios simultáneos a los que se puede mandar un correo.
Nota
Según RFC 2821 se deben permitir al menos 100 destinatarios, literal mente pone:
Rejection of messages (for excessive recipients) with fewer than 100 RCPT commands is a violation of this specification.
9.1. Límite global y por usuario
Exim4 realiza el conteo y control de los correos mediante la directiva «ratelimit», que es una condición que se puede poner en las listas de control ACL. Para el propósito de limitar los correos salientes hay que añadir reglas en el ACL «acl_check_rcpt»
Este ACL ya está definido en el fichero
/etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
pero no contiene
ninguna regla (ni como ejemplo) para «ratelimit». Las reglas ACL se ejecutan en
orden, por ello las voy a poner al principio, es decir, las primeras tras
acl_check_rcpt:
tal y como muestro a continuación:
acl_check_rcpt:
# Log all senders' rates
# warn ratelimit = 0 / 1h / strict
# log_message = Sender rate $sender_rate / $sender_rate_period
# Global limit
deny
ratelimit = 5000 / 1d / $primary_hostname
message = ratelimit deny: server sending reached - $sender_rate / $sender_rate_period
# Keep authenticated users under control
deny
authenticated = *
ratelimit = 400 / 1d / leaky / $authenticated_id
message = ratelimit deny: $authenticated_id overlimit - $sender_rate / $sender_rate_period
La primera regla (comentada) es un ejemplo para depurar tomado de la documentación de Exim4 y escribe en log por cada envío de correo los contadores internos de Exim4. La segunda regla bloquea la salida SMTP del servidor cuando se alcanza el límite global de 5000 correos al día. La tercera lleva un conteo individual por usuario de correo, limitando a cada uno a 400 envíos diarios.
La forma de detectar el si el sistema está bloqueando correos es el log de Exim4. También a los usuarios que intenten enviar durante el bloqueo, les aparecerá el mensaje de error indicado la regla ACL al hacer el envío.
9.2. Limitando el correo con origen el propio servidor
Un problema de la configuración anterior es que los límites anteriores solo se aplican a los correos entrantes por donde se ejecuta el comando «RCPT TO», es decir por la red, pero no para los correos originados localmente.
Esta parte de la configuración pretende limitar el correo que procede de procesos locales descontrolados, páginas Web con PHP, otros scripts o usuarios del sistema.
Advertencia
Cuidado con esto, tiene efectos laterales sobre Exim4 ya que el propio correo que tiene en la cola Exim4 es afectado por esta regla y se puede todo el correo saliente bloqueado.
Personalmente lo estoy usando y si se bloquea la cola es que algo no va bien. Si pruebas esta configuración asegúrate de tener monitorizado Exim4 para controlar los bloqueos mientras experimentas.
Exim4 tiene el ACL «acl_not_smtp» para los correos que no proceden de la red,
para usarla hay que añadirla a la configuración de Debian ya que no se incluye
en ningún fichero dentro de /etc/exim4/conf.d/
Se creará un fichero separado para añadir reglas con este ACL, para ello, primero en el fichero definiciones generales usando hay que añadir lo mostrado para remitir ese ACL a una especificación posterior:
acl_not_smtp = acl_not_smtp
Ahora en un nuevo fichero conf.d/acl/50_exim4-config-limit_mypanel
añado las siguientes reglas:
acl_not_smtp:
#warn
# ratelimit = 0 / 1h / strict / www-data
# log_message = $sender_address sender ratelimit - $sender_rate / $sender_rate_period
accept
senders = root:paulino@art-website.com
logwrite = :main: Ratelimit: remote destination accepted
deny
ratelimit = 500 / 1h / strict / www-data
message = $sender_address sender ratelimit overlimit
logwrite = :main: Ratelimit deny: $sender_address sender overlimit - $sender_rate / $sender_rate_period
warn
ratelimit = 150 / 1h / leaky / www-data
delay = ${eval $sender_rate - 4 }
logwrite = :main: Ratelimit delayed: $sender_address sender ratelimit warning - $sender_rate / $sender_rate_period
accept
ratelimit = 0 / 1h / strict / www-data
logwrite = :main: Ratelimit accepted: $sender_address sender ratelimit - $sender_rate / $sender_rate_period
La regla comentada al principio es para depuración y la siguiente es importante. Asegura la recepción de todos los correos locales con destino al administrador. Si lo la pones perderás los correos de sistema como el CRON, etc.