Apprenez le fonctionnement des réseaux TCP/IP
Last updated on Thursday, July 10, 2014
  • 4 semaines
  • Facile

Free online content available in this course.

Videos available in this course

Paperback available in this course

eBook available in this course.

Certificate of achievement available at the end this course

Got it!

Le routage

Dans ce chapitre, nous allons essayer de comprendre comment les informations transitent d'un réseau à un autre.
Nous verrons notamment :

  • comment sont organisées les données au niveau de la couche 3 ;

  • quel matériel est nécessaire pour communiquer d'un réseau à un autre ;

  • comment les machines dialoguent d'un réseau à un autre.

Suite à ce chapitre la communication entre réseaux n'aura plus de secrets pour vous.

Un protocole, IP

Ainsi, nous savons maintenant dialoguer sur notre réseau local grâce à la couche 2. Nous savons aussi ce qu'est un réseau.
Il ne nous reste plus qu'à comprendre comment communiquer entre réseaux.

Pour cela, nous allons d'abord nous attarder sur le protocole de couche 3, IP.

Le protocole IP

Pour la couche 3 du modèle OSI, c'est le protocole IP, ou Internet Protocol.

Comme pour la couche 2, nous allons devoir définir de quelles informations nous allons avoir besoin, et dans quel ordre les placer.

Déjà, nous pouvons nous douter que nous allons avoir l'adresse IP de l'émetteur ainsi que celle du récepteur. Néanmoins, il va y avoir beaucoup d'autres informations.
Dans un premier temps, nous n'allons voir que celles qui nous intéressent, et nous ajouterons petit à petit les autres éléments de l'en-tête IP.

Nous avons donc :

  • adresse IP émetteur ;

  • adresse IP destinataire.

Jusqu'ici rien d'étonnant, il est normal d'avoir les informations identifiant les participants à la communication.

Toutefois, nous avons dit que l'adresse IP devait toujours être accompagnée du masque ; va-t-on avoir le masque aussi dans l'en-tête IP ?

La question à laquelle il va falloir répondre est surtout : est-il nécessaire de connaître le masque d'une machine pour lui envoyer un message ?
Pour y répondre, mettons-nous dans la peau d'une machine qui veut envoyer un message à une autre.

Nous sommes la machine A qui a pour adresse 192.168.0.1/24 et nous souhaitons envoyer un message à une machine B d'adresse 192.168.1.1/24.
Ce qui est important pour moi, en tant que machine A, c'est de savoir si la machine B est sur mon réseau. En effet, si elle est sur mon réseau, je lui parlerai grâce à la couche 2. Si elle est sur un autre réseau, il faudra que je fasse appel à la couche 3.

De quoi ai-je besoin pour savoir si la machine B est sur mon réseau ?

Pour savoir si la machine B est sur mon réseau, c'est facile !
Je regarde la plage d'adresses de mon réseau, et je n'ai plus qu'à regarder si l'adresse de la machine B appartient à cette plage.

Dans notre cas, ma plage d'adresses va de 192.168.0.0 à 192.168.0.255. Elle ne contient donc pas l'adresse de la machine B (192.168.1.1).
J'en déduis donc que B n'est pas sur mon réseau et qu'il va falloir utiliser la couche 3 pour communiquer avec elle.

Nous remarquons au passage que nous n'avons pas eu besoin du masque de la machine B pour savoir si elle appartenait à notre réseau.

Donc pour l'instant, nous n'avons besoin que de l'adresse IP de l'émetteur et de celle du récepteur. Nous les appellerons adresse IP source et adresse IP destination.

Nous allons donc avoir, comme pour la trame de couche 2, un format de message défini par le protocole IP.
Pour le protocole IP, le message s'appelle un datagramme ou un paquet.

Le datagramme

Comme pour la couche 2, le datagramme IP va être une suite de 0 et de 1 organisés.

Voici la forme qu'il va prendre :

???

Adresse IP SRC (source)

Adresse IP DST (destination)

Données à envoyer

Datagramme IP

Nous voyons ici que le format général est proche de celui de la trame Ethernet, mais que les informations contenues sont différentes et dans un ordre différent.

Normalement, cet en-tête devrait vous choquer ! Non ? Si ?
Eh bien oui, l'adresse IP de destination est en fin d'en-tête. Et pourtant, nous avions vu en couche 2 qu'il était important que l'adresse MAC de destination soit en début d'en-tête pour que la machine qui reçoit la trame sache immédiatement si celle-ci lui est destinée. Pourquoi cela serait différent pour IP ?

Les gens qui ont fabriqué le protocole IP seraient-ils tombés sur l'en-tête la tête ?

Eh bien non, au contraire. Pour le comprendre, nous allons devoir aborder d'autres notions.

L'encapsulation

Pour commencer, nous allons devoir répondre à une question.

Qu'est-ce qui circule sur le réseau ?

Des trames ? Des datagrammes ? Les deux ? Pour répondre à cette question, nous allons devoir nous replonger dans le modèle OSI.
Pour rappel, voici à la figure suivante le modèle OSI, en 7 couches.

Le modèle OSI

Plus précisément, la figure suivante illustre l'envoi ou la réception d'une information.

Envoi dans le modèle OSI

Comme nous le voyons, un message est envoyé depuis la couche 7 du modèle OSI, et il traverse toutes les couches jusqu'à arriver à la couche 1 pour être envoyé sur le réseau.

Mais que devient notre message d'origine, ainsi que les en-têtes de chaque couche ?

En fait, un en-tête va être ajouté à chaque passage par une couche. On va ainsi accumuler les en-têtes des différentes couches (voir la figure suivante).

Encapsulation

Au passage par la couche 4, on ajoutera l'en-tête de couche 4, puis celui de couche 3 en passant par la couche 3, et ainsi de suite.
Ce mécanisme s'appelle l'encapsulation, car on encapsule un message dans un autre.

Nous voyons clairement qu'au final, ce qui va circuler sur le réseau est une trame de couche 2, qui contient le datagramme de couche 3 (qui lui-même contiendra l'élément de couche 4).

Ainsi, je vous ai plus ou moins menti quand je vous ai donné le format d'une trame Ethernet.

Adresse MAC DST

Adresse MAC SRC

Protocole de couche 3

Données à envoyer

CRC

Trame Ethernet

Je ne vous ai pas dit que dans les données à envoyer, il y avait en fait l'en-tête de couche 3, l'en-tête de couche 4, puis enfin, les données à envoyer.

Adresse MAC DST

Adresse MAC SRC

Protocole de couche 3

en-tête de couche 3

en-tête de couche 4

Données à envoyer

CRC

Trame Ethernet

Ceci dit, j'ai eu raison de vous le présenter ainsi, car la couche 2 est incapable de lire les informations de couche 3 ou de couche 4, de même qu'elle ne comprend pas les données à envoyer. Pour elle, tout cela est une suite de 0 et de 1 qu'elle est incapable de comprendre, elle ne voit ça que comme des données...

Maintenant, vous, vous savez que parmi ces données il y a les en-têtes des couches supérieures.

Exemple réel

Nous allons utiliser le logiciel wireshark pour voir en pratique les trames qui passent sur notre réseau. Vous pouvez, vous aussi, si vous le souhaitez, télécharger et installer Wireshark pour voir les jolies trames que votre machine reçoit. Cependant, nous apprendrons plus tard dans le cours à nous en servir pleinement.
Wireshark est un sniffer. Un sniffer est un programme qui écoute sur le réseau, intercepte toutes les trames reçues et les affiche à l'écran.

