Filtrer des mails : Entêtes Received et plages d’adresses IP

Traduction de l'Anglais. Article original sur LinuxQuestions.org : Email Filter With Procmail: Filter Received-Headers By IP-Range .

Contenu

Introduction ➡
Pourquoi ➡
Les plages d’adresses IP dont je parle ➡
Les Entêtes Received dans l’émail ➡
Procmail ➡
Est-ce qu’une adresse IP donné fait partie d’une plage d’IPs spécifique ? ➡
La recette pour Procmail ➡

Introduction

Je n’avais pas trouvé beaucoup d’information sur le Web pour déduire la faisabilité d’une idée que j'ai eu de longue date :

Filtrer des mails selon la plage d’adresses IP à qui appartient l’adresse dans une entête Received.

Ce n’est rien de révolutionnaire, mais je n’ai pas eu assez de connaissances et n’ai pas compris comment configurer un tel filtre avec les logiciels à ma disposition. La découverte d’un service en-ligne qui transforme des plages d’adresses IP en une expression rationnelle (“Regular Expression”) a de nouveau éveillé mon intérêt pour le sujet.

Voici la discussion que j’ai initié sur LQ et qui m’a aidé de me lancer, enfin, d’abord en abandonnant l’idée d’utiliser des expressions rationnelles : [Regex matching IP-Ranges] looking for alternative software solution (anglais).

J’écris ce document parce que

Pourquoi?

Je veux filtrer des plages d’adresses IP, parce que

J’espère que c’est suffisant comme réponse ; si non, considérez moi simplement têtu.

Je ne recommande pas les filtres ciblant des plages d’adresses IP comme efficace dans la lutte contre le SPAM et je ne crois pas que ma procédure devrait être adopté par tout le monde. Je ne sais pas – non plus – pourquoi ce document vous intéresse.

Les plages d’adresses IP dont je parle

216.58.192.0 - 216.58.223.255

Ceci est une telle plage d’adresses : celle qui est attribué à Google.com. Aucune de ces adresses apparaîtra normalement dans vos entêtes de mail. Je la présente comme un exemple.

Pour trouver cette plage d’adresses, j’ai d’abord lancé un simple Ping de Google.com :

slarti@magrathea:~$ ping google.com

Puis un whois pour l’adresse affiché dans les réponses au Ping :

slarti@magrathea:~$ whois 216.58.214.78

Le résultat est l’entrée de la base de donnés ARIN : une liste de plein d’informations sur le propriétaire de cette adresse ; mais déjà la toute première ligne qui suit le commentaire introducteur est :

NetRange: 216.58.192.0 - 216.58.223.255

Une partie de cette procédure sert à découvrir la plages d’adresses à qui appartient quelconque adresse IP enregistré ou la plage d’adresses qui est associé à un domaine Internet.

Les Entêtes Received dans l’émail

Chaque mail que vous recevez contient deux ou plus d’entêtes Received. Dans l’ensemble ils décrivent normalement le chemin qu’a prix un mail en partant de l’expéditeur jusqu’à votre serveur mail. Lire ces entêtes est – en fait – la seule méthode fiable pour connaître le vraie origine d’un mail, si tout ce que vous pouvez consulter à ce but, est le message lui-même.

Voici une page qui explique comment ces entêtes sont analysés dans le contexte de la lutte contre le SPAM : Quelles informations contiennent les en-têtes d’emails ?

Si vous arrivez à remonter un mail jusqu’à son expéditeur, vous connaissez l’adresse IP du serveur mail qui a injecté le message. Dans l’exemple suivant, l’entête Received identifie GitHub comme source d’un message automatique que j’ai reçu (pas complètement authentique) :

