Priority email gateway/fr

De Trustedbird Client Wiki
Révision de 8 septembre 2010 à 11:35 par Rfairise (discussion | contributions)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
English | Français

> Documentation > Priority email gateway

Télécharger priority-email-gateway

ChangeLog


Priority email gateway est un système de configuration d'une passerelle email transmettant des messages en fonction de leur priorité.

Les priorités sont déterminées à partir des en-têtes des messages. Plusieurs priorités différentes peuvent être assignées à un même message, pour les destinataires principaux (To) et pour les destinataires en copie (Cc et Bcc).

Un jeu de règles configurables permet d'identifier les en-têtes et de déterminer les priorités à attribuer.


Le système est basé sur le MTA Postfix couplé avec le serveur SMTP Qpsmtpd. Il est conçu pour fonctionner sur des distributions Linux basées sur Debian (testé sur Debian Etch avec backports, Debian Lenny et Ubuntu 8.04).

Architecture

Schéma

Priority-mail-server-fr.jpg

Principe

La solution comporte un serveur de messagerie Postfix placé en réception (frontend) et agissant comme répartiteur vers plusieurs instances indépendantes de Postfix pour gérer chaque priorité. Une seule instance de Postfix gère et ordonnance déjà efficacement les envois de messages en fonction des destinations. L'utilisation de plusieurs instances indépendantes est utile dans la situation où des messages prioritaires vers une destination arrivent sur le système alors que la file de messages vers cette destination est déjà surchargée. Une autre instance non surchargée pourra alors les traiter plus rapidement que s'ils avaient été ordonnancés après les messages en attente.

Parcours des messages

Le serveur SMTP du Postfix frontend reçoit en SMTP les messages provenant de l'extérieur. Il est chargé d'authentifier les clients si nécessaire puis il transmet les messages à Qpsmtpd utilisé en content‑filter de Postfix.

Qpsmtpd parcourt les en‑têtes des messages et modifie les adresses des destinataires dans l'enveloppe en ajoutant temporairement un domaine privé pour le routage en fonction de la priorité à assigner à chaque destinataire.

Les priorités sont déterminées à partir d'une table de correspondance configurable.

Une fois les domaines privés ajoutés, Qpsmtpd réinjecte le message dans le frontend Postfix. Ce dernier va alors router le message en fonction des domaines privés par destinataire et expédier le message vers une ou plusieurs des instances Postfix chargées de gérer les différentes priorités. Ces instances indépendantes de Postfix fonctionnent simultanément et comportent différents niveaux de priorité au niveau de l'ordonnancement système (niveaux nice).

Les messages reçus par ces instances Postfix passent par un processus de réécriture des adresses des destinataires dans l'enveloppe qui supprime les domaines privés qui avaient été ajoutés par Qpsmtpd. Ils sont ensuite mis en file, puis expédiés vers leur destination.


Installation

Pré-requis

Le système est conçu pour être installé sur un système d'exploitation Debian, par exemple :

  • Debian Etch (4.0) ou Lenny (5.0),
  • Ubuntu server (8.4).

Il est préférable que la version de Postfix soit supérieure ou égale à 2.5 pour bénéficier de meilleurs algorithmes d'ordonnancement du gestionnaires de files.

Pour le cas de Debian Etch, il est possible de mettre à jour Postfix en utilisant la version présente dans la distribution officielle etch‑backports.

Installation de Postfix et Qpsmtpd

La première étape consiste à installer le serveur mail Postfix, Qpsmtpd et l'agent SNMP.

# apt-get install postfix qpsmtpd snmpd

Le serveur SNMP est utilisé pour la supervision et son installation est optionnelle.

Le système peut demander à supprimer un autre serveur mail présent sur le système pour le remplacer par Postfix. Il faut accepter ce remplacement.

Choisir l'option Internet site pour générer une configuration de base.

La configuration de base dans /etc/postfix sera utilisée pour générer celle des instances de Postfix du système de priorités. Elle sera uniquement utilisée lors de la création initiale des configurations.

Elle peut être personnalisée maintenant avec les options qui seront communes à toutes les instances.


Les paramètres utiles à changer dans /etc/postfix/main.cf sont, par exemple, myhostname qui sert à spécifier le nom du serveur. L'authentification et les ports d'écoute ne doivent pas être configurés maintenant car ils seront différents suivant les instances.

Installation du système de priorités

Le paquet du système de priorités comprend un outil de génération des configurations des différentes instances de Postfix qui vont cohabiter sur le système, des scripts de supervision ainsi qu'un script de démarrage.

Télécharger le paquet debian du système de priorités, puis lancer l'installation avec la commande suivante :

# dpkg -i priority-email-gateway_VERSION.deb

