Proxmox Mail Gateway Ratelimit Centralizado en Cluster de Relay de Correo
Sí, toca tocar el correo, llevo tiempo trabajando en mejoras para un sistema anti spam que incluyen un rotador de IPs para postfix que auto excluye las IPs de las listas negras, en postfix se puede hacer con randmap que básicamente selecciona un transport de forma aleatoria, pero... cuando quieres quitar un transport tiene que reiniciar postfix, así que he hecho un sistema adicional que le manda las IPs a postfix, que publicaré más pronto que tarde en el blog.
Hay varias opciones para ratelimit, podemos usar rspamd, que ya nos toca un poco el lado del milter y choca un poco con spamassasin, pero tiene un ratelimit integrado y puedes generar reglas hasta por asunto o cualquier cosa que se te ocurra
Luego tenemos https://postfwd.org/ un sistema sin duda probado y con bastante tiempo en desarrollo, este actúa en smtpd_end_of_data_restrictions
Lo que tenemos que hacer es crear un check_policy_service y enviar información a postfwd
Check_police_service le envía a postfwd la siguiente información
ccert_fingerprint= | ccert_issuer= | ccert_pubkey_fingerprint= | ccert_subject= | client_address= | client_name | client_port= | compatibility_level=3.11 | encryption_cipher= | encryption_keysize= | encryption_protocol= | etrn_domain= | helo_name= | instance= | mail_version= | policy_context= | protocol_name=ESMTP | protocol_state=RCPT | queue_id= | recipient= | recipient_count=0 | request=smtpd_access_policy | reverse_client_name= | sasl_method= | sasl_sender= | sasl_username= | sender= | server_address= | server_port=25 | size=xxx | stress=
¿ Como lo se ? pues estoy haciendo mi propio ratelimit.
¿por que hacer mi propio ratelimit si tengo postfwd ?
Básicamente por que estoy haciendo un panel completo para gestión y quiero integración total, pero el sistema no dista mucho, en vez de hacerlo en perl lo estoy haciendo en go, un poco más rápido todo.
Primero veamos las diferencias que tendrá con postfwd, postfwd, esta pensado para trabajar en smtpd_end_of_data_restrictions mi sistema esta pensado para trabajar ahí y también para trabajar en smtpd_recipient_restrictions. Parece lo mismo pero no.
La diferencia sustancial es que postfwd recibe recipient_count= ya que es lo que puede recibir en end_of_data es más rápido procesarlo ahí pero en smtpd_recipient_restrictions recibimos RCPT TO
Que quiere decir esto, que en un sistio recibimos solo a cuantos destinatarios va el correo, ej
Un correo desde hola@dominio.com se envía a 50 personas, en smtpd_end_of_data_restrictions recipient_count=50 y en smtpd_recipient_restrictions uno a uno la lista de destinatarios, por lo tanto, sacrificamos algo de tiempo y recursos procesando todos los destinatarios, pero ganamos una cosa, poder aplicar limites.
En pocas palabras si queremos que un dominio no pueda enviar más de 50 mensajes por minuto a hotmail.com solo podemos hacerlo desde smtpd_recipient_restrictions, si queremos poner un ratelimit a destinatarios por patrones tenemos que hacerlo desde smtpd_recipient_restrictions ya que aquí es donde recibimos todos los destinatarios.
Con postfwd, solo aplicamos al número total ya que no recibimos los destinatarios si no el número.
Por lo tanto, si quieres un ratelimit ahora mismo, usa postfwd, funciona bien y te hace el apaño, si quieres algo más complejo que previene ataques de diccionario y demás, pues tendrás que esperar un poco más a que el sistema pase las pruebas.
Entre otras cosas el skamale-ratelimit hace:
- Ratelimit por dominio, ip, destinatario, ataques de diccionario, peso por mensaje etc
- Ratelimit centralizado, todo el cluster comunica entre si y genera ratelimit en todos los nodos
- Muy ligero, de 4 o 8 MB de ram de consumo en entorno real
- Limite dinámico, modifica el limite si el remitente a generado bounces o deferred, esto quiere decir que en una hora una cuenta puede tener 300 mails para enviar, pero si tiene muchos bounces o deferred el limite por hora se ajusta automáticamente a la baja ya que es un remitente de poca confianza pudiendo limitarse a 200, 150, 100 etc según la personalización que se quiera dar por bounce o deferred que se detecte en el cluster
- Panel de control de gestión para establecer limites
- Panel de status para ver limites
- Overrides a determinadas IPs, dominios y cuentas de correo desde el panel.
- Opciones adicionales de checks contra SPFS y demás integrado en el ratelimit
El ataque de diccionario es lo siguiente:
sender+al+test.com es el patrón detectado y en el que actual el ratelimit.
Pues si, en eso estoy trabajando, disculpen lo encuesto del post pero ando mal de tiempo y tengo esto un poco descuidado.
2 Imagenes de la config y el ratelimit funcionando en producción
Aunque el proyecto lo voy a subir separado, tal vez sea más útil el ratelimit y el selector para postfix aparte

