Retrouvez cet article dans : Linux Magazine 86
Haute disponibilité avec les champs MX
Nous commencerons ici avec un petit rappel sur le fonctionnement du routage Internet. Pour expédier un message à utilisateur@domaine.com, le serveur de messagerie interroge le DNS pour trouver les échangeurs de messagerie correspondant à domaine.com. Exemple de requête MX : [1] Cyrus-Imap est un logiciel serveur IMAP4 et gestionnaire de boîtes aux lettres. Il est un des rares à implémenter complètement et correctement la norme IMAP4. Il fournit également un serveur POP3 et un serveur de news.$ host -t MX free.fr free.fr mail is handled by 10 mx.free.fr. free.fr mail is handled by 30 mrelay1-2.free.fr. free.fr mail is handled by 30 mrelay2-1.free.fr. free.fr mail is handled by 30 mrelay2-2.free.fr. free.fr mail is handled by 40 mx1-1.free.fr.Comme on le voit ici, un domaine dispose en général de plusieurs échangeurs de messagerie avec des poids respectifs (ici de 10 à 40). Le serveur va tenter d’expédier le message au serveur disposant du poids le plus faible et en cas d’échec, essaie les autres dans l’ordre croissant des poids. Lorsque plusieurs serveurs ont le même, Postfix répartit la charge. Si la livraison échoue, le message est remis en file d’attente en attendant la tentative de livraison suivante. En revanche, si aucun enregistrement MX n’est trouvé dans le DNS, les échangeurs effectuent une recherche sur les enregistrements de type A (correspondant à des adresses du type utilisateur@machine). Dans Postfix, ce comportement se traduit par la configuration par défaut suivante dans le fichier de configuration
default_transport = smtpCe paramètre s’applique à tous les messages dont Postfix n’est pas la destination finale. Dans le cas où notre serveur n’est pas un enregistré comme MX sur Internet, il y a de fortes chances pour que nous ne puissions pas livrer directement le courrier car les serveurs distants nous rejetteront. La solution consiste alors à passer par le serveur SMTP de notre fournisseur d’accès :
relayhost = smtp.mon.faiTel qu’est écrite cette ligne, si le serveur
relayhost = un.(sous).domaine # ou relayhost = [une.machine] # ou encore relayhost = [10.1.2.3]Si on utilise Postfix sur une passerelle censée renvoyer le courrier interne à un autre serveur, on peut utiliser les champs MX pour créer un système de meilleure disponibilité. L’astuce consiste à créer un sous-domaine comme suit :
interne.mon.domaine. MX 10 serveur1 interne.mon.domaine. MX 10 serveur2 interne.mon.domaine. MX 10 serveur3La table transport de la passerelle contiendra alors :
mon.domaine smtp:interne.mon.domaineOn peut bien entendu jouer sur les poids pour privilégier certains serveurs. Cette astuce est bien entendu valable dans toutes les directives appelant des transporteurs (voir plus bas) telles
Le système de transport de Postfix
Dans la formuleDéfinition des transporteurs
Une entrée de mysmtp unix - - - - - smtp
-o <éventuelle(s) option(s)>
Le premier argument nous donne le nom du service qui nous servira dans - dans le fichier
master.cfpour les paramètres passés au processus (smtpici). Elles sont insérées chacune derrière un-o. Par exemple, on peut redéfinirsmtp_helo_name :-o smtp_helo_name=autre.nom. On peut également agir sur les autres paramètres de la ligne tel le nombre maximum de processus lancés [6] ; - dans
main.cfpour les paramètres passés au gestionnaire des files d’attente (qmgr) : chaque transporteur dispose de ses propres paramètres concernant par exemple le nombre maximum de destinataires. Elles sont définies partransporteur_nom_d_optionet ont comme valeur par défautdefault_nom_d_option. Par exemple, pour ne pas dépasser 30 destinataires à la fois dans notre transporteurmysmtp, on utilise :mysmtp_destination_recipient_limit = 30 [4].
 mysmtp unix - - - - 10 smtppuis dans
