Anatomie de Postfix

Anatomie de Postfix

Postfix est un système de messagerie très modulaire. Vous avez ci-dessous le schéma fonctionnel dont  nous allons essayer d'analyser grossièrement le fonctionnement. Tout ce qui suit peut être considéré comme une traduction libre de la documentation officielle du produit. Le site officiel de Postfix se trouve à l'adresse www.postfix.org, avec un site en français qui reprend la quasi totalité du site officiel.

Les files d'attente de Postfix

Il y a cinq  files d'attente pour les messages :

  1. « maildrop » qui reçoit les messages postés localement (depuis l'hôte lui-même).
  2. « incoming » qui reçoit aussi bien les messages postés localement que ceux qui arrivent du réseau (lorsque par exemple nous utilisons cet hôte comme serveur smtp pour notre réseau local). Les messages qui arrivent dans cette file ont déjà subi quelques traitements que nous détaillerons plus loin.
  3. « active » est la file qui contient les messages en cours d'envoi.
  4. « deferred » (différé), contient les messages qui, pour une raison ou une autre, n'ont pu être envoyés. Le protocole SMTP prévoit en effet de ne pas jeter systématiquement les messages qui n'ont pu être envoyés. Les messages classés dans « deferred » subiront plusieurs tentatives d'envoi en étant réinjectés dans « active »
  5. « mailbox » est la file d'attente des messages destinés aux utilisateurs locaux. nous verrons plus loin son utilité exacte.

Ceux qui souhaitent une description plus détaillée du fonctionnement de Postfix pourront avantageusement se tourner vers « Présentation de l'architecture de Postfix ».

Réception d'un e-mail

Entrée dans Postfix Lorsqu'un message arrive dans le système Postfix, quelle que soit son origine, son premier arrêt se fait dans « incoming ». La figure ci contre montre les composants qui sont invoqués  lors de l'arrivée d'un nouveau message.

Origine du message

Le Message est posté localement.

Le programme Postfix « sendmail » (ne pas confondre avec le MTA concurrent) le dépose dans la file « maildrop » d'où il est retiré par le service « pickup ». Ce service effectue quelques contrôles « sanitaires » dans le but de protéger le reste du système Postfix. Dans le but d'éviter des accidents, les permissions du répertoire contenant « maildrop » sont telles que tout le monde peut y écrire, mais aucun utilisateur ne peut en effacer le contenu.

Le message vient du réseau

Le serveur SMTP Postfix reçoit le message et effectue quelques contrôles « sanitaires », toujours dans le but de protéger le reste du système Postfix. Le serveur SMTP peut être configuré pour implémenter des contrôles UCE (Unsollicited Commercial Email) sur la base d'une liste noire locale où issue du réseau, de vérifications sur les DNS (domaine de l'expéditeur) où d'autres requêtes sur les informations concernant l'émetteur.

Traitement du message

Le message n'est pas livrable

Un e-mail est généré automatiquement par le système Postfix  dans le but de renvoyer ce message à son expéditeur. Ce sont les daemons « bounce » (rebond) où « defer » (livraison) qui annoncent la mauvaise nouvelle.

Un e-mail est également généré automatiquement par le système Postfix dans le but de prévenir le responsable de la messagerie en cas de problème. Le système Postfix peut être configuré  pour alerter en cas de problème de protocole SMTP, de violation de règles de sécurité UCE etc. (Ce chemin est indiqué sur le graphique par la flèche sans label).

Le message est livrable

Le message est transmis par l'agent de livraison local soit par l'intermédiaire d'une entrée de la base de donnée des « alias » au niveau du système, soit par le fichier « .forward » au niveau de l'utilisateur. Nous reviendrons sur ces notions un peu complexes dans la configuration de Postfix.

Le daemon « cleanup » implémente le dernier traitement du message. Il ajoute le champ « Form: » et d'autres en-têtes dans le message, arrange les adresses de réponses dans le format « user@fully.qualified.domain » et optionnellement extrait les adresses des destinataires de l'en-tête. Le daemon « cleanup » insère le résultat dans une seule file d'attente: « incoming » et notifie le « queue manager » (qmgr sur le schéma complet) de l'arrivée d'un nouveau message. Le daemon « cleanup » peut être configuré pour transformer les adresses sur la base des tables de consultation « canonical » et « virtual ». Nous verrons également celà dans la configuration de Postfix.

Sur la requête du daemon « cleanup », le daemon « trivial-rewrite » ré écrit les adresses dans le format standard « user@fully.qualified.domain ».

Livraison du message

Sortie de PostfixChaque fois qu'un message est déposé dans la file d'attente « incoming », l'étape suivante consiste à le livrer. La figure ci contre montre les principaux composants de la fonction de livraison de Postfix.

