[ordinateur]Naviguer entre plusieurs profils réseau

Introduction

Problématique

Nous nous intéressons au cas d'un ordinateur qui doit s'adapter à plusieurs configurations réseau. Typiquement, il s'agit d'un ordinateur portable qui navigue entre le réseau résidentiel, celui de l'entreprise, ceux des clients, etc. Plusieurs changements sont nécessaires (adresse IP, passerelle, serveurs de noms) pour passer d'une configuration (ou « profil ») à une autre, et l'on peut vouloir relancer des services ou démarrer certaines tâches avant ou après la reconfiguration.

Objectif

Nous allons dans ce document donner une description des logiciels qui permettent d'identifier le réseau auquel l'ordinateur est maintenant connecté puis de reconfigurer la machine en conséquence. Et oui, tout ceci peut se dérouler sans la moindre intervention de l'utilisateur !

Limitations

Ce document se concentre sur le système d'exploitation Linux en général et s'appuie en particulier sur les logiciels disponibles depuis la distribution Debian. Le lecteur y trouvera des informations utiles pour d'autres distributions de Linux voire éventuellement pour d'autres systèmes d'exploitation d'inspiration Unix. Ce document ne sera probablement d'aucune utilité à l'administrateur de systèmes Microsoft Windows, toutefois.

Organisation

Ce document est organisé de la façon suivante : nous procédons dans un premier temps à l'analyse détaillée du problème, afin de le décomposer et de préciser la terminologie utilisée. Ensuite, nous dressons la liste des logiciels disponibles et les comparons séquentiellement. Enfin, nous concluons ce document en précisant nos critères de choix et en citant les paquets qui y répondent le mieux.

Analyse détaillée du problème

Notre objectif est de faire en sorte que l'ordinateur détecte lorsque sa localisation a changé, qu'il identifie son nouvel environnement et qu'il adapte sa configuration en conséquence. L'ensemble représente notre cahier des charges et nous pouvons y distinguer trois tâches :

  • La détection d'un changement potentiel. La suspension et la reprise de l'ordinateur, le branchement d'un câble réseau, le branchement sur le secteur ou à une station de dockage, ainsi que l'ajout d'une carte réseau PCMCIA, sont autant d'évènements susceptibles de signaler un changement d'environnement. La succession des outils qui suivent ne sera déclenchée que lorsque l'un de ces évènements a eu lieu. Nous appelons cette tâche de détection d'un changement potentiel la Tâche 1.
  • L'identification de l'environnement actuel. À cette phase, l'on essaie de contacter des équipements « permanents » du réseau qui permettraient d'identifier où l'on se trouve, ou de détecter que l'on n'est plus connecté à eux. Cette tâche est appelée dans ce document Tâche 2. Du résultat de cette phase dépend l'éventuelle reconfiguration de l'étape suivante.
  • La reconfiguration du système, ou Tâche 3. Nous serons amenés à considérer cette tâche sous deux aspects :
    • La reconfiguration de l'interface réseau proprement dite. A minima, il s'agit ici de fixer ou obtenir une adresse IP, adapter le fichier /etc/resolv.conf (qui contient les serveurs de noms) et les routes. Ce sera la Tâche 3.a dans le reste de ce document.
    • La reconfiguration des services voire des applications (par exemple utiliser un autre mandataire http) et le lancement de commandes spécifiques au nouvel environnement (comme lancer la synchronisation de certains fichiers). Ce sera pour nous la Tâche 3.b.

Comparaison des logiciels disponibles

Avertissement : la comparaison des logiciels disponibles a été effectuée en août 2003 et n'est à ce titre peut-être pas complètement à jour. Si un nouveau paquet est apparu ou si un paquet mérite que sa description dans cette liste soit modifiée, je serais heureux de faire évoluer ce document d'après vos suggestions

