La première chose qui frappe, quand on se plonge dans la documentation fournie
avec postfix est son apparente simplicité... Finie la syntaxe ésotérique
du sendmail.cf, finie la nécessité de passer par une ensemble de macros
pour oser espérer comprendre un tant soit peu ce que l'on est en train de
configurer : avec postfix tout se passe par l'adaptation d'un seul
fichier, main.cf, normalement placé, comme tous ses autres fichiers de
configuration, dans le répertoire /etc/postfix/. Enfin,
presque... nous verrons plus tard que d'autres fichiers doivent être adaptés,
mais tous ces fichiers quels qu'ils soient sont humainement lisibles et
richement commentés.
À la différence de sendmail, programme monolithique par excellence,
postfix est composé de nombreux petits programmes réalisant chacun une
tâche bien définie. Pour la plupart, ces programmes ne sont pas vus de
l'utilisateur mais appelés directement par le programme serveur
/usr/sbin/postfix, lui-même lancé au démarrage du système via un
script, selon la méthode System V habituelle (en tous cas, sur les systèmes
Linux). Sur mon système, le script en question s'appelle
/etc/init.d/postfix/, j'utiliserai donc cet emplacement dans ce qui
suit, adaptez selon le vôtre.
postfixAinsi que nous venons de le dire, c'est le script /etc/init.d/postfix
(auquel le processus init passe l'option start) qui lance le serveur
/usr/sbin/postfix. Celui-ci lance à son tour le serveur principal,
/usr/lib/postfix/master qui prend alors les choses en main et
s'occupera de lancer les autres démons selon les besoins. Ces démons se
termineront après avoir accompli leurs tâches ou après une certaine période
d'inactivité. Seul le démon de gestion de la file d'attente, reste en
permanence en activité.
Tout ceci peut se vérifier par une simple commande ps :
$ ps axf
...
583 ? S 0:00 /usr/lib/postfix/master
584 ? S 0:00 \_ pickup -t fifo -c
585 ? S 0:00 \_ qmgr -t fifo -u -c
...
qui met en évidence la présence du démon master et le fait qu'il a
lui-même lancé les démons pickup et qmgr.
pickup est responsable de la récupération des courriers locaux : pour
des raisons de compatibilité, postfix utilise un programme nommé
/usr/sbin/sendmail (qui n'est pas le programme sendmail que
nous évoquions plus haut). Ce programme est utilisé pour déposer les courriers
locaux dans la file d'attente maildrop : tous les courriers qui sont
postés par tous les utilisateurs sont déposés dans cette file.
pickup s'occupe de les récupérer et de les passer au démon cleanup
qui s'occupera de remplir les en-têtes manquants, de gérer les enveloppes des
messages et les déposera enfin dans une autre file d'attente, nommée
incoming. Puis, cleanup avertira le gestionnaire de file d'attente,
qmgr, qu'un nouveau courrier est arrivé.
qmgr s'occupera alors de délivrer le courrier dans les boîtes aux lettres
de leurs destinataires et de gérer les délivrances qui ont échoué.
Nous verrons plus loin les autres démons entrant en jeu dans la délivrance du
courrier. Passons maintenant à une configuration minimum pour tester
postfix en local.
Notre but, ici, est d'arriver à poster et recevoir du courrier en local :
par exemple, root doit pouvoir poster un message à l'utilisateur
babe. Ce dernier doit pouvoir récupérer le message, le lire et répondre à
root. Pour simplifier, nous utiliserons le programme canonique mail.
Nous supposerons que notre machine s'appelle alex et que notre domaine
s'appelle linux-france.com. Vérifions tout de suite que c'est le
cas :
$ hostname
alex.linux-france.com
Ainsi que nous l'avons déjà dit, la majeure partie du travail consiste à
adapter le fichier /etc/postfix/main.cf à nos besoins. Bien entendu,
tout cela doit se faire sous le compte root.
La première chose à faire est de sauvegarder le fichier original :
alex:/etc/postfix# cp main.cf main.cf.0
Puis, chargez /etc/postfix/main.cf dans votre éditeur de texte
favori.
Normalement un certain nombre d'options sont déjà positionnées, certaines conviennent, d'autre non. Voici les lignes qui nous intéressent (les commentaires ont été supprimés) :
# INFORMATIONS SUR LES REPERTOIRES LOCAUX
queue_directory = /var/spool/postfix
program_directory = /usr/lib/postfix
daemon_directory = /usr/lib/postfix
# POSSESSION DES FILES D'ATTENTE ET DES PROCESSUS
mail_owner = postfix
# NOMS DE LA MACHINE ET DU DOMAINE
myhostname = alex.linux-france.com
mydomain = linux-france.com
# POUR L'ENVOI DU COURRIER
myorigin = $myhostname
# POUR LA RECEPTION DU COURRIER
mydestination = $myhostname, localhost
# MODE DE TRANSPORT
default_transport = smtp
# GESTION DES ALIAS
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# DELIVRANCE DU COURRIER
mailbox_command = /usr/bin/procmail
# CONTROLE DES COURRIERS
mynetworks = 192.168.2.0/24,127.0.0.0/8
# DELIVRANCES SIMULTANEES A LA MEME DESTINATION
local_destination_concurrency_limit = 2
default_destination_concurrency_limit = 10
Assurez-vous que tous les autres lignes soient considérées comme des
commentaires en les faisant précéder du caractère dièse (#).
Avant de tester tout cela, détaillons rapidement les options choisies (pour des renseignements plus précis, reportez-vous aux pages de manuel et à la documentation fournie avec le programme).
La première section sert à spécifier les emplacements :
/var/spool/postfix est le répertoire de base pour toutes les
files d'attente de postfix, Lors de son premier lancement, postfix
créera tous les sous-répertoires pour ses files sous ce répertoire ;
usr/lib/postfix est le répertoire de base de postfix :
c'est là que se trouvent tous les programmes serveurs qu'il utilise ;La deuxième section précise qui est le propriétaire de la file d'attente et de
la plupart des processus serveurs de postfix. Ici, nous avons gardé la
proposition initiale, après avoir créé l'utilisateur postfix. Voici son
entrée dans notre fichier /etc/passwd :
postfix:x:101:101::/var/spool/postfix:/bin/false
Le x dans la partie mot de passe vient du fait que nous utilisons les
« shadow passwords ». Le groupe 101 correspond au groupe
postfix, lui aussi créé pour l'occasion :
alex:/etc/postfix# grep 101 /etc/group
postfix:x:101:
La troisième section sert à indiquer le nom complet de notre machine et le nom du domaine.
La section suivante concerne l'envoi du courrier : elle permet de
renseigner postfix sur le domaine qui a posté. Pour le moment, nous
considérerons que c'est ce que contient le paramètre $mydomain.
La section concernant la réception des courriers est, là encore, très
simple : on indique la liste des domaines qui seront considérés comme
terminaux pour l'acheminement du courrier. Pour notre configuration en local,
$myhostname et localhost conviennent.
Nous indiquons ensuite le protocole utilisé pour l'acheminement du
courrier. Pour l'instant, postfix ne reconnait que smtp et
uucp.
La gestion des alias fait appel au fichier /etc/aliases utilisé par
ces prédécesseurs. La commande man aliases vous renseignera en détail sur
le format de ce fichier. Disons simplement que comme son nom l'indique, il
permet de définir des alias entre des noms de destinataires. Ainsi, par
exemple, un serveur de news poste quotidiennement un rapport sur ses activités
à l'utilisateur news. Supposons que babe soit l'administrateur des
news sur alex : pour qu'il puisse recevoir ces
messages, et si root est d'accord, bien entendu, il suffit d'indiquer que
le destinataire news à pour alias babe. Ceci est réalisé par l'ajout
de la ligne suivante dans /etc/aliases :
news: babe
Pour des raisons d'optimisation, postfix, comme ses prédécesseurs, demande
à ce que ce fichier soit traité comme une base de données au format DBM ou
DB. Pour générer ces formats, on utilise l'utilitaire
/usr/sbin/postalias. Ma machine ne reconnaissant pas le format DBM,
j'ai donc opté pour le second et produit la base à l'aide de la commande :
alex:/etc/postfix# postalias hash:/etc/aliases
qui m'a produit le fichier /etc/aliases.db.
La section concernant la délivrance du courrier indique ici que nous souhaitons
utiliser procmail pour cette tâche. Tout autre programme ayant la même
fonction peut convenir (deliver, par exemple), mais procmail est le
plus connu dans le monde Linux.
La partie suivante concerne le filtrage des courriers, postfix dispose de
mécanisme permettant de rejeter les indésirables et ici nous indiquons
simplement que seul le réseau de classe A, 127.0.0.0 (aka localnet) est
local pour notre machine.
Enfin, nous indiquons que les messages locaux ne pourront être envoyés simultanément que par 2 au maximum, tous les autres pourront être envoyés par 10 au maximum. Attention à ne pas vouloir pousser ces limites sous peine de débordement du système de courrier !
Avant de lancer postfix, assurez-vous qu'il ne tourne pas en faisant
simplement :
alex:/etc/postfix# postfix stop
Puis, éditez le fichier /etc/postfic/master.cf et mettez un dièse
(#) devant la ligne :
smtp inet n - - - - smtpd
sinon, postfix se plaindra que le port 25 est déjà occupé...
Enfin, faites :
alex:/etc/postfix# postfix start
et, à l'aide de la commande ps axf, vérifiez la présence des démons
master, pickup et qmgr. Si vous ne les voyez pas, c'est qu'il y
a eu un problème : consultez les fichiers /var/log/mail.* pour
tenter d'en rechercher la cause.
Si tout c'est bien passé, root va pouvoir envoyer un courrier à
babe :
alex:/etc/postfix# mail jaco -s test
premier test local
.
Cc:
alex:/etc/postfix#
Immédiatement, babe a dû recevoir ce courrier :
$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/jaco": 1 message 1 new
>N 1 root@alex.linux-france.com. Wed Jan 20 01:46 12/424 "test"
& 1
Message 1:
From root@alex.linux-france.com Wed Jan 20 01:46:10 1999
Delivered-To: jaco@alex.linux-france.com
To: jaco@alex.linux-france.com
Subject: test
Date: Wed, 20 Jan 1999 01:46:10 +0100 (CET)
From: root@alex.linux-france.com
premier test local
& d
& q
$
On notera la présence d'un champ Delivered-To: : il est rajouté par
postfix afin d'éviter les boucles dans la délivrance du courrier et ne
sera pas affiché par défaut avec la plupart des logiciels de lecture du
courrier (en tous cas, avec gnus et netscape).
Essayons encore : maintenant postez sous le compte babe un message à
root et vite, très vite, faites ps axf. Vous devriez voir les lignes
suivantes :
1271 ? S 0:00 /usr/lib/postfix/master
1272 ? S 0:00 \_ pickup -t fifo -c
1273 ? S 0:00 \_ qmgr -t fifo -u -c
1286 ? S 0:00 \_ cleanup -t unix -u -c
1287 ? S 0:00 \_ trivial-rewrite -n rewrite -t unix -u -c
1288 ? S 0:00 \_ local -t unix
Assez rapidement, vous remarquerez, si vous faites la même commande que
cleanup et local se sont terminés, tandis que trivial-rewrite
perdure encore un peu. Lui aussi se terminera à son tour.
Tout ceci corrobore ce que nous disions plus haut : pickup a récupéré
le message et l'a passé à cleanup. trivial-rewrite s'est chargé de
réécrire l'adresse en rajoutant le nom de la machine locale derrière le nom de
l'utilisateur. local est le démon responsable de la délivrance locale du
message dans la boîte aux lettres du destinataire. C'est à ce moment que le
fichier des alias est pris en compte et, si le destinataire utilise un
fichier ~/.forward, local le fait suivre à l'adresse
indiquée. C'est local qui ajoute le champ Delivered-To: pour éviter
un bouclage intempestif et c'est lui qui remplit le champ From de
l'enveloppe (à ne pas confondre avec le champ From:...).
Pour finir cette partie, il ne vous reste plus qu'à essayer de faire la même
chose avec vos logiciels de lecture de courrier favoris : cela ne devrait
pas poser de problème puisque local délivre les messages à l'endroit où la
plupart des logiciels s'attendent à les trouver.