Débuter avec le serveur de messagerie Exim

Gazette Linux n°158 — Janvier 2009

Adaptation française: Nicolas Provost

Relecture de la version française : Deny

Article paru dans le n°158 de la Gazette Linux de Janvier 2009.

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Introduction
Cycle de vie d'un courriel
Le fichier de configuration
SMTP et ESMTP
ACLs
Routeurs
Mécanismes de transport
Débogage
Conclusion

Introduction

La plupart des utilisateurs de Linux n'ont pas spécialement besoin d'un serveur de messagerie. Une installation Linux traditionnelle mettra en place par défaut le serveur de messagerie de la distribution, qui sera peu utilisé.

Si vous avez plus de besoins et que vous voulez installer un serveur de messagerie libre, vous constaterez qu'il y a habituellement 3  possibilités : Sendmail, Postfix et Exim. Cet article traite d'Exim, qui est mon serveur de messagerie de prédilection.

Exim est un serveur de messagerie très complet. Il est utilisable dans de nombreux contextes, bien que les petits sites préfèrent parfois une alternative plus simple telle msmtp.

J'utilise Exim depuis plus de 3 ans. Il a prouvé son efficacité, sa flexibilité et sa fiabilité, et me procure toutes les fonctionnalités dont j'ai besoin. Certaines fonctions que vous trouverez utiles sont compatibles avec Sendmail  : authentification, cryptage, relai de messagerie, intégration facilitée avec de nombreuses bases de données populaires aussi bien que des scanneurs de virus ou de pourriels (spam).

Exim est hautement configurable. Le site web d'Exim fournit un manuel complet en ligne, mais s'y plonger peut sembler décourageant à première vue. Cet article se veut une introduction rapide à la plupart des points clés de configuration. Une fois que ceux-ci vous seront familiers, vous pourrez parcourir le manuel et le Wiki pour trouver d'autres fonctionnalités qui vous seront utiles.

Le fichier de configuration inclut une large palette d'options intégrées, notamment des schémas pour interroger des fichiers ou des bases de données et intégrer facilement SpamAssassin, ClamAV et d'autres scanneurs de pourriels ou de virus. Certaines options contrôlent quelles fonctionnalités sont activées, d'autres permettent à Exim de gérer toute sorte de mécanismes nécessaires pour communiquer avec d'autres serveurs de messagerie. Si les options adéquates sont précisées à la compilation, il y a également possibilité d'utiliser des programmes Perl et C pour fournir des fonctions avancées.

Au moment de la rédaction de cet article, la version courante d'Exim est la 4.69. Si vous utilisez une autre version, vous trouverez peut-être des variantes dans les fonctionnalités, mais Exim reste stable et je pense que toute version plus récente prendra en charge les fonctions décrites dans cet article.

Cycle de vie d'un courriel

Exim traite un courriel en 3 phases. Il s'agit de la réception (acceptance), du routage (routing) et de la distribution (delivery).

La réception est contrôlée par des listes de contrôle d'accès (ACL). Les ACL déterminent de qui vous acceptez les courriels, à destination de qui, et selon quels autres critères vous souhaitez les filtrer.

Le routage est effectué par des routeurs (routers). Les routeurs déterminent où Exim va acheminer les courriels. Habituellement, il s'agit soit d'un autre serveur de messagerie, soit d'une boîte de messagerie locale.

La distribution est effectuée par des mécanismes de transport ou messagers (transports). Ils déterminent les mécanismes de livraison du courrier. Les courriels peuvent être transmis à un autre serveur de messagerie, écrits dans une boîte aux lettres, ou envoyés à un programme qui les traitera.

Le fichier de configuration

Le fichier de configuration comprend cinq sections : les options de configuration globales, ACL, les routeurs, les mécanismes de transport et les règles pour les essais multiples (retry).

Le fichier de configuration par défaut livré avec le source est très bien commenté. Je ne vous conseille pas d'écrire un fichier de configuration en partant de zéro ; il est toujours préfèrable d'adapter le fichier de configuration par défaut à vos besoins. Le fichier de configuration livré par défaut avec Exim 4.69 est disponible ici.

Notez que le fichier de configuration livré avec le paquet Exim de votre distribution peut différer du fichier de configuration par défaut livré avec le code source.

