Après avoir trouvé la doc sur Debian et Exim, je me lance dans la config de ce serveur mails.


Je me baserai donc sur les pages de doc que j’avais indiqué dans un billet précédent:

D’abord sur les 2 premières pages.
L’anti-virus, ce sera pour après.

Ce serveur est un Kimsufi, hébergé chez OVH.

A l’origine ce serveur était en Gentoo, mais connaissant assez bien Debian et pas du tout Gentoo, je l’ai fait reconfigurer en Debian.

Sur ce serveur tourne aussi un serveur Web Apache.
J’ai commencé à développer un site Web sur les PC et les logiciels libres, en particulier Ubuntu :

www.libre-pc.be/
www.libre-pc.com/

Je vais me servir de ces domaines pour configurer et tester le serveur Exim4. J’ai modifié dans le DNS le record MX de ces deux domaines pour qu’il pointe vers notre serveur Exim4.

Si vous avez besoin d’une explication rapide sur les DNS et le MX record, Wikipedia est comme souvent une bonne source d’information.

Exim4 est installé de base dans Debian… Reste à le configurer.

Remarque : Exim peut être installé avec deux types de fichiers de configuration.

Cette façon de faire est préférable au niveau compréhension, clarté et il y a moins de risque d’erreur en n’éditeur qu’un petit fichier à la fois.

Le serveur Exim devra gérer plusieurs comptes mails et sur plusieurs domaines.
Pour un serveur Exim4 Multi-Domaines, il faut définir des Virtual Domains.


Le site www.debian-administration.org me donne une bonne explication « Handling mail for multiple virtual domains with exim4″ à ce sujet.

La page « Exim4 Virtual Host on Debian Etch » du site www.ebuntu.org est aussi très instructive. Ces deux pages sont complémentaires et j’ai réellement compris (enfin je crois) après avoir lu les deux.

Dans le dossier /etc/exim4, il faut créer un dossier « virtualhosts » et y mettre un fichier texte par domaine pour lequel Exim devra gérer du courrier.

J’obtiens donc 2 fichiers vides :

ks12345:/etc/exim4/virtualhosts# ls -l
total 0
-rw-r--r--  1 root root 0 Nov 18 03:24 libre-pc.be
-rw-r--r--  1 root root 0 Nov 18 03:24 libre-pc.com

Pour chaque domaine, il faudra mettre dans son fichier une ligne du genre :

address : username@localhost

Ainsi si j’ai des boites utilisateurs en local sur ce serveur, je mettrais par exemple pour « libre-pc.be »

didier : didier@localhost
jean : jean@localhost
david : david@localhost

pour « libre-pc.com » je veux réenvoyer le mail vers libre-pc.be.

*: catchall@libre-pc.be

Cela veut dire que tout le courrier envoyé à « didier@libre-pc.be » sera envoyé à la boite mail LOCALE de l’utilisateur « didier » sur le serveur lui-même (localhost).
Par contre, pour « libre-pc.com » tout le mail sera redirigé vers l’autre domaine « libre-pc.be »

REMARQUE : Je vérifierai ce point par après !

Il faut maintenant configurer Exim pour qu’il accepte du courrier de tous les domaines pour les quels on aura créé un fichier dans le dossier « virtualhosts ».
Cela permettra d’ajouter facile des nouveaux domaines mails, sans devoir éditer à chaque fois le fichier de configuration.
Pour le moment, la liste des domaines que Exim accepte est dans son fichier de configuration.

cd /etc/exim4/conf.d/main/
vi 01_exim4-config_listmacrosdefs

On y trouve les lignes :

# Create domain and host lists for relay control
# '@' refers to 'the name of the local host'

.ifndef MAIN_LOCAL_DOMAINS
MAIN_LOCAL_DOMAINS = DEBCONFlocal_domainsDEBCONF
.endif
domainlist local_domains = MAIN_LOCAL_DOMAINS

Remplacer la dernière ligne par

domainlist local_domains = @:localhost:dsearch;/etc/exim4/virtual

Cela forcera Exim4 à aller chercher la liste des domaines dans le dossier que nous venons de créer.