Le gestionnaire de file d'attente est le cœur du système de messagerie Postfix. Il contacte les agents de livraison « local », « smtp » ou « pipe » (les anglophones ont un langage parfois équivoque. Faire un « pipe » sur une « queue »…) et envoie une demande de livraison avec le chemin d'accès au fichier qui contient la file d'attente, l'adresse de l'expéditeur, le nom de l'hôte à qui il faut livrer si la destination n'est pas locale, et une où plusieurs adresses de destinataires.

Le gestionnaire maintient une file d'attente « deferred » séparée pour chaque message qui n'a pas pu être livré, de manière à ce qu'un compte-rendu de livraison trop volumineux ne vienne pas ralentir l'accès des autres files.

Le gestionnaire maintient une petite file d'attente « active » avec juste quelques messages prêts pour la livraison. « active » agit comme une petite fenêtre sur les files d'attentes « incoming » ou « deferred ». Cette méthode évite au gestionnaire de faire des débordements de mémoire si le serveur est fortement chargé.

Optionnellement, le gestionnaire fait « rebondir » le message pour les destinataires qui sont référencés dans la table « relocated ». Cette table contient des informations sur les utilisateurs qui ont changé d'adresse.

Sur la demande du gestionnaire de file d'attente, le daemon « trivial-rewrite » résout les destinations. Par défaut, il fait uniquement la distinction entre les destinations locales où distantes. Des informations de routage additionnelles peuvent être spécifiées dans la table « transport ».

Sur la demande du gestionnaire de file d'attente, les daemons « bounce » et « defer » générent des rapports  de non-livraison lorsqu'un message ne peut être acheminé, soit à cause d'une erreur non récupérable, soit parce que le destinataire n'est pas joignable pendant une durée trop longue.

L'agent  local de la livraison sait gérer les boîtes aux lettres de type UNIX, les bases de données du type « alias » de sendmail (le MTA concurrent), les fichiers de type .forward de l'utilisateur. De multiples agents locaux de livraison peuvent être exécutés en parallèle, mais la livraison en parallèle au même utilisateur est habituellement limitée.

En même temps que l'agent de livraison « sendmail », l'agent de livraison « local » implémente l'interface utilisateur familière de sendmail (le MTA concurrent).

L'agent de la livraison locale a des possibilités pour utiliser d'autres moyens de livraison locale : vous pouvez le configurer pour livrer aux fichiers de boîte aux lettres dans les répertoires locaux d'utilisateur, et vous pouvez même le configurer pour déléguer la livraison de boîte aux lettres à une commande externe telle que le programme populaire « procmail ».

Le client smtp recherche une liste d'échangeurs de courrier pour l'hôte de destination, trie la liste par préférence, et essaye chaque adresse alternativement jusqu'à ce qu'il trouve un serveur qui répond. Sur un système  postfix chargé, vous verrez plusieurs processus de client de smtp fonctionner en parallèle.

Le « pipe » est l'interface de sortie vers d'autres transports de courrier (Le programme « sendmail » est l'interface d'entrée). Le système de courrier Postfix peut par  exemple livrer du courrier  par l'intermédiaire du protocole UUCP. Ce protocole vénérable est encore largement répandu. Par défaut, Postfix comprend des adresses de type « bang path » (Rassurez-vous, ici on parle de SMTP, pas de UUCP qui n'est plus de mise sur Internet, mais seulement dans des réseaux privés).

Conclusion

Si vous avez eu le courage de lire cette page jusqu'ici, vous êtes un brave. Si en plus, vous avez tout compris, alors vous êtes remarquable!

Pour résumer la situation, disons que Postfix sait faire les choses suivantes:

  • Recevoir du courrier depuis le réseau, (cette fonction nous intéresse),
  • recevoir du courrier depuis l'hôte local, (pourquoi ne pas s'en servir?),
  • acheminer du courrier dont la destination est ailleurs, (c'est exactement ce que nous cherchons à faire),
  • acheminer du courrier localement, (pourquoi pas?),
  • dans tout ces processus, Postfix est capable de modifier quelque peu les en-têtes de messages. Ca n'a pas beaucoup d'intérêt pour nous, sauf dans le cas où nous utiliserons l'hôte de Postfix pour expédier du courrier.

Il y a tout de même un détail qu'il ne faut pas laisser dans l'ombre: Postfix n'est pas un serveur POP ni IMAP. Même s'il sait livrer du courrier local, il ne sait pas gérer les boîtes aux lettres pour des clients distants. Si l'on veut réaliser cette opération, il faudra ajouter un autre logiciel, ce que nous n'allons d'ailleurs pas nous priver de faire…