Cherchons maintenant à faire en sorte que n'importe quelle machine
de notre réseau puisse joindre n'importe quelle autre.
Nous avons constaté juste avant qu'il n'était pas encore possible de faire
interagir
A1 ou
B1 avec
B3.
La solution logique consiste à procéder
comme précédemment
pour :
- ajouter explicitement à A1 et B1 une route vers le sous-réseau
192.168.30.0/24 qui passe par l'interface eth0 de C1A2,
- ce routeur n'a pas directement accès au réseau visé mais nous lui
avions ajouté une route passant par C2A3/eth0 pour
l'atteindre,
- ajouter explicitement à B3 une route vers le sous-réseau
192.168.10.0/24 qui passe par l'interface eth1 de C2A3,
- ce routeur n'a pas directement accès au réseau visé mais nous lui
avions ajouté une route passant par C1A2/eth1 pour
l'atteindre.
En effet, quand un routeur décide de retransmettre un paquet IP reçu, il
consulte sa table de routage comme s'il avait lui même produit
initialement ce paquet.
C'est ce procédé qui permet aux paquets IP de traverser, pas à pas, une
succession de routeurs pour atteindre l'adresse IP visée.
Vérifiez que la communication est dorénavant possible entre les deux
extrémités du réseau, grâce au relais par les deux routeurs
intermédiaires.
Si cette solution fonctionne, elle n'est toutefois pas très confortable
à utiliser.
Dans le cadre de notre expérimentation nous utilisons très peu de machines
mais en pratique il pourrait y en avoir beaucoup plus dans chacun
des sous-réseaux (voir les pointillés
du schéma).
Et il pourrait également y avoir bien plus de sous-réseaux et donc bien plus
de routeurs pour les interconnecter.
L'
Internet représente justement le gigantesque ensemble de tous
les réseaux interconnectés.
Il deviendrait alors très difficile de préciser sur chaque machine quelles
sont les routes à emprunter pour atteindre telle destination ou telle
autre.
Dans les situations courantes, le réseau de chaque site (une entreprise, une
université...) pris isolément est organisé de manière hiérarchique sous la
forme d'un arbre :
- un routeur principal est relié à “l'extérieur”, c'est à dire au routeur
du fournisseur d'accès à l'Internet,
- il possède également des interfaces appartenant à plusieurs sous-réseaux
internes au site (services accessibles depuis l'Internet, services
à usage interne, postes des usagers, postes de l'administration...),
- chacun des sous-réseaux peut également contenir des routeurs reliés
à d'autres sous-réseaux et ainsi de suite...
Puisque l'organisation est arborescente, il suffit à chaque poste terminal
(qui ne soit pas un routeur) de s'adresser systématiquement au routeur qui
le rapproche de
“l'extérieur” lorsqu'il doit sortir de son sous-réseau
courant.
Il n'y a donc qu'une route à ajouter explicitement sur chaque poste
terminal : il s'agit de la
route par défaut 0.0.0.0/0.
- L'encadrant de séance doit expliquer à cet instant :
- comment une route particulière est choisie parmi toutes
celles de la table de routage,
- l'importance de la largeur du masque lorsque plusieurs choix
sont possibles.
Cette route par défaut est envisagée en tout dernier lieu, lorsque aucune
autre plus spécifique ne correspond à l'adresse IP de destination.
Dans ces conditions, seuls les routeurs ont besoin de connaître très
précisément les routes très spécifiques aux sous-réseaux du site ;
la configuration des postes terminaux (beaucoup plus nombreux normalement)
s'en trouve largement simplifiée.
Pour expérimenter cette solution, supposons que la machine
C2A3 soit
également reliée à
“l'extérieur” par une liaison non matérialisée
ici
“L'extérieur” se situerait donc encore plus à droite de
C2A3
sur
le schéma.
.
Commençons par retirer une à une toutes les routes que nous avions
ajoutées explicitement pour atteindre les sous-réseaux éloignés.
[A1, B1, C1A2, B2]~# ip route del 192.168.30.0/24 ↵
[A1, B1, B3]~# ip route del 192.168.20.0/24 ↵
[B2, C2A3, B3]~# ip route del 192.168.10.0/24 ↵
Puis, sur chaque machine ajoutons la route par défaut
(vers
“l'extérieur”).
[A1, B1]~# ip route add default via 192.168.10.3 ↵
[C1A2, B2]~# ip route add default via 192.168.20.3 ↵
[B3]~# ip route add default via 192.168.30.1 ↵
Normalement,
C2A3 devrait aussi avoir une route par défaut
vers le fournisseur d'accès mais nous n'avons pas matérialisé cette
liaison.
Vérifiez que, en l'état,
B2 (ou
C1A2) peuvent interagir sans
problème avec
B3 :
- à l'aller, le paquet IP devant atteindre B3 emprunte la route par
défaut de B2 par C2A3 qui sait joindre directement B3,
- au retour, le paquet IP devant atteindre B2 emprunte la route par
défaut de B3 par C2A3 qui sait joindre directement B2.
Cependant, la même expérience entre
B1 (ou
A1) et
B2
(ou
C2A3) échoue car
B2 (ou
C2A3) ne sait pas comment
atteindre le sous-réseau
192.168.10.0/24 ; au contraire, les
routes par défaut ont tendance à diriger les paquets IP vers
“l'extérieur”.
Pour pallier ce défaut, il suffit d'intervenir sur un routeur afin
d'expliciter l'architecture interne de notre réseau, comme nous
l'avions déjà fait à
cette étape.
[C2A3]~# ip route add 192.168.10.0/24 via 192.168.20.1 ↵
En effet, alors que toutes les routes par défaut ont tendance à faire
“sortir” les paquets IP, il faut indiquer explicitement qu'il est
nécessaire de
“rentrer” par
C1A2/
eth1 pour atteindre
notre sous-réseau
192.168.10.0/24.
Remarquez que cette intervention n'a lieu que sur
C2A3 ;
il n'est pas nécessaire de la répliquer sur les postes terminaux.
Vérifiez que, grâce à cette nouvelle route explicite, la communication
entre
B1 (ou
A1) et
B2 est redevenue possible.
En regardant attentivement
le schéma, nous remarquons qu'un
paquet IP issu de
B2 et destiné à
B1 (ou
A1) emprunte la
route par défaut de
B2 par
C2A3 puis la route explicite de
C2A3 par
C1A2.
Néanmoins, il serait bien plus pertinent pour
B2 d'atteindre
C1A2
sans passer juste avant par
C2A3.
À ce propos, notre toute dernière utilisation de
ping a dû indiquer,
par un affichage furtif, qu'une
redirection avait eu lieu.
Il s'agit d'un message
ICMP-redirect émis par le routeur
C2A3 à
l'intention de
B2 pour lui signifier qu'il peut désormais atteindre
son destinataire par une route plus directe (que ce routeur connaît).
Cette information est mémorisée (temporairement) par
B2 et vient en
quelque sorte en complément de la table de routage.
Pour s'en rendre compte, nous pouvons interroger les décisions de routage
de
B2.
[B2]~# ip route get 192.168.30.2 ↵
[B2]~# ip route get 192.168.10.2 ↵
Dans le premier cas, la route par défaut est choisie ; dans le second,
il est indiqué qu'une redirection par une autre route sera préférée.
Pour mettre en évidence l'établissement de ce fonctionnement, commençons
par forcer l'oubli des informations de redirection sur
B2
[B2]~# ip route flush cached ↵
et contrôlons le fait que la route par défaut sera à nouveau considérée
pour atteindre
B1.
[B2]~# ip route get 192.168.10.2 ↵
Écoutons l'interface
eth0 de
C2A3
[C2A3]~# tcpdump -eni eth0 ↵
pendant que
B2 cherche à joindre
B1.
[B2]~# ping -c2 192.168.10.2 ↵
Vous devriez constater que le tout premier paquet IP
(
ICMP-echo-request) est bien reçu puis retransmis par
C2A3 mais qu'un message
ICMP-redirect est également
émis vers
B2.
Dès lors,
B2 ne sollicite plus du tout
C2A3 pour communiquer
avec
B1 mais s'adresse directement à
C1A2 comme suggéré
par le message
ICMP-redirect que vient de lui adresser
C2A3
Voici ce que nous pouvons retenir de cette étape :
- en pratique les multiples postes terminaux peuvent se contenter d'une
simple route par défaut vers “l'extérieur”,
- ce n'est qu'au niveau des quelques routeurs qu'il est nécessaire
d'expliciter les routes qui sont très spécifiques à l'architecture
interne de notre réseau,
- les messages de redirection émis par les routeurs ajustent alors
très précisément les décisions de routage des postes terminaux.