Dans Postfix, on a la possibilité de paramétrer une limite du nombre de mails envoyés sur une intervalle de temps. Par exemple, pour mettre en place une limite de 10 mails envoyés par minutes, on ajoute les lignes suivantes au fichier /etc/postfix/main.cf :

# Whitelist
smtpd_client_event_limit_exceptions = 127.0.0.0/8
# Max 10 mails/IP/anvil_rate_time_unit
smtpd_client_message_rate_limit = 10
# Reject pipelining (speed-up mail sending)
smtpd_data_restrictions = reject_unauth_pipelining
smtpd_delay_reject = yes
# Reset counter each minute
anvil_rate_time_unit = 60s
# Log statistics each 5 minutes
anvil_status_update_time = 600s

Pour activer les modifications :

/etc/init.d/postfix reload

Chaque fois qu’un client atteint cette limite, il reçoit l’erreur suivante et met le mail en deferred :

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
0DD51F82        274 Tue Sep  2 15:52:28  postmaster@domain.com
(host 192.168.3.14[192.168.4.14] said: 450 4.7.1 Error: too much mail from 192.168.3.12 (in reply to MAIL FROM command))
                                         email@domain.com

L’erreur est logguée de cette façon dans les logs de postfix :

Sep  2 16:04:07 machine.local postfix/smtpd[25359]: warning: Message delivery request rate limit exceeded: 55 from domain1.com[192.168.3.12] for service smtp

Afin d’avoir la liste des machines qui ont atteint la limite sur la journée en cours, on peut utiliser la commande suivante (peut prendre jusqu’à 2 minutes) :

/bin/cat /var/log/mail.log | grep "Message delivery request rate limit exceeded" |  grep "`date +%b' '%e`" | while read ligne ; do echo $ligne | awk '{print $(NF-5),"\t",$(NF-3)}' ; done | sort -k1 -g | uniq > /tmp/liste_rate_limit && for i in `/bin/cat /tmp/liste_rate_limit | cut -d'[' -f2 | cut -d ']' -f1 | sort | uniq`; do /bin/cat /tmp/liste_rate_limit | grep "$i" | sort -k1 -g | tail -1 ; done | sort -k1 -gr