Installation du serveur Postfix

Si vous connaissez un petit peu l'administration sous Debian, alors vous n'allez pas être surpris de commencer par la commande suivante :

shell# apt-get install postfix postfix-doc

Selon le niveau de votre DEBCONF, vous aurez plus ou moins de questions sur la configuration. Répondez simplement Internet Site à la question sur le type de configuration général. Choisissez également l'adresse à laquelle faire suivre les messages destinés à root. Donnez également la liste des domaines pour lesquels le serveur doit accepter les emails, séparés par des espaces.

Pour ce qui est des mises à jour synchrones, il n'est pas utile des les activer. En effet, il y a vraiment peu de chance qu'un email soit perdu. Ne l'activez donc que si votre serveur ne doit absoluement pas perdre un seul email.

Une fois ces diverses questions répondues, l'installation devrait se dérouler normalement... et vous devriez vous retrouver avec un serveur Postfix fonctionnel, mais très certainement pas configuré exactement selon vos besoins. La configuration du serveur se trouve dans le fichier /etc/postfix/main.cf, nous allons y jeter un coup d'oeil.

Configuration du DNS

La première chose à faire est de configurer le serveur DNS pour choisir le nom sous-lequel le serveur va s'authentifier. La configuration d'un DNS sort du cadre de cet article, je me contenterai donc du minimum. Dans votre fichier /etc/bind/db.mon_domaine, ajoutez deux lignes du type :

mail .mon_domaine.   A      mon_ip_publique
@       MX      5       mail.mon_domaine.

La ligne avec le CNAME déclare un nouveau sous-domaine, tandis que la ligne avec le MX indique que le serveur qui prend en charge le courrier email de ce domaine est celui indiqué par le troisième champs. Le deuxième champs indique la priorité du serveur indiqué par cette entrée. N'oubliez pas non plus de modifier le Serial afin de forcer la synchronisation des autres serveurs DNS.

Vérifiez que la zone est toujours valide par le biais des utilitaires bind :

shell# named-checkzone mon_domaine /etc/bind/db.mon_domaine
zone mon_domain/IN: loaded serial 2007042301
OK

Si tout se passe bien, vous pouvez simplement recharger la configuration du serveur DNS :

shell# /etc/init.d/bind9 reload

Testez alors de l'extérieur les réponses du serveur - il se peut qu'il soit nécessaire d'attendre plusieurs heures avant que les changements ne soient visibles de l'extérieur - :

shell$ dig mx festepreuves.com

; <<>> DiG 9.4.0 <<>> mx festepreuves.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12940
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; QUESTION SECTION:
;festepreuves.com.              IN      MX

;; ANSWER SECTION:
festepreuves.com.       10800   IN      MX      5 mail.festepreuves.com.

;; ADDITIONAL SECTION:
festepreuves.com.       10800   IN      A       81.56.231.122

;; Query time: 140 msec
;; SERVER: 10.44.27.1#53(10.44.27.1)
;; WHEN: Mon Apr 23 23:47:43 2007
;; MSG SIZE  rcvd: 71

Au passage, un petit site très pratique pour tester la configuration de ses serveurs DNS : http://pingability.com/zoneinfo.jsp.

Désormais, le serveur DNS est paré à router tranquillement les emails à destination de notre domaine vers notre serveur. Il ne reste plus qu'à configurer correctement ce dernier :)

Configuration du serveur SMTP (Postfix)

Lançons-nous dans la lecture ... et la compréhension je l'espère, du fichier main.cf. Choisissez votre éditeur préférez et ouvrez le fichier. Ce dernier ne fait qu'une vingtaine de lignes ... comparé à un Apache ça semble être du gâteau ! Rassuré ?

La première chose que nous allons modifier est le contenu de la variable myhostname, cette dernière doit correspondre au nom du serveur email. En gros il faut y mettre ce que vous avez placé dans le champs MX sur votre serveur DNS :

myhostname = my_domaine

La variable relayhost définit si l'on passe par un serveur SMTP tiers, ou bien si l'on gère nous même l'envoi de nos messages. Si nous mettons en place notre propre serveur, c'est bien pour ne pas dépendre d'autres. Laissons donc cette variable vide :

relayhost =

La variable inet_interfaces permet de spécifier les interfaces réseaux sur lesquels doit répondre le serveur. Dans notre cas, nous désirons pouvoir poster du réseau local et d'internet, il est donc nécessaire d'activer toutes les interfaces :