Il faut maintenant créer un fichier d’Alias pour les Virtuals Domains.

Créer un nouveau fichier :

vi /etc/exim4/conf.d/router/350_exim4-config_vdom_aliases

et y mettre les lignes suivantes :

vdom_aliases:
      driver = redirect
      allow_defer
      allow_fail
      domains = dsearch;/etc/exim4/virtual
      data = ${expand:${lookup{$local_part}lsearch*@{/etc/exim4/virtual/$domain}}}
      retry_use_local_part
      pipe_transport   = address_pipe
      file_transport   = address_file
      no_more

Il reste évidemment à redémarrer Exim.

/etc/init.d/exim4 restart

Et à vérifier que tout fonctionne comme voulu.

La page « Installing and configuring Exim 4 on Debian » donne des exemples simples pour envoyer des mails depuis la console

Quelques essais :

mail -s 'sujet' adresse@email  (terminer par une ligne avec un ".")

On peut envoyer un mail via Exim à une adresse locale :

exim4 -bt local_user@example.com

dans mon cas :

exim4 -bt didier@libre-pc.be

Pour une adresse vers un serveur extérieur :

exim4 -v mailbox_you_can_check@dom.ain
   From: user@your.domain
   To: mailbox_you_can_check@dom.ain
   Subject: Testing exim

   Testing exim
   .

Mes essais :

J’essaye en console sur le serveur quelques commandes :

mail -s 'Essais 1' didier@libre-pc.be
Bonjour
premier essais
.
Cc:didier.misson@belcenter.comil -s 'Essais 1' didier@libre-pc.be Bonjour premier essais . Cc:didier.misson@belcenter.com

Quelques secondes après, je reçois bien la copie du mail dans mon Thunderbird à la maison.
Donc, la sortie de mail depuis le serveur vers une adresse extérieure fonctionne.

Par contre, rien en local !

Exim4 détecte bien, sur base du record MX que c’est une adresse locale.
mais ensuite, il ne délivre pas le mail.
Analysons le log :

2006-11-21 09:00:25 1GmQYL-0002JY-RE <= root@abcde.be U=root P=local S=340
2006-11-21 09:00:25 1GmQYL-0002JY-RE lowest numbered MX record points to local host: libre-pc.be
2006-11-21 09:00:25 1GmQYL-0002JY-RE == didier@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host
2006-11-21 09:00:26 1GmQYL-0002JY-RE => didier.misson@belcenter.com R=dnslookup T=remote_smtp H=MX01.AS31449.net [217.112.180.111]
2006-11-21 09:00:26 1GmQYM-0005IR-E6 <= <> R=1GmQYL-0002JY-RE U=Debian-exim P=local S=593
2006-11-21 09:00:26 1GmQYL-0002JY-RE Frozen
2006-11-21 09:00:26 1GmQYM-0005IR-E6 => postmaster@abcde.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29]
2006-11-21 09:00:26 1GmQYM-0005IR-E6 Completed

On remarque que :

L’analyse de l’entête du mail reçu dans ma boite Belcenter donne ceci :

Received : from mx01.as31449.net (mx01.as31449.net [217.112.180.111])	by ns2.belcenter.be (8.13.6/8.13.4) with ESMTP id kAL7r8cC001780	for ; Tue, 21 Nov 2006 08:53:08 +0100 
Received : from ks12345.kimsufi.com (ks12345.kimsufi.com [87.98.123.123])	by mx01.as31449.net (AS31449.net - MX's GW) with ESMTP id 1A3ABE3E8K	for ; Tue, 21 Nov 2006 09:00:25 +0100 (CET) 
Received : from root by ks12345.kimsufi.com with local (Exim 4.50)	id 1GmQYL-0002JY-RE; Tue, 21 Nov 2006 09:00:25 +0100

On voit donc que Exim4 a reçu le mail envoyé par « root », il l’envoie ensuite au serveur mail de Belcenter, qui lui-même le délivre.

Par contre, si je répond à ce mail, il est refusé par Exim :

2006-11-21 08:32:17 H=smtp40.mobistarmail.be [193.252.23.61] F= rejected RCPT : relay not  permitted

Pour le moment, notre serveur Exim n’accepte pas de mails venant de l’extérieur, même venant d’un serveur SMTP officiel.
C’est très sécure ! Trop même… Mais nous verrons ce problème par la suite, en évitant bien entendu de devenir un « Open Relay » ouvert à tous les spammeurs !

D’abord, pourquoi aucun mail local n’est délivré ?

Faut-il absolument un MDA ? Ou les mails ne devraient-ils pas arriver dans les boites locales telque « /home/blog/Mail » ?

En essayant d’envoyer un mail avec Exim4 vers un destinataire locale, j’obtiens :

# exim4 -bt didier@libre-pc.be
R: dnslookup for didier@libre-pc.be
LOG: MAIN
  lowest numbered MX record points to local host: libre-pc.be (while routing )
didier@libre-pc.be cannot be resolved at this time:
  lowest numbered MX record points to local host

Pourtant, j’ai bien ceci dans le fichier « libre-pc.be »

ks12345:/etc/exim4/virtualhosts# cat libre-pc.be
didier : didier@localhost

Je pense que les problèmes de mails locaux viennent du fait que les boites mails au format maildir ne sont pas créées.
La commande pour les créer existe quand dans le package « courier-base ».
Installons le :

ks12345:~# apt-get install courier-base
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  libfam0c102
Recommended packages:
  fam
The following NEW packages will be installed:
  courier-base libfam0c102
...

J’ai maintenant la commande maildirmake qui devrait m’initialiser un dossier au format maildir.
Je l’utilise comme utilisateur, pas en root, puisque je dois initialiser une boite par utilisateur :

maildirmake ~/Maildir/

Effectivement, il m’a créé un dossier « Maildir »

didier@ks12345:~$ cd Maildir/
didier@ks12345:~/Maildir$ ls -l
total 12
drwx------  2 didier didier 4096 2006-11-23 07:21 cur
drwx------  2 didier didier 4096 2006-11-23 07:21 new
drwx------  2 didier didier 4096 2006-11-23 07:21 tmp

Je revérifie la résolution par Exim de mon adresse locale :

 exim4 -bt didier@libre-pc.be
R: dnslookup for didier@libre-pc.be
LOG: MAIN
  lowest numbered MX record points to local host: libre-pc.be (while routing )
didier@libre-pc.be cannot be resolved at this time:
  lowest numbered MX record points to local host

Il n’arrive toujours pas à résoudre l’adresse :-(

J’envoie un mail en console vers 3 adresses « didier@libre-pc.be« , « info@libre-pc.be » et « didier.misson@belcenter.com« .
« didier » est local, « info » devrait être renvoyé vers une adresse externe et l’adresse « belcenter.com » est externe.

Je vois ceci dans le log :

2006-11-23 07:43:21 1Gn8Ir-0006NP-8G <= root@coolconcept.be U=root P=local S=344
2006-11-23 07:43:21 1Gn8Ir-0006NP-8G lowest numbered MX record points to local host: libre-pc.be
2006-11-23 07:43:21 1Gn8Ir-0006NP-8G == info@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host
2006-11-23 07:43:21 1Gn8Ir-0006NP-8G lowest numbered MX record points to local host: libre-pc.be
2006-11-23 07:43:21 1Gn8Ir-0006NP-8G == didier@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host
2006-11-23 07:43:21 1Gn8Ir-0006NP-8G => didier.misson@belcenter.com R=dnslookup T=remote_smtp H=MX01.AS31449.net [217.112.180.111]
2006-11-23 07:43:21 1Gn8Ir-0003QC-OK <= <> R=1Gn8Ir-0006NP-8G U=Debian-exim P=local S=660
2006-11-23 07:43:21 1Gn8Ir-0006NP-8G Frozen
2006-11-23 07:43:22 1Gn8Ir-0003QC-OK => postmaster@coolconcept.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29]
2006-11-23 07:43:22 1Gn8Ir-0003QC-OK Completed

Ca ne m’aide pas vraiment…
Je reçois bien le mail externe, celui envoyé à « didier.misson@belcenter.com »,
mais pas de trace des 2 mails « @libre-pc.be »

Malgré que ma boite au format Maildir soit créée, je pense qu’Exim4 n’est pas configuré pour utiliser le format Maildir.
Dans ce cas, il ne trouve pas non plus de boite au format mailbox … et ne peut distribuer le courrier.

Effectivement, dans le fichier « 30_exim4-config_mail_spool« , je vois la ligne

mail_spool:
  ...
  file = /var/mail/$local_part

C’est bien une configuration pour le format mailbox ! Ce n’est pas ce que je veux. La configuration correcte est bien expliquée dans ces 2 pages :

Voici ce que le fichier correct :

vi /etc/exim4/conf.d/transport/30_exim4-config_mail_spool
### transport/30_exim4-config_mail_spool

# This transport is used for local delivery to user mailboxes in traditional
# BSD mailbox format.
#
mail_spool:
  debug_print = "T: appendfile for $local_part@$domain"
  driver = appendfile
#  file = /var/mail/$local_part
  delivery_date_add
  envelope_to_add
  return_path_add
  group = mail
  mode = 0660
  mode_fail_narrower = false
  directory = ${home}/Maildir
  maildir_format
  message_prefix = ""

Un petit restart d’Exim

ks12345:/# /etc/init.d/exim4
restart Restarting MTA: exim4.

Un petit mail vers didier@libre-pc.be …
et ça ne fonctionne toujours pas !

Au lieu d’essayer vers une adresse d’un virtual host, je vais essayer directement en local.
La résolution se fait correctement :

ks12345:/var/log/exim4# exim4 -bt didier@localhost
R: system_aliases for didier@localhost
R: userforward for didier@localhost
R: procmail for didier@localhost
R: maildrop for didier@localhost
R: local_user for didier@localhost

J’envoie un mail vers didier@localhost mais je ne reçois toujours rien.
Je regarde le log :

2006-11-23 08:18:13 1Gn8qb-00013R-6I <= root@abcde.be U=root P=local S=313
2006-11-23 08:18:13 1Gn8qb-00013R-6I == didier@localhost R=local_user T=mail_spool defer (13): Permission denied: creating lock file hitching
 post /var/mail/didier.lock.ks12345.kimsufi.com.45654b35.00007b4e (euid=1002 egid=8)
2006-11-23 08:18:13 1Gn8qb-00013R-6I ** didier@localhost: retry timeout exceeded
2006-11-23 08:18:13 1Gn8qb-0006Pz-7o <= <> R=1Gn8qb-00013R-6I U=Debian-exim P=local S=1271
2006-11-23 08:18:13 1Gn8qb-00013R-6I Completed
2006-11-23 08:18:14 1Gn8qb-0006Pz-7o => root@abcde.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29]
2006-11-23 08:18:14 1Gn8qb-0006Pz-7o Completed

