Serveur de Messagerie
M3204-SEANCE 5
Patrice Gommery – Avril 2021
Partie 1 : Maintenance du système
En tant qu'administrateur, Postfix met à votre disposition plusieurs commandes permettant notamment de gérer la file d'attente des messages :
postqueue -p : Permet de voir les messages en attente postqueue -f : Permet de forcer l'envoi des messages en attente postsuper -d ID : Permet de supprimer un message de la file d'attente
(ID étant le n° d'identification du message dans la file d'attente, visible avec postqueue -p) postsuper -d ALL : Permet de supprimer tous les messages en attente
( A utiliser avec modération, les messages sont définitivement perdus) postsuper -h ALL : "Gèle" l'envoi des messages
postsuper -H ALL : "Dégèle" l'envoi des messages
Afin de mieux comprendre le cheminement d'un message, essayons d'envoyer un message de notre serveur vers une destination inconnue.
Ouvrez Mutt et envoyer un message à : [email protected]
(Cette adresse Mail n'existe pas, mais le serveur MX existe sur le DNS)
Revenez sur le serveur et ouvrez la file d'attente avec la commande postqueue -p
Vous devriez obtenir un affichage du type :
On voit ici, que notre message n'est pas parti et est resté dans la file d'attente.
L'expéditeur n'est pas averti de cet état, le serveur fera plusieurs tentatives d'envoi avant de lui envoyer un message d'erreur. Les informations affichées sont les suivantes : Queue ID : L'identifiant du message dans la file d'attente.
Size : Sa taille en Octets
Arrival Time : La date et l'heure d'arrivée du message dans la file d'attente Sender/Recipient : L'expéditeur du Message / Le destinataire
Ainsi que la raison de la non-délivrance du message, ici : No Route to host
(Notre serveur à bien résolu le nom de domaine en IP, mais elle n'est pas joignable)
Essayons d'avoir plus d'informations sur ce message. Pour cela nous pouvons consulter les logs de Postfix. Le fichier de log se nomme /var/log/mail.log
Pour voir les informations de notre message : less /var/log/mail.log | grep ID (remplacer ID par l'identifiant du message vu avec postqueue -p)
Vous devriez obtenir quelque chose ressemblant à ceci :
Nous avons ici tout le parcours de notre message sur le serveur Postfix avec son traitement par les différents processus :
SMTPD : Le message arrive sur le serveur, on identifie le client. Ici localhost:127.0.0.1 (Le message a été envoyé via Squirrelmail, l'application PHP tourne en local)
CLEANUP : Le processus Cleanup nomme le message. On voit encore ici que le message a été envoyé via squirrelmail à partir de la machine mail.domprof.net
QMGR : Le message ayant été accepté par Cleanup, il est placé en file d'attente.
On identifie ici l'expéditeur (from) du mail : [email protected]
SMTP : Le destinataire du message ([email protected]) étant un utilisateur externe à notre domaine (domprof.net), celui-ci est confié au processus SMTP qui va essayer de l'envoyer au serveur MX du domaine distant (dom1102.net). L'action échoue : No Route to Host (il n'a pas pu communiquer avec le serveur MX du domaine distant).
QMGR : Le processus smtp ayant échoué, le message est remis en file d'attente.
SMTP : Nouvelle tentative de smtp pour remettre le message au serveur destinataire.
Cet enchainement QMGR/SMTP va se répéter tant que le message sera dans la file d'attente et que les délais ne seront pas dépassés.
Pendant combien de temps le serveur conservera le message en file d'attente ?
Par défaut, le message sera conservé pendant 5 jours avec des intervalles de tentatives d'envoi de 300s, puis 600ms, puis 1200s etc, jusqu'à 4000s .
La valeur par défaut de ces valeurs peut être consultée avec la commande : postconf Pour les modifier, il suffit de les ajouter dans le fichier main.cf (et de recharger postfix) Quelles sont les valeurs à modifier pour réduire le temps de conversation et les délais d'envoi ?
maximal_queue_lifetime (Défaut 5d) :Durée de vie du message dans la file d'attente
queue_run_delay (Défaut 300s) :Délai pour la première tentative de renvoi minimal_backoff_time (Défaut 300s) :Délai minimum pour la prochaine tentative maximal_backoff_time (Défaut 4000s) :Délai maximum pour la prochaine tentative Vous pouvez utiliser les unités de temps suivantes :
s (secondes), m (minutes), h (heures), d (jours), w (semaines)
Exercice : Réduisez la durée de vie d'un message en file d'attente à 2 minutes
Forcez une nouvelle tentative d'envoi du message avec la commande postqueue -f Vérifiez que votre message sort bien de la file d'attente avec postqueue -p
Regardez de nouveau dans les logs en filtrant (grep) sur l'ID du message.
Vous devriez constater que votre message a fini par être supprimé (removed) : Dans QMGR : status =expired, puis en dernier ligne : removed
Dans BOUNCE : Une notification a été envoyée, ID du message BC63D248B0 Qu'est-ce que BOUNCE ?
C'est le processus chargé d'envoyer les messages de non-délivrance à l'expéditeur du message. Ici si on regarde les logs concernant ce message (ID = BC63D248B0)
On voit que le "BOUNCE" a été expédié (to) à : [email protected] qui était l'expéditeur du message original. On voit aussi que c'est le processus LOCAL qui a remis le message au format maildir : status=sent (delivered to maildir)
Les logs sont donc une vrai source d'information lorsqu'il s'agit de savoir si un message a été reçu, expédié, remis dans une boîtes aux lettres ou simplement supprimé.
Bien comprendre le fonctionnement de Postfix et la structure de ses logs est donc important pour gérer son serveur de mails et résoudre les problèmes de messages perdus, supposés arrivés etc ... Dans la suite de ce TP vous allez recevoir et expédier un grand nombre de mails, certains seront légitimes, d'autres pas. Seuls une analyse des logs vous permettra de savoir si vos mails ont été distribués correctement (que ce soit en émission ou en réception).
Quelques rappels :
• Le nom du fichier de log est : /var/log/mail.log
• Pour le consulter utilisez plutôt la commande less (au lieu de nano) associée à un grep pour filtrer les lignes qui vous intéressent.
• La syntaxe sera alors : less /var/log/mail.log | grep FILTRE
• FILTRE peut être n'importe quelle valeur : l'ID d'un message que vous avez récupéré avec postqueue, l'adresse mail de l'expéditeur ou du destinataire du message, le nom d'un processus (qmgr, cleanup etc ...)
• Vous pouvez enchaîner plusieurs filtres en les séparant par des "pipes" |
Exemple : less /var/log/mail.log | grep prof@domprof | grep local | grep sent vous donnerait la liste des mails reçus en local par l'utilisateur prof
• Chaque ligne précise le processus par lequel passe le message :
• SMTPD : Traitent les messages reçus (d'un client ou d'un autre serveur)
• CLEANUP : vérifie la légitimité du message avant de le mettre en file d'attente
• QMGR : traitement de la file d'attente
• LOCAL : Remise d'un message en local
• SMTP : Envoi d'un message vers une autre serveur
• BOUNCE : remise d'un message de non-délivrance
EXERCICE : Affichez et filtrez les logs concernant un message de réponse du prof reçu dans les TPs précédents (ou demandez un nouveau message au prof) . Enregistrez le résultat de votre filtre dans un fichier nommé logs.txt. Utilisez comme sujet de message : LOGS VMID Pour afficher, filtrez les logs et envoyer le résultat dans un fichier, utilisez la syntaxe : cat /var/logs/mail.log | grep Message-ID > /home/pnom/logs.txt