<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<article class="whitepaper" lang="fr">
<?dbhtml filename="serveur-mdk.html">
<artheader>
<title>Serveur de messagerie autonome avec Postfix et Fetchmail</title>
<author>
<firstname>Charles</firstname>
<surname>Vejnar</surname>
<affiliation>
<address>
<email>chv@fr.st</email>
</address>
</affiliation>
</author>
<pubdate>v1.1, Février 2002</pubdate>
<revhistory>
<revision>
<revnumber>1.0</revnumber>
<date>Avril 2001</date>
<revremark>
Première mise en ligne
</revremark>
</revision>
<revision>
<revnumber>1.1</revnumber>
<date>Février 2002</date>
<revremark>
Mises à jour - Ajouts des possibilités de statistiques
</revremark>
</revision>
</revhistory>
<abstract><para>Ce document concerne la mise en oeuvre de l'ensemble d'un serveur de messagerie. J'utilise une <trademark class=registered>Mandrake</trademark> dont <application>Postfix</application> est le gestionnaire de messagerie par défaut et <application>Fetchmail</application> le récupérateur mais les explications qui suivent sont compatibles avec une <trademark class=registered>RedHat</trademark>.</para>
<para>Ce document est mis à votre disposition grâce à mon travail et à mon hébergeur. Il est soumis aux termes de la GNU FDL et je vous prie de m'envoyer un courriel pour toutes références ou commentaires à <email>chv@fr.st</email>. Les informations contenues dans ces pages ne sont aucunement garanties.</para>
<para>Ce document est disponible aux formats <ulink url="serveur-mdk.sgml">SGML</ulink>, <ulink url="serveur-mdk.dvi">DVI</ulink> et <ulink url="serveur-mdk.pdf">PDF</ulink>. Sa version la plus récente est disponible sur <ulink url="http://www.linux-france.org/article/mail/serveur-mdk/">Linux-France</ulink> ou mon <ulink url="http://chv.fr.st">site personnel</ulink>.</para></abstract></artheader>

<sect1 id="intro"><title>Introduction & Installation</title>

<sect2><title>Principes de l'installation</title>

<para>Le but de cet article est d'accompagner le lecteur de manière concise et rapide à configurer un serveur de messagerie autonome. Situé sur une machine indépendante, il se connecte périodiquement et automatiquement grâce à une tâche <application>cron</application> par une connexion analogique avec <application>ppp</application> pour envoyer par SMTP les messages mis en queue et rapatrier ceux présents sur différents comptes POP3 avec <application>Fetchmail</application>.</para>

<para>Cet article ne prétend pas permettre la compréhension du fonctionnement de toutes les applications utilisées mais davantage d'être un plan de mise en oeuvre accompagné de quelques suggestions. Tous les logiciels employés sont cependant assez simple, seul <application>Postfix</application> reclame un peu plus d'explications, je vous conseille pour cela l'article d'Eric Jacoboni sur <ulink url="http://www.linux-france.org/article/mail/postfix-jaco/">Linux-France</ulink>.</para></sect2>

<sect2><title>Installation des packages</title>

<para>Installez les packages RPM suivants :
<itemizedlist spacing="compact">
<listitem><simpara><application>Postfix</application>, le gestionnaire de messagerie</simpara></listitem>
<listitem><simpara><application>Fetchmail</application>, le récupérateur de mails à partir d'un serveur distant</simpara></listitem>
<listitem><simpara><application>Fetchmailconf</application>, l'utilitaire de configuration de Fetchmail</simpara></listitem>
<listitem><simpara><application>Procmail</application>, le distributeur de courrier</simpara></listitem>
<listitem><simpara><application>Ppp</application>, le daemon de connexion à un provider</simpara></listitem>
</itemizedlist>
Vérifier que Sendmail n'est pas installé par <command>rpm -q sendmail</command>.</para>

<para>Afin de lancer Postfix à chaque démarrage de la machine, activez le service Postfix du Système V en le cochant dans le menu proposé par la commande <command>ntsysv</command>.</para></sect2>

<sect2><title>Quelques vérifications</title>