Les logiciels présentés dans cette section sont tous disponibles depuis la distribution Debian GNU/Linux. Debian a sa façon propre de gérer les interfaces réseau : le paquet ifupdown fournit des outils de haut-niveau pour les gérer en se basant sur leur description dans le fichier /etc/network/interfaces. Toutefois, il est également possible d'utiliser des commandes plus universelles comme ifconfig, éventuellement en ignorant le fichier /etc/network/interfaces. De telles solutions auront l'avantage de fonctionner avec d'autres systèmes que Debian. L'auteur n'utilisant que Debian, il privilégiera les solutions intégrées au système de gestion des interfaces réseau de Debian.

Le paquet Debian ifupdown propose un mécanisme de « profil » (mapping en anglais). Ce mécanisme permet d'appeler un script lorsque la commande « ifup <interface> » est lancée, script dont le résultat spécifie le profil à activer. Typiquement, le script va procéder à l'identification de l'environnement de l'ordinateur. Le profil ainsi activé permet d'ajuster l'adresse IP de la machine et la passerelle. Le paquet resolvconf est nécessaire pour adapter de façon similaire les serveurs de noms. De plus, il est possible de préciser dans le fichier /etc/network/interfaces des actions à exécuter une fois qu'un profil particulier a été mis en place. ifupdown, en association avec resolvconf, permet donc de réaliser la Tâche 3.a et fournit le minimum pour permettre à l'administrateur de lancer des scripts arbitraires pour la Tâche 3.b. Ifupdown et resolvconf sont des paquets spécifiques à Debian (pour autant que l'auteur sache) et résolvent partiellement le problème posé dans ce document ; certains des logiciels cités plus bas s'intègrent à eux, d'autres pas.

Logiciels pour la Tâche 1 : détection d'un changement potentiel

Afin de détecter la suspension, la mise en veille et la reprise de l'ordinateur, il est conseillé d'utiliser APM ou ACPI (qui sont mutuellement exclusifs) et d'installer les paquets apmd ou acpid, respectivement. Ces paquets permettent d'exécuter des scripts lorsqu'un changement comme le branchement sur le secteur ou la suspension de l'ordinateur a lieu.

Par ailleurs, ifplugd est un démon très simple qui (par défaut) lance la commande « ifup/ifdown <interface> » lorsqu'un câble réseau vient d'être branché ou débranché. Signalons que laptop-net (évalué plus bas dans ce document) intègre cette fonctionnalité. ifplugd demeure plus robuste et est par exemple capable d'ignorer les courtes déconnexions du câble réseau.

Enfin, le paquet hotplug permet de détecter l'insertion ou la suppression d'une carte réseau (une carte PCMCIA par exemple) afin de configurer l'interface correspondante.

Logiciels pour les Tâches 2 (identification de l'environnement) et 3 (reconfiguration du système)

Debian propose de nombreux paquets pour remplir ces tâches. Certains se limitent à l'une des deux tâches, d'autres combinent les deux. Nous allons les passer en revue dans l'ordre alphabétique. Il convient d'avertir le lecteur que les jugements portés plus bas reflètent l'opinion de l'auteur et qu'ils ne constituent en rien la position officielle du projet Debian ou de qui que ce soit d'autre que l'auteur sur les paquets.

Divine : Automatic IP configuration detection for laptops

  • Tâches 2 et 3.a, laisse une possibilité de faire 3.b à la main.
  • Ne teste que l'IP d'une machine distante (pas l'adresse MAC).
  • Ignore ifupdown (ne renseigne pas le fichier /etc/network/interfaces).
  • Ne supporte pas le DHCP.
  • Format du fichier de configuration débile.
  • Se définit lui-même comme un « quick hack », posant des problèmes de sécurité.
  • Pas de raisons de l'installer.

Guessnet : Guess which LAN is connected to a network device

  • Tâche 2 uniquement.
  • Teste l'IP et optionnellement la MAC d'une machine distante, peut aussi tester la présence d'un concentrateur d'accès (via un modem pppoe) (fonctionnalité qui reste à éprouver) ou lancer tout script extérieur. Aussi, inclut un test de présence de câble réseau.
  • Conçu pour les profils d'ifupdown (complètement intégré à lui), donc supporte tout ce que ifupdown supporte (IP statique, DHCP, ...). Penser au paquet resolvconf pour le fichier /etc/resolv.conf.
  • A recourt à des ruses pour se passer des options dans le fichier /etc/network/interfaces. Lisibilité correcte, sans plus.
  • Laisse ifup remplir la Tâche 3.a et repose sur le mécanisme de ifup pour la Tâche 3.b (scripts lancés par ifup après que l'interface ait été configurée).
  • Fournit des scripts prometteurs (test-dhcp, test-wifi-ap, etc) mais la documentation est incomplète.
  • Bien, son seul inconvénient est qu'il ne gère qu'une interface à la fois.

Ifscheme : scheme control for network interfaces

  • Intégré à ifupdown (permet d'activer un profil particulier).
  • Ne fait rien (suppose la localisation déjà connue, repose sur ifupdown pour reconfigurer le système), si ce n'est qu'il active un profil décrit dans le fichier /etc/network/interfaces.
  • Pour ceux qui veulent manuellement, mais proprement (à la Debian) reconfigurer leur réseau. Compte-tenu de nos ambitions dans ce document, nous n'avons pas de raisons d'installer ce paquet.

ifupdown-roam : roaming enhancements for ifupdown

  • Tâche 2 uniquement.
  • Conçu pour faciliter une utilisation « nomade » d'un ordinateur, ses caractéristiques les plus intéressantes ont été intégrées au paquet guessnet. L'auteur d'ifupdown-roam recommande désormais d'utiliser guessnet.
  • Pas de raisons de l'installer.

intuitively : automatic IP configuration detection for laptops

  • Tâches 2 et 3.a, avec de quoi lancer ce que l'on veut pour la Tâche 3.b.
  • Semblable à divine, en plus propre.
  • Teste l'adresse IP et optionnellement l'adresse MAC d'une machine distante.
  • Fichier de configuration clair.
  • Pages de manuel et fichier README.
  • Utilise des liens symboliques rangés dans une sous-arborescence par schéma : /etc/intuitively/identifiant_schema/etc/resolv.conf -> /etc/resolv.conf.
  • Ne supporte pas le DHCP.
  • Ignore ifupdown.
  • Mieux que divine, mais toujours très incomplet.

laptop-net : automatically adapt laptop ethernet

  • Le tout-en-un : Tâches 1, 2 et 3.
  • S'intègre à /etc/apm et détecte les changements d'état du lien réseau (câble branché ou débranché).
  • Ne teste que les adresses IP (pas les adresses MAC).
  • Supporte le DHCP.
  • Ignore ifupdown.
  • Pas de page de manuel, pas de README, pas de temps à perdre à deviner.
  • Bonus : laisse des liens symboliques morts à sa désinstallation.
  • Sans doute uniquement utilisé par son auteur, et c'est bien ainsi.

laptop-netconf : network detection and configuration program for laptops

  • Tâche 2, laisse la possibilité de faire 3.a (et 3.b) à la main.
  • Ne teste que sur un couple adresse IP + adresse MAC.
  • Exécute un script écrit par l'utilisateur lorsqu'une machine distante est identifiée.
  • Ne fonctionne que pour une interface, en tout et pour tout !
  • Se dit être encore en développement.
  • Peu de documentation : courte page de manuel, en plus de la documentation présente dans les fichiers de configuration.
  • Propose d'utiliser des liens symboliques, il faut écrire son script pour les utiliser.
  • Propose de truander ifupdown (remplacer le fichier /etc/network/interfaces).
  • Moins mature et moins complet que guessnet.

netenv : configure your system for different network environments

  • Tâche 3.a, laisse la possibilité de faire 3.b à la main.
  • Montre une boîte de dialogue (en mode texte) au démarrage pour faire choisir la configuration réseau (!) Elle peut être évitée.
  • Permet de faire ce que les « profils » du fichier /etc/network/interfaces permettent déjà de faire. Inutile pour Debian à part pour la boîte de dialogue de choix.
  • Page de manuel et documentation HTML.
  • Pas de raisons de l'installer (voir plutôt ifscheme).

switchconf : change system configuration to one of many predefined

  • Tâche 3.a, pas évident de faire ce que l'on veut en 3.b.
  • Utilise des liens symboliques « de façon élégante » (comme intuitively).
  • Propose ainsi de truander ifupdown (remplacer le fichier /etc/network/interfaces).
  • Utilise deux répertoires, before.d et after.d, pour ranger des scripts (à écrire soi-même) que l'on veut lancer avant et après chaque changement de configuration. Peu pratique pour lancer certains scripts seulement dans certaines configurations : on utilisera plutôt des lignes « up » dans le fichier /etc/network/interfaces.
  • Pas de raisons de l'installer.

waproamd : WLAN roaming daemon

  • Conçu pour les interfaces WiFi compatibles IEEE 802.11 et dont le pilote supporte l'extension sans-fil de Linux.
  • Tâches 1 et 2 : pour chaque interface, un démon est lancé et celui-ci se charge de tester « en permanence » si un point d'accès est accessible.
  • Un script générique (ou un script spécifique au point d'accès, si un tel script existe) est lancé lorsqu'un point d'accès devient accessible ou est perdu ; c'est ce script qui, typiquement, lancera « iwconfig », se chargeant ainsi de la Tâche 3.
  • waproamd coopérait avec ifplugd, mais il semble qu'il cherche maintenant à s'en affranchir.
  • Un paquet pas extrêmement pratique à configurer et à utiliser, mais indispensable si l'on veut faire avec une interface WiFi ce que ifplugd fait pour les interfaces filaires, à savoir détecter la présence d'un point d'accès et configurer automatique l'interface sans intervention humaine. Signalons toutefois que compte tenu de la sur-consommation induite par l'utilisation de la carte WiFi, l'utilisateur d'un ordinateur portable non branché sur le secteur pourra préférer éteindre manuellement la carte WiFi et ne l'allumer que lorsqu'un point d'accès est effectivement disponible.

whereami : automatically reconfigure your (laptop) system for a new location

  • Tâches 2, 3.a et propose plusieurs scripts pour 3.b
  • Impressionnant pour la détection de la situation : permet de tester la présence d'une adresse IP et/ou MAC, la réponse à une requête DHCP, la présence d'un câble réseau, d'un concentrateur d'accès PPPOE, d'un motif dans la sortie de « lspci -v » (pour détecter une station de dockage), d'un module chargé (lsmod), d'un point d'accès WiFi, et enfin de tester si l'on a reçu des octets sur l'interface.
  • Permet de cascader les tests, de tester successivement plusieurs interfaces : les fichiers de configuration fournis en exemple dans le paquet sont atrocement compliqués mais montrent que pratiquement toutes les situations peuvent être décrites et gérées.
  • Ignore le fichier /etc/network/interface, typiquement. Reconfiguration de l'IP à la main, apparemment (!)
  • Permet d'exécuter tout script quand on arrive, quand on part ou simplement quand on est dans une situation déterminée.
  • Fournit des scripts pour adapter bins, masqmail, le fichier de configuration de Netscape, le fichier /etc/resolv.conf, le smarthost d'exim4, d'exim, de postfix et de qmail, la timezone, ...
  • Optionnellement intégré à APM.
  • Pages de manuel et documentation au format HTML (pas parfaitement à jour).
  • Au final, impressionnant pour la Tâche 2, un peu faible pour la Tâche 3.a et extrêmement flexible et pratique, grâce à ses scripts, pour la Tâche 3.b.
  • Si whereami ne peut pas résoudre votre problème de configuration, aucun autre paquet ne pourra le faire. Maintenant, vous pouvez peut-être vous en tirez avec quelque chose de plus simple que whereami...

Discussion

Dans cette section, nous allons décrire la configuration particulière de l'auteur et motiver son choix de logiciels. Dans cette étude de cas, l'ordinateur portable oscille entre réseau résidentiel et réseau professionnel et ne dispose que d'une seule interface réseau permanente (par opposition à une carte amovible type PCMCIA). En plus de la satisfaction de notre cahier des charges aux trois Tâches, l'auteur accorde de l'importance aux deux critères suivants :

  1. l'intégration à la façon Debian de gérer les interfaces réseau, par opposition à la modification directe des interfaces réseau en court-circuitant le paquet ifupdown ;
  2. le respect de la « philosophie Unix », à savoir « une tâche par outil ».

Aussi l'auteur a-t-il choisi :

  • Pour la Tâche 1 (détection d'un changement potentiel), les paquets apmd et ifplugd. ifplugd est le choix naturel pour détecter le branchement ou le débranchement d'un câble réseau à la carte réseau, tandis que le choix d'apmd s'explique par l'utilisation du système APM pour la gestion de l'énergie -- eût-il utilisé le système ACPI, l'auteur aurait choisi le paquet acpid.
  • Pour la Tâche 2 (identification de l'environnement actuel), le paquet guessnet. Il propose une panoplie de tests suffisante et documente l'intégration au paquet ifupdown.
  • Pour la Tâche 3.a (reconfiguration de l'interface réseau) : les profils, décrits dans le fichier /etc/network/interfaces, du paquet ifupdown, utilisant les extensions du paquet resolvconf pour permettre de gérer le fichier /etc/resolv.conf (résolution de nom).
  • Pour la Tâche 3.b (reconfiguration des services) : les lignes up du fichier /etc/network/interfaces, qui pour l'instant ne contiennent que de très simples commandes. L'auteur a toutefois conservé une copie des scripts proposés par le paquet whereami pour une éventuelle utilisation future.

Aucune configuration particulière des paquets apmd, ifplugd, resolvconf et guessnet n'a été nécessaire. La configuration est entièrement contenue, de façon compacte et relativement claire, dans le fichier /etc/network/interfaces, dont des extraits sont présentés en annexe à titre d'illustration.

Guessnet est donc la solution d'identification de l'environnement qui se distingue dans notre comparatif, en ce qu'elle s'intègre par conception à la façon Debian de gérer les interfaces réseaux et parce qu'elle est riche fonctionnellement (tests nombreux, support de plusieurs interfaces physiques, ...). Pour les cas les plus compliqués, où en particulier il est nécessaire de cascader les tests ou de tester plusieurs interfaces physiques en même temps, whereami semble être le seul candidat.

Remerciements

L'auteur tient avant tout à remercier tous les contributeurs, qu'ils soient développeurs, utilisateurs ou traducteurs, du projet Debian pour mettre à la disposition du plus grand nombre un ensemble de logiciels de qualité. Merci également aux contributeurs de la liste de diffusion debian-user-french@debian.org et en particulier François Tourde et Loïc Minier.

Annexes

Extraits du fichier /etc/network/interfaces de l'auteur

mapping eth0
    script /usr/sbin/guessnet-ifupdown
    map default: none
    map verbose: true

iface eth0-limsi inet static
    # Partie classique de configuration de l'interface
    address 192.44.xx.yy (masqué)
    netmask 255.255.255.0
    broadcast 192.44.78.255
    gateway 192.44.78.22
    # Partie pour resolvconf
    dns-search limsi.fr
    dns-nameservers 192.44.78.7 192.44.78.53 192.175.152.129
    # Définitions des tests pour guessnet
    test1-peer address 192.44.78.22 mac aa:bb:cc:dd:ee:ff (masqué)
    test2-peer address 192.44.78.22 mac aa:bb:cc:dd:ee:ff (masqué)
    # Adaptation de l'imprimante par défaut
    up foomatic-configure -n biglexrv -D

iface eth0-famille inet static
    address 192.168.2.26
    netmask 255.255.255.0
    broadcast 192.168.2.255
    gateway 192.168.2.22
    dns-search famille
    dns-nameservers 192.168.2.22
    test-peer address 192.168.2.1 mac aa:bb:cc:dd:ee:ff (masqué)
    up foomatic-configure -n CanonS600 -D

Droits d'auteur et de diffusion

Copyright Daniel Déchelotte, 2004-2005.

Ce document est régi par la licence CeCILL soumise au droit français et respectant les principes de diffusion des logiciels libres. Vous pouvez utiliser, modifier et/ou redistribuer ce document sous les conditions de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA sur le site http://www.cecill.info/.