SMTP et ESMTP

SMTP (Simple Mail Transfer Protocol) et ESMTP (Extended Simple Mail Transfer Protocol) sont les principaux protocoles utilisés par les serveurs de courrier pour communiquer entre-eux et par les clients de messagerie pour envoyer les messages à un serveur. Une session typique SMTP se déroule ainsi :

220 mail.example.net ESMTP Exim 4.69 Sun, 23 Nov 2008 14:29:20 +0000
HELO client.example.net
250 test.wirefast.net Hello client.example.net [10.20.30.40]
MAIL FROM:<gazetteer@example.net>
250 OK
RCPT TO:<user@example.net>
250 Accepted
DATA
354 Enter message, ending with "." on a line by itself
From:<gazetteer@example.net>
To:<user@example.net>
Subject: Isn't Exim great

You really should check out the article on Exim in this month's
Linux Gazette.

Sincerely

Gaz E Teer
.
250 Message accepted
QUIT
221 mail.example.net closing connection

Cela peut se résumer ainsi : une identification du serveur lui-même (bannière Exim) suivie de la salutation de l'expéditeur (la commande HELO). Lorsque la commande HELO a été acceptée, l'expéditeur annonce qu'il a un courrier à envoyer de la part de gazetteer@example.net (commande MAIL FROM). Le serveur accepte et l'expéditeur lui demande s'il peut le transmettre à user@example.net (commande RCPT TO). Le serveur acquiesce et donc l'expéditeur lui transmet le message (commande DATA). Une ligne constituée d'un simple point « . » indique la fin du message et l'expéditeur clôt la conversation par la commande QUIT.

La première chose à remarquer est que la bannière d'accueil et toutes les réponses du serveur débutent par un code à 3 chiffres. Ces codes indiquent au client si la commande ou la connection a été acceptée. Le texte plus parlant qui suit dans les réponses n'est pas significatif dans le protocole, mais peut être utile lorsque l'on veut suivre le déroulement de la session. Le premier chiffre indique échec ou succès. Les codes débutant par 2 indiquent un succès, ceux débutant par 3 indiquent que des données sont attendues, ceux débutant par 4 signalent un rejet temporaire comme dans le cas d'une boite pleine, et ceux débutant par 5 indiquent un rejet définitif, comme dans le cas d'un utilisateur inexistant.

La directive RFC5321 recommande maintenant que la commande EHLO (HELO étendue) soit utilisée à la place de la commande originelle HELO, mais les serveurs acceptent toujours cette dernière, comme dans cet exemple. Lorsque la commande étendue EHLO est utilisée, le serveur peut proposer un ensemble de protocoles ou d'extensions optionnels tels que le cryptage (TLS) et le transport express (pipelining).

Dans l'exemple, le message n'a qu'un seul destinataire, mais la commande RCPT TO pourrait être répétée pour des envois à plusieurs destinataires.

De même, plus d'un seul message peut être envoyé à chaque session. Après qu'un message a été accepté par le serveur, l'émetteur peut envoyer une autre commande MAIL FROM, à la place de la commande QUIT.

Notez que les adresses mails dans les en-têtes To et From peuvent être complètement différentes de celles données dans les commandes MAIL FROM et RCPT TO dans de nombreux cas, notamment les listes de diffusion, l'utilisation d'alias et les adresses bcc.

ACLs

Les listes de contrôle d'accès vous permettent de définir des règles de filtrage à chaque étape du protocole SMTP, et des évènements en cas de messages non-SMTP. La configuration comprend des ACL nommées, avec 18  options pour les relier à des évènements spécifiques ; par exemple acl_smtp_mail détermine quelle ACL est appliquée pour décider si une commande MAIL FROM est acceptée ou refusée.

Les ACL retournent typiquement les valeurs accept (acceptation) ou deny (refus), mais également les valeurs defer ou discard. accept et discard provoquent une réponse 2xx (succès), mais dans le cas de discard, le message ou le destinataire est ignoré. defer provoque une réponse 4xx (rejet temporaire) et deny une réponse 5xx (rejet définitif).

