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

This article has 3 comments

  1. arno

    C’est intéressant comme article.
    Personnellement, je cherche à limiter l’expédition vers des noms de domaines.

    Par exemple
    yahoo pas plus de 300 emails par heure avec 5 connexion simultanées
    gmail pas plus de 150 emails par heure avec 2 connexion simultanées

    Mais pour l’instant je n’ai rien trouvé.
    Si vous avez une piste je suis preneur

  2. Niaguis

    Bonjour Arno,

    il suffit d’éditer /etc/postfix/main.cf
    et d’y ajouter

    #Protection antiflood anti attaques
    default_destination_concurrency_limit = 1
    default_destination_rate_delay = 60s

    Spécifique à une ancienne version de postfix : procédure pour mise à jour sur debian etch.

    postconf -d | grep mail_version

    #Si version inférieur a 2.5 faire la suite
    #Backports pour postfix.
    #Rajouter le dépot dans /etc/apt/sources.list
    echo ‘deb http://www.backports.org/debian etch-backports main contrib non-free’ >> /etc/apt/sources.list
    #Certificat pour les backports
    apt-get install debian-backports-keyring
    apt-get -t etch-backports install postfix

    Et c’est tout.

    C’est en prod maintenant et RAS c’est bien 1 minute de queue pour chaque mail dans un domaine donné.
    faire « postqueue -p » pour vérifier.

    J’espère avoir été utile

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *