Serveur de messagerie avec Postfix et Dovecot Première partie : Mise en place du MTA (Mail Transfert Agent)

Dans cet article, nous allons installer et configurer Postfix sur une machine tournant sous Debian 11 ( dit « Bullseye »).

L’objectif est de le configurer pour qu’il soit un MTA capable de transmettre et de recevoir des e-mails pour un nom de domaine personnel.

On va également créer un enregistrement SPF, et un enregistrement DMARC, sur notre nom de domaine pour nous prémunir contre l’usurpation des adresses e-mails de notre domaine, et améliorer la « déliverabilité » générale de nos messages.

Pré-requis

Pour la mise en place d’un serveur de messagerie, vous avez besoin de :

  • un serveur dédié (physique ou virtuel) sous Debian 11 de préférence
  • une adresse IP publique configurée sur ce serveur
  • les droits « root »
  • un nom de domaine, qui sera utilisé pour vos adresses e-mails
  • la possibilité de modifier la zone DNS de ce nom de domaine
  • choisir un nom d’hôte, qu’on utilisera pour tous les services déployés et donc le certificat TLS

En ce qui me concerne, je réalise la mise en place de mon serveur de messagerie sur un VPS sous Debian 11, dont l’IP publique est 46.255.162.79.
Le nom de domaine de mes e-mails sera mashi.fr et j’ai choisi de nommer mon serveur de messagerie mail.mashi.fr.
Mon nom d’utilisateur sur mon serveur est olivier, membre du groupe sudo.

Configuration du système d’exploitation

On va ajouter le nom d’hôte utilisé par Postfix et Dovecot dans le fichier hosts du système d’exploitation, pour nous assurer que les liens entre les différents services se réalisent via l’interface loopback.
Vous pouvez le faire en ouvrant le fichier /etc/hosts avec votre éditeur de texte préféré, ou en exécutant la commande suivante :

sudo echo "127.0.0.1 mail.mashi.fr" >> /etc/hosts

Édition de la zone DNS du nom de domaine

Ces opérations sont à effectuer sur le serveur DNS de votre nom de domaine.
En principe, vous trouverez une interface dédié à l’édition de la zone DNS de votre domaine sur le site de son bureau d’enregistrement.

On va ajouter à la zone DNS de notre nom de domaine :

  • un enregistrement de type A pour faire correspondre le nom du serveur de messagerie avec son IP
  • un enregistrement de type MX pour définir le serveur de messagerie de votre nom de domaine
  • un enregistrement de type TXT pour la déclaration du SPF
  • un enregistrement de type TXT pour la déclaration du DMARC

Ainsi, dans mon cas :

mail	 A	 46.255.162.79
@	 MX	 10 mail.mashi.fr.
@	 TXT	 "v=spf1 ip4:46.255.162.79 -all"
_dmarc	 TXT	 "v=DMARC1; p=quarantine; aspf=s; adkim=r; rua=mailto:postmaster@mashi.fr; ruf=mailto:postmaster@mashi.fr"

Dans le SPF, on indique la liste des serveurs depuis lesquels on va envoyer des e-mails. Ici, je ne déclare strictement (« -all ») que mon serveur de messagerie : « ip4:46.255.162.79 ».

Dans le DMARC, on indique que les e-mails ne répondant pas aux politiques SPF (=s pour strict) et DKIM(=r pour relax) du domaine, doivent être mis en spam (=quarantine).
On demande également à ce que les rapports de traitement soient transmis à postmaster@mashi.fr.

Donc, si le teste SPF effectué par le destinataire est en erreur, on demande à ce que le courriel soit mis en SPAM, mais revanche, si le test DKIM est en défaut, ce n’est pas important.

Laissons les enregistrements DNS se propager, pendant que l’on installe et configure Postfix.

Postfix

Installation

Postfix étant intégré dans les dépôts de Debian, on va l’installer avec apt :

sudo apt -y install postfix

Un « assistant d’installation » vous pose alors quelques questions qui vont permettre de générer un fichier de configuration pour Postfix. Toutefois, comme nous allons éditer ce fichier, vous pouvez répondre n’importe quoi et appuyer sur la touche « entrée » de votre clavier, autant de fois que nécessaire.

Voilà, Postfix est installé.

Je vous recommande également d’installer le paquet bsd-mailx, qui ajoute la commande mail, très pratique pour réaliser des tests en ligne de commande.

Configuration

La configuration de Postfix se trouve dans le fichier /etc/postfix/main.cf
La configuration des services de Postfix se trouve dans le fichier /etc/postfix/master.cf

Pour éditer et consulter la configuration de Postfix, nous allons utiliser la commande postconf. Cela nous évitera d’intervenir à la main dans les fichiers sus-cités.

Les commandes utilisées seront :

  • sudo postconf -h 'nom_du_paramètre', pour obtenir la valeur du-dit paramètre.
  • sudo postconf 'nom_du_paramètre=valeur', pour ajouter une valeur au-dit paramètre.
  • sudo postconf -X 'nom_du_paramètre', pour supprimer un paramètre.