Il essaye dans un dossier totalement différent de celui que j’ai défini !
On dirait qu’il n’a pas pris en compte ma définition pour le format maildir…

Je trouve une explication pour configurer Exim4 au format maildir sur cette page
Installing and configuring Exim 4 on Debian

Il faut éditer le fichier « /etc/exim4/update-exim.conf.conf » et y ajouter la ligne :

dc_localdelivery='maildir_home'

Faire un /etc/init.d/exim4 restart

On progresse !
En effet la vérification d’adresse donne ceci :

ks36586:/etc/exim4# exim4 -bt didier@localhost
R: system_aliases for didier@localhost
R: userforward for didier@localhost
R: procmail for didier@localhost
R: maildrop for didier@localhost
R: local_user for didier@localhost
didier@localhost
  router = local_user, transport = maildir_home

Et dans le log :

2006-11-23 08:42:07 1Gn9Dj-0005ti-DW <= root@abcd.be U=root P=local S=319
2006-11-23 08:42:07 1Gn9Dj-0005ti-DW => didier  R=local_user T=maildir_home
2006-11-23 08:42:07 1Gn9Dj-0005ti-DW Completed

Mon mail est OK maintenant !
J’ai bien reçu le mail dans ma boite LOCALE :-)

didier@ks12345:~/Maildir/new$ ls -l
total 4
-rw-------  1 didier didier 431 2006-11-23 08:42 1164267727.H438019P10186.ks12345.kimsufi.com

