Configuration d'Exim sous Debian Jessie pour de l'envoi de mails

Introduction: motivations et contexte, bref plan

Au fur et à mesure que j'ajoute des guirlandes à mon serveur (comprendre: de nouveaux services), revient régulièrement le fait que pouvoir envoyer des mails, par exemple pour réinitialiser un mot de passe, est tout de même un élément utile. Dernier exemple en date : la tentative d'installation d'une instance Sandstorm dans un conteneur, par curiosité suite à un retour d'expérience sur ce logiciel aux JDLL 2017.

Je ne souhaite néanmoins pas faire un serveur de mails complet, car j'ai l'impression que c'est assez lourd à mettre en place et maintenir, notamment niveau sécurité et avec les paramétrages à faire pour ne pas finir dans les spams des gens avec qui on dialogue. Les mails me paraissent par ailleurs être un service critique sur lequel je veux avoir l'esprit tranquille, c'ets donc un service que j'ai délégué (compte chez Ouvaton).

D'où mon souhait d'avoir un serveur de mails pour l'envoi uniquement. Pas besoin d'ouvrir son port 25 pour recevoir du courrier, ni de devoir sécuriser cette nouvelle brèche potentielle.

A noter qu'il est possible de paramétrer exim pour passer par un relais pour cet envoi de courrier (par exemple le serveur SMTP de son FAI ou de son fournisseur de mails traditionnel), mais c'est tellement plus hype d'être indépendant1.

Pour le présent articles je suivrai le déroulé suivant, qui consiste en une organisation des notes que j'ai prises au fur et à mesure:

  1. Synthèse des étapes nécessaires
    • Configuration classique
    • Cas particulier
  2. Autres et retour d'expérience complémentaire
    • REX
    • Infos utiles
    • Divers

Synthèse

Je résume ci-dessous ce qui me paraît être le minimum à faire pour pouvoir envoyer ses mails avec Exim sous Debian Jessie. A noter que je suppose qu'un domaine 'perso.site.org'2 pointe vers l'adresse IP publique de la machine, ce qui oriente ma configuration ci-dessous3.

Vérifier son pare-feu

Vérifier que sa machine peut envoyer des paquets sur le port 25 de serveurs distants (pour que notre MTA puisse communiquer avec ses pairs): ci-dessous en testant sur le serveur de laposte:

host laposte.net

me renvoie notamment une ligne "laposte.net mail is handled by 10 smtpz4.laposte.net.", d'où la ligne suivante:

telnet smtpz4.laposte.net. 25

Si tout va bien on arrive sur une console telnet (qu'on peut quitter avec "CTRL+]" (cf message de telnet: "Escape character is '^]'."). Si cela n'est pas possible alors il y a là un souci ; notre machine ne peut pas communiquer avec les serveurs de messagerie extérieurs.

Configurer exim

A noter que je présume ici exim installé tel qu'il l'est par défaut sur une Debian Jessie fraîche.

On commence par reconfigurer gentiment par l'outil existant:

dpkg-reconfigure exim4-config

Ci-après les choix successifs à l'interrogatoire (pompé de cet article croisé au cours de mes recherches pour le résumé, avec une adaptation au propos tenu ici; désolé pour l'anglais):

  • General type of mail configuration: internet site: mail is sent and received directly using SMTP
  • System mail name: perso.site.org
    • nom qui sera renseigné dans /etc/mailname
  • IP-addresses to listen on for incoming SMTP connections: 127.0.0.1 ; ::1
  • Other destinations for which mail is accepted: perso.site.org, debian
    • "debian" étant le nom local de la machine, renvoyé par la commande 'hostname' et éditable dans le fichier '/etc/hostname'
    • à noter que des tutos recommandent aussi de mettre des valeurs supplémentaires (exemple: 'localhost', dont le texte précédent le champ de réponse précise clairement que cette valeur est de toute façon ajoutée...) mais ma configuration, fonctionnelle, montre que ce n'est pas indispensable
  • Les questions suivantes laissées aux valeurs par défaut:
    • The “Domains to relay mail for:” option is empty.
    • The “Machines to relay mail for:” option is empty.
    • Keep number of DNS-queries minimal (Dial-on-Demand)? No
    • Delivery method for local mail: Format « mbox » dans /var/mail
    • Split configuration into small files? No

A ce stade, en principe sur une installation fraîche c'est fonctionnel. J'ai reproduit sur dans un conteneur fraîchement créé, ça fonctionne. It just works ©. On peut tester par l'envoi d'un mail sur toto@fournisseursympa.com :

echo "Youpi ça marche!" | mail -s "Test d'envoi de mail" toto@fournisseursympa.com

On n'oubliera pas de vérifier le dossier de spam de l'adresse destinataire si nécessaire.

Résolution de mon problème particulier

Ca ne fonctionnait en revanche pas tel quel sur mon serveur; j'imagine que des tripatouillages antérieurs ont fait bouger les lignes. Toujours est-il que les messages ne partaient pas, j'avais dans mes logs des lignes du type suivant:

1Ruz3Y-0005TQ-Ek == user@perso.site.org R=dnslookup T=remote_smtp defer (-53): retry time not reached for any host