Pour commencer, on va définir les interfaces d’écoute, et le(s) protocole(s) IP qu’on souhaite utiliser.
Dans mon cas, je souhaite écouter sur mon IP publique et l’interface loopback :

sudo postconf 'inet_interfaces=127.0.0.1, 46.255.162.79'

et le tout en IPv4 uniquement :

sudo postconf 'inet_protocols=ipv4'

Il est obligatoire de relancer Postfix pour appliquer les paramètres inet_interfaces et inet_protocols :
sudo systemctl restart postfix

Définissons maintenant le nom d’hôte du serveur (myhostname), qui sera annoncé dans les transactions avec les autres MTA et MDA, et qui apparaîtra dans les en-têtes de vos e-mails :

sudo postconf 'myhostname=mail.mashi.fr'

et le nom de domaine par défaut des e-mails envoyés par le serveur (myorigin) :

sudo postconf 'myorigin=mashi.fr'

Donnons maintenant à Postfix la liste des noms de domaine dont notre serveur est la destination.
Il y aura bien-sûre notre nom de domaine, et je fais personnellement le choix d’ajouter aussi le nom d’hôte du serveur, et localhost :

postconf 'mydestination=$myhostname, $myorigin, localhost'

On va également s’assurer que Postfix est son propre relais, et qu’il va, par ses propres moyens, transmettre chaque message qu’il reçoit vers le MTA (ou MDA) du destinataire.
Pour cela, on définit la valeur du paramètre relayhost à « rien » :

sudo postconf 'relayhost='

On demande à postfix de recharger sa configuration pour appliquer les nouveaux paramètres :

sudo postfix reload

A partir de là, on est en capacité de recevoir et d’émettre des e-mails depuis et vers l’extérieur.

Test : envoyer un e-mail vers une adresse de courriel distante

On va envoyer un e-mail, vers une adresse de courriel distante, à laquelle on a accès, dans mon cas, une adresse @gmail.com.
Pour envoyer le courriel, on va utiliser la commande echo et la commande mail. Le format est simple :
echo "contenu du message" | mails -s "Le sujet du message" adresse_du_destinataire

Ce qui donne :

echo "Salut, ceci est le corps de mon un e-mail de test" | mail -s "Ceci est l'objet de mon e-mail de test" xxxxx.yyyyy@gmail.com

La commande devrait s’exécuter, sans erreur, en 1 ou 2 secondes.
On va jeter un œil dans les journaux de Postfix, pour voir ce qu’il s’est passé :

tail /var/log/mail.log

Ce qui nous donne :

Jan 25 22:37:46 v1711 postfix/pickup[1294032]: 6BC4D2B5BED: uid=1005 from=<olivier>
Jan 25 22:37:46 v1711 postfix/cleanup[1294038]: 6BC4D2B5BED: message-id=<20220125213746.6BC4D2B5BED@mail.mashi.fr>
Jan 25 22:37:46 v1711 postfix/qmgr[1294033]: 6BC4D2B5BED: from=<olivier@mashi.fr>, size=416, nrcpt=1 (queue active)
Jan 25 22:37:47 v1711 postfix/smtp[1294040]: 6BC4D2B5BED: to=<xxxxxxx.yyyyyy@gmail.com>, relay=gmail-smtp-in.l.google.com[142.250.153.27]:25, delay=0.67, delays=0.02/0.1/0.15/0.4, dsn=2.0.0, status=sent (250 2.0.0 OK  1643146667 ss23si9963924ejc.146 - gsmtp)
Jan 25 22:37:47 v1711 postfix/qmgr[1294033]: 6BC4D2B5BED: removed

Le traitement par Postfix de cet e-mail a généré 5 lignes. Chaque ligne est générée par un des processus de Postfix (en gras).
On sait que ces 5 lignes concernent le même e-mail, grâce à « l’ID de queue Postfix », ici : 6BC4D2B5BED.

Les logs sont une source d’information importante et très complète pour savoir si e-mail a été transmis ou non, et pour quelles raisons le cas échéant, et comment le courriel a été relayé par notre Postfix.

Sans rentrer dans les détails, on peut voir que plusieurs informations ressortent dans ces 5 lignes :

La ligne 1 nous indique que le processus pickup de Postfix a récupéré un e-mail provenant de l’utilisateur local olivier qui a pour uid, 1005.

La ligne 2 nous indique que le processus cleanup de Postfix a fini de traiter l’e-mail que pickup lui a transmis précédemment, en nous retournant le message-id qu’il lui a donné.

La ligne 3 est générée par le processus qmgr. Il nous indique l’adresse de courriel de l’émetteur de l’e-mail, le poids de l’e-mail en octets, et le nombre de destinataire.

Ligne 4 est généré par l’agent de transport qui s’appelle smtp. Il va tenter de livrer le courriel au destinataire et nous remonter le résultat de l’opération.
Ainsi, on voit dans la ligne 4 du log :

  • le destinataire de l’e-mail : to=<xxxxxx.yyyyyy@gmail.com>
  • le MTA du destinataire (obtenu par la résolution DNS du MX du domaine du destinataire) : relay=gmail-smtp-in.l.google.com[142.250.153.27]:25
  • le temps de la transmission en seconde de l’e-mail vers le relais du destinataire : delay=0.67
  • le status de transmission : status=sent (et informations complémentaires fournis par le MTA distant).