Une ACL contient une liste de règles, chacune formée d'un verbe et d'un ensemble de conditions. Si les conditions sont satisfaites, la règle est déclenchée. Les règles sont traitées dans l'ordre jusqu'à ce que l'une d'entre elles retourne accept, deny ou defer, ou qu'il n'y ait plus d'autre règle. Dans ce cas, le résultat est implicitement deny.

L'ACL de connection SMTP correspond à l'option acl_smtp_connect. Elle est utilisée pour décider si l'on accepte ou non une connexion. Normalement, elle n'est pas utilisée, comme la plupart des administrateurs de messagerie ne savent pas à priori qui va leur expédier des courriels, ils acceptent en général les connexions venant de partout. Une situation dans laquelle vous pourriez utiliser cette règle est celle d'un serveur de courrier interne non connecté directement à internet, acceptant des courriers de clients sur son sous-réseau ou de un ou deux serveurs externes. Pour la mettre en oeuvre, vous devrez préciser :

acl_smtp_connect = check_connection

dans les options, et dans la section ACL :

check connection:
    accept hosts = 192.168.53.0/24: 10.10.10.10 : 10.11.12.13 

    deny

Cette ACL débute par un verbe accept et une condition stipulant que l'hôte se connectant soit membre du sous-réseau 192.168.53.0/24, ou l'une des machines 10.10.10.10 et 10.11.12.13. La seule autre règle est sans condition deny, de telle façon que les hôtes ne correspondant pas aux adresses précédentes soient rejetés.

L'ACL SMTP MAIL correspond à l'option acl_smtp_mail. Elle est utilisée pour décider si l'on accepte ou pas une commande MAIL FROM avec une adresse de courrier particulière. Il ne s'agit pas d'une règle que j'utiliserais en temps normal, mais j'ai eu un problème avec un utilisateur particulier qui avait envoyé un courriel retransmis à son tour des milliers de fois par heure. Il ne s'agit pas de bloquer les autres expéditeurs sur cet hôte, mais pour bloquer seulement un utilisateur, nous pouvons écrire :

acl_smtp_mail = check_sender

dans les options, et comme ACL :

check_sender:
    deny message = Utilisateur bloqué
         sender  = user@example.com

    accept

La première règle rejette toutes les demandes d'envoi de courrier depuis user@example.com, avec le message « Utilisateur bloqué » et la seconde accepte tous les autres envois.

En pratique, maintenir une liste d'utilisateurs bloqués dans le fichier de configuration est lourd à gérer. Il est presque toujours mieux de conserver cette liste dans un fichier externe. Cela peut être réalisé en changeant la ligne de l'expéditeur en

sender  = lsearch;/etc/mail/sender_blacklist

Exim peut effectuer des recherches aussi bien dans un fichier que dans de nombreuses bases de données populaires ou d'autres sources telle LDAP. C'est détaillé dans le chapitre 9 du manuel.

La règle SMTP RCPT correspond à l'option acl_smtp_rcpt. Elle sert à décider si une commande RCPT TO est acceptée ou non.

L'exemple suivant provient du fichier de configuration par défaut, où il est entièrement commenté. J'ai omis certaines règles qui restreignent les adresses contenant certains caractères.

Avant de définir l'ACL, nous définissons des listes de noms de domaines qui y sont utilisées.

domainlist local_domains = exim.example.com
domainlist relay_to_domains = 
hostlist   relay_from_hosts = 127.0.0.1

acl_smtp_rcpt = acl_check_rcpt

Les ACL sont :

  accept  hosts = :

  accept  local_parts   = postmaster
          domains       = +local_domains

  require verify        = sender

  accept  hosts         = +relay_from_hosts
          control       = submission

  accept  authenticated = *
          control       = submission

  require message = relai interdit
          domains = +local_domains : +relay_to_domains

  require verify = recipient

  accept