Received: from o4.sgmail.github.com (o4.sgmail.github.com [192.254.112.99])
(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
(No client certificate requested)
by [my smarthost] (Postfix) with ESMTPS id 5F909100C64
for <me@my_domain>; Wed, 12 Mai 2004 06:53:40 +0200 (CEST)

Ceci n’est ni la première, plus haute, ni la dernière plus basse entête Received dans le message. Pour savoir si vraiment 192.254.112.99 est le serveur qui a injecté le mail, vous devez analyser aussi les entêtes restantes.

Procmail

Procmail est un logiciel qui filtre des mails entrants de divers manières. Je l’utilise afin de distribuer quelques mails dans des dossiers spécifiques ou pour effacer du mail indésirable, en fonction des propriétés que Procmail est capable de discerner.
Les règles qui définissent les filtres s’accumulent dans le fichier de configuration de Procmail, d’habitude c’est

~/.procmailrc

Si Procmail est installé sur votre ordinateur, il y a plusieurs pages de manuel (man-pages) dédiées au program procmail lui-même (man procmail), le fichier de configuration (man procmailrc), exemples (man procmailex) et un mécanisme de filtrage avancé, appelé “weighted scoring technique” (technique d’évaluation pondérée : man procmailsc).

Est-ce qu’une adresse IP donné fait partie d’une plage d’IPs spécifique ?

Ceci est à peu près le seul vraie problème à résoudre, avant qu’un filtre peut agir sur les plages d’adresses IP. Une fois que la solution est trouvé, tout ce qu’il faut est une liste de plages d’adresses à filtrer et une recette procmail qui appliquera le nouveau filtre à chaque entête Received qui se trouve dans votre mail entrant.

Mon idée d’origine a été une expression rationnelle en concordance avec les adresses qui appartiennent à une plage d’adresses IP donnée.

Mais ce serait une manière de procéder très compliquée et – comme j’ai rapidement appris – un effort exagéré :

Une adresse IP n’est qu’une manière bizarre d’écrire un numéro. Une plage d’IPs indique donc simplement les valeurs extrêmes d’une série de nombres

.

D’autres nombres se trouvent dans la série ou non.
La réponse à la question : comment trouver si un adresse est inclus dans une plage d’IPs spécifique a été donné dans la toute première réponse à ma question sur LQ :

Dans une routine programmée, vous pouvez faire appel à une fonction de bibliothèque pour identifier, vérifier et probablement aussi comparer des adresses IP. La simple arithmétique de la proposition ci-dessus rentre quand même dans une seule ligne de code et parait suffisant pour le but de filtrer des plage d’adresses IP.

J’ai alors écris un script en Ruby – ip_in_range (une Rubygem sur rubygems.org) qui fait la comparaison. Il peut être exécuté de différentes manières en ajoutant un nombre variable d’arguments, mais pour l’intégration dans un filtre, la syntax est :

ip_in_range < [email] [range_list.txt]

Je peux utiliser une pipe (comme dans l'exemple avec < ) et nommer un fichier en text comme seul argument pour le programme. Ce fichier contient une simple liste de plages d’IP, une par ligne, comme :

192.168.0.1 192.168.0.255
autre exemple : 192.168.2.100 192.168.2.168
(...)

Tout texte en dehors des adresses IP est ignoré par ip_in_range et peut servir comme commentaire.

La recette pour Procmail

Procmail peut déléguer des taches à des programmes et scripts, soit en réaction à un filtre qui détecte une concordance, soit pour justement tester une condition. Dans le cas dernier, la réaction dépendra du code de sortie d’un logiciel ou script. Le lancement d’un tel programme dans la partie condition d’une recette pour Procmail est initié avec le symbol ‹ ? ›.

La recette qui teste si les entêtes Received d’un mail contiennent une adresse IP d’une plage d’adresses connue :

:0
* !FROM_DAEMON
* !FROM_MAILER
* !^X-Loop: my_mail@address
* 1^0 ? ip_in_range ~/.procmail/range_list.txt
/home/[chemin au répertoire mail]/refuse/ip_refuse

De cette manière, tous les mails qui sont testé positif par ce filtre, sont envoyés dans le répertoire ip_refuse dans le sous-répertoire refuse

Quand vous définissez vos propres filtres, vous devriez les tester en envoyant un message de test à Procmail. En idéal, vous écrivez la première version d’un nouveau filtre dans un fichier de configuration séparé et le nommez comme argument pour Procmail. Comme ça, la configuration opérationelle ne contiendra pas des recettes potentiellement incorrectes jusqu’au moment que vous les avez perfectionnées.