Le 'R=dnslookup' m'a porté à croire que c'était la faute de la résolution DNS, d'abord après avoir croisé cette archive et ensuite après avoir fait pointer le domaine 'perso.site.org' sur l'IP locale de ma machine via le résolveur DNS de mon routeur, qu'interroge ma machine pour ses requêtes DNS4. La solution pour moi a été de diriger, au niveau d'exim, le nom de mon domaine utilisé ('perso.site.org') vers ma propre machine, via exim lui-même puisqu'avec le fichier "/etc/hosts" je n'avais pas de succès. Pour cela on exploite un composant d'exim, à savoir 'hubbed_hosts' :

# echo "perso.site.org: 127.0.0.1" > /etc/exim4/hubbed_hosts
# service exim4 restart

Retours d'expérience complémentaires et autres

Retours d'expérience complémentaires

  • Les tutoriaux que j'ai croisés recommandaient de modifier le fichier "/etc/hosts" pour y faire figurer une ligne '127.0.0.1 perso.site.org' afin que le composant d'exim gérant la boîte aux lettres (le 'mail user agent', i.e. le MUA, qui rentre en jeu lorsqu'on utilise la commande 'mail') trouve le composant gérant le transport du courrier (le 'mail transport agent' : le MTA), lequel se charge de contacter les serveurs de courrier extérieurs5. De ce que j'ai observé cela ne fonctionne pas pour exim, comme si ce dernier aller directement faire de la résolution de nom de domaine. Voir la solution à mon problème sur ce point.

  • En passant, ayant eu maille à partir avec le fichier '/etc/hosts' et sa bonne prise en compte, j'ai appris que tester le contenu de ce fichier avec la commande 'host' est inutile car cette dernière commande vient avec le paquet bind et ne fait que de la résolution DNS; elle va donc directement interroger les serveurs DNS et ne pas se poser de questions sur l'environnement local. Même si les applications devraient en principe consulter ce fichier '/etc/hosts' avant de faire une résolution DNS (pourvu que 'files' soit placé avant 'dns' dans le fichier '/etc/nsswitch.conf', sur la ligne commençant par 'hosts'). On peut vérifier cette bonne prise en compte par un ping :

    ping -c 1 perso.site.org
    

    devrait taper sur l'IP renseignée dans "/etc/hosts" pour le domaine 'perso.site.org'. Voir ici pour la source la plus explicite que j'ai croisée sur le sujet et là une autre source de propos analogue.

  • Ici le descriptif qui m'a été utile pour le fichier 'hubbed_hosts'; à noter que la doc d'exim permet certainement de retrouver ces infos, mais on a là deux trois lignes d'exemples, et je n'ai pas trouvé facilement la doc d'exim (dans /etc/exim4/conf.d/router/150_exim4-config_hubbed_hosts on nous dit: "see exim4-config_files(5) and spec.txt chapter 20.3 through 20.7 for more detailed documentation." mais je ne sais guère où chercher cette doc; sur le site au chapitre idoine la recherche de la chaîne 'hubbed' ne renvoie rien...)

Commandes exim utilisées

  • Voir la liste de messages en attente:

    exim4 -bp
    
  • Voir le status détaillé pour le message '1czhuD-0005t5-RK' (et mieux comprendre ce qui s'est passé en cas de dysfonctionnement) (source):

    exim -d -bt 1czhuD-0005t5-RK
    
  • Traiter toute la file d'attente, y compris les messages en statut gelé ('frozen'):

    exim4 -qff
    

    le 'q' vaut pour 'queue', le premier 'f' pour 'force' et le second pour 'frozen', de ce que j'en ai compris; source ici

  • Vider la file d'attente en supprimant les mails en attente; utile en phase de test! :

    exiqgrep -i | xargs exim -Mrm
    

Infos utiles

  • Fichier log par défaut: /var/log/exim4/mainlog
  • Fichier avec le nom par défaut de notre machine pour les mails : /etc/mailname
    • par exemple si on a dans ce fichier la ligne 'perso.site.org' les mails envoyés seront en 'user@perso.site.org'
    • fichier édité lors de la configuration d'exim avec 'dpkg-reconfigure exim4-config'
  • pour gérer le service, vérifier qu'il tourne, le redémarrer pour lever le doute quant à la prise en compte de certains changements:
    service exim4 status|stop|start|restart
    

Autres

  • Pour envoyer un mail via telnet il paraît que c'est possible (voir par exemple ici mais non testé avec succès (faute de temps) et légèrement hors scope).

  • Pour se rassurer sur le fait qu'on n'est pas blacklisté on peut jeter un oeil ici (pas grande idée sur la valeur de ce site, mais ça m'affichait quasi tout en vert pour mon cas donc ça m'a laissé penser en première approche que ce n'était pas ça mon problème, et de fait).

Plus loin

Pour aller plus loin on pourrait imaginer:

  • paramétrer de façon à moins finir dans les spams;
  • configurer l'adresse utilisée par défaut pour les services pour la passer en 'noreply@perso.site.org' pour bien marquer que c'est à sens unique.

En l'état cela répond néanmoins à mon besoin.

Notes


  1. et de finir dans les spams. 

  2. je sais, un .org et un site perso c'est a priori peu compatible. 

  3. J'ai néanmoins remarqué que mettre n'importe quoi (par exemple, 'nimp.ortequoi') à la place ne changeait rien pourvu qu'on reste cohérent dans la configuration. 

  4. ça ne fonctionnait toujours pas, mais avec un message d'erreur un peu différent, ce qui laissait penser que j'étais sur la bonne piste. 

  5. ceci étant ce que je crois avoir compris de mes recherches sur le sujet. 

Vus : 2246
Publié par vhaguer : 5