(avec VERSION correspondant à la version du paquet situé dans le répertoire courant)

Le paquet va alors installer les différents éléments du système de priorités et va ensuite créer, à partir de la configuration présente dans /etc/postfix, les configurations spécifiques des différentes instances de Postfix dans /etc/postfix‑frontend, /etc/postfix0, /etc/postfix1, /etc/postfix2, ...

Qpsmtpd et les différentes instances de Postfix ainsi créées sont démarrées à la fin de l'installation.


Configuration

Liste des fichiers

  • /etc/priority-email-gateway.conf : définition du nombre et des caractéristiques des instances de priorités.
  • /etc/postfix : configuration Postfix de référence utilisée uniquement à l'installation du système comme base pour générer les autres configurations.
  • /etc/postfix-frontend : configuration de l'instance Postfix frontend.
  • /etc/postfix0, /etc/postfix1, ... : configuration des instances Postfix gérant les différentes priorités.

Les principaux fichiers de configuration de Postfix sont main.cf et master.cf.

  • /etc/qpsmtpd/addPrivatePriorityDomain.conf : règles d'identification des en-têtes de messages pour déterminer les priorités.

Outils / Scripts

  • /etc/init.d/postfix-priority : script de démarrage de toutes les instances Postfix.
  • /etc/init.d/qpsmtpd-priority : script de démarrage de Qpsmtpd.
  • /usr/sbin/update-priority-email-gateway : outil de génération ou de mise à jour des configurations de toutes les instances Postfix et Qpsmtpd.
  • /usr/sbin/priority-email-gateway-showQueues : outil d'affichage du nombre de messages dans chaque file de chaque instance Postfix.

Configuration générale

La configuration générale du système de priorités est située dans le fichier /etc/priority-email-gateway.conf.

Important : tout changement dans ce fichier doit être suivi d'une exécution de la commande update-priority-email-gateway qui met à jour les différentes configurations de toutes les instances Postfix et Qpsmtpd et redémarre le service.


Les paramètres impactés automatiquement par le script update-priority-email-gateway sont mentionnés en commentaires dans les fichiers modifiés et ne doivent pas être modifiés directement.

La syntaxe à respecter lors de l'édition de /etc/priority‑email-gateway.conf doit être celle d'un script shell sh.

  • PRIORITY_COUNT : nombre de priorités différentes à gérer, ce qui correspond au nombre d'instances de Postfix vers lesquelles l'instance Postfix frontend répartit les messages.
Plage de valeurs : supérieur ou égal à 2
Valeur par défaut : 5
  • DEFAULT_PRIORITY : numéro de l'instance Postfix chargée de gérer les messages quand aucune règle ne correspond aux en-têtes.
Plage de valeurs : entre 0 et PRIORITY_COUNT - 1
Valeur par défaut : 2
  • RELAY_HOST : adresse du prochain relai SMTP vers lequel tous les messages doivent être transmis en sortie du système de priorité.
Syntaxe : ce paramètre est utilisé comme relayhost dans Postfix et peut donc prendre les formes suivantes : domain name, hostname, hostname:port, [hostname]:port, [hostaddress] ou [hostaddress]:port. Les crochets désactivent les requêtes MX.
Valeur par défaut : ""
  • MONITORING_DIR : répertoire dans lequel les informations de supervision sont écrites régulièrement et mises à disposition de l'agent SNMP.
Valeur par défaut : /tmp/priority-email-gateway-monitoring

Paramètres spécifiques Qpsmtpd

  • NICE_LEVEL_QPSMTPD : niveau de priorité d'ordonnancement système de Qpsmtpd.
Plage de valeurs : ‑20 (plus prioritaire) à 20 (moins prioritaire)
Valeur par défaut : 0
  • LIMIT_CONNECTIONS_QPSMTPD : nombre maximum de connexions simultanées acceptées par Qpsmtpd.
Valeur par défaut : 100

Paramètres spécifiques Postfix

