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:

  1. Se establecerá un límite global al servidor, éste incluye todos los correos enviados por el sistema.

  2. Se establecerá un límite máximo por cuenta de correo.

  3. 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:

Fichero /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
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:

Fichero /etc/exim4/conf.d/main/00_exim4_config_mypanel
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.