<para>La machine est nommé <systemitem>serveur</systemitem> et appartient au domaine <systemitem>mozart.com</systemitem> ce que l'on peut vérifier :
<screen>
$ hostname
serveur.mozart.com
</screen></para>
<para>Toutes les manipulations sont effectuées sous le compte root. Les comptes des utilisateurs ont été créés par les commandes <command>useradd <replaceable>nom_utilisateur</replaceable> </command>puis <command>passwd <replaceable>nom_utilisateur</replaceable></command>.</para></sect2></sect1>

<sect1 id="config"><title>Configuration</title>

<sect2><title>Configuration de Postfix</title>

<sect3><title>Postfix de base</title>

<para>Allez dans le répertoire <filename class=directory>/etc/postfix</filename> puis faites une copie du fichier <filename>main.cf</filename>. Ce fichier constitue l'essentiel de la configuration de <application>Postfix</application>. Ouvrez-le avec votre éditeur favori. La plupart des options sont correctement positionnées mais il faut en préciser certaines.</para>
<para><itemizedlist spacing="compact">
<listitem><para>Pour préciser les noms de machine et de domaine :
<screen>
myhostname = serveur.mozart.com
mydomain = mozart.com
</screen></para></listitem>
<listitem><para>Pour préciser l'envoi puis la réception du courrier :
<screen>
myorigin = $myhostname
mydestination = $myhostname, localhost.$mydomain
</screen></para></listitem>
<listitem><para>Pour préciser le mode de transport des courriers sortants :
<screen>
default_transport = smtp
</screen></para></listitem>
<listitem><para>Pour préciser la gestion des alias :
<screen>
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
</screen></para></listitem></itemizedlist>
</para>

<simpara>Pour prendre en compte les changements de configuration, entrez la commande <command>postfix reload</command>.</simpara>
<simpara>Pour afficher les différences de votre configuration avec celle par défaut, entrez <command>postconf -n</command>.</simpara>
<para>Pour vérifier la configuration du serveur, lancez <command>postfix check</command>.</para>

<para>Vérifiez la présence de Postfix et associés par :
<screen>
$ ps axf
  733 ?        S      0:00 /usr/lib/postfix/master
  738 ?        S      0:00  \_ qmgr -l -t fifo -u
 1900 ?        S      0:00  \_ pickup -l -t fifo
</screen></para>

<para>Dès à présent le serveur <emphasis>local</emphasis> de messagerie fonctionne.</para></sect3>

<sect3><title>Postfix vers l'extérieur</title>

<para>Pour ouvrir le serveur vers l'extérieur, il faut lui indiquer la marche à suivre. Pour cela ajoutez les lignes suivantes au fichier <filename>/etc/postfix/main.cf</filename> en remplaçant <replaceable>mail.provider.com</replaceable> par l'adresse du serveur SMTP de votre provider (en conservant les crochets) :
<screen>
relayhost = [<replaceable>mail.provider.com</replaceable>]
defer_transports = smtp
</screen></para></sect3>

<sect3><title>Réécriture des adresses</title>

<para>Enfin, il faut définir la correspondance entre les adresses locales de type <replaceable>utilisateur@serveur.mozart.com</replaceable> qui n'ont aucune valeur pour vos correspondants extérieurs et celles qu'ils connaissent de type <replaceable>identifiant@provider.com</replaceable>. Editez le fichier <filename>/etc/postfix/sender_canonical</filename> pour que <application>Postfix</application> remplace l'adresse locale de la forme <replaceable>utilisateur@serveur.mozart.com</replaceable> par <replaceable>identifiant@provider.com</replaceable> lorsque <replaceable>utilisateur</replaceable> envoit un message :
<screen>
utilisateur identifiant@provider.com
</screen></para>

<para>De même, un message adressé par un utilisateur local à <replaceable>identifiant@provider.com</replaceable> ne doit pas être dirigé vers l'extérieur car bien que l'adresse <replaceable>identifiant@provider.com</replaceable> corresponde à une adresse non-locale, l'utilisateur dont l'adresse est <replaceable>identifiant@provider.com</replaceable> lui est <emphasis>local</emphasis>. Editez le fichier <filename>/etc/postfix/recipient_canonical</filename> :
<screen>
identifant@provider.com utilisateur
</screen></para>