Je ne sais pas comment il compose son nom de fichier, mais en allant voir son contenu, c’est bien le mail que je me suis envoyé :-)

Je refais un test vers « didier@libre-pc.be » …

et ça ne fonctionne toujours pas.

Donc, un problème de résolu : les mails @localhost et les boites au format maildir,
mais il reste un problème avec le dossier virtualhost qui n’est pas pris ! :-(

Ok…
Un oeil extérieur, ça aide souvent beaucoup ;-)
Mon problème vient d’une stupide erreur de nom de dossier pour les virtual hosts!

J’ai « virtual » dans les 2 fichiers de configuration

et « virtualhosts » dans les autres fichiers et comme dossier ! :o )

Je corrige et mets « virtualhosts » partout, et restart de Exim4 évidemment.

Ca ne va pas encore. Il doit rester une erreur :

exim4 -bt didier@libre-pc.be
R: dnslookup for didier@libre-pc.be
LOG: MAIN
  lowest numbered MX record points to local host: libre-pc.be (while routing )
didier@libre-pc.be cannot be resolved at this time:
  lowest numbered MX record points to local host
2006-11-23 19:24:46 1GnJFe-0001XV-SA <= root@abcde.be U=root P=local S=329
2006-11-23 19:24:46 1GnJFe-0001XV-SA lowest numbered MX record points to local host: libre-pc.be
2006-11-23 19:24:46 1GnJFe-0001XV-SA == didier@libre-pc.be R=dnslookup defer (-1): lowest numbered MX record points to local host
2006-11-23 19:24:46 1GnJFe-0004zm-T7 <= <> R=1GnJFe-0001XV-SA U=Debian-exim P=local S=593
2006-11-23 19:24:46 1GnJFe-0001XV-SA Frozen
2006-11-23 19:24:47 1GnJFe-0004zm-T7 => postmaster@abcde.be R=dnslookup T=remote_smtp H=mx1.ovh.net [213.186.33.29]
2006-11-23 19:24:47 1GnJFe-0004zm-T7 Completed

J’ai finalement trouvé.

Tout se passe comme si Exim4 ne tenait même pas compte de ma définition indiquant un dossier /etc/exim4/virtualhosts
Pas qu’il ne le trouve pas… Il n’en tient pas compte !

Pourquoi ?

C’est un problème de configuration d’Exim4.
Il y a deux façons d’avoir les fichiers de configuration d’Exim4.

  1. soit regroupé en 2 ou 3 gros fichiers
  2. soit splitté en plusieurs petits fichiers de configuration

Cette 2ème manière est plus claire et souple, et elle correspond aux fichiers de configuration que j’ai. Mais Exim n’en tient pas compte car il n’est pas dans ce mode !
Il faut forcer ce mode « split config » :

vi /etc/exim4/update-exim.conf.conf
dc_use_split_config='true'

Redémarrage d’Exim et essais de résolution :

# exim4 -bt didier@libre-pc.be
LOG: MAIN PANIC DIE
 failed to open /etc/exim4/virtual for directory search: No such file or directory

C’est TRES clair !
Il me reste un mauvais nom de dossier « virtual » qui traine dans un fichier de configuration.

Il est ici :

/etc/exim4/conf.d/router# vi 350_exim4-config_vdom_aliases

La ligne « domains » était fausse et contenait le dossier « /etc/exim4/virtual »
Je l’ai corrigée :

vdom_aliases:
     driver = redirect
     allow_defer
     allow_fail
     domains = dsearch;/etc/exim4/virtualhosts
     data = ${expand:${lookup{$local_part}lsearch*@{/etc/exim4/virtualhosts/$domain}}}
     retry_use_local_part
     pipe_transport   = address_pipe
     file_transport   = address_file
     no_more

