Postfix Installation

Postfix est un serveur mail (ou MTA) permettant de gérer presque tous les cas d’une utilisation professionnelle. Postfix supporte le protocole IPv6 depuis sa version 2.24.

Pré-requis :

  • Un nom de domaine + enregistrements DNS accessibles.
    Il est maintenant presque indispensable de configurer un DMARC, DKIM ou SPF pour que les e-mails ne finissent pas dans les spams ou ne soient pas systématiquement rejetés par certaines messageries.
  • Deux adresses mails de tests pour recevoir le courrier.
    • Il est préférable de tester sur plusieurs boîtes mails l’envoi des messages, ici Protonmail et Gmail.
    • Gmail est assez permissif pour recevoir du courrier non authentifié, si vos enregistrements DMARC, DKIM ou SPF ne sont pas encore configurés le courrier devrait cependant être délivré (dans les spams), cela permettra donc de tester simplement si Postfix envoie bien vers l’éxtérieur. Protonmail quand à la lui, les rejetant systématiquement permettra de vérifier si les messages envoyés sont correctement chiffrés et authentifiés.
  • Un VHOST configuré (ici avec NGINX), correspondant au nom de domaine qui enverra les mails.
  • HTTPS sur le Vhost (ici avec Let’s Encrypt)

NGINX

Le serveur name est monsite-linux.fr, les alias sont www, stmp et mail.
Le certificat ssl a été généré avec Let’s Encrypt et regroupe le domaine + les sous domaines.

server {
listen 80;

server_name monsite-linux.fr www.monsite-linux.fr smtp.monsite-linux.fr mail.monsite-linux.fr;

return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name monsite-linux.fr www.monsite-linux.fr smtp.monsite-linux.fr mail.monsite-linux.fr;

ssl_certificate /etc/letsencrypt/live/monsite-linux.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/monsite-linux.fr/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/monsite-linux.fr/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;

# . . . other code
root /home/VEN-Yenn/monsite-linux.fr/www/;
index index.php index.html index.htm;

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.1-fpm.sock;
}

location ~ /\.ht {
deny all;
}

access_log /var/log/nginx/monsite-linux.fr.access.log;
error_log /var/log/nginx/monsite-linux.fr.error.log warn;

}

Préparation du serveur

Fichier hosts

Préciser dans /etc/hosts le nom de domaine et le serveur name (Disponible/modifiable dans /etc/hostname).

127.0.0.1               localhost.localdomain localhost
42.42.13.37 monsite-linux.fr Debian
2001:1337:9:1337:: monsite-linux.fr Debian

Le reverse DNS

Il est possible d’ajouter un reverse DNS sur votre serveur La plupart du temps cela se fait sur l’interface d’administration de votre prestataire.
Note : pour le reverse avec l’IPV6 il faut généralement utiliser la notation complète pour que l’ajout soit pris en compte.

Adresse IP Reverse
42.42.13.37 monsite-linux.fr.
2001:1337:9:1337:: monsite-linux.fr.

Les fichiers aliases et mailname

@todo Intêret de ses fichiers ?
Fichier /etc/aliases ?
Fichier /etc/mailname ?

Postfix

Installation

Pour installer Postfix il suffit simplement d’utiliser les dépôts (Exim sera supprimé car il ne peut pas y avoir deux MTA). Si la question vous est posée mettez “Site Internet” et le nom de domaine voulu.

# apt install postfix

Fichier de logs

Les logs relatif à Postfix et aux mails se trouvent dans :

  • /var/log/mail.log
  • /var/log/mail.err
  • /var/log/mail.info
  • /var/log/mail.warn
  • /var/log/message
  • /var/mail/root

Configuration

Il est possible d’utiliser l’outils postconf qui permettra rapidement d’associer une variable à une valeur dans le fichier /etc/postfix/main.cf, exemple :

# postconf -e "myorigin = MonDomaine.com"

Il est également possible de directement modifier le fichier pour avoir une vue d’ensemble.

