Réseaux IP: la pratique Vincent Defert - 1 Déc. 1998

Introduction

Pour relier une machine à un réseau, il faut bien sûr l'avoir dotée d'une carte réseau correctement réglée (c'est à dire sans conflit avec les autres périphériques), mais il faut ensuite indiquer au système d'exploitation comment l'utiliser. Ceci se déroule en 3 étapes: chargement du driver, configuration de l'interface et configuration du routage.

Chargement du driver

La première chose à faire est de charger le driver permettant le dialogue avec la carte. Ceci se fait avec la commande modprobe suivie du nom du driver et des paramètres (adresse d'entrées-sortie, interruption, etc) de la carte si besoin.

Par exemple, "modprobe 3c59x" chargera le driver de la carte 3COM 3C590 (carte PCI: pas de paramètres) et "modprobe smc-ultra io=0x300" chargera le driver d'une carte SMC Ultra configurée pour utiliser l'adresse d'E/S 0x300 (les autres paramètres sont détectés).

A partir de ce moment, le système d'exploitation "connait" la carte sous le nom de /dev/eth0 (ou /dev/ethn si c'est la (n + 1) ème carte). Si la machine contient plusieurs cartes, elles sont numérotées dans l'ordre où elles sont détectées. Dans ce cas (ex. routeur ou firewall), il faudra noter quelque part l'adresse Ethernet (en général marquée sur les cartes) pour s'y retrouver.

Configuration de l'interface

Maintenant que le système est capable de dialoguer avec la carte, il faut lui fabriquer une "carte d'identité" pour qu'elle soit reconnue du système et des autres machines. C'est ce qu'on appelle "configurer une interface".

On indique au système à l'aide de la commande ifconfig l'adresse IP de la carte ainsi que son netmask et son adresse de broadcast si ces éléments ne peuvent pas être déduits de son adresse IP. Par exemple, si votre adresse est 192.168.0.5, la commande à utiliser sera:

ifconfig eth0 192.168.0.5

ou sous une forme plus complète:

ifconfig eth0 192.168.0.5 netmask 255.255.255.0 broadcast 192.168.0.255

La commande ifconfig supporte d'autres options d'usage moins courant. Reportez-vous à sa page de manuel pour plus de détails.

Configuration du routage

Le système sait maintenant comment utiliser l'interface et connait son "identité IP". Reste à lui dire quand l'utiliser: c'est le rôle de la commande route. Dans le cas de notre exemple, il faudrait l'utiliser de la façon suivante:

route add -net 192.168.0.0 eth0

Elle ajoute une entrée à la table de routage (option add) indiquant que les paquets à destination du réseau (option -net) n° 192.168.0.0 doivent être envoyés à l'interface eth0.

Si le masque de sous-réseau indiqué par votre administrateur diffère de celui normalement associé à la classe de l'adresse (c'est ce qu'on appelle un réseau "Classless", technique servant à éviter le gaspillage des adresses IP en utilisant les adresses d'une plage donnée dans plusieurs sous-réseaux physiques différents), vous devrez aussi utiliser l'option netmask:

route add -net 192.168.0.0 netmask 255.255.255.0 eth0

Enfin, si votre réseau est relié à l'Internet ou un d'autre réseaux, il vous faudra indiquer une route par défaut permettant d'aiguiller les paquets ne correspondant à aucune autre entrée de la table de routage vers une passerelle appropriée. Exemple:

route add default gw 192.168.0.1 netmask 0.0.0.0

La commande route supporte d'autres options d'usage moins fréquent. Reportez-vous à sa page de manuel pour plus de détails.

Dépannage

Pour vérifier que tout fonctionne, utilisez la commande ping suivie de l'adresse (ou du nom) d'une autre machine du même réseau. Cette commande ne s'arrête que si vous appuyez sur Ctrl-C.

