Howto déboguage Postfix


But de ce document

Ce document explique comment déboguer des éléments du système de messagerie Postfix lorsque le fonctionnement ne correspond pas à ce qui est attendu. Les méthodes varient de l'enregistrement volubile dans les journaux jusqu'à faire fonctionner un processus démon sous le contrôle d'un debugger ou d'un traceur d'appel.

On supposera ici que les fichiers de configuration de Postfix main.cf et master.cf sont stockés dans le répertoire /etc/postfix. Vous pouvez utiliser la commande "postconf config_directory" pour trouver l'emplacement actuel de ce répertoire sur votre machine.

Listées dans l'ordre de niveau d'investigation, les techniques de déboguage sont les suivantes :

Recherche des signes manifestes de problème

Postfix enregistre tous les échec et succès de livraison dans un fichier journal. Ce fichier est généralement /var/log/maillog ou /var/log/mail ; le chemin exact est défini dans le fichier /etc/syslog.conf.

Lorsque Postfix ne reçoit ni n'envoie de message, la première chose à faire est de rechercher les erreurs qui indiquent un fonctionnement anormal de Postfix :

% egrep '(warning|error|fatal|panic):' /un/fichier/de/log | more

Note : les messages les plus importants apparaissent en DÉBUT de sortie. Les messages d'erreurs suivants sont moins intéressants.

La nature de chaque problème est indiquée comme suit :

Déboguer Postfix de l'intérieur

Avec les version 2.1 et supérieures de Postfix, vous pouvez demander à Postfix de produire des rapports d'erreurs de livraison à des fins de déboguage. Ces rapports ne montrent pas seulement les adresses d'expédition/de destination après réécriture et substitutions d'alias ou transfert, ils montrent également des informations sur la livraison en boîte-aux-lettres à une commande non-Postfix, les réponses des serveurs SMTP distants, et ainsi de suite.

Postfix peut produire deux types de rapports de livraison à des fins de déboguage :

Ces rapports contiennent les informations générées par les agents de livraison de Postfix. Comme ces processus sont des démons et n'interagissent pas directement avec les utilisateurs, le résultat est envoyé par message à l'expéditeur du message de test. Le format de ces rapports est pratiquement identique à ceux des notifications ordinaires de non-livraison.

Un exemple détaillé de rapport de livraison est présenté au paragraphe debugging à la fin de la page ADDRESS_REWRITING_README.

Désactiver la mise en cage dans master.cf

Une faute courrante est d'activer la mise en cage chroot dans le fichier master.cf de Postfix sans suivre toutes les étapes de constitution de la cage chroot. Ceci entraîne un plantage des processus démons de Postfix du dans tous les cas à des fichiers manquants.

L'exemple ci-dessous montre un serveur SMTP configuré avec la mise en cage chroot désactivée :

/etc/postfix/master.cf:
    # =============================================================
    # service type  private unpriv  chroot  wakeup  maxproc command
    #               (yes)   (yes)   (yes)   (never) (100)
    # =============================================================
    smtp      inet  n       -       n       -       -       smtpd

Recherchez dans master.cf tous les processus qui n'ont pas la mise en cage chroot désactivée. Si vous en trouvez, faites une copie du fichier master.cf de Postfix et éditez l'entrée en question. Après avoir exécuté la commande "postfix reload", vérifiez si le problème a disparu.

Si c'est le cas, félicitations. Laisser Postfix tourner dans cette configuration est adéquate pour beaucoup de sites. Si vous préférez remettre le chroot, lisez la page BASIC_CONFIGURATION_README pour preparer la mise en cage chroot.

Journaux verbeux pour des connexions SMTP spécifiques

Dans /etc/postfix/main.cf, listez les noms de sites ou adresses dans le paramètre debug_peer_list. Par exemple, pour rendre le logiciel plus bavard pour les connexions sur la boucle locale :

/etc/postfix/main.cf:
    debug_peer_list = 127.0.0.1

