Postfix – Créer son propre SMTP Mail Relay

Synopsis

Le mail est un des moyens de communication les plus utilisés dans le monde, ce qui créer automatiquement des dérives comme le Spam et autres usurpations. Il faut savoir que le protocole SMTP (Simple Mail Transfert Protocol) date des années 80 et comme son nom l’indique est assez simple, il n’a donc pas été pensé pour être sécurisé.

Étant donné que dans la conception ouverte du SMTP n’importe qui peut en théorie envoyer un mail en se faisant passer pour qui il veux, la logique s’est tourné vers une vérification à la réception via DKIM, SPF, DMARK et Antispam … ainsi qu’une sécurisation via SMTP over STARTTLS/SSL.

Voilà pourquoi la plupart des Antispam utilisent des RBL (Real-time Blackhole List) ou DNSBL (Domain Name System-based Blackhole List) dont une qui liste toutes les IP publiques non « professionnelles » pour s’assurer que les ordinateurs d’utilisateurs lambda victimes de malwares ne se transforment en bots envoyant massivement du spam. D’ailleurs certains opérateurs bloquent les requêtes sortantes sur le port SMTP (25).

Une mesure efficace pour Monsieur Michu, mais gênante pour l’utilisateur avancé qui souhaite héberger son propre serveur mail. Voila pourquoi ce post va vous permettre de solutionner ceci avec la mise en place d’un relais SMTP authentifié.

Prérequis

  • Un nom de domaine.
  • Un serveur sous Ubuntu Server LTS (ex. 16.04) comme par exemple un VPS chez OVH (P’tite pub…).
  • Une connexion en root (Pour éviter le sudo :D).
  • Configuration DNS (Voir plus bas)
    • Reverse DNS (Record type A).
    • SPF (Record type TXT)
    • DMARC (Record type TXT)
  • Reverse DNS du VPS configuré.

Installation des paquets

  • Installation de Postfix est ses dépendances.
apt-get install postfix sasl2-bin libsasl2-modules
  • Sélectionner Internet Site
  • Utiliser le nom configuré dans le reverse DNS du VPS.

Authentification SASL

L’authentification SASL va être gérée par le daemon saslauthd, avec une base d’identifiants sasldb.

Éditer le fichier /etc/default/saslauthd et remplacer ces lignes :

  • Autoriser le daemon à démarrer.
START=no
START=yes
  • Forcer l’authentification via la DB SASL plutôt que PAM.
MECHANISMS="pam"
MECHANISMS="sasldb"
  • Utiliser l’environnement de Postfix.
OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
  • Faire un lien symbolique pour l’utilisation de l’environnement Postfix chrooté.
cd /var/run
mv saslauthd saslauthd.bak
ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
  • Démarrer le service saslauthd.
service saslauthd start
  • Créer un compte utilisateur qui sera autorisé à relayer, à utiliser plus tard sous la forme « user@domain ».
saslpasswd2 -u domain user

Configuration de postfix

Le daemon SMTP de Postfix écoute par défaut sur le port 25, hors pour l’authentification nous allons le passer sur le port 587 (submission).

  • Editer le fichier /etc/postfix/master.cf et retirer le # au début de la ligne « submission » et l’ajouter au début de « smtp ».
  • S’assurer aussi que la ligne utilise les 4 tirets, pour autoriser l’environnement chrooté.
#smtp inet n - - - - smtpd
#smtp inet n - - - 1 postscreen
#smtpd pass - - - - - smtpd
#dnsblog unix - - - - 0 dnsblog
#tlsproxy unix - - - - 0 tlsproxy
#submission inet n - - - - smtpd
  • Ajouter cette ligne pour forcer l’Pv4 sur Gmail
smtp-ipv4 unix  -       -       -       -       -       smtp
-o inet_protocols=ipv4
  • Ajouter ces lignes à la fin du fichier /etc/postfix/main.cf pour forcer Postfix à utiliser SASL en rejetant les requêtes non authentifiées.
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = no
smtpd_recipient_restrictions = permit_sasl_authenticated,reject
  • Créer le fichier /etc/postfix/sasl/smtpd.conf, pour activer communication entre Postfix et saslauthd.
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
mech_list: PLAIN LOGIN
  • Permettre à Postfix de communiquer avec le daemon saslauthd en ajoutant l’utilisateur au groupe.
adduser postfix sasl
  • Redémarrer le service Postfix pour prendre les modification en compte.
service postfix restart

Forcer IPv4 pour Gmail

  • Créer le fichier transport.
/etc/postfix/transport
  • Y ajouter cette ligne.
gmail.com       smtp-ipv4:
  • Ajouter transport au lookup tables Postfix.
postmap /etc/postfix/transport
  • Ajouter ces lignes à la fin du fichier /etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
compatibility_level=2
  • Prise en compte des modifications sur Postfix.
service postfix reload

Génération des certificats SSL

  • Afin d’exploiter le SSL, il va falloir générer des certificats pour Postfix.
mkdir /etc/postfix/ssl
cd /etc/postfix/ssl/
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 10
24 chmod 600 smtpd.key openssl req -new -key smtpd.key -out smtpd.csr
  • Les réponses ne sont pas très importantes sauf pour le CN.
Common Name (CN) : <FQDN_Reverse_DNS>
openssl x509 -req -days 3650 -in smtpd.csr -signkey smtpd.key -out smtpd.crt
openssl rsa -in smtpd.key -out smtpd.key.unencrypted
mv -f smtpd.key.unencrypted smtpd.key
openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 3650
  • Répondre aux questions de la même façon qu’à l’étape précédente.
  • Activation de TLS dans Postfix via /etc/postfix/main.cf.