nenette:~# ping 192.168.0.32
PING 192.168.0.32 (192.168.0.32): 56 data bytes
64 bytes from 192.168.0.32: icmp_seq=0 ttl=128 time=0.6 ms
64 bytes from 192.168.0.32: icmp_seq=1 ttl=128 time=0.4 ms
64 bytes from 192.168.0.32: icmp_seq=2 ttl=128 time=0.4 ms
64 bytes from 192.168.0.32: icmp_seq=3 ttl=128 time=0.4 ms
64 bytes from 192.168.0.32: icmp_seq=4 ttl=128 time=0.4 ms
64 bytes from 192.168.0.32: icmp_seq=5 ttl=128 time=0.4 ms

--- 192.168.0.32 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.4/0.4/0.6 ms
nenette:~# 

Si vous n'obtenez pas de lignes semblables, c'est que vote interface est probablement mal configurée. Tapez ifconfig sans paramètres, vous devez obtenir quelque chose comme:

nenette:~# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
          RX packets:5735 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5735 errors:0 dropped:0 overruns:0 carrier:0 coll:0

eth0      Link encap:Ethernet  HWaddr 00:A0:24:B7:B9:6F
          inet addr:192.168.0.5  Bcast:194.206.79.255  Mask:255.255.255.192
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:269963 errors:0 dropped:0 overruns:0 frame:0
          TX packets:177320 errors:0 dropped:0 overruns:0 carrier:0 coll:98
          Interrupt:10 Base address:0xd800

nenette:~#

Si ce n'est pas le cas, revoyez le chargement du driver ou la configuration de l'interface. Si tout est correct, il s'agit d'un problème de routage. La commande route -n (l'option -n évite les requêtes DNS pour afficher des noms à la place des adresses: un seul problème à la fois, s'il vous plaît!):

nenette:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0      248 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0      113 lo
nenette:~# 

Si votre réseau est relié à l'Internet ou un autre réseau, il vous faut aussi tester la communication avec l'extérieur en faisant un ping sur une machine située à l'extérieur (par exemple: 192.48.96.9 (ftp.uu.net)). Si ça ne fonctionne pas, pas de panique: il est possible que ce soit parce que vous êtes derrière un firewall qui bloque les requêtes ICMP. Il vous faudra alors utiliser la commande ftp pour vérifier que la liaison avec l'extérieur est possible:

nenette:~# ftp 192.48.96.9
Connected to 192.48.96.9.
220 ftp.UU.NET FTP server (Version wu-2.4(4) Mon Jan 6 13:57:37 EST 1997) ready.
Name (192.48.96.9:root):

Si vous obtenez un message de ce type, c'est que tout fonctionne et vous pouvez faire Ctrl-C pour interrompre. En cas de message d'erreur, c'est qu'il y a sans doute un problème de routage. Pour le vérifiez, utilisez route -n, qui doit vous afficher quelque chose comme:

nenette:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0      248 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0      113 lo
0.0.0.0         192.168.0.1     0.0.0.0         UG    1      0     1446 eth0
nenette:~# 

Si la dernière ligne manque, vous n'avez pas de route par défaut et il vous est impossible de "sortir" de votre réseau. Il faut donc faire un "route add default gw ...".

Si la dernière ligne est bonne mais que ça ne fonctionne pas, c'est peut-être parce que votre routeur est hors service, qu'il y a un problème sur la ligne ou chez votre fournisseur de connectivité. Il vous faut utiliser la commande traceroute pour le vérifier:

nenette:~# traceroute -n 192.48.96.9
traceroute to 192.48.96.9 (192.48.96.9), 30 hops max, 40 byte packets
 1  192.168.0.1  9.754 ms  9.461 ms  8.046 ms
 2  195.6.244.14  60.885 ms  48.924 ms  90.517 ms
 3  194.206.126.244  50.503 ms  48.97 ms  120.122 ms
 4  194.206.126.2  55.655 ms  52.213 ms  58.908 ms
 5  208.213.229.130  588.303 ms  589.843 ms  589.611 ms
 6  208.213.229.129  599.564 ms  599.763 ms  600.749 ms
 7  208.213.229.226  629.167 ms  599.284 ms  599.383 ms
 8  195.10.40.34  599.152 ms  599.289 ms  631.011 ms
 9  157.130.34.217  642.326 ms  715.072 ms  653.724 ms