# ----------------------------------------------------------
# - General Settings
# ----------------------------------------------------------
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 2

mailbox_size_limit = 0
recipient_delimiter = +

inet_interfaces = all
inet_protocols = all

myhostname = monsite-linux.fr
myorigin = monsite-linux.fr
mydestination = localhot localhost.$myhostname
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases


# ----------------------------------------------------------
# - TLS parameters
# ----------------------------------------------------------
smtpd_use_tls = yes
smtpd_tls_CApath = /etc/letsencrypt/live/monsite-linux.fr/fullchain.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/monsite-linux.fr/cert.pem
smtpd_tls_key_file = /etc/letsencrypt/live/monsite-linux.fr/privkey.pem

smtp_tls_security_level = may

#smtp_tls_protocols = !SSLv2, !SSLv3
#smtpd_tls_protocols = !SSLv2, !SSLv3

Relancer ensuite le serveur.

# postfix reload

Configuration avancée

Modifier l’adresse de l’éxpéditeur

Créer un fichier /etc/postfix/generic et y ajouter des valeurs de type key: value puis appliquer les modification avec postmap et redémarrer Postfix.

# echo 'root [email protected]' >> /etc/postfix/generic
# postmap /etc/postfix/generic
# service postfix restart

Veillez à ce que le fichier /etc/postfix/main.cf comporte bien la ligne :

smtp_generic_maps = hash:/etc/postfix/generic

Plus d’infos : http://www.postfix.org/ADDRESS_REWRITING_README.html

Modifier le nom de l’éxpéditeur

Il suffit de créer un compte sur le serveur et de s’y connecter pour envoyer le mail.

Firewall

Il faut ouvrir le port 25 TCP :

iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

Mailutils

Mailutils est un utilitaire de gestion du courrier électronique. Il permettra de lancer des commandes directement dans le terminal pour envoyer des mails.

Installation

Simplement via les dépôts.

# apt install mailutils

Envoyer des mails

Dans un premier temps, envoyer un mail à root@monsite-linux.fr et regarder dans les logs pour voir si tout est ok.

# mail -s "Hello pot" "[email protected]" < message.txt

Les logs dans /var/log/mail.log devrait ressembler à ceci, indiquant que le mail à bien été envoyé et délivré (status=sent (delivered to mailbox)) :

May 28 10:11:33 monsite-linux postfix/cleanup[18507]: 67BD5600BBF: message-id=<[email protected]>
May 28 10:11:33 monsite-linux postfix/qmgr[3078]: 67BD5600BBF: from=<[email protected]>, size=390, nrcpt=1 (queue active)
May 28 10:11:33 monsite-linux postfix/local[18509]: 67BD5600BBF: to=<[email protected]>, relay=local, delay=0.1, delays=0.07/0/0/0.03, dsn=2.0.0, status=sent (delivered to mailbox)
May 28 10:11:33 monsite-linux postfix/qmgr[3078]: 67BD5600BBF: removed

Si c’est ok vous pouvez tester sur une adresse Gmail. Comme les DNS ne sont pas encore “safe” le message sera un peu lent à être délivré car il sera pour l’instant considéré comme du spam potentiel et restera un moment dans la file d’attente queue active et Connection timed out :

May 28 10:13:49 monsite-linux postfix/pickup[17325]: 7C587600BBF: uid=0 from=<[email protected]>
May 28 10:13:49 monsite-linux postfix/cleanup[18659]: 7C587600BBF: message-id=<[email protected]>
May 28 10:13:49 monsite-linux postfix/qmgr[3078]: 7C587600BBF: from=<[email protected]>, size=396, nrcpt=1 (queue active)
May 28 10:14:05 monsite-linux postfix/qmgr[3078]: 9B5AC600B99: from=<[email protected]>, size=440, nrcpt=3 (queue active)
May 28 10:14:05 monsite-linux postfix/qmgr[3078]: 44ADF600B98: from=<[email protected]>, size=440, nrcpt=3 (queue active)
May 28 10:14:05 monsite-linux postfix/qmgr[3078]: 7B8AC600B9A: from=<[email protected]>, size=440, nrcpt=3 (queue active)
May 28 10:14:19 monsite-linux postfix/smtp[18661]: connect to gmail-smtp-in.l.google.com[74.125.140.27]:25: Connection timed out