<para>Générez alors à partir de ces fichiers les bases DB utilisées par <application>Postfix</application> par les commandes :
<simplelist type=vert columns=1>
<member><command>postmap /etc/postfix/sender_canonical</command></member>
<member><command>postmap /etc/postfix/recipient_canonical</command></member>
</simplelist>
</para>

<para>Ajoutez alors dans le fichier <filename>/etc/postfix/main.cf</filename> :
<screen>
sender_canonical_maps = hash:/etc/postfix/sender_canonical
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
</screen>
puis relancez <application>Postfix</application> par <command>postfix reload</command>.</para></sect3>

<sect3><title>Test de la configuration</title>

<para><itemizedlist spacing="compact">
<listitem><simpara>Envoyez des messages aux utilisateurs locaux par la commande <command>mail</command></simpara></listitem>
<listitem><simpara>Envoyez des messages aux utilisateurs non-locaux par la commande <command>mail</command></simpara></listitem>
<listitem><simpara>Consultez la file d'attente par la commande <command>mailq</command></simpara></listitem>
<listitem><simpara>Affichez les répertoires des files d'attente par la commande <command>tree /var/spool/postfix</command></simpara></listitem>
</itemizedlist></para></sect3></sect2>

<sect2><title>Configuration de Fetchmail</title>

<para>Lancez l'utilitaire <command>fetchmailconf</command> en étant sous root. Choisissez tous les paramètres de vos comptes emails distants dans l'interface. Vous devriez obtenir en sortant du programme un fichier <filename>/root/.fetchmailrc</filename> de ce type :
<screen>
poll <replaceable>pop.provider.com</replaceable> with proto POP3
   user '<replaceable>utilisateur1</replaceable>' there with password '<replaceable>passe</replaceable>' is <replaceable>utilisateur1</replaceable> here options fetchall
   user '<replaceable>utilisateur2</replaceable>' there with password '<replaceable>passe</replaceable>' is <replaceable>utilisateur2</replaceable> here options fetchall
</screen></para></sect2>

<sect2><title>Configuration de la connexion</title>

<para>Un script très pratique est livré avec <application>pppd</application>. Il s'agit de <command>ppp-on</command>. Pour l'installer, il suffit de le copier (<filename class=directory>/usr/share/doc/</filename> peut-être aussi <filename class=directory>/usr/doc</filename>) :
<simplelist type=vert columns=1>
<member><command>cp /usr/share/doc/ppp-2.4.0/scripts/ppp-on /etc/ppp/</command></member>
<member><command>cp /usr/share/doc/ppp-2.4.0/scripts/ppp-on-dialer /etc/ppp/</command></member>
<member><command>cp /usr/share/doc/ppp-2.4.0/scripts/ppp-off /etc/ppp/</command></member>
</simplelist></para>

<para>Editez le fichier <filename>/etc/ppp/ppp-on</filename> pour affecter les valeurs aux paramètres <varname>TELEPHONE</varname>, <varname>ACCOUNT</varname> et <varname>PASSWORD</varname>.</para>

<para>Editez le fichier <filename>/etc/ppp/ppp-on-dialer</filename> pour ajuster le chemin de recherche de la commande <command>chat</command> : remplacez <command>chat</command> par <command>/usr/sbin/chat</command>.</para></sect2>

<sect2><title>Assemblage du tout</title>

<para>On établit la connexion régulièrement par une entrée <application>cron</application>. Une fois la connexion établie le fichier <filename>/etc/ppp/ip-up.local</filename> est exécuté automatiquement par le système ; on y place les commandes pour envoyer et recevoir les messages puis pour raccrocher.</para>

<note>
<para>
Afin d'éviter d'entrer en concurrence avec le script qui suit, supprimez dans le fichier <filename>/etc/ppp/ip-up</filename> toute ligne contenant <command>/usr/sbin/sendmail</command>. En effet cette commande est exécutée avec davantage de précaution par le script suivant.
</para>
</note>

<para>Ajoutez une entrée à <application>cron</application> par la commande <command>crontab -e</command> qui ouvre <application>vi</application> dans lequel vous pouvez taper une ligne comme la suivante qui lance deux fois par heure du lundi au vendredi de 9 heures à 19 heures la connexion donc l'envoi et la récupération du courrier :
<screen>
0,30 9-19 * * 1-5 /etc/ppp/ppp-on
</screen></para>

<para>Ajoutez au script <filename>/etc/ppp/ip-up.local</filename> les lignes suivantes et rendez-le exécutable par <command>chmod +x /etc/ppp/ip-up.local</command> :
<screen>
#!/bin/bash
# Récupération des messages
/usr/bin/fetchmail --logfile /root/fetchlog &
fetchid=$!
fetchps=$(ps --no-headers -o pid -p $fetchid)
if [ -z "$fetchps" ]
   then fetchps=0
fi
sleep 10
while [ "$fetchps" -eq "$fetchid"  -a -e "/var/lock/LCK..ttyS0" ]
do
   sleep 20
   fetchps=$(ps --no-headers -o pid -p $fetchid)
   if [ -z "$fetchps" ]
      then fetchps=0
   fi
done
if [ "$fetchps" -ne 0 ]
   then kill $fetchid
fi
# Envoi des messages mis en queue
/usr/sbin/sendmail -q &>/dev/null
sleep 10
mailq=$(/usr/bin/mailq)
while [ "$mailq" != "Mail queue is empty" -a -e "/var/lock/LCK..ttyS0" ]
do
   sleep 20
   mailq=$(/usr/bin/mailq)
done
# On raccroche
/etc/ppp/ppp-off
</screen></para></sect2></sect1>

<sect1 id="util"><title>Utilisation du serveur</title>

<sect2><title>Administration à distance</title>

<sect3><title>Administration par SSH (Secure SHell)</title>