La ligne 5 nous informe que qmgr a supprimé le courriel de ses files d’attentes.

Lors de cet essai, l’e-mail a bien été remis au MTA du domaine du destinataire.
Ce que l’on peut confirmer en consultant l’adresse e-mail xxxxxx.yyyyyy@gmail.com, depuis le compte Google correspondant.
L’interface de Gmail, nous fournis en plus des informations supplémentaires, notamment que l’e-mail a passé les test SPF et DMARC :

Informations détaillées visible via « Afficher l’original » dans l’interface Gmail

Attention, si les enregistrements SPF et DMARC ne sont pas encore propagés, ou s’ils contiennent des erreurs, il est fort probable que votre e-mail de test arrive en SPAM.
Il peut aussi être carrément refusé (temporairement ou définitivement) par le serveur de messagerie du destinataire, ce qui sera explicitement indiqué dans les journaux de Postfix le cas échéant.

Test : recevoir un un e-mail sur un compte local

On va envoyer un e-mail, depuis une boîte mail « standard » vers notre boîte mail locale.
Dans mon cas, j’envoie un e-mail à olivier@mashi.fr depuis ma boîte Gmail xxxxxx.yyyyyy@gmail.com.

Patienter 1 à 2 minutes maximum, puis de lancer un tail sur le fichier de log de Postfix.

tail /var/log/mail.log

Vous devriez observer quelque chose de similaire à ça :

Jan 25 23:19:08 v1711 postfix/smtpd[1294667]: EE1A22B5F6C: client=mail-pf1-f178.google.com[209.85.210.178]
Jan 25 23:19:08 v1711 postfix/cleanup[1294671]: EE1A22B5F6C: message-id=<CABf+crk7OHGt9FSLZDohmuu=T-YqG84-VEu_wv7w7_M33QDBuA@mail.gmail.com>
Jan 25 23:19:08 v1711 postfix/qmgr[1294033]: EE1A22B5F6C: from=<xxxxxxx.yyyyyy@gmail.com>, size=3296, nrcpt=1 (queue active)
Jan 25 23:19:09 v1711 postfix/local[1294672]: EE1A22B5F6C: to=<olivier@mashi.fr>, relay=local, delay=0.03, delays=0.01/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Jan 25 23:19:09 v1711 postfix/qmgr[1294033]: EE1A22B5F6C: removed

Comme pour l’envoi, on peut voir 5 lignes générées par les différent services de Postfix responsable de livraison du courriel vers notre boîte mail locale. On va une nouvelle fois survoler les lignes du log :

La première ligne, inscrite par le démon smtpd de Postfix, nous donne le nom d’hôte du MTA de l’émetteur du message : client=mail-pf1-f178.google.com[209.85.210.178]

La ligne 2 nous indique que le processus cleanup de Postfix a fini de traiter l’e-mail que smtpd lui a transmis précédemment, en nous retournant le message-id qu’il lui a donné.

La numéro 3 nous donne, générée par qmgr nous donne des informations sur le courriel :

  • L’adresse de l’émetteur : from=<xxxxxx.yyyyyy@gmail.com>
  • La taille de l’e-mail : size=3296
  • Le nombre de destinataire : nrcpt=1
  • Le nom de la file d’attente où se trouve l’e-mail : (queue active)

La ligne numéro 4 nous donne les informations issues de la tentative de livraison du courriel, réalisé ici par l’agent de transport local de Postfix, vers son destinataire :

  • L’adresse du destinataire : to=<olivier@mashi.fr>
  • Le nom du relais pour le domaine : relay=local
  • Le temps de réception de l’e-mail : delay=0.03
  • Le statut de la transmission du courriel : status=sent (delivered to mailbox)

Enfin, la cinquième ligne nous indique que le message est supprimé de la queue de Postfix.

On a ici une livraison réussie d’un courriel provenant d’un domaine extérieur vers un compte sur notre domaine personnel.
Je peux le consulter en tapant la commande mail dans le terminal de mon serveur.

Conclusion

Vous disposez désormais d’un MTA, capable de transmettre des e-mails de la part d’utilisateur locaux, vers des destinataires distants,

Grâce à l’utilisation d’un enregistrement SPF d’un enregistrement DMARC, on optimise la livraison de nos courriels et on renforce notre protection contre l’usurpation de nos adresses e-mails (« spoofing »), en aidant les anti-spam à interpréter nos e-mails.

Le MTA est également en mesure de recevoir des e-mails à destination d’utilisateur de notre nom de domaine.

Maintenant, on va devoir mettre en place un serveur IMAP et un serveur SMTP, afin de pouvoir envoyer et consulter nos e-mails, avec un MUA, plus communément appelé un client de messagerie, comme Thunderbird, Outlook, Evolution, Apple Mail, Roundcube, Rainloop, etc..

La suite dans l’article : https://blog.wck-foundation.fr/?p=335