Mais parviendra au bout d’un certain temps à se frayer un chemin et vous pourrez aller le relever dans vos dossier spams de Gmail.

May 28 10:14:20 monsite-linux postfix/smtp[18661]: 7C587600BBF: to=<[email protected]>, relay=gmail-smtp-in.l.google.com[2a00:1450:400c:c04::1a]:25, delay=31, delays=0.09/0.01/30/0.3, dsn=2.0.0, status=sent (250 2.0.0 OK  1590660857 c63si5197730wmd.136 - gsmtp)
May 28 10:14:20 monsite-linux postfix/qmgr[3078]: 7C587600BBF: removed

Vider la liste d’attente

En cas de problème vous pouvez vider la liste d’attente (queue):

postsuper -d ALL

Préparation des DNS

Pour réduire le risque que vos messages soient considérés comme des spams (et parfois même rejetés), il est nécessaire de configurer ces 3 méthodes d’authentification :

  • Publier un enregistrement SPF (Sender Policy Framework) pour le domaine
    SPF empêche les spammeurs d’envoyer des messages non autorisés semblant provenir de votre domaine.
  • Activez la signature DKIM (DomainKeys Identified Mail) pour vos messages
    La signature DKIM permet aux serveurs de réception de vérifier que le propriétaire du domaine a bien envoyé le message. La plupart des serveurs de messagerie exigent une clé DKIM de 1024 bits ou plus.
  • Publiez un enregistrement DMARC (Domain-based Message Authentication, Reporting, and Conformance) pour votre domaine
    DMARC aide les expéditeurs à protéger leur domaine contre le spoofing.

Note : ce sont des DNS, essayons d’être patient si le résultat attendu ne semble pas être au rendez-vous.

Enregistrement SPF

Les enregistrements SPF dépendent du contenu du fichier /etc/hosts et de l’enregistrement DNS.

Configuration

Fichier /etc/hosts

Préciser les adresses IPV6 et IPV4 publiques du serveur ainsi que le nom de domaine et le nom de l’hôte.

127.0.0.1           localhost.localdomain localhost
42.42.13.37 monsite-linux.fr Debian
2001:1337:9:1337:: monsite-linux.fr Debian

Enregistrement DNS

Faire un enristrement SPF contenant la valeur suivante :

"v=spf1 a mx ptr ip4:42.42.13.37 ip6:2001:1337:9:1337:: ~all"

Entêtes dans les mails

Lorsque le SPF est mal configuré les en-têtes indiquent un message d’erreur :

spf=softfail (google.com: domain of trainsitioning [email protected] does not designate 2001:1337:9:1337:: as permitted sender) [email protected]
Return-Path: <[email protected]>

Lorsque le SPF est correctement configuré l’expéditeur est autorisé :

spf=pass (google.com: domain of [email protected] designates 2001:1337:9:1337:: as permitted sender) [email protected]
Received: by monsite-linux.fr (Postfix, from userid 0) id 100BB600BED; Fri, 29 May 2020 19:09:55 +0000 (UTC)

Si vous modifiez via Postfix l’adresse de l’expéditeur, il est fort possible que vous obteniez un Neutral :

spf=neutral (google.com: 2001:1337:9:1337:: is neither permitted nor denied by best guess record for domain of [email protected]) [email protected]
Return-Path: <[email protected]>
Received: from monsite-linux.fr (monsite-linux.fr. [2001:1337:9:1337::])

Signature DKIM

