Configuration Sendmail
Configuration Sendmail
Configuration Sendmail
~2~
1. Historique du document
16 janvier 2000, V1.1 rajout d'une autre méthode pour déterminer le nom d'hôte
dynamique lors d'une connexion.
27 décembre 1999 première version 1.0.
2. Introduction
L'objet de ce document est de présenter une configuration de sendmail sur un poste linux
servant de serveur de mail sortant pour les postes clients de votre réseau privé. Cette même
machine linux est connectée de façon intermittente à Internet par PPP, ADSL ou RNIS.
La machine cible tourne sous Linux Mandrake 6.1 basé sur une Red Hat 6.1 avec un noyau
2.2.13-7mdk, mais la configuration devrait s'appliquer aussi pour d'autres UNIX. Les chemins
et noms des commandes et autres fichiers sont ceux d'une Mandrake 6.1.
On suppose que sendmail est installé sur votre machine ainsi que les fichiers de configuration
et m4, voici les packages concernés:
sendmail-8.9.3-11mdk.i586.rpm
sendmail-cf-8.9.3-11mdk.i586.rpm
m4-1.4-13mdk.i586.rpm
Le présent document porte donc sur la version 8.9.3 de sendmail. On suppose par ailleurs que
votre réseau est configuré et opérationnel et que votre connexion fonctionne.
Sauf indications contraires, toutes les manipulations décrites dans le présent document sont à
réaliser sous root.
~4~
3. Pourquoi sendmail
Sur un poste Linux vous n'êtes pas obligé d'avoir à configurer sendmail, des outils comme
Netscape disposent de leur propre mécanisme qui permette d'envoyer du courrier, alors
pourquoi s'embêter à configurer sendmail, pour la gloire ? Certains disent que tant qu'on a pas
chercher à configurer sendmail, on n'est pas un vrai administrateur système. Certes ce n'est
pas une raison suffisante, l'intérêt de configurer sendmail est de pouvoir mettre en place un
serveur de mail sortant pour votre réseau privé et ainsi relayer les courriers venants des postes
clients du réseau privé, qu'ils soient sous Windows, MacOS ou autres.
Les autres avantages de sendmail sont multiples, il fait ainsi office de barrière anti spam, et
permet la réécriture de l'entête des emails pour cacher les noms des utilisateurs locaux ainsi
que le nom du domaine privé. Pourquoi cacher son nom de domaine privé ? Si votre email
arrive chez votre FAI ou ailleurs sur internet, il peut être irrémédiablement rejeté sous
prétexte de contenir un nom de domaine non reconnu, c'est une protection anti-spam. Qui plus
est dans l'hypothèse très improbable ou l'email arrive au destinataire, celui-ci ne pourra y
répondre car votre email est inconnu sur le net.
4. Avant de commencer
Avant de commencer je ne puis que vous conseillez la lecture du document d'Eric Jacoboni
"lire et envoyer du courrier off-line sur sa machine" que vous trouverez sur http://www.linux-
france.org/article/mail/sendmail. Ce document est une excellente introduction à sendmail, il
présente une configuration simple, dans le cadre d'un poste isolé connecté de façon
intermittente à Internet. Ce présent document n'a pas la prétention de se substituer au
document d'Eric Jacoboni, il se veut un complément, vous trouverez ainsi de nombreuses
références au document d'Eric.
Si vous avez déjà une configuration type Jacoboni, voilà ce que la présente configuration peut
vous apporter en plus :
le nom de domaine privé n'apparaît aucunement dans les mails sortants, ce qui n'est
pas le cas avec la doc d'Eric où apparaît le nom de domaine privé dans les champs
Received et Message-Id,
le serveur linux peut relayer le courrier des postes du domaine privé,
si un utilisateur local envoie un mail à [email protected] (qui je le rappelle est aussi un
utilisateur local), le mail ne part pas chez le FAI avant de revenir sur le poste linux, il
est acheminé dirctement en local. Avec la config d'Eric le mail va d'abord chez le FAI.
5. Configuration de sendmail
un format sensé être facile à comprendre, alors que sendmail.cf est écrit dans un langage
hautement "abscon". C'est ce dernier fichier qui était directement modifié avec les anciennes
versions de sendmail.
Le nom du fichier n'a pas d'importance, vous pouvez l'appeler simplement config.mc. Voici
son contenu:
include(`../m4/cf.m4')dnl
OSTYPE(`linux')dnl
FEATURE(redirect)dnl
FEATURE(nocanonify)dnl
FEATURE(always_add_domain)dnl
FEATURE(local_procmail)dnl
GENERICS_DOMAIN(machine.domaine.fr machine localhost)
FEATURE(genericstable)
FEATURE(masquerade_envelope)dnl
FEATURE(relay_entire_domain)dnl
FEATURE(accept_unresolvable_domains)dnl
define(`confDOMAIN_NAME',`ppp.fai.fr')dnl
define(`SMTP_MAILER_FLAGS',`e9')dnl
define(`confCF_VERSION', `Commentaire quelconque qui apparaitre dans
l'entete - 25/12/99')dnl
define(`confCON_EXPENSIVE', `True')dnl
define(`confME_TOO', `True')dnl
define(`confCOPY_ERRORS_TO', `Postmaster')dnl
define(`confDEF_CHAR_SET', `ISO-8859-1')dnl
define(`confMIME_FORMAT_ERRORS', `True')dnl
define(`SMART_HOST', `smtp8:[mail.fai.fr]')dnl
define(`confRECEIVED_HEADER', `from fai.fr
by fai.fr ($v/$Z)$?r with $r$.
id $i$?u
for $u; $|;
$.$b')
define(`confTO_QUEUEWARN', `24h')dnl
MAILER(local)
MAILER(smtp)
Kpirateo hash -o /etc/mail/pirateo
LOCAL_RULE_0
R$+ < @ $+ > $* $: < $(pirateo $1 @ $2 $: $) > $1 < @ $2 >
$3
R< $+ > $+ < @ $+ > $* $@ $>97 $1
R<> $+ < @ $+ > $* $: $1 < @ $2 > $3
^^^^^^ tabulation unique à cet endroit, ailleurs
un simple espace
FEATURE(relay_entire_domain)
Permet à sendmail d'accepter les mails venants des postes appartenant à votre réseau privé,
sans cette ligne tre à l'envoie d'email, vous auriez sur les PC sous windows un message
d'erreur du style "Relaying denied".
FEATURE(accept_unresolvable_domains)
Sans ce feature si vous êtes off-line, vous n'arriverez pas à d'envoyer un mail d'un poste client,
par contre dès qu'on passe on-line ce paramètre devient parfaitement inutile. Cependant je
vous conseille de garder ce feature pour pouvoir stocker tous les mails dans la file d'attente de
sendmail.
Permettent que le courrier destiné à [email protected] (utilisateur local toto) ne parte chez le
FAI pour finalement revenir vers toto. ce cas de figure se produit quand on répond à un
utilisateur local, son email ayant été récrit par les genericstable. Cette astuce m'a été
communiquée par Denis Braussen d'après l'idée de Pablo Saratxaga. Vous trouverez plus de
détail sur la page de configuration d'UUCP de Denis plus précisément au chapitre 7 de la
documentation UUCP de Denis sur http://www.linux-france.org/article/connex/UUCP/denis-
uucp.
define(`confDOMAIN_NAME',...)
Ce define a pour but de faire disparaître le nom de votre domaine privé dans l'entête de vos
emais partants sur internet (Champ Received et Message-Id). Reportez vous au chapitre
masquage du domaine pour plus d'informations.
define(`confRECEIVED_HEADER',...)
Ce define contribue aussi à masquer le nom de domaine privé. Reportez vous au paragraphe
masquage du domaine.
Permet à sendmail d'accepter les mails venants des postes appartenant à votre réseau
privé, sans cette ligne tre à l'envoie d'email, vous auriez sur les PC sous windows un
message d'erreur du style "Relaying denied".
FEATURE(accept_unresolvable_domains)
Sans ce feature si vous êtes off-line, vous n'arriverez pas à d'envoyer un mail d'un
poste client, par contre dès qu'on passe on-line ce paramètre devient parfaitement
~7~
inutile. Cependant je vous conseille de garder ce feature pour pouvoir stocker tous les
mails dans la file d'attente de sendmail.
Kpirateo hash -o /etc/mail/pirateo
LOCAL_RULE_0
R$+ < @ $+ > $* $: < $(pirateo $1 @ $2 $: $) > $1 < @
$2 > $3
R< $+ > $+ < @ $+ > $* $@ $>97 $1
R<> $+ < @ $+ > $* $: $1 < @ $2 > $3
Permettent que le courrier destiné à [email protected] (utilisateur local toto) ne parte
chez le FAI pour finalement revenir vers toto. ce cas de figure se produit quand on
répond à un utilisateur local, son email ayant été récrit par les genericstable. Cette
astuce m'a été communiquée par Denis Braussen d'après l'idée de Pablo Saratxaga.
Vous trouverez plus de détail sur la page de configuration d'UUCP de Denis plus
précisément au chapitre 7 de la documentation UUCP de Denis sur http://www.linux-
france.org/article/connex/UUCP/denis-uucp.
define(`confDOMAIN_NAME',...)
Ce define a pour but de faire disparaître le nom de votre domaine privé dans l'entête de
vos emais partants sur internet (Champ Received et Message-Id). Reportez vous au
chapitre masquage du domaine pour plus d'informations.
define(`confRECEIVED_HEADER',...)
Ce define contribue aussi à masquer le nom de domaine privé. Reportez vous au
paragraphe masquage du domaine.
Les genericstables permettent de réécrire les emails locaux pour qu'ils correspondent aux
emails attribués par le FAI. Pour cela vous devez créer un fichier /etc/genericstable ,
contenant les lignes:
toto: [email protected]
tata: [email protected]
Pour faire prendre en compte la modif de ce fichier et pour le générer au format qui va bien, il
faut taper ensuite:
7. Le "hack de Pablo"
Vous devez créer un fichier /etc/mail/pirateo, dans lequel vous mettrez, la liste des adresses
email attribués par le FAI et les noms locaux correspondants comme ceci:
[email protected] toto
~8~
[email protected] tata
# bla bla
# un tas de commentaires
#
passwd: files
shadow: files
group: files
services: files
networks: files
protocols: files
rpc: files
ethers: files
netmasks: files
bootparams: files
netgroup: files
publickey: files
automount: files
aliases: files
Pourquoi donc ? Parce que si on suit les conseils de Jacoboni, Samba ne marche plus, au lieu
de travailler sur l'adresse IP de classe C de votre réseau privé que vous avez défini
(192.168.13.X par exemple), Samba va travailler sur l'adresse de classe A 127.X.X.X. Et cela
même si vous avez définit votre machine avec l'adresse qui va bien c'est à dire 192.168.13.10
machine machine.domaine.fr en plus de la ligne décrite plus haut.
Par contre n'oubliez pas de rajouter dans le fichier les postes de votre réseau privé avec le
FQDN (Fully Qualified Domain Name, nom complet), ça nous donne donc ça:
MAILER-DAEMON: postmaster
postmaster: root
9. Rechargement de sendmail
Ca y est c'est fini, pour obliger sendmail à relire son fichier de configuration, il faut d'abord
préalablement tuer sendmail s'il tourne, pour cela faire:
Rajoutez:
ATTENTION: Sur une Mandrake 6.1 en tapant sendmail -bd -os on a parfois cette erreur
En fait il suffit d'éditer /etc/sendmail.cf et de supprimer quelques lignes vides (au niveau de
la ligne 51), pour que tout rentre dans l'ordre, tapez alors à nouveau la commande sendmail -
bd -os.
Tous les emails partants se retrouvent en attente dans le répertoire /var/spool/mqueue, pour
les envoyer, une fois connecté vous devez tapez:
/usr/sbin/sendmail -q -v
Pour visualiser les messages dans la file d'attente, vous pouvez tapez:
mailq
Quand vous envoyez un courrier en local (de toto vers tata), le courrier ne va pas transiter par
mqueue, il va se retrouver directement dans la boîte aux lettres du destinataire sans avoir à
taper sendmail -q. En cas d'envoi vers un destinataire extérieur à votre domaine, le courrier
va se retrouver dans le répertoire d'attente de sendmail.
11.1 Principes
~ 11 ~
Subject: test
première ligne
------
>
> première ligne
>
------
Fin de votre message
Quelques commentaires:
On voit que l'adresse de l'utilisateur toto a bien été transformé en [email protected]. Par
ailleurs obelix.fai.fr (IP= 210.205.98.21) est le nom de la machine chez votre FAI qui a
~ 12 ~
"routé" votre email, ppptc22.fai.fr (IP=210.205.98.22) étant votre identité officielle sur le net
au moment de votre connexion.
Par contre vous voyez que d'une part le commentaire que vous avez défini dans le fichier de
config apparaît dans l'email, ce qui n'est pas vraiment génant, mais on y voit aussi le nom de
votre domaine privé dans les champs Received et Message-Id. Certains serveurs sur Internet
pourraient rejeter vos emails sous pretexte de contenir un nom de domaine inconnu.
Voyons maintenant un email envoyé d'un de vos postes client et renvoyé par un réflecteur.
------
> première ligne
Dans Received, on voit en fait le cheminement que suit le mail envoyé du poste client, il va
d'abord sur machine puis part chez le FAI (sur obelix). On voit donc le nom de votre
domaine, le nom du poste Linux et du poste client d'où a été envoyé l'email, et même l'adresse
IP que vous lui avez attribué !
Reste le problème des emails partant de postes sous Windows, où apparait le nom et l'adresse
IP, on va carrément redéfinir le champ Received:
Après correction voici la réponse d'un mail envoyé d'un poste client renvoyé par le réflecteur:
------
> Windows
On voit qu'il reste encore des traces du domaine dans l'identité du message. Voici l'email qui
part de notre serveur Linux.
------
#!/bin/bash
cd /var/spool/mqueue
for nom_mail in `ls | grep df*`
do
sed "s/machine.domaine.fr/fai.fr/g" $nom_mail > /tmp/mail.tmp
cp /tmp/mail.tmp $nom_mail
done
12.1 Principe
Vous pouvez redéfinir le nom de votre machine, tel qu'il apparaîtra dans les headers, pour
qu'il corresponde exactement avec le nom que vous a attribué le FAI, pendant une connexion
et ceci même si ce nom change à chaque connexion. Je me sers d'un truc trouvé dans le guide
du rootard que j'ai très légèrement adapté ( http://www.linux-france.org/article/grl au chapitre
~ 15 ~
13.10 pour être précis). Le truc consiste à chaque connexion de lancer un petit programme
gethost qui va déterminer le nom attribué à notre poste linux, on modifie dans la foulée le
config.mc en conséquence, on regénère sendmail.cf, on kill sendmail et on le relance dans la
foulée.
#include <stdio.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
int main(argc,argv)
char argc;
char *argv[];
{
struct hostent *host;
struct in_addr ia;
if (argc < 2) {
fprintf(stderr,"Usage: %s adresse_IP_locale \ n",argv[0]);
exit(1);
}
if (!inet_aton (argv[1],&ia)) {
fprintf(stderr,"Erreur: adresse invalide \ n");
exit(1);
}
host=gethostbyaddr((char*)&ia,sizeof(ia),AF_INET);
if (!host) {
fprintf(stderr,"Erreur: adresse non trouvée ou pas de DNS \ n");
exit(1);
}
printf("%s \ n",host->h_name);
exit(0);
}
En tant que root, copiez l'exécutable gethost sous /usr/local/sbin (ou /usr/bin c'est vous qui
voyiez...). Maintenant on va modifier /etc/ppp/ip-up qui est lancé à chaque début de
connexion pour reconstruire le fichier de config de sendmail en fonction du nom déterminé
par gethost et relancer sendmail.
#!/bin/bash
# $4 correspond à l'adresse IP attribuée lors d'une connexion
ADRESSE=$4
# détermination du nom connaissant l'adresse IP
HOST=`/usr/local/sbin/gethost $ADRESSE`
# on modifie le fichier de config pour avoir le nom qui va bien (à noter
que config.mc n'est jamais touché)
if [ -n "$HOST" ] ; then
sed s/ppp.fai.fr/$HOST/ /usr/lib/sendmail-cf/cf/config.mc >
/usr/lib/sendmail-cf/cf/config.current.mc
# on regénère sendmail.cf
cd /usr/lib/sendmail-cf/cf
m4 config.current.mc > /etc/sendmail.cf
~ 16 ~
# on tue sendmail
kill -1 `head -1 /var/run/sendmail.pid`
# on relance sendmail
/usr/sbin/sendmail -bd -os
fi
exit 0
Autre solution beaucoup plus simple, si vous voulez pas vous embêter avec un programme C,
remplacer la ligne HOST par:
A la prochaine connexion, vous aurez donc un sendmail avec une config tip-top.
12.2 Au final
Au final, en prenant en compte la modification d'adresse dynamique, Voici un mail envoyé de
mon poste linux:
------
>
mon texte
------
texte
Vous noterez que nulle part on voit la mention de mon domaine privé et encore moins mes
adresses IP privées. A noter aussi que je n'ai pas eu à lancer mon script pour corriger le champ
Message-Id. J'avais le problème avec la précédente version de la Mandrake mais plus avec
celle-ci mais en ayant la même version de sendmail, va comprendre ! Je laissse néanmoins le
script au cas où.
NOTE: A noter que de temps à autre, il n'est pas possible de déterminer le nom d'hôte
dynamique de la machine attribué lors de la connexion, et cela quelque soit la manière utilisée
pour le faire (avec gethost ou nslookup). C'est pour ça que dans le script ip-up vous trouvez
un test sur la valeur de HOST (vide ou non vide).
Si avec Microsoft Internet Mail, il est impossible d'envoyer des mails d'un poste Windows
vers le serveur Linux quand celui-ci est offline, avec l'erreur suivante dans les fichiers de log:
Et que par contre il n'y a aucun problème quand le serveur est on-line. C'est que vous avez un
problème de DNS. A noter que le problème est similaire avec Outlook Express et d'une
manière générale avec les outils de mail de Microsoft .
Si avec Netscape l'envoi de mail en mode off-line vers la file d'attente (répertoire mqueue)
prend au moins 80s autant dire une éternité, que ce soit d'un poste client ou du poste serveur.
C'est que vous avez aussi un problème de DNS.
Certains de vos mails entrants sont tout bonnement rejetés, en jetant un coup d'oeil dans
/var/log/maillog et en activant l'option de débug de sendmail, on se rend compte que ce sont
les emails avec des noms de domaines non reconnu par le DNS du FAI qui sont rejetés, en
clair c'est une protection par défaut anti-spam de sendmail qu'il n'est pas judicieux de
désactiver.
~ 19 ~