Postfix main.cf : ma configuration serveur mail commentée

Problème : configurer Postfix sur un serveur mail, c'est souvent un copier-coller de lignes obscures sans comprendre ce qu'elles font. Solution : la configuration main.cf complète de mon serveur srv-hosting, commentée bloc par bloc : TLS, DANE, SASL, milters DKIM, LMTP. Temps de lecture : 8 min

Introduction

La configuration Postfix est le cœur de tout serveur mail self-hosted. Pourtant, main.cf reste un fichier intimidant : des dizaines de lignes, des paramètres obscurs, et pas toujours de commentaires clairs. Voici le fichier main.cf complet qui tourne en production sur srv-hosting (Debian 12 + Virtualmin), avec un décryptage de chaque bloc : TLS, DANE, SASL/Dovecot, restrictions, milters DKIM et livraison LMTP. Vous pouvez vous en servir comme base pour votre propre serveur.

La configuration étape par étape

Étape 1 : Le fichier main.cf de référence

Voici l’intégralité du fichier main.cf de production, tel qu’il est actif sur le serveur :

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 3.6 on
# fresh installs.
compatibility_level = 3.6

# TLS parameters
smtpd_tls_security_level = may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_security_level = dane
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = srv-hosting.democrasite.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, srv-hosting.democrasite.com, localhost.democrasite.com, localhost, democrasite.com, kameleon.fr
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
#mailbox_command = /usr/bin/procmail-wrapper -o -a $DOMAIN -d $LOGNAME
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
virtual_alias_maps = hash:/etc/postfix/virtual
sender_bcc_maps = hash:/etc/postfix/bcc
sender_dependent_default_transport_maps = hash:/etc/postfix/dependent
home_mailbox = Maildir/
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
# corrigé le 21/05/2026 smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination check_policy_service inet:127.0.0.1:10023
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination check_policy_service inet:127.0.0.1:10023
spfcheck_time_limit = 3600
smtp_dns_support_level = dnssec
smtp_host_lookup = dns
allow_percent_hack = no
resolve_dequoted_address = no
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891
tls_server_sni_maps = hash:/etc/postfix/sni_map
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_uid_maps = static:1002
virtual_gid_maps = static:1002
policyd-spf_time_limit = 3600
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtp_tls_cert_file = /etc/letsencrypt/live/democrasite.com/fullchain.pem
smtp_tls_key_file = /etc/letsencrypt/live/democrasite.com/privkey.pem
smtpd_tls_CAfile = /etc/letsencrypt/live/democrasite.com/chain.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/democrasite.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/democrasite.com/privkey.pem

Étape 2 : Décryptage des points clés

Identité et domaines

  • myhostname = srv-hosting.democrasite.com : le FQDN que Postfix annonce.
  • mydestination liste les domaines acceptés localement : democrasite.com et kameleon.fr en font partie.
  • myorigin = /etc/mailname : le domaine ajouté aux adresses sans domaine.

TLS entrant et sortant

  • smtpd_tls_security_level = may : TLS entrant proposé, pas obligatoire.
  • smtp_tls_security_level = dane : TLS sortant renforcé avec DANE, qui vérifie la chaîne de confiance via DNSSEC et les enregistrements TLSA.
  • smtp_dns_support_level = dnssec : Postfix exige des réponses DNSSEC validées pour ses résolutions DNS.
  • smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1 : les anciens protocoles TLS sont exclus.

Authentification SASL avec Dovecot

  • smtpd_sasl_auth_enable = yes : l’authentification SMTP est active.
  • smtpd_sasl_type = dovecot et smtpd_sasl_path = private/auth : Postfix délègue l’authentification au socket SASL de Dovecot.

Restrictions et policy SPF

  • smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination check_policy_service inet:127.0.0.1:10023 : après avoir autorisé le réseau local et les clients authentifiés, Postfix rejette les destinations non autorisées et interroge une policy service locale (policyd-spf) sur le port 10023.
  • La ligne précédente (commentée) signale une correction appliquée le 21/05/2026 : la ligne active est bien celle qui contient check_policy_service.

Milters DKIM

  • milter_default_action = accept : si le milter est injoignable, Postfix accepte quand même le message.
  • smtpd_milters et non_smtpd_milters = inet:127.0.0.1:8891 : tous les flux (entrant et sortant) passent par OpenDKIM sur le port 8891.