Les paramètres suivants définissent les valeurs des paramètres spécifiques à chaque instance de Postfix. Chaque paramètre peut avoir comme suffixe :

  • _FRONTEND : indique que le paramètre est spécifique à l'instance frontend.
  • _DEFAULT : indique que le paramètre sera appliqué pour une instance de priorité uniquement si ce paramètre n'est pas explicitement défini pour cette instance.
  • [n] : indique que le paramètre est spécifique à une instance de priorité. n est un index de tableau correspondant au numéro d'instance ([0] pour l'instance 0, [1] pour l'instance 1, ...).


  • QUEUE_RUN_DELAY : permet de définir la valeur des paramètres Postfix queue_run_delay et minimal_backoff_time définissant le temps minimum entre deux tentatives d'envoi pour les messages de la file deferred (messages dont l'envoi a échoué à une tentative d'expédition).
  • MAXIMAL_QUEUE_LIFETIME : permet de définir la valeur des paramètres Postfix maximal_queue_lifetime et bounce_queue_lifetime définissant le temps maximum de garde d'un message dans la file deferred avant d'être renvoyé à l'expéditeur comme impossible à distribuer.
  • BOUNCE_COMMAND : permet de définir la commande à exécuter lorsque Postfix doit renvoyer un message de non-distribution à l'expéditeur d'un message. (voir paragraphe Événement lors du renvoi d'un message à l'expéditeur)
  • NICE_LEVEL : niveau de priorité d'ordonnancement système nice à affecter à cette instance. Pour éviter un engorgement, il est souhaitable d'avoir l'instance frontend configurée avec une priorité moindre que celle des autres instances pour favoriser l'acheminement des messages déjà présents dans le système plutôt que d'en accepter de nouveaux.
Plage de valeurs : ‑20 (plus prioritaire) à 20 (moins prioritaire)
  • DSCP_CLASS : valeur de la classe DSCP (Differentiated Services Code Point) à inscrire dans l'en‑tête des paquets IP sortant d'une instance Postfix sur le réseau. La classe peut être BE (Best Effort, par défaut), EF (Expedited Forwarding), AFxx (Assured Forwarding) ou CSx (Class Selector). Ce paramètre est passé à Netfilter/iptables avec l'option ‑‑dscp‑class (voir le manuel de la commande iptables pour les différentes valeurs possibles).

Événement lors du renvoi d'un message à l'expéditeur

Lorsqu'un message n'est pas distribuable au relai suivant dans le temps imparti à l'instance Postfix chargée de le gérer, celui-ci est renvoyé à l'expéditeur et la commande définie dans le paramètre BOUNCE_COMMAND de l'instance est exécutée. Il est possible de programmer l'envoi d'un trap SNMP vers une station de gestion SNMP. Par exemple, pour l'instance de priorité numéro 4, avec 10.1.2.3 comme adresse de la station de gestion distante :

BOUNCE_COMMAND[4]="snmptrap -v 2c -c public 10.1.2.3 xxxxxxx"

Le mécanisme déclanchant cet événement est le paramètre bounce_notice_recipient de main.cf qui définit le destinataire d'un message d'erreur égal à bouncemanager. Ce destinataire virtuel est configuré en tant qu'alias dans le fichier alias_maps du répertoire de configuration de chaque instance Postfix. Par défaut, cet alias a une seule valeur, bouncecommand, qui permet l'exécution de la commande définie dans BOUNCE_COMMAND. Il est possible d'ajouter un autre destinataire pour l'alias bouncemanager dans le fichier alias_maps pour envoyer une copie du message d'erreur à l'administrateur du système.

Exemple de fichier alias_maps avec envoi d'une copie de message d'erreur à admin@system :

bouncemanager: bouncecommand   admin@system

Personnalisation du frontend Postfix

L'instance frontend dont la configuration est située dans /etc/postfix‑frontend écoute les messages entrant en SMTP sans authentification sur le port 25 par défaut.

Il est nécessaire de configurer les clients ayant la permission d'envoyer des messages à relayer par le système (paramètre mynetworks par exemple).

Il est aussi possible de configurer d'autres ports d'écoute et/ou d'activer des méthodes d'authentification des clients.

Personnalisation des instances de priorités Postfix

Les instances de priorités Postfix (dont les configurations sont dans /etc/postfix0 pour la priorité 0, /etc/postfix1 pour la priorité 1, et ainsi de suite), sont au nombre de PRIORITY_COUNT configuré dans /etc/priority‑email‑gateway.conf.

Elles sont automatiquement configurées pour n'écouter et n'accepter que des connexions locales provenant du frontend, sur les ports TCP 20000 pour la priorité 0, 20001 pour la priorité 1, 20002 pour la priorité 2 et ainsi de suite.

Personnalisation des règles d'identification des en-têtes de messages

Les règles d'identification des en-têtes de messages se configurent dans /etc/qpsmtpd/addPrivatePriorityDomain.conf.

Elles sont présentées sous la forme d'un tableau avec la syntaxe d'un hash Perl.

# Header name,			Value regexp,	Recipient type,	Priority
headerRuleList => [
[ "X-Priority",			qr/^5/,		0,		0],
[ "X-Priority",			qr/^4/,		0,		1],
[ "X-Priority",			qr/^2/,		0,		3],
[ "X-Priority",			qr/^1/,		0,		4],
[ "X-XIMF-Primary-Precedence",	qr/^priority/,	1,		3],
[ "X-XIMF-Primary-Precedence",	qr/^flash/,	1,		4],
[ "X-XIMF-Copy-Precedence",	qr/^priority/,	2,		3],
[ "X-XIMF-Copy-Precedence",	qr/^flash/,	2,		4],
],