initial_destination_concurrency = 200Ceci ne change rien pour les autres transporteurs qui restent limités parmysmtp_destination_concurrency_limit=200
Desserte locale
Comme Sendmail et les autres logiciels de routage de courrier, le métier initial de Postfix n’est pas de gérer des boîtes aux lettres, mais de router le courrier. Toutefois, il peut gérer le stockage du courrier selon les méthodes UNIX traditionnelles " mailbox " ou " maildir ". Par défaut, la première méthode est utilisée et les messages sont stockés dans les fichiers- Dès la réception de la commande
RCPT TO, Postfix vérifie que le message correspond à un utilisateur enregistré en consultant les tables passées au paramètrelocal_recipient_mapset le rejette sinon. Dans les versions 1.x de Postfix, ce paramètre était laissé vide. Le message n’était donc pas contrôlé à son arrivée, générant ainsi des accusés de non-remise pour lorsque le destinataire était inconnu. A partir de Postfix 2,local_recipient_mapspointe par défaut sur la base des comptes UNIX et celle des alias (/etc/aliases). - Le gestionnaire des files d’attente attribue le message au transporteur déclaré dans
local_transport : par défaut, c’est l’entréelocaldemaster.cfqui appelle le démon du même nom. - Le démon
localgère ensuite les réécritures d’adresses si le destinataire se trouve dans/etc/aliasesou si l’utilisateur existe et dispose d’un fichier.forward. - Si le destinataire est trouvé dans une table
mailbox_transport_mapsou si le paramètremailbox_transportest renseigné, local délègue la livraison. - Sinon, le message est livré dans le fichier utilisateur du répertoire
/var/spool/mail.
 local_transport =
