Postfix est un serveur de courrier, ou MTA libre, conçu pour être efficace, sécurisé et agréable à administrer.
Commencez par installer Postfix, selon votre distribution, par exemple :
# aptitude install postfix
Postfix se configure dans le fichier /etc/postfix/main.cf
(vous pouvez télécharger mon fichier d'exemple comme base). La configuration utilise des variables, auxquelles on affecte des valeurs. Les explications complètes de ces variables se trouve dans le manuel postconf(5)
. Voici les plus importantes :
####################### # Paramètres généraux # ####################### # Nom de domaine de messagerie principal. mydomain = example.com # Nom d'hôte. myhostname = tintin.example.com # Nom de domaine utilisé pour les adresses incomplètes. myorigin = $mydomain # Activer l'écoute IPv6. inet_protocols = all # Les clients SMTP sûrs, qui auront plus de privilèges # (concrètement, le droit d'utiliser ce serveur comme relais). mynetworks = 127.0.0.0/8 [::1]/128 ################ # Serveur SMTP # ################ # Les noms de domaine pour lesquels on accepte le courrier. mydestination = example.com, tintin.example.com, localhost, localhost.localdomain # Si votre FAI ne vous permet pas de poster le courrier directement, # utiliser son serveur SMTP comme relais en décommentant cette ligne. #relayhost = smtp.fai.com ####################### # Distribution locale # ####################### # Commande pour distribuer le courrier. mailbox_command = procmail -a "$EXTENSION" # Taille limite des BàL mailbox_size_limit = 51200000 # Caractère séparant le nom de destinataire d'un paramètre additionnel # (adresses « plussées », du type <untel+nawak@example.com> → <untel@example.com>) recipient_delimiter = +
Avec cette configuration, adaptée à votre domaine, ainsi que les valeurs par défaut des nombreux autres paramètres réglables, vous avez déjà un serveur de courrier fonctionnel et assez sécurisé.
Pour affiner cette configuration, vous pouvez régler finement les restrictions SMTP. Pour bien comprendre de quoi il s'agit, voici comment on soumet un message à un serveur :
example.com
sur son port SMTP, pour commencer une transaction SMTP :$ telnet example.com smtp
220 tintin.example.com ESMTP Postfix
HELO milou.example.net
250 tintin.example.com
MAIL FROM: <tournesol@example.net> 250 2.1.0 Ok RCPT TO: <tintin@example.com> 250 2.1.5 Ok
DATA 354 End data with <CR><LF>.<CR><LF> Le contenu du message, y compris les en-têtes. . 250 2.0.0 Ok: queued as 22D2A8871 QUIT 221 2.0.0 Bye
On peut donc distinguer quatre étapes où le client soumet des informations :
Postfix applique à chacune de ces étapes des restrictions : ce sont des règles qui permettent de décider s'il faut accepter ou refuser un message. Par exemple, le serveur example.com
devrait :
Relais ouvert
Il faut donc absolument éviter que son propre serveur se comporte en relais ouvert. Sans cela, il serait rapidement utilisé pour transmettre du pourriel, et risquerait de finir sur des listes de blocage, puis de voir tout son courrier sortant refusé par les autres serveurs de l'Internet. La configuration par défaut de Postfix ne se comporte pas comme relais ouvert, mais vous devez faire attention en la modifiant.
Voici un exemple de configuration plus fine que les réglages par défaut :
# Règles pour accepter ou refuser une connexion : # - on attend une seconde (pour piéger les zombies) ; # - on interdit la parallélisation là où il n'est pas sensé y en avoir. smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, sleep 1, reject_unauth_pipelining # Règles pour accepter ou refuser un message, dès lors qu'on connaît le nom # de l'hôte de l'expéditeur (par sa commande HELO ou EHLO) : # - on refuse les noms d'hôte invalides. smtpd_helo_restrictions = reject_invalid_helo_hostname # Règles pour accepter ou refuser un message, dès lors qu'on connaît l'adresse # de l'expéditeur : # - s'il vient d'un expéditeur inexistant de notre domaine, on le rejette ; # - si le domaine de l'expéditeur n'a pas d'IP ou de MX, on le refuse ; # - s'il vient d'un client sûr ou d'un client authentifié, on l'accepte ; # - si l'adresse de l'expéditeur n'est pas sous forme canonique, on le refuse. smtpd_sender_restrictions = reject_unlisted_sender, reject_unknown_sender_domain, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender # Règles pour accepter ou refuser un message, dès lors qu'on connaît le # destinataire (par la commande RCPT TO) : # - s'il est destiné à un expéditeur forgé chez nous, on le rejette ; # - s'il est destiné à un domaine forgé, on le rejette ; # - s'il vient d'un hôte sûr ou d'un client authentifié, on l'accepte ; # - si l'adresse de destination n'est pas sous forme canonique, on le refuse ; # - finalement, s'il n'est pas destiné à un domaine que l'on gère ou pour # lequel on relaie, on le refuse. smtpd_recipient_restrictions = reject_unlisted_recipient, reject_unknown_recipient_domain, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination
Après avoir modifié le fichier de configurations /etc/postfix/main.cf
, rechargez Postfix :
/etc/init.d/postfix reload
Vous pouvez ensuite essayer votre configuration en soumettant un message, directement en SMTP. Essayez de le faire depuis le serveur lui-même, puis depuis l'extérieur, avec des adresses d'expédition et de réceptions à l'intérieur et hors de votre domaine. Voici ce que vous devez dire pour une transaction SMTP (les réponses du serveur s'intercaleront entre vos phrases) :
$ telnet example.com smtp HELO nom.de.la.machine.cliente MAIL FROM: <untel@example.net> RCPT TO: <untel@example.com> RCPT TO: <untel@example.org> # si vous voulez envoyer à plusieurs destinataires DATA From: Untel <untel@example.net> To: Untel autre <untel@example.com> # on met <untel@example.org> en copie cachée ! Subject: Test Essai. . QUIT
Le courrier est alors livré dans les boîtes aux lettres des utilisateurs correspondants : /var/mail/utilisateur
. Depuis un shell, vous pouvez consulter votre courrier de façon basique avec un logiciel comme mail, ou avec Mutt si vous l'avez installé.
Vous pouvez maintenant recevoir du courrier et en envoyer depuis votre serveur. Vous pouvez également faire de votre serveur un relais de courrier, qui vous permettra, à condition de vous identifier, d'envoyer du courrier depuis n'importe où sur Internet.
Pour effectuer l'identification des utilisateurs, par nom d'utilisateur de mot de passe, Postfix doit utiliser un serveur SASL externe. Deux logiciels peuvent fournir ce service : Dovecot ou Cyrus SASL. Nous vous conseillons d'utiliser Dovecot, surtout si vous l'utilisez également pour le service de boîtes aux lettres.
Postfix seul ne fournit pas de service d'identification, mais doit utiliser un serveur SASL externe. Ça tombe bien, Dovecot peut faire office de serveur SASL ! Pour activer ce service, ajoutez (ou décommentez) ceci dans la section auth default
du fichier de configuration /etc/dovecot/dovecot.conf
pour Dovecot 1.2 ou dans la section service auth
du fichier /etc/dovecot/conf.d/10-master.conf
pour Dovecot 2 :
auth default { … socket listen { client { path = /var/spool/postfix/private/auth group = postfix mode = 0660 } } … }
service auth { … unix_listener auth-userdb { … } # Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0660 group = postfix } }
Il s'agit pour Dovecot de créer un socket Unix, sur lequel il écoutera les demandes d'identification provenant de Postfix. Comme le service SMTP de Postfix est chrooté (emprisonné) dans le répertoire /var/spool/postfix/
, il faut placer ce socket sous ce répertoire. Maintenant, relancez Dovecot :
# /etc/init.d/dovecot restart
Si vous avez suivi mon exemple de configuration des restrictions, Postfix est déjà prêt à accepter le courrier provenant d'utilisateurs identifiés. En revanche, il ne propose pas d'identification ! Il faut simplement le régler pour utiliser le service d'identification de Postfix :
# Activer l'identification SASL smtpd_sasl_auth_enable = yes # Utiliser le service d'identification de Dovecot smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth # Noter dans les en-tête des messages l'identifiant de l'utilisateur. smtpd_sasl_authenticated_header = yes
Postfix écoute actuellement sur le port SMTP, et proposera une identification uniquement après que le client sera passé en connexion sécurisée (en TLS, avec la commande STARTTLS). Le port SMTP étant souvent bloqué par des fournisseurs d'accès, si vous comptez utiliser votre serveur comme relais depuis des connexions étrangères (dans le sens : pas chez vous), vous devriez également activer deux autres services :
Pour cela, éditez le fichier de configuration /etc/postfix/master.cf
, qui définit les options spécifiques des différents services de Postfix. SMTPS et submission sont des services de type smtpd, qui vont utiliser le fichier de configuration /etc/postfix/main.cf
, sauf pour certains paramètres que nous surchargeons aver les options -o
:
smtp inet n - - - - smtpd submission inet n - - - - smtpd -o smtpd_enforce_tls=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject smtps inet n - - - - smtpd -o smtpd_tls_wrappermode=yes
Finalement, relancez Postfix :
# /etc/init.d/postfix restart
Vous pouvez maintenant essayer d'envoyer du courrier depuis un autre ordinateur client, en configurant votre logiciel de messagerie pour qu'il utilise votre serveur comme relais. Définissez pour cela un compte SMTP, en utilisant votre serveur, sur le port submission (587), avec votre identifiant et votre mot de passe Unix.