Lorsqu'un message est traité, toutes les règles sont testées les unes après les autres. Pour chaque règle, l'en-tête de message correspondant est recherché et sa valeur est comparée avec la règle. Si elle correspond, les destinataires du type mentionné dans la règle (0 : tous les destinataires, 1 : seulement les destinataires principaux, 2 : seulement les destinataires en copie) se voient assigner la priorité indiquée dans la règle, annulant la priorité précédemment enregistrée pour ces destinataires.


Démarrage/arrêt du système de priorités

Le serveur de priorité est lancé automatiquement en service au démarrage du serveur. Les scripts utilisés sont /etc/init.d/postfix‑priority et /etc/init.d/qpsmtpd‑priority. Ils contrôlent toutes les instances Postfix configurées ainsi que Qpsmtpd.

Les services se contrôlent de manière standard sur un système Debian.

Démarrage du service :

# /etc/init.d/postfix‑priority start
# /etc/init.d/qpsmtpd‑priority start

Arrêt du service :

# /etc/init.d/postfix‑priority stop
# /etc/init.d/qpsmtpd‑priority stop

Redémarrage du service :

# /etc/init.d/postfix‑priority restart
# /etc/init.d/qpsmtpd‑priority restart

Après une mise à jour de la configuration par update‑priority‑email‑gateway, le service est automatiquement redémarré.

Supervision

Console

Le script priority‑email‑gateway‑showQueues permet à l'administrateur de visualiser l'état des différentes files (nombre de messages dans chaque file) de toutes les instances Postfix dans une console :

# priority‑email‑gateway‑showQueues
Message count in incoming, active, deferred and hold queues of all Postfix instances

 * postfix-frontend = 14
   | incoming = 1
   | active   = 12
   | deferred = 0
   | hold = 0
 * postfix0 = 0
 * postfix1 = 0
 * postfix2 = 650
   | incoming = 1
   | active   = 644
   | deferred = 0
   | hold = 5
 * postfix3 = 0
 * postfix4 = 0

Log

Il est possible de générer des statistiques sur le fonctionnement des différentes instances de Postfix à l'aide du fichier journal géré par syslog dans /var/log/mail.log. Chaque entrée est préfixée par le nom de l'instance de Postfix qui a généré l'entrée dans le journal (postfix-frontend, postfix0, postfix1, …).

SNMP

Un service lancé par cron génère toutes les minutes un état des différentes files (nombre de messages dans chaque file) de toutes les instances Postfix dans des fichiers indépendants dans MONITORING_DIR (configuré dans /etc/priority‑email‑gateway.conf, par défaut /tmp/priority‑email‑gateway‑monitoring).

Ces fichiers sont destinés à être fournis à l'agent SNMP local. Un fichier de configuration de l'agent SNMP pour ces informations est disponible dans /etc/snmp/snmpd.priority‑email‑gateway.conf. Il est généré par update‑priority‑email‑gateway et est destiné à être ajouté à la configuration locale :

# ln /etc/snmp/snmpd.priority‑email‑gateway.conf /etc/snmp/snmpd.local.conf

Suivant la configuration du serveur SNMP, il peut être nécessaire d'autoriser l'accès à ces variables en remplaçant la directive de configuration suivante dans /etc/snmp/snmpd.conf :

com2sec paranoid default public

par celle-ci :

com2sec readonly default public

Attention, la configuration par défaut de l'agent SNMP n'autorise que les connexions locales.

L'accès aux données de supervision peut se faire par exemple en interrogeant la branche NET-SNMP-EXTEND-MIB::nsExtendOutputFull :

$ snmpwalk -v 2c -c public 127.0.0.1 NET-SNMP-EXTEND-MIB::nsExtendOutputFull
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."qpsmtpdCount" = STRING: 1
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix0-hold" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix1-hold" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix2-hold" = STRING: 5
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix3-hold" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix4-hold" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix0-active" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix1-active" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix2-active" = STRING: 644
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix3-active" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix4-active" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix0-deferred" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix0-incoming" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix1-deferred" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix1-incoming" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix2-deferred" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix2-incoming" = STRING: 1
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix3-deferred" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix3-incoming" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix4-deferred" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix4-incoming" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix-frontend-hold" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix-frontend-active" = STRING: 12
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix-frontend-deferred" = STRING: 0
NET-SNMP-EXTEND-MIB::nsExtendOutputFull."postfix-frontend-incoming" = STRING: 1