lmtp:unix:/var/cyrus/soc
où mailbox_transport =
lmtp:unix:/var/cyrus/soc
Il nous reste à gérer le problème du rejet des destinataires ne disposant pas de comptes UNIX. Pour ce faire, deux solutions :
- Omettre la vérification en vidant le paramètre
local_recipient_maps. Cette solution présente l’inconvénient de devoir générer les accusés de non-remise. - Renseigner
local_recipient_mapsavec une table renvoyant quelque chose si l’utilisateur est valide. On peut utiliser ici une table LDAP [voir encadré] mais, si votre serveur est très chargé, il est préférable d’interroger régulièrement l’annuaire avec un script cron qui crée un fichier local car les consultations LDAP ralentissent le traitement du courrier et nécessitent un serveur LDAP très disponible. Comme Postfix ne tient pas compte de la valeur renvoyée, vous pouvez utiliser une table construite à d’autres fins (contrôle d’accès, etc.).
# main.cf
alias_maps =
proxy:ldap:/etc/postfix/ldap.cf
# /etc/postfix/ldap.cf
# Connexion
server_host = ldap.mon.domaine
search_base = dc=mon,dc=domaine
bind = no
# requête LDAP
query_filter = (mail=%s)
# attribut LDAP contenant le résultat
result_attribute = mailbox
Le système est très simple : on appelle un fichier qui contient les paramètres de connexion, la requête à effectuer et l’attribut à lire. La variable Gérer plusieurs systèmes dans un même domaine
Dans cet exemple, nous sommes confrontés à une migration progressive du système interne de messagerie sans interruption globale de service. Le serveur Postfix que nous configurons est une passerelle qui va devoir gérer l’aiguillage. Nous nous trouvons donc avec des utilisateurs du même domaine mais répartis sur plusieurs systèmes, un routage habituel des messages avec les tables# main.cf transport_maps = /etc/postfix/transport # /etc/postfix/transport user1@domaine.fr smtp:mx-système1 user2@domaine.fr smtp:mx-système2 ...On peut également utiliser une table LDAP, avec la réserve indiquée dans l’encadré, ou encore une table SQL. Nous utilisons toujours des champs MX comme proposé dans le premier paragraphe de cet article pour garantir une certaine disponibilité. Pour le courrier sortant, nous devons indiquer aux deux systèmes de passer par notre passerelle, ce qui ne pose pas de difficultés. Le problème majeur restant est d’expliquer aux deux systèmes qu’ils ne détiennent pas la totalité de la base des comptes. Quelques exemples : cette configuration ne pose pas de problèmes à Postfix (il suffit d’écrire la table de transport) ni à Exchange 2000 qui dispose d’un paramètre permettant de renvoyer à un autre serveur le courrier du domaine n’ayant pas trouvé de destinataire (on peut aussi renseigner l’annuaire avec les paramètres de l’autre serveur). En revanche, pour Exchange 5, cette configuration est plus délicate. L’astuce consiste à changer le domaine qu’il considère être le sien :
- Chaque utilisateur dispose de deux adresses dans l’annuaire : user1@domaine.fr et user1@bidon.fr.
# main.cf
alias_maps =
proxy:mysql:/etc/postfix/mysql
# /etc/postfix/mysql
user = nom-de-connexion
password = mot-de-passe
dbname = nom-de-la-BD
query = SELECT ‘smtp:[‘ mailhost ‘]’ \
FROM users WHERE mail=’%s’
On obtient ainsi ce qu’attend Postfix (" - pouvoir consulter une table qui se trouve en dehors de la cage
chroot, - mutualiser les connexions.
 alias_maps =      proxy:mysql:/etc/postfix/mysqlOn ne peut en revanche l’utiliser partout. La liste des paramètres de
- Le domaine interne d’Exchange est bidon.fr.
- Les adresses sortantes sont réécrites de user1@bidon.fr en user1@domaine.fr.
# main.cf sender_canonical_maps = \ pcre:/etc/postfix/expedition recipient_canonical_maps = \ hash:/etc/postfix/reception # /etc/postfix/expedition /^([^@]+)@bidon\.fr/ $1@domaine.fr # /etc/postfix/reception user2@domaine.fr user2@bidon.fr ...On ne peut utiliser d’expressions régulières pour les messages entrants car cela ne concerne qu’une partie de nos utilisateurs. En revanche, ces réécritures nous évitent le routage par utilisateur car, en sortant de Postfix, les utilisateurs des deux systèmes ne se trouvent plus dans le même domaine :
# /etc/postfix/transport bidon.fr  smtp:mx-exchange5 domaine.fr smtp:mx-exchange2k
Duplication de messages
Postfix offre la possibilité d’effectuer à la volée des copies cachées (dites " BCC "). On peut intégralement dupliquer le courrier passant par Postfix en utilisant sender_bcc_maps = \
pcre:/etc/postfix/hotlines
recipient_bcc_maps = $sender_bcc_maps
# /etc/postfix/hotlines
/^(hotline[^@]+)@domaine.fr$/ $1@sauv.fr
L’astuce utilisée ici consiste à créer un domaine de messagerie (Conclusion
Cet article ne couvre bien entendu pas l’étendue des possibilités de configuration du routage dans Postfix, mais comme les exemples de la documentation en ligne [2] apportent une solution à la plupart des configurations standards, j’ai choisi quelques problèmes qui pourront peut-être vous donner des idées si vous en rencontrez de similaires. La découverte du fonctionnement du fichier- Documentation de Postfix : http://www.postfix.org/documentation.html
- Traduction de la documentation par l’auteur : http://postfix.traduc.org/
- Cyrus-Imap : http://asg.web.cmu.edu/cyrus/imapd/Â
- Postfix avec Cyrus-Imap : http://www.linuxorable.net/1-Cyrus-IMAP-58-installer-Cyrus.html
Retrouvez cet article dans : Linux Magazine 86





Donnez votre avis
Vous devez avoir ouvert une session pour écrire un commentaire.