DKIM (DomainKeys Identified Mail) est un standard permettant d’associer de manière forte une entité ou une organisation avec un domaine au sein d’un email, il fonctionne par cryptographie asymétrique, le MTA (ici Postfix) se charge de signer numériquement tous les emails envoyés avec une clé privée contenue sur le serveur et le destinataire pourra alors vérifier l’intégrité du corps ainsi que les en-têtes du message grâce à la clé publique fournie par le domainkey : le champ TXT contenu dans un enregistrement DNS.

OpenDKIM

OpenDKIM est un logiciel libre pour vérifier et générer des signatures DKIM. Il implémente un service milter (Pour filtrer le spam et les virus) lui permettant notamment d’être utilisé avec Postfix.

Installation

Simplement via les dépôts :

# apt install opendkim opendkim-tools

Configuration

Le fichier de configuration principal d’OpenDKIM se trouve dans /etc/opendkim.conf. (Pensez à faire un backup avant de le modifier). Le manuel est accessible comme tel man opendkim.conf et le fichier entièrement documenté est /usr/share/doc/opendkim/examples/opendkim.conf.sample. :

La configuration de /etc/opendkim.conf est la suivante :

AutoRestart             Yes
AutoRestartRate 10/1h
LogWhy Yes
Syslog Yes
SyslogSuccess Yes

Mode sv
Canonicalization relaxed/simple
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable

SignatureAlgorithm rsa-sha256
Socket inet:8891@localhost
PidFile /var/run/opendkim/opendkim.pid

UMask 022

UserID opendkim:opendkim

TemporaryDirectory /var/tmp

Génération des clefs publiques et privées

Dans un premier temps nous allons créer un répertoire du même nom que le nom de domaine.

# mkdir /etc/opendkim/keys/monsite-linux.fr

Puis générer la clé privée et publique. Vous trouverez ensuite dans le répertoire /etc/opendkim/keys/monsite-linux.fr/ la clé publique dans mail.txt et la clé privé dans mail.private

# opendkim-genkey -D /etc/opendkim/keys/monsite-linux.fr/ -d monsite-linux.fr -s mail

Changement du propriétaire sur le répertoire.

# chown -R opendkim: /etc/opendkim/keys/monsite-linux.fr

Il est possible de renommer le nom de la clé privée.

# mv /etc/opendkim/keys/monsite-linux.fr/mail.private /etc/opendkim/keys/monsite-linux.fr/mail

Ajoutez ensuite dans le fichier de clés d’OpenDKIM /etc/opendkim/KeyTable l’enregistrement de votre domaine :

mail._domainkey.monsite-linux.fr monsite-linux.fr:mail:/etc/opendkim/keys/monsite-linux.fr/mail

Ensuite ajouter votre domaine dans les tables de signature d’OpenDKIM /etc/opendkimSigningTable :

*@monsite-linux.fr mail._domainkey.monsite-linux.fr

Pour terminer ajoutez le domaine et le nom d’hôte dans le fichier /etc/opendkim/TrustedHosts :

127.0.0.1
monsite-linux.fr
Debian

Enregistrement DNS DKIM

Votre clé publique se trouve dans /etc/opendkim/keys/monsite-linux.fr/mail.txt et votre enregistrement DNS doit ressembler à ceci :

Note : la clé semble être en 2 parties scindée par des quotes " ".

mail._domainkey        IN TXT    ( "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuhyvDyCorb7nvjOLeX1rcbtJtd+nneE/hZo2i4g58lGOWo0dG2DPN5ka58HAiN54hM3afJVVPhB/vEEbI8oE8NvO0y780Suk+T8TAdE18OR1u0BVMfJ47OUrLWNYWxhxkSqWoCxfWuIAi1D9xL4itSW7SQQOSwaG42Qbir6mE4cT03zXXwHcNQL5wVFX" "d+FtN5r1KeQj8fHuA0jNEc6sVnRhsgtEfKcevPhbpgk/H1ysgnS5qTT2aT9f6rfPo4ygxuVNotdFZL9geFdaoD/4x1RPy1g+bX2TQoYsx5Rwu+OTV5hDBLp7TXc0pCkNEY30kEK9ehDg+vQ6ngpof4C/UQIDAQAB" )

