POSTFIX - Configurer postfix pour relayer en SASL
Sommaire
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:
- Un wiki de configuration relatif à Gmail
- Un article de forum relatif aux erreurs d'aliases
- Un wiki très complet sur Postfix, pour ArchLinux, cf postaliases
- Bind de postfix sur 127.0.0.1
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.
- vous pouvez utiliser openssl pour tester l'accès au serveur de relay.
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.
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 vi /etc/postfix/main.cf ... inet_interfaces = 127.0.0.1 ...
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 inet_interfaces = 127.0.0.1
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]
On fournit les données:
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.