Dans un premier temps, nous pouvons voir la liste des trames reçues lors d'une requête Google avec la question "Site du Zéro" (voir la figure suivante).

Liste paquets wireshark

Ce n'est pas très parlant pour nous mais nous voyons que pour notre requête web, il y a eu plusieurs échanges de trames entre nous et Google.

Nous allons maintenant nous plonger dans le contenu d'une trame en cliquant sur l'une d'entre elles. Wireshark sépare les éléments de chacune des couches du modèle OSI, comme vous pouvez le voir sur la figure suivante.

Paquets wireshark

Nous pouvons voir les éléments vus par la couche 1 (Frame 187...), puis la couche 2 Ethernet, puis la couche 3 IP, Internet Protocol, la couche 4 que nous ne connaissons pas encore et les données applicatives qui sont ici du web HTTP.

Nous allons enfin pouvoir voir le contenu de chacune des couches en cliquant sur le triangle en face d'une couche.
Commençons avec la couche 2 (voir la figure suivante).

En-têtes wireshark

Nous voyons bien les éléments que nous connaissons : l'adresse MAC destination et l'adresse MAC source. Wireshark reconnaît et nous montre qu'il s'agit d'une carte réseau Apple grâce aux trois premiers octets qui sont représentatifs du constructeur de la carte. Enfin, il nous montre le protocole de couche 3 utilisé qui est ici IP.

Passons ensuite à la couche 3 (voir la figure suivante).

En-tête IP wireshark

Nous ne connaissons pas tous ces éléments, mais nous pouvons voir en fin d'en-tête les adresses IP source et destination.

Revenons à nos moutons

Oui, nous cherchions à comprendre pourquoi l'adresse IP de destination n'était pas en début d'en-tête IP ?

Nous avons maintenant des éléments pour le comprendre.
Quand un message arrive sur une machine, il remonte les couches du modèle OSI de la couche 1 à la couche 7. Il passe donc par la couche 2 qui lit l'adresse MAC de destination :

  • si c'est bien celle de la carte réseau, il lit le reste de la trame, puis transmet les données (le datagramme en fait !) à la couche 3 ;

  • si ce n'est pas celle de la carte réseau, il jette la trame à la poubelle.

Donc si le message arrive à la couche 3, cela veut obligatoirement dire que la machine sait déjà que le message lui est destiné, puisque l'adresse MAC de destination est la sienne. Elle n'a donc pas la nécessité de savoir immédiatement si l'adresse IP de destination est la sienne, puisqu'elle sait déjà que le datagramme est pour elle.

On peut donc placer l'adresse IP de destination où l'on veut dans l'en-tête IP. Les créateurs du protocole IP ne sont pas fous. :p

Nous connaissons donc maintenant deux éléments de l'en-tête IP et leur placement. Pour découvrir les autres éléments de l'en-tête IP, nous allons dès maintenant aborder l'élément essentiel de la couche 3, le routage !

Le routage

Le routage va nous permettre d'envoyer un message en dehors de notre réseau.
Comme nous l'avons vu précédemment, les réseaux sont reliés les uns aux autres, et nous passons souvent par plusieurs réseaux pour en joindre un autre, vous vous rappelez de la figure suivante ?

Ensemble de réseaux connectés
Ensemble de réseaux connectés

Mais comment se fait la liaison entre ces réseaux ?

Eh bien comme pour la couche 2, nous avons un matériel spécifique pour gérer la connexion entre réseaux, le routeur.

Le routeur

Il doit donc avoir une interface dans chacun des réseaux auquel il est connecté.

C'est donc tout simplement une machine qui a plusieurs interfaces (plusieurs cartes réseau), chacune reliée à un réseau. Son rôle va être d'aiguiller les paquets reçus entre les différents réseaux.

Un ordinateur ayant deux cartes réseau pourra être un routeur.

Mais alors, qu'est-ce qui différencie un simple ordinateur d'un routeur ?

Très peu de choses en fait. La différence principale est qu'un routeur accepte de relayer des paquets qui ne sont pas pour lui alors qu'une simple machine les jettera à la poubelle.

Toute machine connectée à un réseau peut donc jouer le rôle de routeur. Il suffit d'activer le routage dessus. Nous verrons dans la partie pratique comment le faire.

Prenons un exemple

Nous allons nous mettre dans la peau d'un routeur.