10  146.188.160.62  595.143 ms  590.433 ms  659.247 ms
11  146.188.160.181  649.863 ms  700.901 ms  617.067 ms
12  137.39.253.86  600.835 ms  599.379 ms  590.867 ms
13  192.48.96.9  607.071 ms  589.221 ms  603.156 ms
nenette:~# 

Cette commande affiche toutes les machines par lesquelles passe les paquets pour atteindre la machine-cible. Elle ne fonctionnera que si les requêtes ICMP peuvent "passer" au travers d'éventuels firewalls, ce qui est le cas lorsqu'on met en place les premières machines d'une installation (il n'y a encore rien à protéger ;).

La première ligne correspond à votre passerelle (souvent un routeur). Si elle n'est même pas affichée, vous n'aurez pas à chercher bien loin: vérifier et/ou réinitialiser le routeur, se renseigner auprès de la société qui vous loue la ligne spécialisée pour qu'ils vérifient son état. La seconde ligne correspond en général au routeur de votre fournisseur de connectivité, et ainsi de suite. Dans ce cas, contactez votre fournisseur.

Résolution de noms

Pour finir, taper des adresses IP n'est pas un problème quand il s'agit de faire quelques tests, mais ce n'est pas acceptable en fonctionnement normal. La conversion de noms en adresses IP est faite par un dispositif appelé "resolver", qu'il faut configurer et auquel il faut fournir des informations.

En général, on rencontre 2 types de situations: le réseau local de petite taille et les installations plus grandes ou connectées à Internet. Dans le premier cas, il suffit de remplir une petite table de correspondance dans chaque machine (fichier /etc/hosts). Dans le second cas, on utilise en général un serveur de noms.

Le fichier /etc/hosts contient des lignes de la forme "adresse nom alias1 alias2 ...". Par exemple:

192.168.0.1 nenette nenette.mynett.fr
192.168.0.2 moumoune moumoune.mynett.fr
192.168.0.3 pupuce pupuce.mynett.fr

Si vous utilisez un serveur de noms, il vous faudra créer ou modifier le fichier /etc/resolv.conf. Vous y indiquerez votre nom de domaine par défaut (pour compléter automatiquement les noms de machines abrégés) et l'adresse IP de votre serveur de noms. Exemple:

domain mynett.fr
nameserver 192.168.0.1

Notez que vous pouvez mettre jusqu'à 3 serveurs de noms, en ajoutant autant de lignes "nameserver", au cas où le premier serait hors service (ou les 2 premiers).

A partir de maintenant, vous pouvez taper "ping moumoune" ou "traceroute pupuce" sans problème. C'est beau la technique, non?

Conclusion

Maintenant que votre système est fonctionnel, il ne reste plus qu'à ajouter les commandes de configuration nécessaires (modprobe, ifconfig et route) à un des scripts de démarrage de votre machine, celui-ci dépendant de la distribution utilisée (ex. /etc/rc.d/rc.inet1 avec la Slackware). Vous remarquerez que vous avez pu effectuer toutes ces manipulations sans redémarrer votre machine ni gêner aucun des programmes en cours d'exécution. Sympatique, non? En tous cas, ça facilite énormément les essais!

Notez que selon les distributions, il existe des utilitaires aux noms évocateurs (ex. netconfig) évitant de devoir saisir tout cela à la main. Cependant, en cas de problème, il est indispensable de maîtriser tout ce qui précède pour pouvoir s'en sortir. L'idéal est donc de faire votre premier essai "à la main", comme décrit ici, pour vérifier par l'expérience si vous avez tout assimilé. Ensuite, au lieu de modifier vous-même les scripts de démarrage, utilisez plutôt l'utilitaire fourni par votre distribution.