Génération d'une liste d'accès pour Postscreen

Je ne vais pas vous expliquer à quoi sert Postscreen, d'autres le font très bien et je vous invite à jeter un oeil aux remerciements pour en savoir plus.

Lorsque Postscreen est configuré pour effectuer des contrôles profonds, ce dernier va introduire une notion de greylisting, ce qui peut vite être problématique :

  • Arrivé d'un email
  • Postscreen mets l'IP en liste blanche et répond au serveur que le serveur est injoignable
  • Quelques instants plus tard, le serveur tente à nouveau l'envoi et ça passe car l'IP est en liste blanche

Généralement, cela suffit pour bloquer la majorité des spammeurs qui ne retenteront pas l'envoi, si ça passe quand même, rspamd sera là pour achever les spams.

C'est bien pratique mais c'est problématique pour plusieurs raisons :

  • Pourquoi greylister alors que l'email pourrait arriver instantanément avec une liste blanche ?
  • Les gros fournisseurs possèdent un tas d'adresses IP, ce n'est donc pas la même IP qui va se représenter et vous pourrez attendre plusieurs jours avant de recevoir un email s'il n'est pas droppé entre temps

Un exemple simple qui m'est déjà arrivé :

  • Arrivé d'un email en provenance de Google avec l'IP A
  • Postscreen mets l'IP A en liste blanche et répond au serveur que le serveur est injoignable
  • Google retente avec une autre IP B
  • Postscreen mets l'IP B en liste blanche et répond au serveur que le serveur est injoignable
  • Google retente avec une autre IP C
  • Postscreen mets l'IP C en liste blanche et répond au serveur que le serveur est injoignable

Et ça boucle avec une multitude d'IP, on peut attendre longtemps comme ça.

  1. Pré-requis
  2. Fonctionnement du script
  3. Récupération du script
  4. Exécution du script
  5. Références et remerciements

1. Pré-requis

Un exemple de liste généré est disponible ici, cependant si vous voulez exécuter le script vous-même, vous aurez besoin de :

  • bash
  • dig
  • nslookup
  • sipcalc

Pourquoi bash ?

C'était plus rapide pour moi, j'imagine que ça doit être réalisable avec Python3 et bien plus optimisé, mais le résultat sera le même.

Pourquoi utiliser sipcalc ?

Afin que les IP soient correctes et éviter les warning dans postfix.

Pas mal de domaines ont des entrées SPF invalides, avec des IP parfois incomplètes.

De plus, mais grâce à bash cette fois-ci, je n'accepte pas les IPv4 avec un CIDR inférieur à /12, encore une fois, des entrées SPF sont curieuses et la main de l'homme a encore fait des ravages.

2. Fonctionnement du script

Le script permettant de générer la liste d'accès va se baser sur 4 listes :

l_direct_ip.txt :

Cette liste va contenir une liste d'IP.
Utile lorsqu'un fournisseur n'a pas d'entrée SPF et que les IP sont connues d'avance.

l_direct_ip_reject.txt :

Cette liste va contenir une liste d'IP à rejeter.
Les IP se trouveront à la fin du fichier généré.

l_get_from_domain.txt :

Cette liste va contenir des domaines dans lesquelles nous viendront récupérer les adresses IP.
Utile lorsqu'un fournisseur n'a pas d'entrée SPF et que les domaines sont connus d'avance.

l_get_from_spf.txt :

Cette liste est la plus intéressante, elle va contenir des domaines possédant une entrée SPF qui sera scannée afin de récupérer les IP autorisées.

3. Récupération du script

Le dépot git se trouve ici et vous pouvez récupérer l'archive au format tar.gz ici ou en faisant un git clone si vous préférez.

4. Exécution du script

Rien de bien difficile :

$ bash create_lists.sh

Avec mes listes, cela peut prendre environ 5 minutes et il en résultera un fichier output_ip.txt.

Si vous avez bien compris, ce fichier pourra être utilisé en tant que postscreen_access.cidr.

5. Références et remerciements