Postfix est un serveur mail, et plus exactement un MTA (Mail Transfer Agent). Il gère l’envoi et la réception de mails par Internet en utilisant le protocole SMTP. Le monde de l’Open Source offre toute une panoplie de MTA, parmi lesquels on trouve Postfix, Exim, Qmail et Sendmail.
Dans ce premier article sur les serveurs de messagerie, nous allons configurer Postfix sur une machine publique tournant sous Rocky Linux 8. Notre premier objectif, ce sera l’envoi des messages du système comme par exemple les notifications de DNF Automatic pour les mises à jour automatiques. Cette configuration pourra également être utilisée par les applications locales comme OwnCloud ou WordPress.
Prérequis
Avant de mettre la main à la pâte, je vérifie si le serveur n’est pas blacklisté quelque part :
Installation
Postfix est fourni par les dépôts officiels de la distribution :
# dnf install -y postfix
On installera également la commande mail
(paquet mailx
) pour pouvoir tester et gérer les mails en ligne de commande directement sur le serveur :
# dnf install -y mailx
Configuration initiale
Les fichiers de configuration utilisés par Postfix se situent dans /etc/postfix
:
- Le fichier
master.cf
gère la configuration du démonmaster
de Postfix. Dans la plupart des configurations de base, on n’aura pas à intervenir sur ce fichier. - Le fichier
main.cf
contient les paramètres de contrôle des démons de Postfix. C’est celui que l’on modifiera le plus souvent.
Le fichier main.cf
fourni par défaut fait près de 740 lignes, la plupart étant des commentaires. On peut commencer par aérer ce fichier pour ne garder que les directives :
# cd /etc/postfix # mv main.cf main.cf.orig # grep -h -v '^[[:space:]]*\#' main.cf.orig | grep -v '^[[:space:]]*$' > main.cf
On obtient un fichier beaucoup plus lisible :
compatibility_level = 2 queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix inet_interfaces = localhost inet_protocols = ipv4 mydestination = $myhostname, localhost.$mydomain, localhost unknown_local_recipient_reject_code = 550 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix/samples readme_directory = /usr/share/doc/postfix/README_FILES smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem smtpd_tls_key_file = /etc/pki/tls/private/postfix.key smtpd_tls_security_level = may smtp_tls_CApath = /etc/pki/tls/certs smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt smtp_tls_security_level = may meta_directory = /etc/postfix shlib_directory = /usr/lib64/postfix
Si un paramètre n’est pas présent dans main.cf
, Postfix utilisera sa valeur par défaut. Pour la plupart, ces valeurs sont définies « en dur » dans le code source de Postfix, tandis que certaines sont initialisées à la compilation et quelques-unes au moment du lancement du programme.
Le programme postconf
est très utile pour examiner les valeurs courantes et par défaut du fichier main.cf
. Pour afficher la valeurs de certains paramètres de configuration, il suffit de les fournir en argument :
# postconf inet_interfaces inet_interfaces = localhost
L’option -d
affichera la valeur par défaut des paramètres demandés :
# postconf -d inet_interfaces inet_interfaces = all
Configuration sur un serveur dédié
Nous allons supprimer la plupart des paramètres redondants ou autrement inutiles pour commencer avec quelques directives de base :
# /etc/postfix/main.cf # # Minimal Postfix configuration for Internet-facing servers # Disable backwards compatibility compatibility_level = 2 # Disable IPv6 inet_protocols = ipv4 # Outbound mail only inet_interfaces = localhost mailbox_size_limit = 0 # Host myhostname = sd-155842.dedibox.fr # Domain mydomain = dedibox.fr # Authorize local machine only mynetworks = 127.0.0.0/8 # Local aliasing alias_maps = hash:/etc/aliases # Debugging debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 # Command paths sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix # Documentation manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix/samples readme_directory = /usr/share/doc/postfix/README_FILES
Quelques remarques :
- Si l’IPv6 est désactivé au niveau du système, il faudra également le faire ici grâce à la directive
inet_protocols
. inet_interfaces = localhost
limite l’utilisation de Postfix aux applications locales.myhostname
est censé contenir le nom d’hôte pleinement qualifié du serveur, c’est-à-dire le résultat de la commandehostname --fqdn
.mynetworks
définit les adresses depuis lesquelles Postfix accepte les mails sans authentification via SMTP.alias_maps
définit l’emplacement de la table de correspondance. Certaines informations ne peuvent pas être facilement représentées dansmain.cf
. Les tables de correspondance permettent de les stocker dans des fichiers externes. Postfix n’utilise pas directement les fichiers texte, ce serait trop lent. Au lieu de cela, les tables de correspondance de type hash (ou « tables de hachage ») servent pour construire des fichiers indexés, grâce à la bibliothèque Berkeley DB. Le programmepostmap
est utilisé pour construire les fichiers indexés. Pour mettre à jour les alias, on utilisera la commandenewaliases
.
Éditer la table de correspondance /etc/aliases
:
# Person who should get root's mail
root: info@microlinux.fr
Je vous encourage fortement à utiliser votre adresse e-mail plutôt que la mienne. Ceci étant dit, la quantité de notifications que je reçois quotidiennement par e-mail me donne une vague idée de la popularité de mes articles sur l’administration des serveurs Linux.
Construire le fichier indexé :
# newaliases
Mise en service
Activer et démarrer Postfix :
# systemctl enable postfix --now
Vérifier si Postfix tourne correctement :
# systemctl status postfix ● postfix.service - Postfix Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2022-12-04 11:19:04 CET; 35s ago ... # cat /var/log/maillog ... starting the Postfix mail system ... daemon started -- version 3.5.8, configuration /etc/postfix
J’envoie un mail de test vers un compte auquel j’ai accès, en l’occurrence mon adresse principale. Un point .
sur une ligne à part marque la fin du message :
$ mail info@microlinux.fr Subject: Test Postfix Ceci est un test. . EOT
Je me connecte au compte mail externe et je vérifie si le message a bien été envoyé.
À partir de là, Postfix pourra être utilisé par les applications locales comme DNF Automatic, Rsnapshot, OwnCloud, WordPress, etc.
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.
6 commentaires
pascal · 1 janvier 2024 à 19 h 28 min
Bonsoir,
Je viens de relire cet article qui précise ‘installation minimale’.
Question : La configuration de base proposée ne protége pas contre le fait de faire du relais ouvert,
avec le risque de voir des spammeurs l’utiliser, et de se retrouver blacklisté.
kikinovak · 1 janvier 2024 à 19 h 51 min
C’est expliqué dans l’article. L’option
inet_interfaces = localhost
limite Postfix aux applications locales.pascal · 1 janvier 2024 à 20 h 03 min
Merci pour cette réponse. C’est un point important et je voulais obtenir une précision.
kikinovak · 1 janvier 2024 à 20 h 05 min
C’est également explicité – de manière un peu laconique certes – dans le commentaire du fichier de configuration
Outbound mail only
.yoann · 20 janvier 2024 à 15 h 36 min
pour alleger le fichier voici la commande : grep -v -P ‘(^#|^\s+#|^\s+$|^\s?$)’ TONFICHIER
kikinovak · 20 janvier 2024 à 17 h 27 min
À tes souhaits. :o)