inet_interfaces = all

La variable masquerade_domain permet d'indiquer au serveurs que certains domaines ou sous-domaines ne doivent pas être conservés tels quels, mais transformés. Ainsi, notre serveur répond au sous-domaine mail.mon_domain.com, mais nous voulons que les mails soient envoyés avec l'adresse : mon_domain.com. Indiquons donc que le domaine mail.mon_domain.com doit être géré par le masquerading :

masquerade_domains = mail.mon_domain.com 
masquerade_exceptions =

Les alias permettent de mettre en relation des adresses du serveur local et d'autres utilisateurs ou adresses. Pour le moment nous allons stocker ces adresses dans le fichier /etc/aliases :

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

Test du fonctionnement du serveur de mail

La configuration du serveur est certe incomplète car il manque le stockage des emails et leur consultation à distance, la gestion de plusieurs noms de domaine, la vérification du contenu par un antivirus, l'anti-spam, ... mais chaque chose en son temps.

Commençons par recharger la configuration du serveur avec la commande suivante :

shell# /etc/init.d/postfix reload
Reloading Postfix configuration...done.

Si tout va bien il ne devrait pas y avoir de messages d'erreur. Maintenant, tentez de vous envoyer un message à vous même (en gras ce que vous devez taper) à partir du serveur directement :

shell$ mail -s "Petit test" moi@mon_domain.com
 Voilà, c'est juste un petit test pour voir
 .
 Cc:
shell$

Vérifions que le message a bien été reçu :

shell$ mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/moi": 1 message 1 new
>N  1 moi@mon_do  Sat Apr 28 14:20   14/517   Petit test
& {{1}}
Message 1:
From grdscarabe@festepreuves.com  Sat Apr 28 14:20:59 2007
X-Original-To: grdscarabe@festepreuves.com
To: grdscarabe@festepreuves.com
Subject: Petit test
Date: Sat, 28 Apr 2007 14:20:59 +0200 (CEST)
From: grdscarabe@festepreuves.com (GrdScarabe)

Juste un test

& q

Il semble bien que ça fonctionne. Attelons-nous maintenant à ajouter un alias dans le fichier /etc/alias. Par exemple, étant donné que nous n'avons pas mis en place de moyen de récupérer les messages, renvoyons-les vers une adresse que nous possédons déjà :

shell# vi /etc/aliases
# /etc/aliases
mailer-daemon: postmaster
postmaster: root
nobody: root
hostmaster: root
usenet: root
news: root
webmaster: root
www: root
ftp: root
abuse: root
noc: root
security: root
root: moi
moi: moi@mon_autre_adresse.fr
shell# postalias /etc/aliases

La commande postalias permet de mettre à jour la base des alias auprès du serveur, sinon il n'aurait pas pris en compte votre modification dans /etc/aliases. Envoyons alors maintenant un message à cette adresse :

shell$ mail -s "Petit test des alias" moi@mon_domain.com
 Voilà, c'est juste un petit test pour voir si les alias fonctionnent
 .
 Cc:

Une fois le message parti, allez voir dans la boîte que vous avez spécifié au niveau de l'alias. Le message doit y apparaître :) Bravo ... vous avez mis en place votre premier serveur de mail. Offrons lui l'ouverture sur le monde maintenant ...

Configuration du firewall

Si vous voulez que votre serveur accepte des mails provenant de l'extérieur, il est nécessaire de laisser le port 25 ouvert au niveau de votre firewall ! Si vous êtes chez free, commencez par lire cet article.

Pour ma part j'utilise directement iptables pour gérer mon firewall, je ne décrirai donc que cette méthode qui est de toute manière certainement la plus complexe. Il y a de fortes chances que si vous n'utilisez pas iptables, il suffise de spécifier à votre firewall de laisser passer les emails ou de débloquer le port 25.

La chaîne permettant d'autoriser l'accès au port 25 et bloquer le reste par le biais d'iptables est la suivante :

shell# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
shell# iptables -A INPUT -j REJECT

Si toutefois vous avez d'autres serveurs tournant sur la machine avec leur propre configuration du firewall, il est certainement préférable d'utiliser la chaîne suivante :

shell# iptables -I INPUT 1 -p tcp --dport 25 -j ACCEPT

Si vous voulez en savoir plus sur les règles iptales, je vous conseille de lire cet article.

Vous devriez maintenant pouvoir envoyer/recevoir des mails de votre domaine d'un peu n'importe où dans le monde :)