POSTFIX - Configurer postfix pour relayer en SASL

De PedroWiki

Introduction

Le contexte: vous avez un serveur, qui porte une application web. Cette application dispose par exemple d'un formulaire de contact, ou fait des traitements nécessitant des notifications par mail, et vous avez besoin de pouvoir envoyer via localhost sur le port 25.

Cet article décrit comment j'ai produit une configuration fonctionnelle pour relayer au travers d'un relay de chez Gandi ou Gmail, ces configurations sont valables quel que soit le relay SMTP.

Liens utiles

N'étant pas spécialiste de postfix ou de la messagerie en général, je me suis appuyé sur quelques liens et tutos bien utiles:

Pré requis

  • connaitre votre OS (Debian 9.5 dans notre cas).
  • avoir un relay (ex: mail.gandi.net ou smtp.google.com).
  • connaitre le port TCP de destination (en général 587 pour le SASL).
  • disposer d'un compte et d'un mot de passe pour pouvoir utiliser ce relai.
  • vérifier que votre hébergeur vous permet de sortir sur les ports SMTP classiques.

Chez Scaleway par exemple, il est nécessaire de se rendre dans la configuration du Security Group protégeant votre VM, et de cocher une case correspondant à l'autorisation, en sortie, des protocoles de messagerie. Sans cette autorisation explicite, votre configuration pourra être valide, mais vous ne relayerai pas correctement.

SecGroup..PNG

Installation et configuration

Vérifications préalables

  • Vérifier s'il y a déjà un service SMTP installé en local:
netstat -tpln ==> vérifier ce qui écoute sur le port 25
  • Si besoin, désinstaller l'éventuel service SMTP (ex: exim par défaut sur les images Debian Scaleway):
apt-get remove exim4 --purge

Installation de postfix

apt-get update
apt-get install postfix

Dans l'assistant de configuration graphique proposé par l'installer Postfix, choisir "No configuration", on fera tout manuellement ensuite.

Préparation de la configuration

cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf

Configuration compte SASL

vi /etc/postfix/sasl_passwd
...
[smtp.gmail.com]:587    username@gmail.com:password (ATTENTION A INSTANCIER FONCTION DE VOS PARAM PERSOS)
...
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd

Configuration des aliases

vi /etc/postfix/aliases
...
root: <votre_adresse_d_admin>
...
postalias /etc/postfix/aliases
cp /etc/postfix/aliases.db /etc/ (ON PEUT CONFIGURER LE CHEMIN DANS POSTFIX, MAIS LA FLEMME, DONC ON RECOPIE LE FICHIER OU LA CONF PAR DEFAUT LE CHERCHE)

Configuration relaying SASL

vi /etc/postfix/main.cf

Avec l'option "No configuration" votre main.cf doit ressembler à ça:

# 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 2 on
# fresh installs.
compatibility_level = 2

Ajouter en fin de fichier les lignes suivantes:

relayhost = [smtp.google.com]:587 (ATTENTION LE RELAY DOIT ETRE COHERANT AVEC CELUI DESIGNE DANS sasl_passwd)
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

Redémarrer postfix pour prendre la configuration en compte

systemctl restart postfix.service

En principe sur une conf si petite, peu de chance d'avoir des erreurs au démarrage, sauf fichier mal placé ou fautes de frappe. Vous pouvez vérifier que le service tourne bien:

netstat -tpln => chercher le port 25, vérifier qu'il n'est bien bindé que sur 127.0.0.1
systemctl status postfix.service

Test du fonctionnement

Traces

Mettre en place des traces pour vérifier le bon fonctionnement:

tail -f /var/log/mail.log /var/log/mail.err &

Envoi manuel d'un mail avec telnet

root@machine:~# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 machine.localdomain ESMTP Postfix (Debian/GNU)

Le log indique:

==> /var/log/mail.log <==
Feb 23 11:38:08 machine postfix/smtpd[6555]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Feb 23 11:38:08 machine postfix/smtpd[6555]: connect from localhost[127.0.0.1]

Pas de pb, les messages en warning peuvent être ignorés.

ehlo localhost
250-machine.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
mail from: contact@domaine.test
250 2.1.0 Ok
rcpt to: adresse@domaine.dest
250 2.1.5 Ok

Le log indique:

Feb 23 11:38:33 machine postfix/smtpd[6555]: 898B22C250D: client=localhost[127.0.0.1]
data
354 End data with <CR><LF>.<CR><LF>
Subject: test relay SASL
Ca fonctionne?
.

Le log indique:

Feb 23 11:38:50 machine postfix/cleanup[6615]: 898B22C250D: message-id=<20190223113833.898B22C250D@machine.localdomain>

250 2.0.0 Ok: queued as 898B22C250D

Feb 23 11:38:50 machine postfix/qmgr[6137]: 898B22C250D: from=<contact@domaine.test>, size=360, nrcpt=1 (queue active)
Feb 23 11:38:51 machine postfix/smtp[6651]: 898B22C250D: to=<adresse@domaine.dest>, relay=smtp.google.com[A.B.C.D]:587, delay=26, delays=25/0.05/0.06/0.18, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 25E42240005)
Feb 23 11:38:51 machine postfix/qmgr[6137]: 898B22C250D: removed

Le mail est correctement délivré!

Vérifier la réception

Checker la boite de destination. Vérifier que le mail est bien délivré et qu'il n'est pas classé directement en spam.