# TLS parameters
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key

smtpd_use_tls = yes
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = no
smtpd_recipient_limit = 100
smtp_tls_security_level = may
smtpd_tls_received_header = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_helo_restrictions = reject_invalid_hostname
smtpd_sender_restrictions = reject_unknown_address

tls_random_source = dev:/dev/urandom

smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Cependant début 2018, la RFC 83146 a finalement affecté officiellement le port 465 au protocole SMTP avec TLS implicite.
  • Il est donc possible d’éditer le fichier /etc/postfix/master.cf  et de modifier « submission » par « smtps ».
#smtp inet n - - - - smtpd
#smtp inet n - - - 1 postscreen
#smtpd pass - - - - - smtpd
#dnsblog unix - - - - 0 dnsblog
#tlsproxy unix - - - - 0 tlsproxy
smtps inet n - - - - smtpd
  • Redémarrer le service Postfix pour prendre les modifications en compte.
service postfix restart
  • Voila à quoi devrait ressembler votre fichier /etc/postfix/main.cf.
# See /usr/share/postfix/main.cf.dist for a commented, more complete version

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
readme_directory = no

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

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

# TLS parameters
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key

smtpd_use_tls = yes
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = no
smtpd_recipient_limit = 100
smtp_tls_security_level = may
smtpd_tls_received_header = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_session_cache_timeout = 3600s
smtpd_helo_restrictions = reject_invalid_hostname
smtpd_sender_restrictions = reject_unknown_address

tls_random_source = dev:/dev/urandom

smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

#Postfix
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = smtp.myoffice.ovh
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, smtp.myoffice.ovh, localhost.myoffice.ovh, , localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 20480000
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

#SASL Authentication
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = no
smtpd_recipient_restrictions = permit_sasl_authenticated,reject

Configuration du Firewall (UFW)

  • Installation des paquets.
apt-get install ufw
  • Vérifier les règles en place.
ufw status
  • Bloquer les ports en entrée (Incoming).
ufw default deny incoming
ufw default allow outgoing
  • Autoriser des ports en entrée (ex. SSH/SMTP)
ufw allow 22/tcp
ufw allow 587/tcp
ufw allow 465/tcp
  • Activer le Firewall UFW.
ufw enable

Configuration des Record DNS

Ci-dessous un récapitulatif des différents Record DNS à configurer sur la zone mondomaine.fr, avec des exemples.

VPS Name : vps
VPS Domain : mondomaine.fr 
VPS FQDN : vps.mondomaine.fr
VPS IP : 1.2.3.4
IP Publique serveur d'envoi (ex. Exchange) : 2.3.4.5
  • Reverse DNS (Type A)
<VPS_NAME> IN A <VPS_IP>
vps IN A 1.2.3.4
  • SPF (Type TXT)
 IN TXT "v=spf1 +ip4:<SOURCE_IP> +ptr:<DOMAIN_VPS> +mx ip4:<VPS_IP> ~all"
IN TXT "v=spf1 +ip4:2.3.4.5 +ptr:mondomaine.fr +mx ip4:1.2.3.4 ~all"
  • DMARC (Type TXT)
_dmarc IN TXT "v=DMARC1; p=none"

Configuration du serveur mail

Le but est maintenant de dire au Mail Server de router ses mails en sortie vers notre VPS.

  • Pour Exchange il faut configurer le Send Connector pour utiliser le FQDN du VPS en Smart Host (Route mail through smart hosts).

Test de la configuration

Pour les tests de la configuration je vous conseille d’utiliser MXToolbox et Mail Tester, sans oublier de specifier le port (ex. vps.mondomaine.fr:587)

http://www.mail-tester.com

https://mxtoolbox.com

Mathieu

Je suis actuellement ingénieur spécialisé dans le design d'environnements cloud virtualisés. Adepte des technologies de VMware, Nutanix, Citrix et Microsoft je propose à travers ce blog diverses astuces de troubleshooting.

S’abonner
Notification pour
guest

6 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Drayz
Drayz
4 années il y a

Bonjour j’ai effectuer toutes les manipulations et cote dns ca a l’air bon mais seulement quand j’essaye d’envoyer un mail cela ne fonctionne pas en tant que smtp server j’ai bien mit vps.domaine.fr en username j’ai mit vps et mot de passe le mien en email d’envoie j’ai mit ceci [email protected] et j’ai la reponse echec d’envoie du courrier pouvez vous m’aider ?
Cordialement super tuto

stanthewizzard
stanthewizzard
4 années il y a

Excellent tuto mais la machine doit etre dans le meme LAN je suppose ? (smtpd_relay_restrictions = permit_mynetworks)

je vais retirer ça pour le mettre sur un petit VPS

STANTHEWIZZARD
STANTHEWIZZARD
3 années il y a

Bon
apt update & apt upgrade

Plus rien ne fonctionne
auth login to postfix meet 454 4.7.0 Temporary authentication failure: generic failure sur le smarthost exchange

Je seche
Merci pour ton aide

STANTHEWIZZARD
STANTHEWIZZARD
3 années il y a

Je me réponds à moi même

Suite à l’update (21/05/2020 sous Ubuntu 18.04 LTS)
il faut

submission inet n – y – – smtpd