En résumé
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 (accroche SEO)
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. Tu peux t’en servir comme base pour ton 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.mydestinationliste les domaines acceptés localement :democrasite.cometkameleon.fren 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 = dovecotetsmtpd_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_miltersetnon_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.pemetchain.pem.
⚠️ Points d’attention
Attention
Cohérence du socket milter : cette config déclare smtpd_milters = inet:127.0.0.1:8891. Vérifie 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 = daneetsmtp_dns_support_level = dnssec, ta 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 tu gères plusieurs domaines mail (ex :kameleon.fr), pense au SNI viatls_server_sni_maps = hash:/etc/postfix/sni_mapet vérifie les certificats de chaque domaine. - Policy SPF :
check_policy_service inet:127.0.0.1:10023suppose 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 = 0signifie 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 checkne remonte aucune erreur de syntaxe. -
smtpd_miltersetnon_smtpd_milterspointent vers un socket milter réellement actif. - La ligne
smtpd_recipient_restrictionsactive est bien celle aveccheck_policy_service(correction du 21/05/2026). - Les certificats Let’s Encrypt de
democrasite.comsont présents et valides. - L’utilisateur 1002 correspond bien à la config de tes boîtes virtuelles.
# Commande de validation finale
sudo postfix check
🎓 Conclusion
Voilà, tu as 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. Tu peux t’en inspirer ligne par ligne pour ton propre serveur mail. Et toi, quels paramètres main.cf utilises-tu ? Tu as déjà testé DANE ou tu restes en TLS opportuniste ? Raconte-moi ça en commentaire !
📚 Ressources complémentaires
- Documentation main.cf (postfix.org)
- Postfix COMPATIBILITY_README (cité dans la config)
- Postfix TLS_README — DANE et sécurité TLS
💬 Ton avis ?
Cette config commentée t’aide à y voir plus clair dans main.cf ? Tu veux un article dédié à un bloc précis (DANE, policyd-spf, LMTP) ? Laisse un commentaire, je réponds !
📚 Dans la même série
Postfix et ses amis — Article 1
Postfix main.cf : ma configuration serveur mail commentée 👈 (tu es ici)
🔗 Articles liés
- Postfix + DKIM avec OpenDKIM
- Postfix, muscler l’anti-spam contre fishing
- Stack serveur actuelle