Pour vérifier si votre enregistrement DKIM a bien été pris en compte vous pouvez lancer la commande dig :

# dig +short default._domainkey.monsite-linux.fr TXT

"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuhyvDyCorb7nv[...]

Postfix

Ajouter dans le ficher de configuration /etc/postfix/main.cf de Postfix.

smtpd_milters           = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept:
milter_protocol = 2

Redémarrer ensuite OpenDKIM et Postfix.

Entêtes dans les mails

Lorsque le DKIM est mal configuré, les en-têtes indiquent un message d’erreur :

dkim=temperror (no key for signature) 
[email protected] header.s=default header.b=Vd+QljmB;

Lorsque le DKIM est correctement configuré :

dkim=pass [email protected] header.s=mail header.b=mDNZSZ72;

Enregistrement DMARC

DMARC protège le domaine contre le spam en empêchant la falsification de l’adresse de l’expéditeur dans les messages frauduleux. Il ne sera pas possible (à ce jour) de faire croire qu’ils proviennent de votre domaine avec DMARC.

Enregistrement DNS DMARC

Votre enregistrement DNS doit ressembler à ceci :

_dmarc      IN TXT      "v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected]; adkim=s; aspf=s; pct=100; rf=afrf; sp=reject"

Entêtes dans les mails

Lorsque le DMARC est correctement configuré :

dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=monsite-linux.fr

Erreurs rencontrées

Postfix

Port déjà occupé

Postfix ne se lançait pas car le port 25 était déjà occupé par un processus. Dans mon cas sendmail n’avait pas libéré le port, il suffit simplement de tuer le processus avec un simple kill (Pour afficher les ports utilisés Et les PID des processus : netstat -paunt ).

Mails acceptés chez Google mais pas chez Protonmail, Gmx, Yopmail, …

Les mails sont bien reçus chez GMail mais pas sur les autres messageries comme Protonmail, Gmx ou encore Yopmail. Le message d’erreur dans /var/log/mail.log indique systématiquement un status=deferred :

Jun 23 20:43:25 monsite-linux postfix/error[4409]: B76F8600C3B: to=<[email protected]>, relay=none, delay=0.15, delays=0.13/0/0/0.03, dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to mailsec.protonmail.ch[185.70.40.102]:25: Connection timed out)

Le problème venait d’une mauvaise configuration du firewall qui n’acceptait pas les connexions sur le port 25 en TCP OUTPUT.

iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 25 -j ACCEPT // Doit être en TCP, pas UDP

Il est intéressant de constater que cette configuration n’avait pas d’incidence pour envoyer des mails sur GMail.

Installation supplémentaires

Installation pouvant parfois résoudre les problèmes d’authentification :

# apt install libsasl2-modules
# apt install libsasl2-dev

Outils

Visualise les enregistrements MX, DNS, liste noire et diagnostics SMTP : https://mxtoolbox.com/SuperTool.aspx

Testez l’indésirabilité (spam) de vos emails : https://www.mail-tester.com

Documentation

https://fr.wikipedia.org/wiki/Postfix
https://mailutils.org/
https://www.alsacreations.com/tuto/lire/614-Serveur-mail-Postfix.html (Configuration détaillée)
https://support.google.com/mail/answer/81126
https://www.dmarcanalyzer.com/spf/how-to-create-an-spf-txt-record/
https://wiki.evolix.org/HowtoOpenDKIM
http://fr.wikipedia.org/wiki/DomainKeys_Identified_Mail
http://www.opendkim.org/docs.html
https://www.malekal.com/postfix-spf-dkim/
http://www.postfix.org/ADDRESS_REWRITING_README.html
http://www.postfix.org/postconf.5.html#canonical_maps
https://www.rosehosting.com/blog/how-to-install-and-integrate-opendkim-with-postfix-on-a-centos-6-vps/
https://cipherlist.eu/

> Partager <