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 mails, nous allons configurer Postfix sur une machine publique tournant sous CentOS 7. Notre premier objectif, ce sera l’envoi des messages du système comme par exemple les notifications de yum-cron
. 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, on pourra vérifier si le serveur n’est pas blacklisté quelque part.
Installation
Postfix est inclus dans une installation minimale de CentOS. S’il n’est pas présent sur le système, on peut l’installer comme ceci.
$ sudo yum install 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.
$ sudo yum install 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 680 lignes, la plupart étant des commentaires. On peut commencer par aérer ce fichier pour ne garder que les directives.
$ cd /etc/postfix $ sudo mv main.cf main.cf.orig $ grep -h -v '^[[:space:]]*\#' main.cf.orig | grep -v '^[[:space:]]*$' | \ sudo tee main.cf
On obtient un fichier beaucoup plus lisible.
# /etc/postfix/main.cf
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 = all
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-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
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 IPv6 inet_protocols = ipv4 # Outbound mail only mailbox_size_limit = 0 inet_interfaces = localhost # Banner smtpd_banner = $myhostname ESMTP $mail_name (CentOS) # Host myhostname = sd-100246.dedibox.fr # Domain mydomain = dedibox.fr # Domain that appears in mail posted on this machine myorigin = $myhostname # Authorize local machine only mynetworks = 127.0.0.0/8 # Deliver mail directly to the Internet relayhost = # Local aliasing alias_maps = hash:/etc/aliases alias_database = 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-2.10.1/samples readme_directory = /usr/share/doc/postfix-2.10.1/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.smtpd_banner
définit la chaîne de caractères avec laquelle Postfix s’identifie auprès d’un autre MTA.myhostname
est censé contenir le nom d’hôte pleinement qualifié du serveur, c’est-à-dire le résultat de la commandehostname --fqdn
.myorigin
définit le domaine auquel sont associés des mails envoyés localement. Par défaut,myorigin
a la même valeur quemyhostname
.mynetworks
définit les adresses depuis lesquelles Postfix accepte les mails sans authentification via SMTP.relayhost
définit le MTA auquel on est censé transférer les mails qui ne doivent pas être acheminés localement. Dans notre configuration, cette directive doit rester vide. On l’utilisera sur un serveur de réseau local pour transférer les mails à un MTA public sur Internet.alias_maps
définit l’emplacement de la table de correspondance, etalias_database
la base de données correspondante. 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 # Basic system aliases -- these MUST be present. mailer-daemon: postmaster postmaster: root # General redirections for pseudo accounts. bin: root daemon: root adm: root ... # trap decode to catch security attacks decode: root # Person who should get root's mail root: info@microlinux.fr
Construire le fichier indexé.
$ sudo newaliases
Premier test
Activer et démarrer Postfix.
$ sudo 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 Fri 2019-03-29 07:41:11 CET; 47s ago ... $ sudo cat /var/log/maillog ... starting the Postfix mail system ... daemon started -- version 2.10.1, configuration /etc/postfix
Envoyer un mail vers un compte mail externe auquel on a accès. Un point .
sur une ligne à part marque la fin du message.
$ mail info@microlinux.fr Subject: Test Postfix Ceci est un test. . EOT
Se connecter au compte mail externe et vérifier si le message a bien été envoyé.
À partir de là, Postfix pourra être utilisé par les applications locales. Voici par exemple un message envoyé par yum-cron
.
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.
2 commentaires
leclerc · 13 octobre 2020 à 10 h 45 min
Bonjour,
déjà merci ,pour tout ces articles
concernant la variable inet_interfaces = localhost, il faut bien indiquer de la passer en all dans les tuto suivant sinon on ne peut pas envoyer des mail depuis thunderbird ?
Merci
kikinovak · 14 octobre 2020 à 18 h 20 min
Dans ce tuto,
inet_interfaces = localhost
s’explique effectivement par le fait que le serveur ne doit pas recevoir de messages. Dans l’autre article, la directive n’est plus spécifiée telle quelle.