La première règle accepte les courriels arrivant avec un expéditeur vide. Cela autorise les agents de courrier locaux qui soumettent des messages par le mécanisme de pipe (méthode standard d'entrée-sortie), plutôt que via une connection TCP/IP.

La seconde accepte les messages pour l'administrateur de courrier (postmaster) de chaque domaine de la liste local_domains. Cela est requis par la directive RFC5321.

La troisième règle impose que l'adresse de l'expéditeur soit vérifiable. Les adresses des expéditeurs sont vérifiées en les appliquant aux routeurs. Si elles ne sont pas routables, la vérification échoue. Pour les utilisateurs avancés, il est possible de définir des options spécialement pour la vérifications.

La quatrième règle accepte les messages en provenance de tous les hôtes de la liste de domaines relay_from_hosts. Cette règle permet à Exim de relayer les courriers depuis d'autres hôtes, c'est-à-dire, par exemple, qu'Exim peut être utilisé comme passerelle pour transmettre des courriels depuis des serveurs de messagerie internes qui ne sont pas directement reliés à Internet. Dans notre cas, relay_from_hosts est vide, et donc Exim ne servira pas de relai pour d'autres machines.

La cinquième règle accepte des mails en provenance de n'importe où du moment que l'utilisateur est authentifié. Une utilisation typique pourrait être l'expédition des courriels depuis des portables qui sont connectés à Internet mais pas au réseau local.

Si nous ne configurerons pas Exim pour accepter des authentifications, aucun courrier entrant ne sera accepté. Cet article ne couvre pas l'authentification dans Exim.

La sixième règle rejette tous les destinataires qui ne sont ni dans l'un des domaines locaux ni dans l'un des domaines autorisés à être relayés. L'option message de la règle indique la phrase retournée pour chaque rejet dans ce cas.

La septième règle rejette les destinataires ne pouvant pas être vérifiés.

La dernière règle accepte les messages ayant passé les filtres précédents sans être acceptés ou rejetés.

Notez que lorsqu'un message comporte plusieurs destinataires, chaque destinataire peut-être accepté ou rejeté individuellement. Le message est accepté dés qu'un destinataire l'est. Evidemment, le message ne sera délivré qu'aux destinataires autorisés.

L'ACL DATA peut être utilisée pour rejeter des messages à l'examen de leur contenu, par exemple pour exclure les messages contenant « mauvais mots » ou « vilains mots », précisez

acl_smtp_data = acl_check data

dans les options et

  deny message = Mots interdits dans le message
       regex   = (?i)\\w(mauvais|vilains)\\wmots\\w

  accept

La première règle utilise une expression régulière pour détecter les expressions « mauvais mots » et « vilains mots », et pour rejeter le mail en indiquant le message « Mots interdits dans le message ».

La seconde accepte tous les courriels non refusés par la règle précédente.

Routeurs

Une fois le message accepté, Exim le stocke dans le répertoire de la file d'attente pour les traitements ultérieurs. L'étape suivante est le routage.

Les routeurs traitent des adresses. Il est possible de faire 3  choses avec une adresse. Elle peut être assignée à un mécanisme de transport pour la livraison, elle peut être rejetée, ou bien elle peut être transformée en une nouvelle adresse (ou plusieurs adresses).

Le fichier de configuration contient un certain nombre de routeurs qui sont appliqués dans l'ordre de leur apparition. Le fichier par défaut définit les 4 routeurs suivants :

dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup{$local_part}lsearch{/etc/aliases}}
  file_transport = address_file
  pipe_transport = address_pipe

userforward:
  driver = redirect
  check_local_user
  file = $home/.forward
  no_verify
  no_expn
  check_ancestor
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply

localuser:
  driver = accept
  check_local_user
  transport = local_delivery
  cannot_route_message = Unknown user

Ces routeurs sont entièrement commentés dans le fichier de configuration par défaut.

Chaque routeur commence par l'option driver. Cela indique quel module d'Exim doit être utilisé pour router l'adresse.

Le premier routeur, dnslookup, recherche les livraisons distantes. Il correspond aux adresses appartenant aux domaines non listés dans la liste local_domains, et utilise pour elles le mécanisme de transport « remote_smtp ». L'option ignore_target_hosts permet de s'assurer que les adresses 0.0.0.0 et du sous-réseau 127.0.0.0/8 sont traitées comme des échecs de résolution, et l'option no_more implique qu'elles ne sont pas transmises aux routeurs suivants, donc qu'elles sont rejetées comme non routables.

Le deuxième routeur, system_aliases, cherche les alias dans le fichier /etc/aliases et remplace les adresses par celles trouvées dans ce fichier. Si la recherche ne trouve rien dans le fichier, le routeur ignore l'adresse, permettant ainsi le passage au routeur suivant.

