Chapitre 1115 minIntermédiaire
Messagerie sous Linux : relais Postfix et IMAP avec Dovecot
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- distinguer les rôles et les ports de la messagerie ;
- configurer Postfix en relais pour les notifications d'un serveur ;
- lire un journal Postfix et gérer la file d'attente ;
- éviter un relais ouvert ;
- monter une maquette de messagerie avec Postfix et Dovecot.
3 exercices corrigés1 schéma
Postfix est un serveur de messagerie SMTP (un MTA, Mail Transfer Agent) : il envoie les courriels vers d'autres serveurs et reçoit ceux qui arrivent pour ses domaines. Dovecot est un serveur IMAP : il permet aux logiciels de messagerie de lire les boîtes aux lettres stockées sur le serveur. Ce chapitre explique les rôles et les protocoles de la messagerie, configure Postfix en relais pour que les serveurs envoient leurs alertes et leurs notifications, puis monte, pour un TP, une messagerie complète avec Postfix et Dovecot.
Les rôles et les protocoles
Un courriel traverse plusieurs logiciels, chacun avec son rôle :
| Rôle | Nom | Exemples | Protocole |
|---|---|---|---|
| Écrire et lire | MUA, le client de messagerie | Thunderbird, Outlook, un webmail, GLPI qui envoie une notification | Soumission en SMTP (587), lecture en IMAP (993) |
| Transporter | MTA, le serveur SMTP | Postfix, Exchange, les serveurs de Microsoft 365 ou de Gmail | SMTP (25) entre serveurs |
| Déposer dans la boîte | MDA | Le livreur local de Postfix, LMTP de Dovecot | Local |
| Donner accès aux boîtes | Serveur IMAP ou POP | Dovecot | IMAP (993), POP3 (995) |
| Port | Usage | Chiffrement |
|---|---|---|
| TCP 25 | SMTP entre serveurs | STARTTLS, opportuniste |
| TCP 587 | Soumission : un client ou un serveur authentifié dépose un courriel à envoyer | STARTTLS, obligatoire en pratique |
| TCP 465 | Soumission en TLS implicite | TLS dès la connexion |
| TCP 993 | IMAP en TLS | TLS dès la connexion |
| TCP 143 | IMAP, avec STARTTLS | À éviter |
Les enregistrements DNS de la messagerie (MX, SPF, DKIM, DMARC) disent quel serveur reçoit les courriels d'un domaine et quels serveurs ont le droit d'en envoyer. Ils sont présentés dans le cours Services réseau. Retiens leur conséquence pratique : un serveur qui envoie directement des courriels au nom de sorbier.example, sans figurer dans l'enregistrement SPF du domaine, verra ses messages classés comme indésirables ou refusés. C'est la raison pour laquelle les serveurs passent par le relais du fournisseur de messagerie.
Un relais pour les notifications des serveurs
Chez Sorbier, les boîtes aux lettres sont chez un fournisseur de messagerie en ligne. Les serveurs Linux ont pourtant besoin d'envoyer des courriels : notifications de GLPI, alertes de la supervision, rapports des tâches planifiées. Sur chacun, un Postfix minimal, dit satellite, accepte les courriels des programmes locaux et les relaie vers le serveur de soumission du fournisseur, smtp.sorbier.example, port 587, avec un compte dédié, alertes@sorbier.example.
Sur srv-glpi :
sudo apt install postfix libsasl2-modules mailutils
L'installation pose deux questions : choisis le type Système satellite (Satellite system), puis indique le nom de courrier srv-glpi.ad.sorbier.example et le relais [smtp.sorbier.example]:587. Complète ensuite /etc/postfix/main.cf avec postconf -e, qui modifie une valeur sans risque de faute de frappe dans le fichier :
sudo postconf -e 'inet_interfaces = loopback-only'
sudo postconf -e 'mydestination ='
sudo postconf -e 'relayhost = [smtp.sorbier.example]:587'
sudo postconf -e 'smtp_sasl_auth_enable = yes'
sudo postconf -e 'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd'
sudo postconf -e 'smtp_sasl_security_options = noanonymous'
sudo postconf -e 'smtp_tls_security_level = encrypt'
sudo postconf -e 'smtp_generic_maps = hash:/etc/postfix/generic'
| Paramètre | Rôle |
|---|---|
inet_interfaces = loopback-only | Postfix n'écoute que sur 127.0.0.1 : aucune autre machine ne peut lui confier un courriel. Ce n'est pas un relais ouvert |
mydestination = | Le serveur ne reçoit de courriel pour aucun domaine : tout part vers le relais |
relayhost = [smtp.sorbier.example]:587 | Le serveur de soumission ; les crochets interdisent la recherche d'un enregistrement MX |
smtp_sasl_* | Authentification auprès du relais, avec le compte du fichier sasl_passwd |
smtp_tls_security_level = encrypt | Refuse d'envoyer si la connexion au relais n'est pas chiffrée : le mot de passe ne part jamais en clair |
smtp_generic_maps | Réécrit les adresses internes (root@srv-glpi.ad.sorbier.example) en une vraie adresse avant l'envoi |
Le compte du relais, dans /etc/postfix/sasl_passwd :
[smtp.sorbier.example]:587 alertes@sorbier.example:Mot-De-Passe-Du-Compte
La réécriture des adresses, dans /etc/postfix/generic : tout ce qui vient de srv-glpi ou lui est adressé devient alertes@sorbier.example, une boîte lue par l'équipe :
@srv-glpi.ad.sorbier.example alertes@sorbier.example
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd /etc/postfix/generic
sudo postfix check
sudo systemctl restart postfix
postmap compile chaque fichier texte en une table indexée (sasl_passwd.db), la seule que Postfix lit : après chaque modification du fichier texte, relance postmap. Le fichier .db contient aussi le mot de passe et hérite des droits du fichier texte.
Le test.
echo "Test du relais depuis srv-glpi" | mail -s "Test relais srv-glpi" amercier@sorbier.example
sudo journalctl -u postfix@- -n 20 --no-pager
# … postfix/smtp[2214]: 4F2A1C0412: to=<amercier@sorbier.example>, relay=smtp.sorbier.example[203.0.113.40]:587,
# delay=1.2, dsn=2.0.0, status=sent (250 2.0.0 OK queued as …)
status=sent : le relais a accepté le courriel. Les autres états à connaître : status=deferred (échec temporaire, Postfix réessaiera, souvent un problème de réseau ou d'authentification) et status=bounced (refus définitif, un avis de non-remise est produit).
mailq # file d'attente : les courriels pas encore partis
sudo postqueue -f # réessayer tout de suite
sudo postsuper -d ALL deferred # vider les courriels en attente (après avoir compris pourquoi)
Dans GLPI, Configuration > Notifications : active les suivis par courriel, puis, dans la configuration des courriels, choisis l'envoi par SMTP vers 127.0.0.1, port 25, sans authentification ni chiffrement (la connexion ne sort pas de la machine), avec l'adresse d'expéditeur alertes@sorbier.example, et envoie le courriel de test.
Une messagerie complète en maquette : Postfix et Dovecot
Pour comprendre la messagerie de bout en bout (et pour l'épreuve, où l'on peut te demander de lire une configuration), monte en TP un serveur qui reçoit des courriels et les sert en IMAP. Sur une VM de laboratoire mail.sorbier.example, isolée, avec des comptes Linux locaux (adduser jlefevre) :
sudo apt install postfix dovecot-imapd
Choisis Site Internet à l'installation de Postfix, avec le nom de courrier sorbier.example. Puis :
sudo postconf -e 'myhostname = mail.sorbier.example'
sudo postconf -e 'mydomain = sorbier.example'
sudo postconf -e 'myorigin = $mydomain'
sudo postconf -e 'mydestination = $myhostname, $mydomain, localhost'
sudo postconf -e 'mynetworks = 127.0.0.0/8 [::1]/128'
sudo postconf -e 'home_mailbox = Maildir/'
sudo postconf -e 'smtpd_tls_cert_file = /etc/ssl/mail/mail.crt'
sudo postconf -e 'smtpd_tls_key_file = /etc/ssl/mail/mail.key'
sudo postconf -e 'smtpd_tls_security_level = may'
sudo postconf -e 'smtpd_sasl_type = dovecot'
sudo postconf -e 'smtpd_sasl_path = private/auth'
sudo postconf -e 'smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination'
| Paramètre | Rôle |
|---|---|
mydestination | Les domaines dont ce serveur reçoit les courriels et les livre en local |
mynetworks | Les réseaux autorisés à relayer sans authentification : ici, la machine seule |
home_mailbox = Maildir/ | Chaque courriel devient un fichier dans ~/Maildir/ de l'utilisateur, le format que Dovecot lira |
smtpd_tls_* | Le certificat présenté aux clients et aux autres serveurs (autosigné ou interne en maquette) |
smtpd_sasl_type = dovecot | Les mots de passe des clients qui veulent envoyer sont vérifiés par Dovecot |
smtpd_relay_restrictions | Relayer vers l'extérieur seulement pour la machine locale ou un client authentifié ; tout le reste est refusé |
Dans /etc/postfix/master.cf, active le service de soumission sur le port 587, réservé aux clients authentifiés et chiffrés (Debian fournit ces lignes en commentaire) :
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Dovecot 2.4, la version de Debian 13, a une syntaxe de configuration nouvelle, incompatible avec celle de la version 2.3 que montrent beaucoup de tutoriels. Debian répartit sa configuration dans /etc/dovecot/conf.d/ et lit en dernier /etc/dovecot/local.conf, où l'on met ses propres réglages :
# /etc/dovecot/local.conf
# Boîtes au format Maildir, dans le dossier personnel
mail_driver = maildir
mail_path = ~/Maildir
mail_inbox_path =
# Certificat présenté aux clients IMAP
ssl_server_cert_file = /etc/ssl/mail/mail.crt
ssl_server_key_file = /etc/ssl/mail/mail.key
# Socket d'authentification pour Postfix
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
Par défaut, Debian authentifie les comptes du système par PAM (passdb pam) et stocke les boîtes au format mbox dans /var/mail : le bloc ci-dessus passe au format Maildir, un fichier par message, plus robuste. La ligne mail_inbox_path = annule le chemin mbox de la boîte de réception défini par Debian.
sudo doveconf -n | head -30 # configuration effective : une erreur de syntaxe s'affiche ici
sudo systemctl restart dovecot postfix
sudo doveadm auth test jlefevre # vérifie le mot de passe d'un compte
Le test de bout en bout. Envoie un courriel local, vérifie qu'il est livré, puis lis-le en IMAP :
echo "Bonjour" | mail -s "Test local" jlefevre@sorbier.example
ls /home/jlefevre/Maildir/new/
openssl s_client -connect mail.sorbier.example:993 -quiet
# a1 LOGIN jlefevre motdepasse
# a2 LIST "" "*"
# a3 SELECT INBOX
# a4 FETCH 1 BODY[HEADER.FIELDS (SUBJECT FROM)]
# a5 LOGOUT
Dans un client de messagerie (Thunderbird), le compte se configure avec IMAP sur le port 993 en SSL/TLS, et SMTP sur le port 587 en STARTTLS, avec le même identifiant et le même mot de passe.
Exercices
Exercice 1 sur 3 Lire un journal Postfix Réussi À revoir
Les notifications de GLPI ne partent plus. Le journal de Postfix sur srv-glpi contient :
postfix/smtp[3121]: 7B1D2C0455: to=<amercier@sorbier.example>, relay=smtp.sorbier.example[203.0.113.40]:587, delay=0.9, dsn=4.7.0, status=deferred (SASL authentication failed; server smtp.sorbier.example[203.0.113.40] said: 535 5.7.8 Error: authentication failed)
Explique ce qui se passe, ce que deviennent les courriels, et comment corriger.
Voir la réponseMasquer la réponse de l'exercice 1
Postfix joint bien le relais et chiffre la connexion, mais le relais refuse l'authentification (code 535) : le mot de passe du compte alertes@sorbier.example a changé, a expiré, ou le fournisseur a désactivé l'authentification par mot de passe pour ce compte. L'état est deferred : les courriels restent dans la file d'attente (mailq) et Postfix réessaiera régulièrement, jusqu'à 5 jours par défaut, avant de les renvoyer en erreur.
Correction : vérifier le compte chez le fournisseur, corriger le mot de passe dans /etc/postfix/sasl_passwd, puis sudo postmap /etc/postfix/sasl_passwd, et sudo postqueue -f pour renvoyer tout de suite les courriels en attente. Vérifier ensuite dans le journal que l'état passe à status=sent. À prévoir : une alerte de supervision sur la taille de la file d'attente, pour ne pas découvrir le problème des jours plus tard.
Tu avais trouvé ?
Exercice 2 sur 3 Relais ouvert ? Réussi À revoir
Sur un serveur de maquette, un étudiant a écrit inet_interfaces = all et mynetworks = 0.0.0.0/0 « pour que les autres VM puissent envoyer ». Quel est le risque si ce serveur est un jour exposé sur Internet ? Propose une configuration qui laisse envoyer les VM du réseau de maquette 10.10.0.0/24 sans ce risque.
Voir la réponseMasquer la réponse de l'exercice 2
mynetworks = 0.0.0.0/0 déclare toute adresse IPv4 comme réseau de confiance : n'importe qui sur Internet peut faire relayer des courriels vers n'importe quelle destination. C'est un relais ouvert : il servira à envoyer du pourriel en masse, et l'adresse du serveur sera inscrite sur les listes noires, ce qui bloquera ensuite tous les courriels légitimes.
Correction : mynetworks = 127.0.0.0/8 [::1]/128 10.10.0.0/24, en gardant smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination, et le pare-feu local qui n'accepte le port 25 que du réseau de maquette. Mieux encore : que les VM s'authentifient sur le port 587 plutôt que d'être autorisées par leur adresse.
Tu avais trouvé ?
Exercice 3 sur 3 Le bon port Réussi À revoir
Pour chaque connexion, donne le port et le protocole : (a) Thunderbird envoie un courriel par le serveur de l'entreprise ; (b) le serveur de l'entreprise transmet ce courriel au serveur du destinataire ; (c) Thunderbird relève les courriels en les laissant sur le serveur ; (d) Postfix de srv-glpi dépose une notification chez le relais du fournisseur.
Voir la réponseMasquer la réponse de l'exercice 3
- (a) SMTP de soumission, TCP 587 avec STARTTLS et authentification (ou 465 en TLS implicite).
- (b) SMTP, TCP 25, de serveur à serveur, le serveur destinataire étant trouvé par son enregistrement MX.
- (c) IMAP, TCP 993 en TLS : les courriels restent sur le serveur, synchronisés entre les appareils. POP3 (995) les téléchargerait en général pour les supprimer du serveur.
- (d) SMTP de soumission, TCP 587, authentifié et chiffré (
smtp_tls_security_level = encrypt).
Tu avais trouvé ?