Livraison locale : Maildir et Dovecot LMTP

  • home_mailbox = Maildir/ : boîtes aux lettres au format Maildir.
  • virtual_transport = lmtp:unix:private/dovecot-lmtp : la livraison des boîtes virtuelles passe par le LMTP de Dovecot.
  • virtual_uid_maps / virtual_gid_maps = static:1002 : les mails virtuels sont possédés par l’utilisateur 1002.

Certificats TLS Let’s Encrypt

  • Les certificats (entrant et sortant) pointent vers /etc/letsencrypt/live/democrasite.com/ : fullchain.pem, privkey.pem et chain.pem.

Points d’attention

Attention

Cohérence du socket milter : cette config déclare smtpd_milters = inet:127.0.0.1:8891. Vérifiez que /etc/opendkim.conf et /etc/default/opendkim utilisent bien la même adresse (inet:8891@localhost ou inet:127.0.0.1:8891), sinon la signature DKIM ne fonctionne pas.

  • DANE exige DNSSEC : avec smtp_tls_security_level = dane et smtp_dns_support_level = dnssec, votre résolution DNS doit passer par des résolveurs validant DNSSEC. Si un domaine distant n’a pas d’enregistrement TLSA, Postfix bascule en TLS opportuniste.
  • Certificats par domaine : les chemins TLS pointent vers democrasite.com. Si vous gérez plusieurs domaines mail (ex : kameleon.fr), pensez au SNI via tls_server_sni_maps = hash:/etc/postfix/sni_map et vérifiez les certificats de chaque domaine.
  • Policy SPF : check_policy_service inet:127.0.0.1:10023 suppose qu’un service de policy SPF (policyd-spf) tourne bien sur le serveur, sinon les restrictions peuvent échouer.
  • Limite de boîte : mailbox_size_limit = 0 signifie aucune limite de taille de boîte — à garder en tête pour la gestion de l’espace disque.

Résultat final

Cette configuration est celle qui tourne en production sur srv-hosting (Debian 12, ARM64, Virtualmin). Elle combine authentification, sécurité TLS/DANE et signature DKIM.

Avant Après
Serveur mail sans politique de sécurité claire TLS + DANE + DNSSEC, protocoles obsolètes bloqués
Authentification SMTP non définie SASL via Dovecot (private/auth)
SPF non contrôlé Policy service policyd-spf sur le port 10023
DKIM absent Milters OpenDKIM sur le port 8891
Livraison locale non optimisée Maildir + livraison LMTP via Dovecot

Checklist de validation :

  • sudo postfix check ne remonte aucune erreur de syntaxe.
  • smtpd_milters et non_smtpd_milters pointent vers un socket milter réellement actif.
  • La ligne smtpd_recipient_restrictions active est bien celle avec check_policy_service (correction du 21/05/2026).
  • Les certificats Let’s Encrypt de democrasite.com sont présents et valides.
  • L’utilisateur 1002 correspond bien à la config de vos boîtes virtuelles.
# Commande de validation finale
sudo postfix check

Conclusion

Voilà, vous avez maintenant une configuration Postfix main.cf complète, éprouvée en production, avec chaque bloc expliqué : TLS/DANE, SASL Dovecot, restrictions SPF, milters DKIM et livraison LMTP. Vous pouvez vous en inspirer ligne par ligne pour votre propre serveur mail. Et vous, quels paramètres main.cf utilisez-vous ? Avez-vous déjà testé DANE ou restez-vous en TLS opportuniste ? Racontez-nous cela en commentaire !

Ressources complémentaires

Votre avis ?

Cette config commentée vous aide à y voir plus clair dans main.cf ? Voulez-vous un article dédié à un bloc précis (DANE, policyd-spf, LMTP) ? Laissez un commentaire, je réponds !

Dans la même série

Postfix et ses amis — Article 1 sur 2

Tous les articles de la série

  1. Postfix main.cf : ma configuration serveur mail commentée (vous êtes ici)
  2. Postfix : Installer et configurer DKIM avec OpenDKIM

Publié le 19 août 2026 — Mis à jour le 19 août 2026

Articles liés

Article rédigé par Nabil & Jarvis — V.001