<para>SSH permet d'obtenir un shell sur une machine distante de manière sécurisée. On l'utilise en lieu et place de Telnet. Sur le serveur, installez le package RPM <filename>openssh-server</filename>. Sur le poste client, installez le package RPM <filename>openssh-client</filename> pour un client Linux. Il existe un excellent client SSH pour <trademark class=registered>Windows</trademark> <application>PuTTY</application> disponible à l'adresse <ulink url="http://www.chiark.greenend.org.uk/~sgtatham/putty/">http://www.chiark.greenend.org.uk/~sgtatham/putty/</ulink> qui est à la fois un client SSH et une émulation de terminal de type bash. Sur le poste client, lancez la commande <command>ssh <replaceable>adresse-ip-serveur</replaceable></command> sous <trademark class=registered>Linux</trademark> ou double-cliquez sur l'exécutable <filename>putty.exe</filename> sous <trademark class=registered>Windows</trademark>, connectez-vous alors sous un utilisateur puis faites un <command>su</command> pour passer sous le compte root (la connexion en root directe n'est pas recommandée pour des raisons de sécurité).</para></sect3>

<sect3><title>Administration par Webmin</title>

<para>Installez le package RPM <filename>webmin</filename>. Dans un navigateur web, allez à l'adresse <ulink url="https://adresse-ip-serveur:10000/">https://<replaceable>adresse-ip-serveur</replaceable>:10000/</ulink> (https pour Mandrake 7.2 et supérieures, http pour les autres).</para></sect3></sect2>

<sect2><title>Envoi régulier d'une page web</title>

<para>Recevoir tous les matins la page de la bourse ou autre dans ses messages peut être tout à fait agréable et utile. Pour cela, exécutez la commande <command>date -d '1 days ago' +%d >/root/datepage</command> pour initialiser le système puis ajoutez les lignes suivantes au fichier <filename>/etc/ppp/ip-up.local</filename> avant la commande qui raccroche en mettant le nom de l'utilisateur qui doit recevoir le message (champ <replaceable>To:</replaceable>) et l'adresse de la page à envoyer :
<screen>
datepage=$(cat /root/datepage)
jour=$(date +%d)
heure=$(date +%H)
if [ $jour != $datepage -a $heure = 09 -a -e "/var/lock/LCK..ttyS0" ]
   then wget -O <replaceable>/root/devises.html</replaceable> <replaceable>http://fr.finance.yahoo.com/m3/index.html</replaceable> &>/dev/null
        head="From: MailServeur\nTo: <replaceable>utilisateur</replaceable>\nSubject: Devises\n
              Content-Type: text/html; charset=iso-8859-1;\n"
        echo -e $head >>/root/mel
        cat <replaceable>/root/devises.html</replaceable> >>/root/mel
        /usr/sbin/sendmail -t < /root/mel
        rm -f /root/mel
        date +%d >/root/datepage
fi
</screen></para></sect2>

<sect2><title>Etapes d'ajout d'un compte de messagerie</title>

<para><note><para>Le cas échéant, n'oubliez-pas de créer un compte POP3 chez votre hébergeur de messagerie.
</para></note></para>

<procedure><title>Sur le serveur</title>
<step><simpara>Ajoutez un compte utilisateur par :</simpara>
<substeps>
<step><simpara><command>useradd <replaceable>nom-utilisateur</replaceable></command></simpara></step>
<step><simpara><command>passwd <replaceable>nom-utilisateur</replaceable></command></simpara></step>
</substeps>
</step>
<step><simpara>Complétez les fichiers <filename>/etc/postfix/sender_canonical</filename> et <filename>/etc/postfix/recipient_canonical</filename> ;</simpara></step>
<step><simpara>Regénérez les bases par :</simpara>
<substeps>
<step><simpara><command>postmap /etc/postfix/sender_canonical</command></simpara></step>
<step><simpara><command>postmap /etc/postfix/recipient_canonical</command></simpara></step>
</substeps></step>
<step><simpara>Relancez Postfix par <command>postfix reload</command> ;</simpara></step>
<step><simpara>Complétez le fichier <filename>/root/.fetchmailrc</filename>.</simpara></step>
</procedure>

<procedure><title>Sur le poste client</title>
<step><simpara>Configurez l'adresse IP du client ;</simpara></step>
<step><simpara>Dans le logiciel de messagerie, mettre l'adresse IP du serveur de messagerie pour l'adresse des serveurs POP3 et SMTP.</simpara></step>
</procedure></sect2></sect1>

<sect1 id="stats"><title>Statistiques des connexions et des courriers</title>

<para>Le but de cette partie est d'exploiter les logs du système en vue d'effectuer des statistiques de l'utilisation du serveur de messagerie. Pour cela, les logs bruts sont envoyés périodiquement cryptés par courrier électronique à un administrateur qui dispose d'outils d'analyse sous <trademark class=registered>Linux</trademark> présentés ci-après.</para>

<sect2><title>Sur le serveur : envoi des logs</title>

<sect3><title>Scripts et programmes</title>

<para>Le premier script utile permet l'envoi crypté des logs. <application>Log2mail</application> (<ulink url="script/log2mail">disponible</ulink>) est à copier dans le répertoire <filename class=directory>/usr/local/bin/</filename> par exemple. Il est nécessaire de modifier les permissions d'accès à ce script car le mot de passe de cryptage y est écrit en clair. Vérifiez que <application>GnuPG</application> est correctement installé.
<screen>
cp log2mail /usr/local/bin/
chmod 700 log2mail
rpm -q gnupg
</screen>
Editer le fichier <filename>/usr/local/bin/log2mail</filename> afin de modifier les variables du destinataire et du mot de passe. Il est aussi nécessaire de modifier le paramètre <replaceable>-f</replaceable> de <application>Matt</application> par une adresse email réelle si les logs sont destinés à un personne externe au réseau local.</para>

<para>Un programme est indispensable à la bonne marche du script présenté ci-dessus : <application>Matt</application> (<ulink url="script/matt">disponible</ulink> ou <ulink url="ftp://ftp.riverdrums.com/pub/matt/">ftp://ftp.riverdrums.com/pub/matt/</ulink>) qui envoit en pièce attachée un fichier qu'on lui désigne.
<screen>
cp matt /usr/local/bin/
</screen></para></sect3>

<sect3><title>Configuration de Logrotate</title>

<para><application>Logrotate</application> est le logiciel qui effectue la rotation des logs du système. Le principe est le suivant : périodiquement (chaque jour, semaine, mois) <application>logrotate</application> efface chaque fichier de log et en garde auparavant une copie qu'il numérote. Pour éviter l'accumulation de ces fichiers numérotés seuls les plus récents sont conservés. Modifiez le fichier <filename>/etc/logrotate.d/syslog</filename> comme suit :
<screen>
/var/log/messages {
        rotate 10
        monthly
        prerotatj
        /usr/local/bin/log2mail /var/log/messages log-messages
        endscript
        postrotate
        /usr/bin/killall -HUP syslogd
        endscript
}
/var/log/mail/info {
        rotate 10
        monthly
        prerotate
        /usr/local/bin/log2mail /var/log/mail/info postfix-info
        endscript
        postrotate
        /usr/bin/killall -HUP syslogd
        endscript
}
</screen>
</para>

</sect3></sect2>

<sect2><title>Sur un poste Linux : analyse des logs</title>

<note><para>
Cette partie est encore en développement.
</para>
</note>

<para>Les messages reçus par courriel sont cryptés. Pour les décrypter, exécuter <command>gpg --output log-messages-<replaceable>date</replaceable> --decrypt log-messages-<replaceable>date</replaceable>.gpg</command>.</para>

<sect3><title>Analyse des connexions</title>

<para><application>Ppplag</application> est un script <application>Perl</application> disponbile sur <ulink url="http://www.biscom.net/~cade/away/ppplag/">http://www.biscom.net/~cade/away/ppplag/</ulink> qui analyse <filename>/var/log/messages</filename>.</para></sect3>

<sect3><title>Analyse des échanges de courrier</title>

<para><application>Pflogsumm</application> est un autre script <application>Perl</application> disponible sur <ulink url="http://jimsun.linxnet.com/postfix_contrib.html">http://jimsun.linxnet.com/postfix_contrib.html</ulink>qui analyse <filename>/var/log/mail/info</filename>.</para></sect3>

</sect2></sect1>

<sect1 id="rem"><title>Remarques générales et techniques</title>

<para>Toutes les remarques sont bienvenues à <email>chv@fr.st</email>.</para>

<qandaset>
<qandaentry><question><para>Si le relais ne fonctionne pas, la connexion reste ouverte inutilement.</para></question>
<answer><para>Inexact pour moitié. En effet <application>Fetchmail</application> est pourvu d'un <foreignphrase>timeout</foreignphrase> de 300 secondes mais la commande <command>sendmail</command> de <application>Postfix</application> ne l'est pas. C'est un problème à résoudre.</para></answer></qandaentry>

<qandaentry><question><para>Si le connexion ne fonctionne pas, le relais reste ouvert inutilement.</para></question>
<answer><para>Inexact. En effet grâce au paramètre <parameter class=command>-e "/var/lock/LCK..ttyS0"</parameter> des boucles <function>while</function> du script <filename>ip-up.local</filename>, si la connexion n'est plus ouverte le script se termine.</para></answer></qandaentry>

<qandaentry><question><para>Le <filename>ppp-on</filename> peut être déjà lancé quand il est lancé par <application>cron</application>.</para></question>
<answer><para>Exact mais sans conséquence. En effet, si un <filename>ppp-on</filename> est déjà lancé, la connexion échoue et le nouveau ppp-on se ferme.</para></answer></qandaentry>

<qandaentry><question><para>Que faire lorsque l'on dispose d'une connexion permanente (ADSL en particulier) ?</para></question>
<answer><para>Outre l'inutilité des demandes de connexion régulière par <application>cron</application>, un paramètre de la configuration de <application>Postfix</application> s'avère être inutile. Ce paramètre est le <replaceable>relayhost</replaceable> du fichier <filename>/etc/postfix/main.cf</filename>. En effet lors de connexions intermittentes (modem) <application>Postfix</application> transmet au relayhost (serveur SMTP distant) l'intégralité des messages sortants et le relayhost ensuite se charge de transmettre les messages à chaque correspondant. Cependant <application>Postfix</application> peut tout à fait jouer le rôle du relayhost c'est-à-dire contacter le serveur mail de chaque correspond et assurer ainsi lui-même l'envoi des messages. Cette dernière méthode est utilisable et recommandée pour des connexions permanentes mais peu pratique dans un cas contraire.</para></answer></qandaentry>
</qandaset>
</sect1>

</article>