Voilà, ça fonctionne nettement mieux !

J’ai actuellement ceci dans /etc/exim4/virtualhosts/libre-pc.be

Quelques essais de résolution :

# exim4 -bt didier@libre-pc.be
R: system_aliases for didier@localhost
R: userforward for didier@localhost
R: procmail for didier@localhost
R: maildrop for didier@localhost
R: local_user for didier@localhost
didier@localhost
   <-- didier@libre-pc.be
 router = local_user, transport = maildir_home

# exim4 -bt info@libre-pc.be
R: dnslookup for didier.misson@belcenter.com
didier.misson@belcenter.com
   <-- info@libre-pc.be
 router = dnslookup, transport = remote_smtp
 host MX01.AS31449.net [217.112.180.111] MX=10
 host MX02.AS31449.net [217.112.181.155] MX=1000

Cela fonctionne correctement :

:-)
Il reste un petit problème: A la réception dans ma boite Belcenter, Thunderbird classe directement le mail reçu dans les SPAM :-(
Je pense que c’est une question d’adresse d’origine du mail, mais je verrai cela plus tard ;-)

Exim4 en réception ?

Cela fonctionne. Si je fais « Répondre » dans Thunderbird, la réponse arrive bien au serveur. Elle est bien traitée par Exim4 qui place le mail en local dans /home/blog/Maildir/new
Mon mail venant de ma boite « belcenter.com » a bien été envoyé depuis le serveur SMTP de Mobistar.

2006-11-24 04:03:24 1GnRLY-00012N-Tw <= didier.misson@belcenter.com H=smtp40.mobistarmail.be [193.252.23.61]
 P=esmtp S=1639 id=456660D2.1010605@belcenter.com
2006-11-24 04:03:24 1GnRLY-00012N-Tw => didier  R=local_user T=maildir_home
2006-11-24 04:03:24 1GnRLY-00012N-Tw Completed

Et la sécurité ?
Je n’ai pas envie de servir de relais de spams !

Elle semble assurée, ok !

Si j’envoie vers le serveur Exim4 un mail, via le relais SMTP de mon provider Internet, vers une adresse dont le domaine n’est pas configuré dans les virtual hosts d’Exim, Exim4 rejette le mail et renvoie un message d’erreur vers l’expéditeur.

Dans le log :

2006-11-24 04:17:59 H=smtp40.mobistarmail.be [193.252.23.61] F= rejected RCPT < 
didier@libre-pc.com>: relay not permitted

J’ai en effet le fichier /etc/exim4/virtualhosts/libre-pc.be , mais PAS celui de libre-pc.com.
Le MX record de « libre-pc.com » pointe bien vers le serveur Exim, mais Exim4 rejette les mails de ce domaine car il ne fait pas partie des virtual hosts définis.

Exim4 n’accepte donc en entrée QUE les mails vers SES propres domaines.

Ce billet est devenu plus une liste des recherches d’erreurs que j’avais faite, qu’une recette d’installation et configuration ;-)

Je vais refaire dés que j’aurai le temps, un nouveau billet propre et plus court, en ne reprendant QUE ce qui est correct, sans le debugging ;-)

Si vous lisez ce billet avant que j’en ai fait la synthèse, j’espère que cela vous guidera malgré tout. ;-)


Réseaux sociaux :
  • Print
  • Identi.ca
  • Twitter
  • Facebook
  • email
  • PDF
  • RSS
  • Digg
  • Sphinn
  • del.icio.us
  • Mixx
  • Google Bookmarks
  • MySpace
  • Netvibes
  • Technorati
  • Wikio
  • Wikio FR
  • LinkedIn
  • Add to favorites
  • FriendFeed
  • viadeo FR
  • Yahoo! Buzz
  • MisterWong
Si vous appréciez cet article, laissez un commentaire ou abonner vous au flux RSS feed pour avoir les articles futures délivrés dans votre Reader.

Articles relatifs

Written on novembre 18th, 2006 & filed under Serveurs Tags: , ,