Les options allow_fail et allow_defer permettent au routeur d'échouer (fail) ou de différer (defer) si la recherche retourne :fail: ou :defer:. Les options file_transport et pipe_transport spécifient les mécanismes de transport à utiliser si le routeur retourne un nom de fichier ou un tube (pipe). A ce sujet, un nom de fichier est une chaîne commençant par / (slash), ne se terminant pas par / et qui ne peut pas être analysée comme une adresse valide selon la directive RFC2822, avec un domaine. Un tube correspond à une chaîne dont le premier caractère est la barre verticale « | ».

Le troisième routeur, userforward, recherche les fichiers .forward dans les répertoires personnels des utilisateurs, et utilise leur contenu pour substituer les adresses. Comme attendu, si un tel fichier n'est pas trouvé, le routeur ignore l'adresse, qui est transmise au routeur suivant.

L'option check_local_user est utilisée pour s'assurer que le routeur ne traite pas l'adresse si la partie locale[1] ne correspond pas à un utilisateur valide sur le système, par exemple un alias. L'option no_verify s'assure que le routeur n'est pas opérationnel quand il est utilisé à des fins de vérification et non de livraison, et no_expn a le même effet si Exim est en train de traiter une commande EXPN. L'option check_ancestor spécifie que le fichier de substitution d'adresses ne servira pas à rediriger une adresse déjà substituée, c'est-à-dire empêche les boucles lors de la redirection.

A la fin, les trois options de transport spécifient les mécanismes de transport à utiliser respectivement pour les noms de fichier, les tubes et les répondeurs automatiques.

Le dernier routeur tente de délivrer un courrier à un utilisateur local.

Mécanismes de transport

Les mécanismes de transport transmettent les messages à leur destinataire. Les transports locaux les transfèrent à des fichiers ou des tubes sur l'hôte local. Les transports distants les envoient à une autre machine.

La configuration par défaut définit 5 mécanismes de transport :

remote_smtp:
  driver = smtp

local_delivery:
  driver = appendfile
  file = /var/mail/$local_part
  delivery_date_add
  envelope_to_add
  return_path_add

address_pipe:
  driver = pipe
  return_output

address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

address_reply:
  driver = autoreply

Comme pour les routeurs, tous les mécanismes de transports ou messagers débutent par l'option driver, qui détermine quel module d'Exim va se charger de la livraison.

Le messager remote_smtp utilise le pilote smtp pour délivrer le courrier aux hôtes distants en utilisant le protocole SMTP.

Le messager local_delivery utilise le pilote appendfile pour livrer le courrier dans les boites locales au format BSD. Les options delivery_date_add, envelope_to_add et return_path_add ajoutent respectivement les en-têtes Delivery-Date (date de livraison), Envelope-To (adresse de livraison SMTP) et Return-Path (adresse de réponse ou de retour). Remarquez que la directive RFC5321 requiert l'en-tête Return-Path lors de la livraison finale, mais que Delivery-Date et Envelope-To ne sont pas standards.

Exim gère également les formats de boîtes aux lettres MBX, Maildir et mailstore, quand les options appropriées sont précisées dans la configuration.

Le messager address_pipe s'occupe de l'acheminement par pipes (tubes), lorsque ce cas est spécifié dans les fichiers d'alias ou .forward. L'option return_output traite tout texte sur la sortie standard du tube comme un échec de livraison et transmet ce texte à l'expéditeur en guise de message d'erreur. De façon similaire, return_fail_output transmet ce message d'erreur uniquement si le tube retourne un code d'état non nul en fin d'exécution.

Le messager address_file est utilisé pour l'acheminement vers des fichiers, quand des noms de fichiers sont spécifiés dans les fichiers d'alias ou .forward. Le mécanisme est similaire à local_delivery mais utilise le nom de fichier fourni à la place des noms de fichiers habituels des boîtes aux lettres de l'utilisateur.

Enfin le messager address_reply utilise le pilote autoreply, qui génère des réponses automatiques lorsque requises par le routeur userforward. Il ne s'agit pas d'un transport au sens propre puisqu'il ne délivre pas le message original. Pour génèrer une réponse automatique et aussi délivrer le courrier, les routeurs appelant ce messager doivent préciser l'option unseen, de telle sorte que le courrier sera également traité par les routeurs ultérieurs.