Vous pouvez indiquer plusieurs machines, domaines, adresses ou réseaux/masque. Pour rendre les changements effectifs immediatement, exécutez la commande "postfix reload".

Enregistrer une session SMTP avec un sniffer réseau

Cet exemple utilise tcpdump. Pour enregistrer une conversation, vous devez indiquer un buffer assez grand avec l'option "-s" sinon, vous perdrez tout ou partie du contenu des paquets.

# tcpdump -w /nom/de/fichier -s 2000 host exemple.com and port 25

Lancez cette commande et tapez Ctrl-C pour arrêter. Pour voie les données, utilisez un visualisateur binaire, ethereal, or utilisez mon untilitaire tcpdumpx disponible à l'adresse ftp://ftp.porcupine.org/pub/debugging/.

Rendre les programmes démons de Postfix plus bavards

Ajoutez une ou plusieurs options "-v" aux définitions des démons choisis dans /etc/postfix/master.cf et tapez "postfix reload". Ceci entraînera la journalisation de toute l'activité dans le démon syslog. Exemple :

/etc/postfix/master.cf:
    smtp      inet  n       -       n       -       -       smtpd -v

Rend le serveur SMTP de Postfix plus bavard. Pour diqgnostiquer les problèmes de réécriture d'adresses, on peut ajouter l'option "-v" au démon cleanup(8) et/ou trivial-rewrite(8), et pour les problèmes de livraison, on peut ajouter l'option "-v" au gestionnaire des files d'attente qmgr(8) ou oqmgr(8), ou aux agents de livraison lmtp(8), local(8), pipe(8), smtp(8), ou virtual(8).

Tracer manuellement un processus démon de Postfix

Beaucoup de systèmes vous autorisent à inspecter manuellement un processus tournant avec un traceur d'appels système. Par exemple :

# trace -p process-id (SunOS 4)
# strace -p process-id (Linux et beaucoup d'autres)
# truss -p process-id (Solaris, FreeBSD)
# ktrace -p process-id (generic 4.4BSD)

Encore plus d'informations peuvent être obtenues des appels de librairies. Exemples :

# ltrace -p process-id (Linux, également porté sur FreeBSD et BSD/OS)
# sotruss -p process-id (Solaris)

Lisez la documentation de votre système pour plus de détails.

Tracer un processus tournant peut donner des informations sur ce qu'un processus tente de faire. Cette technique fournit le maximum d'informations que vous pouvez obtenir sans utiliser un programme debugger interactif comme décrit dans le dernier paragraphe.

Tracer automatiquement un processus démon de Postfix

Postfix peut attacher un traceur d'appels dès qu'un processus démon démarre. Les traceurs d'appel peuvent être utilisés dans plusieurs cas.

  1. Traceurs d'appels système tels trace, truss, strace, ou ktrace. Ils montrent les communications entre les processus et le noyau.

  2. Traceurs d'appels aux librairies tels sotruss et ltrace. Ils montrent les appels aux routines des librairies et donnent une meilleure idée de ce que fait un processus.

Ajoutez une option -D à la commande suspecte dans /etc/postfix/master.cf, Par exemple :

/etc/postfix/master.cf:
    smtp      inet  n       -       n       -       -       smtpd -D

Editez l'option debugger_command dans /etc/postfix/main.cf pour que Postfix invoque le traceur d'appel de votre choix, par exemple :

/etc/postfix/main.cf:
    debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin;
         (truss -p $process_id 2>&1 | logger -p mail.info) & sleep 5

Tapez "postfix reload" et observez les journaux.

Lancer des programmes démons avec le debugger interactif xxgdb

Si vous avez un système X-Windows installé sur votre machine Postfix, alors un debugger interactif tel xxgdb peut être adapté.

Renseignez debugger_command dans /etc/postfix/main.cf pour qu'il invoque xxgdb :

/etc/postfix/main.cf:
    debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         xxgdb $daemon_directory/$process_name $process_id & sleep 5

