Page suivante Page précédente Table des matières

4. Que faire en cas d'attribution dynamique de l'adresse IP

4.1 Quel est le problème ?

sendmail lorsqu'il communique avec un autre MTA se présente (commande HELO ou EHLO) en utilisant le contenu de la macro $j qui est généralement le résultat de la commande hostname sur le système hôte.

Dans le cas d'une machine reliée de façon intermitente à l'Internet ce résultat n'est généralement pas adresse officielle, déclarée, donc connue du service de noms (DNS).

Nous avons vu que la solution quand on dispose d'une adresse IP fixe et valide consistait en forcer la définition de la macro $j par la commande du kit m4 :

 define(`confDOMAIN_NAME',`ppp.domaine.fr')dnl
Mais il faut, pour utiliser cette solution, connaître à l'avance le nom qui sera attribué à notre machine lors de la future connexion... ce n'est donc pas envisageable dans le cas qui nous préoccupe.

4.2 Une solution.

Dans le fichier /etc/sendmail.cf que nous venons de générer, nous pouvons voir :

# my official domain name
# ... define this only if sendmail cannot automatically determine your domain
#Dj$w.Foo.COM

C'est à cet endroit qu'a eventuellement lieu la définition de la macro $j qui nous intéresse.

Lors d'une connexion PPP, le script ip-up, lancé au début de la connexion, reçoit en argument l'adresse IP qui nous a été attribuée. Il est donc possible, dans ce script, de demander au serveur de noms (le nôtre ou celui du provider) de transcrire cette adresse IP en un nom de domaine pleinement qualifié, de modifier /etc/sendmail.cf puis de relancer sendmail avec cette nouvelle définition.

Différentes méthodes et programmes le permettent mais la plupart sont verbeux et nécessiteraient un filtre awk ou grep pour extraire le nom qui nous intéresse... j'ai donc écrit un petit utilitaire très simple gethost dans cet unique but.

Pour pouvoir utiliser le script ip-up que je fournis plus loin :

Il vous reste à modifier votre fichier /etc/ppp/ip-up en y intégrant le mien.

4.3 Un exemple de script ip-up

#!/bin/sh
#   /etc/ppp/ip-up   script permettant de configurer correctement
#                    sendmail dans le cas des attributions 
#                    dynamique d'adresse IP
# 
#   Copyright  04/1998 Jean Charles Delépine
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.

# Les paramètres passés à ip-up par pppd (man pppd) :
# $1 = nom de l'interface (ppp0)  
# $2 = périférique utilisé (/dev/modem)  
# $3 = vitesse de transmission
# $4 = adresse IP locale (celle qui nous intéresse)
# $5 = adresse IP distante (le serveur de modem du provider, sera
#      notre passerelle vers le reste du monde)
# $6 = ipparam (option donnée par l'utilisateur via l'option ipparam
#      de pppd)

HOST=`/usr/local/bin/gethost $4`

sed s/'#Dj.*'/"Dj$HOST"/ /etc/sendmail.cf.base >/etc/sendmail.cf 

kill -1 `head -1 /var/run/sendmail.pid` 

/usr/sbin/sendmail -q&

exit 0

4.4 Le programme gethost.c

/* 
    gethost.c, récupère le nom canonique d'une machine 
               à partir de son adresse IP.

    Copyright  04/1998 Jean Charles Delépine
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
*/

#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 addr\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);
}

Page suivante Page précédente Table des matières