Débogage

Cet article a tenté de prouver que la configuration de base d'Exim est plutôt simple ; cependant, toute nouvelle configuration est susceptible de contenir des erreurs et doit être testée. Exim fournit de nombreuses options pour vous aider à tester et déboguer votre configuration.

Le test le plus simple sur toute nouvelle configuration est de chercher les erreurs de syntaxe. Vous pouvez lancer Exim avec les options -bc -C /chemin/du/fichier pour contrôler la syntaxe.

Une simulation de session SMTP peut être lancée avec exim -bh adresse_ip. Ceci simule l'arrivée d'un message depuis l'adresse IP donnée, en utilisant l'entrée-sortie standard, les informations de diagnostic étant écrites sur la sortie d'erreurs standard. Aucun message n'est expédié et les fichiers journaux réels ne sont pas modifiés.

Des tests d'acheminement peuvent être lancés sur des adresses en utilisant exim -bt. Cela peut être combiné avec -t adresse_expediteur si les routeurs contrôlent les adresses des expéditeurs.

Une option extrêmement utile est -d. Elle entraîne l'affichage des informations de diagnostic sur la sortie d'erreur standard. Ces informations peuvent être contrôlées en ajoutant +option ou -option, par exemple exim -bd -d-all+acl fournira des informations de débogage sur les ACLs.

Il y a d'autres options qui peuvent être utilisées pour déboguer des aspects particuliers de la configuration. Elles sont listées dans le manuel.

Conclusion

J'espère que cet article aura rendu évident le fait que débuter avec Exim n'est pas excessivement difficile, et que les administrateurs avancés d'Exim trouveront une mine de fonctionnalités utilisables dans de nombreux contextes, depuis le filtrage de pourriels jusqu'à l'élaboration d'applications basées sur le traitement automatique des courriels.

Bien que les premiers pas avec Exim soient simples, ce n'est qu'un début. Chaque administrateur de messagerie doit être conscient de ses responsabilités face à la grande communauté Internet. Un serveur de messagerie mal configuré peut se retrouver dans les listes noires pour tout un tas de raisons. Les pires délits en la matière sont le relai (relaying—transmission sans contrôle de courriels) ou la rétrodiffusion (backscatter —renvoi de courriels non sollicités), mais de nombreux sites vont boycotter les serveurs qui émettent via des connexions non permanentes (dialup), sont mal configurés au niveau DNS ou ne sont pas conformes aux différentes directives RFC.

La plupart des administrateurs de messagerie auront besoin de prendre des mesures anti-spam, telles que les listes grises (greylisting) et le scannage à l'aide d'outils comme SpamAssassin.

L'auteur remercie le Dr Philip Hazel et les nombreux contributeurs au code source d'Exim et à sa documentation. Les remerciements vont également aux nombreux inscrits à la liste de diffusion des utilisateurs d'Exim qui ont permis à l'auteur et à d'autres de tirer le meilleur d'Exim.

Neil est programmeur, spécialisé en C++ sur Unix et Linux. Il est diplômé en informatique et en informatique de dernière génération.

Neil a travaillé sur une vaste gamme de systèmes allant du système de commande pour la British Gas National Grid aux serveurs vidéo pour le Home Choice Video On Demand Service. Il a commencé par programmer des ordinateurs en 1980 avec sa classe d'études, qui était autorisée à accéder à un mainframe au National Institute of Oceanography, programmé en Fortran sur des cartes perforées.

Un diplôme d'informatique a suivi au Queen Mary College, à Londres, puis Neil a travaillé pour Logica pendant trois ans avant de faire un MSC en New Generation Computing à l'université d'Exeter.

Les cinq années suivantes ont vu Neil faire de la recherche sur des algorithmes parallèles de simulation au Royal Signals and Radar Establishment, initialement sur des transordinateurs et ultérieurement sur des systèmes parallèles basés sur SPARC. Depuis qu'il a quitté le RSRE, Neil a surtout travaillé en tant qu'indépendant ainsi que sur les sources de données dans le secteur de la finance, les serveurs vidéo et les proxies d'analyse de virus.

Neil a utilisé Unix pour la première fois au collège en 1982 et a commencé à travailler sous Linux en 1996.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://wiki.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.



[1] NdT : avant le @