Assurez-vous que xxgdb est dans les chemins de recherche des commandes ($PATH), et exportez XAUTHORITY pour que le contrôle d'accès X fonctionne, Par exemple :

% setenv XAUTHORITY ~/.Xauthority (syntaxe csh)
$ export XAUTHORITY=$HOME/.Xauthority (syntaxe sh)

Ajoutez une option -D à la définition du démon suspect dans /etc/postfix/master.cf, Par exemple :

/etc/postfix/master.cf:
    smtp      inet  n       -       n       -       -       smtpd -D

Arrêtez et redémarrez le système Postfix. Ceci est nécessaire pour que Postfix se lance avec les XAUTHORITY et DISPLAY appropriés.

Pendant que le démon suspect est démarré, une fenêtre du debugger apparaît et vous pouvez observer en détail ce qui se passe.

Lancer des programmes démons avec un debugger non-interactif

Si vous n'avez pas de X-Windows installed on the Postfix machine, ou si vous n'êtes pas familier avec les debuggers interactifs, vous pouvez essayer gdb en mode non interactif, et obtenir une trace de la pile d'appels lorsque le processus plante.

Renseignez debugger_command dans le fichier /etc/postfix/main.cf pour qu'il invoque le debugger gdb :

/etc/postfix/main.cf:
    debugger_command =
        PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont; echo
        where; sleep 8640000) | gdb $daemon_directory/$process_name 
        $process_id 2>&1
        >$config_directory/$process_name.$process_id.log & sleep 5

Ajoutez un option -D au démon suspect dans le fichier /etc/postfix/master.cf, par exemple :

/etc/postfix/master.cf:
    smtp      inet  n       -       n       -       -       smtpd -D

Tapez "postfix reload" pour activer les changement de configuration.

Pendant que le processus démon suspect est lancé, un fichier de sortie est créé nommé avec le nom du démon et son numéro de processus (par exemple, smtpd.12345.log). Lorsque le processus plante, une trace de la pile d'appel (avec sortie de la commande "where") est écrit dans ce fichier journal.

Comportement déraisonnable

Parfois, le comportement apparent de Postfix ne semble pas correspondre au code source. Comment un programme peut-il dévier des instructions données par son auteur ? Il y a deux possibilités :

Dans les deux cas, le programme en fonctionnement n'est pas le programme supposé être exécuté donc tout peut arriver.

Il y a une troisième possibilité :

Les fuates relatives au Hardware ne se reproduisent pas exactement de la même manière après un redémarrage du système. Il y a peu que Postfix puisse faire sur un hardware défaillant. Assurez-vous d'utiliser du matériel qui peut détecter les erreurs de mémoire. Les systèmes critiques masquent le matériel réel.

Lorsqu'un compilateur fait une erreur, le problème peut être reproduit chaque fois que le programme résultat est lancé. Les erreurs du compilateur ont plus de chance d'arriver dans l'optimiseur de code. Si le problème est reproductible après les redémarrages, il peut être intéressant de recompiler Postfix en désactivant l'optimisation et d'observer la différence.

Pour recompiler Postfix en désactivant l'optimisation :

% make tidy
% make makefiles OPT=

Ceci produit des Makefiles qui ne requierent pas l'optimisation.

Une fois les Makefiles créés, compilez le logiciel :

% make
% su
Password:
# make install

Si le problème continue, il est tant de demander de l'aide à votre vendeur.

Rapporter les problèmes à la liste postfix-users@postfix.org

Les personnes inscrits sur la liste postfix-users@postfix.org sont d'une aide précieuse, en particulier si VOUS leur fournissez assez d'information. Souvenez-vous que ce sont des bénévoles et que leur temps est limité. Attention, il s'agit d'une liste de diffusion anglophone ! Si vous ne maîtrisez pas suffisament la langue de Shakespear, vous pouvez poser vos questions sur le groupe de news fr.comp.mail.serveur.

Lorsque vous rapportez un problème, assurez-vous d'inclure les informations suivantes.

Valid HTML 4.01! traduction par Xavier Guimard - Retour au menu