Imaginons que nous sommes une machine ayant comme adresse MAC l'adresse 00:11:22:33:44:55 et comme adresse IP 192.168.0.1/24.
Nous recevons la trame suivante (dans laquelle nous indiquons aussi l'en-tête de couche 3) sur une de nos interfaces :

00:11:22:33:44:55

01:2B:45:56:78:ED

IP

???

IP SRC: 10.0.0.1

IP DST: 136.42.0.28

Données à envoyer

CRC

Trame Ethernet avec en-tête de couche 3

Quelques petites questions...

Quelle est l'adresse IP de la machine qui a envoyé ces informations ?

Cette adresse IP est bien l'adresse IP source 10.0.0.1.

Quelle est l'adresse MAC de la machine qui a envoyé ces informations ? (Attention au piège !)

Nous ne pouvons pas la connaître ! Eh oui, si vous vous souvenez de la couche 2, une adresse MAC est propre à un réseau local. En dehors de ce réseau, nous ne la voyons pas. Justement ici, la trame arrive sur l'interface de notre machine ayant pour adresse IP 192.168.0.1/24. Son réseau ne contient donc pas l'adresse IP 10.0.0.1.
La machine 10.0.0.1 ne fait pas partie de notre réseau et nous ne connaîtrons jamais son adresse MAC.
L'adresse MAC que nous voyons ici en adresse MAC source est celle du dernier routeur qui nous a envoyé la trame. Nous allons approfondir tout cela par la suite.

Vient maintenant une question importante.

Que se passe-t-il quand notre machine reçoit cette trame ?

Je vous propose que nous y répondions ensemble.

La trame arrive à ma carte réseau qui reçoit les 0 et les 1 et les envoie à mon système d'exploitation. La couche 2 de mon système d'exploitation reçoit les 0 et les 1 et les interprète pour me donner l'adresse MAC de destination de la trame.
C'est mon adresse MAC 00:11:22:33:44:55 !
Donc je lis la suite de l'en-tête de la trame pour voir qui m'envoie cette trame et à quel protocole de couche 3 la couche 2 doit l'envoyer. Il est inscrit IP, donc j'envoie la trame en enlevant l'en-tête Ethernet, ce qui donne le datagramme IP, à la couche 3 et plus précisément au protocole IP.
La couche 3, donc le protocole IP, lit l'ensemble des informations de l'en-tête IP, puisque nous savons maintenant que ce datagramme nous est destiné.
Et là, badaboum, l'adresse IP de destination du datagramme n'est pas la nôtre...

Ceci étant, ce n'est pas grave, car nous avons vu auparavant qu'il est normal pour un routeur de recevoir un message qui ne lui est pas destiné.
Son rôle va maintenant être d'aiguiller le datagramme vers sa destination.

Mais comment fait-il cela ?

Il possède en fait une table dans laquelle est indiqué le prochain routeur auquel il doit envoyer le datagramme pour que celui-ci arrive à sa destination.
Cette table est très importante et s'appelle la table de routage !

Je le répète, car elle est très importante : cette table est très importante et s'appelle la table de routage !

La table de routage

La table de routage va donc lister les routeurs auxquels je peux envoyer mon datagramme pour joindre une destination donnée.
La destination donnée ne va pas être une machine, mais un réseau. Si on devait indiquer un chemin pour chaque machine sur Internet, les tables de routage seraient énormes ! :p

Le principe est d'avoir d'un côté la liste des réseaux que l'on veut joindre, et de l'autre la liste des routeurs à qui nous devons envoyer le datagramme pour joindre les réseaux. On appelle aussi ce routeur une passerelle.

Voici un exemple de table de routage :

Table de routage

Réseau à joindre

passerelle

192.168.1.0/24

10.0.0.253

192.168.122.0/24

10.0.0.45

192.168.8.0/24

10.0.0.254

Les tables de routage posséderont donc toujours ces informations mais, selon les systèmes d'exploitation, le format de la table pourra être un peu plus compliqué et comporter des colonnes supplémentaires.
Par exemple, voici à la figure suivante la table de routage de ma machine sous Mac.

Table de routage Mac OS 2
Table de routage Mac OS X

On voit bien dans la colonne de gauche les réseaux que je veux joindre, et dans la colonne juste à sa droite les passerelles (gateway en anglais) par lesquelles je dois passer pour joindre le réseau correspondant. Les autres colonnes ne nous intéressent pas pour l'instant.

On récapitule :

  • un routeur est une machine possédant plusieurs interfaces ;

  • chaque interface d'un routeur est connectée à un réseau, le routeur relie ainsi plusieurs réseaux entre eux ;

  • toute machine ayant plusieurs interfaces peut jouer le rôle de routeur, même le vieux PC de mamie ;

  • un routeur se différencie d'une simple machine, car il accepte de relayer des paquets qui ne lui sont pas destinés ;

  • un routeur aiguille les paquets grâce à sa table de routage ;

  • la table de routage indique quelle passerelle utiliser pour joindre un réseau.

Il est important de bien comprendre et retenir ce qui précède, car le routage est la base du fonctionnement d'Internet !

Si l'on reprend le dernier point, la table de routage indique quelle passerelle utiliser pour joindre un réseau.
Cela nous amène à une nouvelle question.

Si je suis connecté à Internet, dois-je avoir une route pour chacun des milliers de réseaux d'Internet ?

Pour répondre à cette question, nous allons voir qu'un mécanisme simple a été mis en place : la route par défaut.

La route par défaut

Nous venons de voir dans ma table de routage sous Mac une information importante. Dans la première ligne, ce n'est pas un réseau qui est indiqué, mais le mot défaut.
Cela indique que si une adresse que je veux joindre n'appartient à aucun des réseaux indiqués dans ma table, il faudra emprunter la passerelle indiquée dans la route par défaut. Cela va régler le problème lié à la multitude de réseaux sur Internet. Il me suffira d'indiquer dans ma table une route par défaut qui permettra d'aller vers Internet et donc de joindre tous les réseaux qui y sont présents.

Ceci reste encore très abstrait et sûrement complexe à comprendre, alors prenons un petit exemple pour fixer les idées.

Exercice de routage

Voici en figure suivante un schéma réseau qui contient plusieurs réseaux. Nous allons essayer d'écrire les tables de routage des routeurs.

Réseau simple
Réseau simple

Sur ce schéma, nous voyons deux réseaux (192.168.0.0/24 et 192.168.1.0/24) reliés entre eux grâce au routeur 1 qui possède une interface réseau dans chacun de ces réseaux.
Pour les adressages des machines, je n'ai indiqué que le dernier octet de l'adresse, car les trois premiers identifient le réseau et sont donc déjà connus. Par exemple pour la machine en haut à gauche d'adresse .1 qui est dans le réseau 192.168.0.0/24, on peut déduire son adresse complète qui est 192.168.0.1.

Maintenant, essayons d'écrire la table de routage du routeur 1.

Pour cela, je vais vous donner une méthode qui s'appliquera toujours et qui fonctionnera pour tous les cas :

  1. indiquer les réseaux auxquels ma machine est connectée ;

  2. indiquer la route par défaut ;

  3. indiquer tous les autres réseaux que je ne peux pas encore joindre avec les deux étapes précédentes.

Appliquons la méthode.
1 - Indiquer les réseaux auxquels ma machine est connectée.
Mon routeur 1 est connecté à deux réseaux, 192.168.0.0/24 et 192.168.1.0/24.

Table de routage du routeur 1

Réseau à joindre

passerelle

192.168.0.0/24

?

192.168.1.0/24

?

Pour l'instant, nous ne nous soucions pas d'indiquer les passerelles, cela viendra dans un second temps.

Passons à la seconde étape.
2- Indiquer la route par défaut.
Le cas est un peu particulier, car notre routeur est déjà connecté à tous les réseaux du schéma. Il n'a donc pas besoin d'une route par défaut pour aller vers d'autres réseaux, il les connaît déjà tous !

3- Indiquer tous les autres réseaux que je ne peux pas encore joindre avec les deux étapes précédentes.
Même chose que la réponse précédente, il n'y a pas de réseau supplémentaire à indiquer.

La table de routage sera donc :

Table de routage du routeur 1

Réseau à joindre

passerelle

192.168.0.0/24

?

192.168.1.0/24

?

Il nous reste à y indiquer les passerelles. Pour cela, nous allons appliquer une règle simple : la passerelle pour joindre un de mes réseaux est mon adresse.

Ici, cela va donner :

Table de routage du routeur 1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.254

192.168.1.0/24

192.168.1.254

Et voilà ! Nous avons mis en place la table de routage du routeur 1 !

Maintenant, est-ce que cela suffit pour faire dialoguer nos deux réseaux entre eux ?

La réponse est malheureusement non, bien que le routeur sait maintenant aiguiller les paquets qu'il reçoit.

Dans ce cas, comment les machines du réseau vont savoir qu'il faut lui envoyer les paquets ?

Eh bien elles auront, elles aussi, une table de routage. Toute machine connectée à un réseau possède une table de routage, même une imprimante, un téléphone, ou le vieux PC de mamie... :p

C'est grâce à cette table de routage qu'une machine peut savoir à quelle passerelle envoyer un paquet quand elle veut joindre un autre réseau que le sien. On peut donc reprendre le schéma précédent et, par exemple, faire la table de routage de la machine 192.168.0.1.

On utilise notre méthode :
1- Indiquer les réseaux auxquels ma machine est connectée.
Ma machine est connectée à un seul réseau 192.168.0.0/24, ce qui donne pour la table de routage :

Table de routage de 192.168.0.1

Réseau à joindre

passerelle

192.168.0.0/24

?

2- Indiquer la route par défaut.
Cette fois, nous pouvons indiquer la route par défaut pour joindre un autre réseau que le nôtre, par exemple 192.168.1.0/24 (même si nous n'avons pas trop le choix dans notre exemple, vu qu'il n'y a qu'un réseau...) :

Table de routage de 192.168.0.1

Réseau à joindre

passerelle

192.168.0.0/24

?

192.168.1.0/24

?

3- Indiquer tous les autres réseaux que je ne peux pas encore joindre avec les deux étapes précédentes.
Là encore, nous avons déjà indiqué les deux réseaux que nous pouvons joindre, donc cette étape peut être oubliée.

Notre table de routage est donc :

Table de routage de 192.168.0.1

Réseau à joindre

passerelle

192.168.0.0/24

?

192.168.1.0/24

?

Nous savons déjà remplir la première ligne, car elle concerne notre propre réseau, nous pouvons donc y indiquer notre propre adresse en passerelle :

Table de routage de 192.168.0.1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.1

192.168.1.0/24

?

Il nous reste à indiquer la passerelle à utiliser pour joindre le réseau 192.168.1.0/24.
La question est donc la suivante.

À qui la machine 192.168.0.1 doit envoyer ses paquets pour joindre le réseau 192.168.1.0/24 ?

On se doute qu'il va falloir les envoyer au routeur R1, mais à laquelle de ses deux interfaces ?

Pour répondre à cela, je vous propose d'utiliser une métaphore pour nos réseaux.
Nous allons imaginer que chacun de nos réseaux est une pièce d'une maison, et que le routeur est la porte qui permet de relier les deux pièces. La porte a deux poignées, chacune dans une des deux pièces, comme les deux interfaces de notre routeur.
Quand je suis dans une pièce et que je veux aller dans l'autre, quelle poignée puis-je utiliser ? Celle qui est de mon côté de la porte, ou l'autre ?

La réponse est évidente : il faut que j'utilise la poignée qui est de mon côté de la porte !
Eh bien c'est pareil pour le routage. Pour joindre un réseau, une machine doit utiliser une passerelle qui appartient à son propre réseau.

Ici, ce sera donc l'adresse du routeur qui est sur le même réseau que la machine 192.168.0.0/24, soit l'adresse 192.168.0.254. Ce qui nous donne :

Table de routage de 192.168.0.1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.1

192.168.1.0/24

192.168.0.254

Youhou ! Nous savons maintenant faire des tables de routage !

Pour en être bien sûrs, nous allons prendre des exemples un peu plus complexes. Observez la figure suivante.

Réseau plus complexe
Réseau plus complexe

Ça, c'est du réseau ! Bien que cela reste en réalité un très petit réseau, pour nous, c'est déjà pas mal ! Nous allons donc refaire, comme dans l'exercice précédent, les tables de routage du routeur 1 et de la machine 192.168.0.1.
À vous de jouer ! Et n'oubliez pas d'utiliser la méthode en trois étapes.

Pour le routeur 1.

Commençons par le routeur 1, pour la première étape, rien n'a changé, il a toujours ses deux interfaces connectées aux mêmes réseaux.

Table de routage du routeur 1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.254

192.168.1.0/24

192.168.1.254

Pour l'étape 2, ça change.
2- Indiquer la route par défaut.
Ici, le routeur 1 doit avoir une route par défaut, car il peut aller sur Internet, mais il ne peut pas connaître tous les réseaux d'Internet. Sa passerelle doit lui permettre d'aller sur Internet et sera donc la première étape pour aller vers Internet. Il doit passer par le routeur 3, sur l'interface qui est sur le même réseau que lui, soit 192.168.1.253.

Table de routage du routeur 1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.254

192.168.1.0/24

192.168.1.254

défaut

192.168.1.253

Mais vu qu'il va devoir aussi passer par le routeur 4 ensuite, pourquoi ne pas indiquer directement le routeur 4 ?

Eh bien c'est l'histoire du serpent qui se mord la queue, ou de la poule et de l'œuf ! ;)
Si, pour sortir de mon réseau, j'indique une passerelle qui est en dehors de mon réseau, je ne pourrai jamais l'atteindre, car pour l'atteindre il faudrait que je sache sortir de mon réseau... et pour sortir de mon réseau il faudrait atteindre la passerelle... Je ne continue pas, vous voyez qu'on n'arrivera jamais à sortir de notre réseau dans ce cas !

On en déduit une règle très importante : les passerelles indiquées dans ma table de routage appartiennent toujours à l'un de mes réseaux.

Ainsi, pour mon routeur 1, je ne devrais trouver que des passerelles qui sont dans les réseaux 192.168.0.0/24 et 192.168.1.0/24.
Ouf, c'est bien le cas dans ma table de routage !

Passons à la troisième étape.
3- Indiquer tous les autres réseaux que je ne peux pas encore joindre avec les deux étapes précédentes.
Là, ça se complique.
Il y a globalement 4 réseaux sur notre schéma (192.168.0.0/24, 192.168.1.0/24, 10.0.0.0/24 et 10.0.1.0/24) plus Internet.

Actuellement, nous savons aller vers les deux premiers. Nous savons aussi aller vers Internet grâce à notre passerelle par défaut. Il nous reste donc deux réseaux à joindre, 10.0.0.0/24 et 10.0.1.0/24.

Cependant, si on y regarde de plus près, nous savons aussi aller vers le réseau 10.0.1.0/24, car il est derrière ma passerelle par défaut.

En effet, imaginons que le routeur 1 veut envoyer un paquet vers la machine 10.0.1.1. Il va aller voir dans sa table de routage et va la parcourir.
En fait, il va parcourir les routes une à une et va regarder si la machine qu'il veut joindre appartient aux réseaux définis dans les routes :

  • 10.0.1.1 n'appartient pas au réseau 192.168.0.0/24 de la première route, donc elle ne convient pas ;

  • 10.0.1.1 n'appartient pas non plus au réseau 192.168.1.0/24 de la seconde route, donc elle ne convient pas non plus ;

  • comme la définition de la route par défaut nous le dit, nous allons utiliser la passerelle associée à la route par défaut, et notre paquet va être envoyé à l'adresse 192.168.1.253 du routeur 3 ;

  • ça y est, vu que le routeur 3 est connecté au réseau 10.0.1.0/24 que nous voulons joindre, il saura lui transmettre le paquet.

Vous l'aurez peut-être remarqué aussi, quand nous parcourons une table de routage afin de trouver une route pour joindre une destination, nous faisons exactement les mêmes calculs que nous avons faits dans le chapitre sur les masques de sous-réseau. C'est-à-dire, savoir si une adresse appartient à un réseau.

Mais revenons à l'exercice, car nous savons joindre tous les réseaux sauf un, le réseau 10.0.0.0/24.
Eh bien nous allons ajouter une route pour lui. En regardant le schéma, nous voyons qu'il faut passer par l'adresse 192.168.0.253 du routeur 2 pour aller vers le réseau 10.0.0.0/24. Ce qui nous donne au final :

Table de routage du routeur 1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.254

192.168.1.0/24

192.168.1.254

défaut

192.168.1.253

10.0.0.0/24

192.168.0.253

Il existe une autre écriture possible pour la route par défaut qui est parfois identifiée par le réseau 0.0.0.0/0.
Ceci donne une autre écriture de la table de routage :

Table de routage du routeur 1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.254

192.168.1.0/24

192.168.1.254

0.0.0.0/0

192.168.1.253

10.0.0.0/24

192.168.0.253

Pour la machine 192.168.0.1, je vous donne directement la correction :

Table de routage de 192.168.0.1

Réseau à joindre

passerelle

192.168.0.0/24

192.168.0.1

0.0.0.0/0

192.168.0.254

10.0.0.0/24

192.168.0.253

Voilà ! Vous savez maintenant comment les paquets sont aiguillés d'un réseau à un autre et comment fonctionne le routage.
Vous êtes aussi capables d'écrire les tables de routage des machines pour des réseaux simples.

Si vous voulez vous entraîner, voici les tables de routage de quelques autres machines du schéma :

Table de routage de 10.0.0.1

Réseau à joindre

passerelle

10.0.0.0/24

10.0.0.1

0.0.0.0/0

10.0.0.254

Table de routage du routeur 2

Réseau à joindre

passerelle

10.0.0.0/24

10.0.0.254

192.168.0.0/24

192.168.0.253

0.0.0.0/0

192.168.0.254

Table de routage de 10.0.1.2

Réseau à joindre

passerelle

10.0.1.0/24

10.0.1.2

0.0.0.0/0

10.0.1.254

192.168.1.0/24

10.0.1.253

192.168.0.0/24

10.0.1.253

10.0.0.0/24

10.0.1.253

Dans ce cas, on peut aussi simplifier en regroupant les réseaux 192.168.0.0/24 et 192.168.1.254/24 en un seul réseau avec un masque plus grand :

Table de routage de 10.0.1.2

Réseau à joindre

passerelle

10.0.1.0/24

10.0.1.2

0.0.0.0/0

10.0.1.254

192.168.0.0/23

10.0.1.253

10.0.0.0/24

10.0.1.253

Maintenant que nous commençons à avoir quelques connaissances théoriques assez poussées, nous allons pouvoir passer à la pratique et aux TP ! Enfin !

Mise en pratique du routage

Installation

Linux vs Windows

Nous allons travailler sous Linux. Il n'est pas question ici de comparer Windows et Linux, qui ont chacun leurs avantages et inconvénients, mais de choisir le système le mieux adapté à ce que nous voulons faire, c'est-à-dire du réseau.

L'avantage sous Linux est que nous allons pouvoir voir concrètement ce que nous faisons. Accéder aux fichiers de configuration, mettre en place des fonctions avancées, etc.

Pour ceux qui n'ont pas l'habitude de Linux, la première étape sera de se familiariser avec ce système. Ne vous inquiétez pas, ce n'est pas du tout sorcier.
Ce qui nous intéresse dans ce tutoriel n'est pas le système mais le réseau. Je vous laisserai donc vous occuper d'installer et mettre en place les outils et systèmes nécessaires. Vous pouvez par exemple commencer par l'excellent tutoriel de M@teo sur Linux.

L'architecture

En réseau, on parle souvent d'architecture pour indiquer comment les machines sont branchées entre elles.
Par exemple, vous avez déjà découvert deux architectures réseau dans nos précédents exercices sur le routage ; regardez donc la figure suivante.

Réseau plus complexe

Ceci est une architecture qui fait le lien entre nos machines, nos routeurs, nos switchs et Internet.

Euh, ils sont où les switchs ? Je ne les vois pas sur le schéma…

En fait, ce schéma est ce que nous appelons un schéma logique. Cela veut dire que nous représentons dessus la logique de connexions entre les réseaux.
Ainsi, les switchs qui sont censés être propres à un réseau ne sont pas vraiment représentés. Ils le sont plus ou moins par les barres horizontales qui identifient chacun des réseaux.

Étape 1, notre machine

Avant de nous plonger dans une architecture complexe, nous allons déjà aborder ce que l'on peut voir au niveau du routage et de la couche 3 avec notre machine.

Sous Windows

J'imagine que la grande majorité d'entre vous se trouvant sous Windows, il peut être intéressant de voir ce que l'on peut faire sur ce système.
En ce qui me concerne, je suis sous Windows XP pro. Si jamais vous êtes sous Vista ou Seven, l'interface a été légèrement modifiée mais les mêmes informations sont toujours présentes.

Déjà, il faut comprendre qu'une partie des informations sera visible et configurable en ligne de commande DOS, et une autre partie ne le sera que depuis l'interface graphique.

Commençons par la ligne de commande.
Pour ouvrir une fenêtre DOS, cliquez sur Démarrer, puis exécuter, et tapez "cmd" dans l'invite de commande. Une fenêtre DOS devrait s'ouvrir, semblable à la figure suivante.

fenêtre dos

Nous allons regarder notre configuration réseau à l'aide de la commande ipconfig. On va en profiter pour agrandir notre fenêtre pour voir tout ce qui se passe à l'écran.

Pour moi c'est assez simple, je n'ai qu'une carte réseau (voir la figure suivante).

ipconfig

Nous voyons ici trois informations intéressantes :

  • je possède l'adresse IP 10.8.98.231 ;

  • elle est associée au masque 255.255.240.0 ;

  • et j'ai comme passerelle par défaut 10.8.97.1.

Vous pouvez vous amuser à calculer ma plage d'adresses réseau si cela vous tente ! :p
Maintenant, regardons la table de routage que nous pouvons voir à l'aide de la commande route print (voir la figure suivante).

route print

On voit ici ma passerelle par défaut identifiée par l'écriture 0.0.0.0/0. On voit aussi mon propre réseau local 10.8.96.0/20 qui a pour passerelle mon adresse 10.8.98.231. Tout cela est bien normal.

Par contre, Windows nous ajoute une foultitude de routes de plus auxquelles nous ne nous intéresserons pas, car elles sont propres à l'implémentation que fait Windows du routage.

Maintenant que je connais ma passerelle, puis-je communiquer avec elle ?

Oui, et nous avons la commande ping pour cela. Cette commande permet de savoir si nous arrivons à joindre une machine (voir figure suivante).

ping 10.8.97.1

Nous voyons ici qu'une requête a été envoyée à la machine 10.8.97.1 (en fait, 4 requêtes ont été envoyées).
La machine nous répond ensuite 4 fois.

On voit un temps de réponse de 17 ms pour la première requête, puis ce temps est plus bas pour les autres, pourquoi ?

(Si vous n'avez pas la réponse, nous y reviendrons dans le prochain chapitre.)
Ça marche, nous communiquons avec la machine 10.8.97.1 ! :D

Pouvons-nous aller plus loin et sortir de notre réseau ? Joindre le Site du Zéro par exemple ?

ping siteduzero

Comme vous pouvez le constater sur la figure précédente, ça marche encore ! De plus, nous voyons même que l'adresse IP du Site du Zéro est 92.243.25.239.

Si vous vous souvenez, nous pouvons aussi voir les routeurs par lesquels nous passons pour joindre une destination grâce au traceroute qui, sous Windows, se fait par la commande tracert. Je vous en donne un intéressant en figure suivante.

tracert www.intechinfo.fr

J'ai fait un tracert vers le site web de mon école, mais il n'aboutit pas... Cela ne veut bien sûr pas dire que la machine n'est pas joignable, mais simplement qu'il y a un routeur sur le chemin qui bloque l'envoi ou la réception de mon traceroute.
Il est par ailleurs intéressant de voir aux étapes 9, 10 et 11 que nous passons sur Internet par des réseaux privés ayant des adresses RFC 1918 !!
Cela est dû au fait que les opérateurs utilisent ces adresses sur leurs réseaux privés mais que ces routeurs ne communiquent pas directement avec des machines d'Internet.

Ainsi, nous voyons bien que notre machine possède tous les éléments nécessaires au bon fonctionnement de la couche 3.

En revanche, s'il n'est pas simple sous Windows de modifier sa configuration réseau, cela peut se faire très facilement graphiquement.

Cliquez sur Démarrer, puis Panneau de configuration et choisissez Connexions réseau. Vous cliquez avec le bouton droit sur la connexion que vous voulez voir, puis dans la nouvelle fenêtre, cliquez sur Protocole Internet (TCP/IP) et enfin sur Propriétés.

Voici à la figure suivante ce que vous devriez voir.

propriétés TCP/IP

Ici, on voit que mon adresse IP est donnée automatiquement. En fait, c'est le routeur de mon opérateur qui me la fournit.
Ceci dit, on peut tout à fait fixer soi-même ces informations (voir la figure suivante).

propriétés TCP/IP à la main

Voilà, vous savez maintenant où trouver les informations IP sous Windows et comment les modifier.
Regardons maintenant sous Linux ce que cela peut donner.

Sous Linux

Je vous conseille d'utiliser une Debian.
Debian est une distribution formidable et très orientée services et stabilité. Ainsi, en installant une Debian de base sans environnement graphique, vous aurez une machine consommant très peu de ressources. Et vu que nous allons par la suite installer plusieurs machines virtuelles sur votre machine, il serait intéressant de ne pas consommer trop de ressources pour que votre machine tienne la charge.

Pour l'instant, nous allons découvrir les commandes utiles sous Linux pour accéder aux informations réseau.

Pour afficher son adresse IP, c'est la commande ifconfig.

sd-6555:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:40:63:e8:09:89  
          inet adr:88.191.45.68  Bcast:88.191.45.255  Masque:255.255.255.0
          adr inet6: 2a01:e0b:1:45:240:63ff:fee8:989/64 Scope:Global
          adr inet6: fe80::240:63ff:fee8:989/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:102942465 errors:0 dropped:0 overruns:0 frame:0
          TX packets:78387221 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          RX bytes:3096315640 (2.8 GiB)  TX bytes:2529589244 (2.3 GiB)
          Interruption:18 Adresse de base:0xfc00 

lo        Link encap:Boucle locale  
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3490390 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3490390 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:232029693 (221.2 MiB)  TX bytes:232029693 (221.2 MiB)

Nous voyons ici que ma machine possède deux interfaces réseau. La première est l'interface eth0 (eth pour Ethernet !) qui est ma carte réseau.
La ligne qui nous intéresse dans sa configuration est la suivante :

inet adr:88.191.45.68  Bcast:88.191.45.255  Masque:255.255.255.0

Nous pouvons y voir notre adresse IP 88.191.45.68, notre masque 255.255.255.0 et l'adresse de broadcast 88.191.45.255.

Enfin nous avons l'interface lo (pour local, ou loopback) qui est une interface réseau virtuelle qui n'est accessible que sur la machine elle-même. Son adresse est toujours 127.0.0.1, sur toutes les machines. C'est une convention.

Pour voir ma table de routage, la commande est route -n :

sd-6555:~# route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
88.191.45.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         88.191.45.1     0.0.0.0         UG    0      0        0 eth0

On voit tout de suite la sobriété de cette table par rapport à Windows ! ;)
La première ligne est pour notre réseau, et on voit une particularité de Linux qui n'indique pas notre adresse, mais 0.0.0.0. C'est comme ça.
La seconde est la route par défaut qui est ici 88.191.45.1.

Maintenant que nous avons affiché les informations, nous allons voir ce qu'il faut faire pour les modifier.
Sous Linux, tout est modifiable depuis la ligne de commande.

Par exemple, on peut utiliser la commande ifconfig avec des options pour modifier son adresse et la remplacer par 10.0.0.1/24 :

sd-6555:~# ifconfig eth0 10.0.0.1 netmask 255.255.255.0
sd-6555:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:40:63:e8:09:89  
          inet adr:10.0.0.1  Bcast:10.0.0.255  Masque:255.255.255.0
          adr inet6: 2a01:e0b:1:45:240:63ff:fee8:989/64 Scope:Global
          adr inet6: fe80::240:63ff:fee8:989/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:102950613 errors:0 dropped:0 overruns:0 frame:0
          TX packets:78388144 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          RX bytes:3096939806 (2.8 GiB)  TX bytes:2529720601 (2.3 GiB)
          Interruption:18 Adresse de base:0xfc00 

lo        Link encap:Boucle locale  
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:3491321 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3491321 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:232085987 (221.3 MiB)  TX bytes:232085987 (221.3 MiB)

Mon adresse a bien changé !

Nous allons maintenant modifier la table de routage. Pour cela, la commande est encore route, à utiliser avec des options.
Par exemple, nous allons enlever notre route par défaut, et la changer pour 10.0.0.254 vu que nous avons déjà changé notre adresse IP.

sd-6555:~# route del default
sd-6555:~# route add default gw 10.0.0.254
sd-6555:~# route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         10.0.0.254      0.0.0.0         UG    0      0        0 eth0

Nous pouvons même ajouter une route spécifique si nous le souhaitons pour aller vers le réseau 192.168.0.0/24 en passant par la passerelle 10.0.0.253 :

sd-6555:~# route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.0.0.253
sd-6555:~# route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     10.0.0.253      255.255.255.0   U     0      0        0 eth0
0.0.0.0         10.0.0.254      0.0.0.0         UG    0      0        0 eth0

Vous savez maintenant modifier l'adressage et la table de routage d'une machine Linux, nous allons pouvoir passer au premier TP ! :D

Étape 2, mise en place de notre architecture

Un premier réseau simple

Nous allons mettre en place dans un premier temps un réseau très simple. Il sera constitué de deux réseaux reliés entre eux par un routeur.
Voici à la figure suivante le schéma logique.

schéma réseau simple

Nous allons donc créer trois machines virtuelles sous Linux. Les deux premières vont jouer le rôle de machines clientes, la troisième jouant le rôle de routeur entre les deux réseaux.

Création des machines virtuelles

Prérequis : il vous faudra pour être tranquille 30 Go de disque dur pour installer les machines virtuelles. Un minimum de 2 Go de RAM serait bien également.

Si vous n'êtes pas habitués à utiliser des machines virtuelles, vous allez voir, c'est très simple.
Le principe est de faire tourner une ou plusieurs machines en parallèle de votre machine principale. Ainsi vous pouvez avoir un Windows installé sur votre machine, et un Linux qui tourne en même temps en tant que machine virtuelle.

Par exemple, je fais tourner un Windows XP pro sur mon Mac et je peux travailler sur les deux en parallèle (voir la figure suivante).

Windows sous mac os

Je vais considérer que vous êtes sous Windows, mais de toute façon, l'installation est possible sous Mac OS ainsi que sous Linux.

Nous allons donc installer un programme qui nous permet de virtualiser des machines, il s'agit de Virtualbox.
Vous pouvez aussi choisir vmware ou VirtualPC pour virtualiser si vous y êtes habitués, mais les manipulations seront faites sous Virtualbox dans ce TP.

Allez télécharger la dernière version de Virtualbox et installez-la. L'installation est très simple, il suffit de cliquer sur next à chaque étape. ;)

Avant de créer notre première machine virtuelle, nous allons voir qu'il y a plusieurs façons de les créer.
La première est celle que vous utilisez habituellement pour installer des machines, c'est-à-dire récupérer une image disque du système d'exploitation à installer, la graver sur un CD ou un DVD, puis insérer le CD ou le DVD dans le lecteur pour commencer l'installation en redémarrant la machine.
La seconde est plus simple et nous allons l'utiliser. Elle consiste à récupérer une image d'une machine déjà existante et à la copier directement dans Virtualbox.

Pour cela, je vous propose de télécharger une image d'une Debian que j'ai déjà créée.

Positionnez ce fichier .vdi dans un répertoire que nous allons appeler... répertoire ! Lancez Virtualbox ; vous devriez voir apparaître une fenêtre semblable à la figure suivante.

Image Virtualbox
Image Virtualbox

Nous allons maintenant créer trois machines virtuelles à partir de notre image.

Pour cela, cliquez sur New, ou Nouveau. Cliquez sur Suivant, puis donnez un nom à votre machine virtuelle, par exemple Debian01. Choisissez Linux Debian comme système. Mettez 256 Mo comme mémoire (on n'a pas besoin de plus en environnement graphique !).

Ensuite, choisissez un disque existant puis Ajouter et allez pointer sur votre fichier Debian01.vdi dans le répertoire choisi.
Choisissez ce disque et cliquez sur Suivant. Votre Debian est installée et prête à l'emploi.

Avant d'aller plus loin, essayez de la démarrer en cliquant dessus puis Lancer. Normalement tout se lance tout seul et la machine boot. Vous devriez vous retrouver devant l'invite de login. Le login est root et le mot de passe est siteduzero.

Si vous obtenez un prompt : debian01:~# c'est gagné ! Vous pouvez maintenant arrêter cette machine avec la commande init 0.
Nous allons maintenant dupliquer notre machine Debian pour avoir plusieurs machines virtuelles et faire du réseau entre elles.

Pour la dupliquer, ou la cloner, nous allons utiliser la fonction de clonage qui est disponible directement dans Virtualbox. Faites un clic droit sur votre machine virtuelle et choisissez cloner. Choisissez le nom de votre clone, par exemple Debian02, et sélectionnez réinitialisez l'adresse MAC de toutes les cartes réseau. Sélectionnez Clone intégral, et cliquez enfin sur Cloner.

Refaites la même opération pour Debian03, et hop, vos trois machines virtuelles sont prêtes !

Il ne vous reste qu'à refaire les étapes de création des machines virtuelles. Vous devriez maintenant avoir vos trois machines virtuelles prêtes à l'emploi, comme indiqué en figure suivante.

3 machines virtuelles Virtualbox

Il nous reste juste à configurer le réseau. Pour cela, allez dans l'interface de Virtualbox, et pour chacune des 3 machines double-cliquez sur réseau, dans la colonne de droite (voir la figure suivante).

virtualbox réseau

Puis choisissez Accès par pont et indiquez la carte réseau qui est connectée à Internet sur votre machine (si jamais vous avez une carte wifi et une carte réseau filaire). Dans mon cas, j'ai indiqué la carte wifi (voir la figure suivante).

virtualbox réseau fenêtre

Nous sommes OK pour le réseau. Démarrez les trois machines virtuelles et connectez-vous à chacune d'entre elles avec le login indiqué plus haut.

Réalisation du TP

Nous connaissons déjà la commande ifconfig qui permet de voir sa configuration réseau et de changer son adresse.
Faites un ifconfig et vérifiez que vous avez bien les cartes eth0 et lo.

Pour la suite du TP, je considérerai que c'est eth0 qui fonctionne, vous le remplacerez si nécessaire.

Commençons le TP. Donnez les adresses suivantes aux machines :

  • 192.168.10.1/24 à la machine 1 ;

  • 192.168.10.254/24 à la machine 2 ;

  • 192.168.11.1/24 à la machine 3.

Solution
Sur Debian 01 :
ifconfig eth0 192.168.10.1 netmask 255.255.255.0

Sur Debian 02 :
ifconfig eth0 192.168.10.254 netmask 255.255.255.0

Sur Debian 03 :
ifconfig eth0 192.168.11.1 netmask 255.255.255.0

Essayez maintenant de pinguer la machine Debian02 depuis la machine Debian01, que se passe-t-il ?

Solution

debian01:~# ping 192.168.10.254
PING 192.168.10.254 (192.168.10.254) 56(84) bytes of data.
64 bytes from 192.168.10.254: icmp_seq=1 ttl=64 time=3.18 ms
64 bytes from 192.168.10.254: icmp_seq=2 ttl=64 time=0.121 ms
64 bytes from 192.168.10.254: icmp_seq=3 ttl=64 time=0.123 ms
^C
--- 192.168.10.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.121/1.142/3.184/1.443 ms

On voit que le ping fonctionne.

Essayez maintenant de pinguer Debian03.

Solution

debian01:~# ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
From 192.168.11.1 icmp_seq=2 Destination Host Unreachable
From 192.168.11.1 icmp_seq=3 Destination Host Unreachable
From 192.168.11.1 icmp_seq=4 Destination Host Unreachable
^C
--- 192.168.11.1 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4003ms
, pipe 3

Ici, le ping ne marche pas. Et c'est bien normal, car les machines Debian01 et Debian03 ne sont pas dans le même réseau. Il n'y a pas de routeur pour relier les deux réseaux, donc cela ne peut pas marcher.
Il nous faut ajouter une interface à la machine Debian02 dans le réseau de Debian03 pour relier les deux réseaux.

Configuration du routeur

C'est donc la machine Debian02 qui va jouer le rôle de routeur.
La première chose à faire est de lui ajouter une adresse IP supplémentaire dans le réseau 192.168.11.0/24.

Mais nous n'avons qu'une carte réseau !?

Ce n'est pas grave, car sous Linux, nous pouvons ajouter autant d'adresses que nous voulons à une interface réseau.
Nous allons en fait créer une interface virtuelle eth0:0.

ifconfig eth0:0 192.168.11.254 netmask 255.255.255.0

Nous avons maintenant deux interfaces réseau avec chacune une adresse dans l'un des deux réseaux.

debian02:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0c:29:61:e8:68  
          inet adr:192.168.10.254  Bcast:192.168.10.255  Masque:255.255.255.0
          adr inet6: fe80::20c:29ff:fe61:e868/64 Scope:Lien
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1017251 errors:0 dropped:0 overruns:0 frame:0
          TX packets:523742 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:1000 
          RX bytes:391610641 (373.4 MiB)  TX bytes:387456364 (369.5 MiB)

eth0:0    Link encap:Ethernet  HWaddr 00:0c:29:61:e8:68  
          inet adr:192.168.11.254  Bcast:192.168.11.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

lo        Link encap:Boucle locale  
          inet adr:127.0.0.1  Masque:255.0.0.0
          adr inet6: ::1/128 Scope:Hôte
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:4921 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4921 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:0 
          RX bytes:478450 (467.2 KiB)  TX bytes:478450 (467.2 KiB)

Nous sommes prêts à router... ou presque.
En effet, pour l'instant, notre machine se comporte comme une simple machine et rejette les paquets qui ne sont pas destinés à sa propre adresse IP. Pour qu'elle se comporte comme un routeur, il faut activer le routage. Pour cela, c'est très simple, car il suffit de mettre 1 à la place de 0 dans un fichier :

echo 1 > /proc/sys/net/ipv4/ip_forward

Et hop, notre machine est désormais un routeur !

Nous pouvons essayer de pinguer Debian03 depuis Debian01.

debian01:~# ping 192.168.11.1
PING 192.168.11.1 (192.168.1.1) 56(84) bytes of data.
From 192.168.11.1 icmp_seq=2 Destination Host Unreachable
From 192.168.11.1 icmp_seq=3 Destination Host Unreachable
From 192.168.11.1 icmp_seq=4 Destination Host Unreachable
^C
--- 192.168.11.1 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4003ms
, pipe 3

Oups ! Ça ne fonctionne pas...

C'est normal, car pour l'instant, la machine Debian01 ne sait pas qu'il faut envoyer ses paquets à Debian02.
Nous devons mettre une route dans sa table de routage pour que cela fonctionne. Vu que notre réseau est très simple, nous pouvons lui mettre une route par défaut. Regardons sa table de routage, puis ajoutons une route par défaut :

debian01:~# route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.10.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
debian01:~# route add default gw 192.168.10.254
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.10.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.10.254       0.0.0.0         UG    0      0        0 eth0

Et maintenant, c'est sûr, le ping va marcher !

debian01:~# ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
^C
--- 192.168.11.1 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4003ms
, pipe 3

Ça ne marche toujours pas... Pourtant la machine Debian01 sait à qui il faut envoyer les paquets pour joindre Debian03 !

Avez-vous une idée de ce qui se passe ?

En fait, la machine Debian01 fait bien son boulot, sa table de routage lui dit que pour joindre le réseau 192.168.11.0/24, il faut passer par la route par défaut, et elle peut le faire. Elle envoie donc son paquet au routeur Debian02 192.168.10.254. Debian02 reçoit le paquet, voit en couche 2 son adresse MAC, lit l'adresse IP destination en couche 3 et voit que le paquet n'est pas pour elle. Vu que le routage est activé, elle va voir dans sa table de routage à qui elle doit l'envoyer.
Elle voit que 192.168.11.1 appartient à son propre réseau, elle peut donc envoyer sa trame à 192.168.11.1.
Jusqu'ici tout roule.

192.168.11.1 reçoit le ping !
Mais par contre, sa table de routage ne possédant pas de route par défaut, il ne sait pas renvoyer la réponse...
La machine Debian01 ne reçoit donc jamais de réponse.

Nous pouvons le vérifier grâce à la commande tcpdump.
Tcpdump est un sniffer. C'est un programme qui est capable d'écouter toutes les trames qui arrivent sur notre carte réseau et de nous les afficher à l'écran (comme wireshark, mais en ligne de commande sous linux). Nous allons successivement utiliser le sniffer sur Debian01, Debian02 sur l'interface eth0, Debian02 sur l'interface eth0:0 et enfin Debian03.

debian01:~# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:56:48.670431 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 1, length 64
15:56:49.669414 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 2, length 64
15:56:50.668679 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 3, length 64
15:56:51.668678 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 4, length 64

Ici, on voit que la machine Debian01 envoie bien les requêtes vers Debian03.

debian02:~# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:56:48.670431 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 1, length 64
15:56:49.669414 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 2, length 64
15:56:50.668679 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 3, length 64
15:56:51.668678 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 4, length 64

La machine Debian02 voit bien arriver les requêtes sur son interface eth0 (192.168.10.254).

debian02:~# tcpdump -i eth0:0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:56:48.670431 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 1, length 64
15:56:49.669414 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 2, length 64
15:56:50.668679 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 3, length 64
15:56:51.668678 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 4, length 64

Elle voit même les requêtes ressortir de son interface eth0:0.

debian03:~# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:56:48.670431 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 1, length 64
15:56:49.669414 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 2, length 64
15:56:50.668679 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 3, length 64
15:56:51.668678 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 4, length 64

Et la machine Debian03 voit bien arriver les requêtes sur son interface eth0, mais aucune réponse ne ressort.

Ce problème est très connu sous le nom de problème de la route de retour.
Souvent les personnes pensent à configurer l'envoi des informations, mais ne pensent pas au retour.

Il faut donc ajouter une route par défaut à Debian03.

debian03:~# route -n
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.11.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
debian03:~# route add default gw 192.168.11.254
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.11.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.11.254       0.0.0.0         UG    0      0        0 eth0

Et maintenant notre ping... fonctionne !

Et nous pouvons le voir avec tcpdump :

debian01:~# tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:56:48.670431 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 1, length 64
15:56:48.670662 IP 192.168.11.1 > 192.168.10.1: ICMP echo reply, id 15160, seq 1, length 64
15:56:49.669414 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 2, length 64
15:56:49.669606 IP 192.168.11.1 > 192.168.10.1: ICMP echo reply, id 15160, seq 2, length 64
15:56:50.668679 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 3, length 64
15:56:50.668874 IP 192.168.11.1 > 192.168.10.1: ICMP echo reply, id 15160, seq 3, length 64
15:56:51.668678 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 4, length 64
15:56:51.668864 IP 192.168.11.1 > 192.168.10.1: ICMP echo reply, id 15160, seq 4, length 64
15:56:52.668676 IP 192.168.10.1 > 192.168.11.1: ICMP echo request, id 15160, seq 5, length 64
15:56:52.668859 IP 192.168.11.1 > 192.168.10.1: ICMP echo reply, id 15160, seq 5, length 64

On voit bien ici les requêtes de Debian01 et les réponses de Debian02.

debian01:~# ping 192.168.11.1
PING 192.168.11.1 (192.168.11.1) 56(84) bytes of data.
64 bytes from 192.168.11.1: icmp_seq=1 ttl=64 time=3.18 ms
64 bytes from 192.168.11.1: icmp_seq=2 ttl=64 time=0.121 ms
64 bytes from 192.168.11.1: icmp_seq=3 ttl=64 time=0.123 ms
^C
--- 192.168.10.254 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2006ms
rtt min/avg/max/mdev = 0.121/1.142/3.184/1.443 ms

Que faut-il en retenir ?

  • Il faut toujours penser qu'on ne peut joindre une machine QUE si le routage fonctionne dans les DEUX SENS.

  • Il est souvent intéressant d'écrire les tables de routage sur papier avant de mettre en place une infrastructure pour éviter que cela ne fonctionne pas, une fois mis en place.

Ça y est, nous avons mis en place notre premier réseau routé !

Étape 3, pour ceux qui le souhaitent

Il s'agit de mettre en place le gros réseau que nous avions étudié (voir la figure suivante). Je ne vais pas refaire ce TP avec vous, vous avez maintenant toutes les informations nécessaires pour le réaliser.

schéma réseau complexe
Création des machines

Vous avez déjà trois machines créées. Pour réaliser cette architecture, vous en aurez besoin de 5 en plus (4 routeurs et une machine par réseau). Créez les machines comme nous l'avons fait précédemment.

Écriture des tables de routage

Écrivez toutes les tables de routage de toutes les machines du réseau sur papier.

Configuration

Mettez en place la configuration IP de toutes les machines ainsi que le routage tel que vous l'avez écrit sur papier.

Pour créer une route qui ne soit pas une route par défaut, donc pour un réseau spécifique, la syntaxe est :
route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.11.254

Et pour enlever une route :
route del -net 192.168.10.0 netmask 255.255.255.0

Tests

Pour tester votre réseau, vous avez bien sûr la commande ping, mais aussi traceroute ou tcpdump.
Utilisez-les pour comprendre d'où peut venir un éventuel problème.

  • Vous maîtrisez le protocole IP (ou du moins une partie).

  • Vous savez ce qu'est le routage.

  • Vous savez connecter des réseaux entre eux.

  • Vous savez configurer l'adresse de machines sous Windows et Linux.

  • Vous savez configurer le routage sous Linux.

Nous connaissons maintenant bien le protocole IP, mais nous allons voir qu'il existe d'autres protocoles pour la couche 3...

Example of certificate of achievement
Example of certificate of achievement

Only Premium members can download videos from our courses. However, you can watch them online for free.