Security-X

Forum Security-X => Internet & Réseau => Cours et Tutoriels => Discussion démarrée par: XmichouX le mars 25, 2013, 09:54:57

Titre: Routage des paquets à travers Internet (1/2)
Posté par: XmichouX le mars 25, 2013, 09:54:57
3) Routage des paquets à travers Internet

Internet est un système mondial de millions de réseaux interconnectés, dont votre petit réseau local fait partie (indirectement avec le protocole NAT que nous allons aborder dans ce chapitre) au même titre qu'une grande baie de serveurs web. Lorsque vous souscrivez à une offre Internet proposée par un FAI, vous ne faites que demander un routeur vous permettant de joindre le réseau du FAI (par le biais du câblage téléphonique), qui lui est directement connecté à Internet (réseau "publique" et non local) : il possède donc une adresse IP publique dite "routable" car unique au monde à un instant T.
Afin de communiquer à l'intérieur des réseaux et entre des réseaux différents, il a fallu établir une stratégie de communication.
La base a été d'adresser physiquement les équipements puis logiquement afin de créer la notion de réseaux, puis d'exploiter ces réseaux et leur structure pour acheminer le plus simplement et le plus efficacement possible un paquet d'un PC lambda à un autre (pouvant être à l'autre bout du monde sur un réseau différent) : c'est le routage logique des paquets.

Dans ce chapitre, nous allons aborder le protocole NAT (une solution temporaire à la pénurie d'IPv4) et ce fameux routage.

a) NAT

Aujourd'hui, avec la pénurie d'adresses IP liée à IPV4 (2^32 possibilités, soit environ 4 300 000 000 d'adresses), chaque PC ne peut pas avoir sa propre adresse IP sur Internet. C'est pourquoi le protocole NAT (Network Address Translation) a été implémenté pour palier temporairement ce problème.
On distingue à ce jour adresse IP locale et adresse IP publique.
L'adresse IP locale est l'adresse IP d'un PC au sein d'un réseau privé/local alors que l'adresse IP publique est notre adresse sur Internet (quand on sort du réseau local). L'adresse IP locale est non routable sur Internet (car non unique au monde, puisque tous les réseaux locaux se trouvent sur des plages d'adresses IP réservées comme 192.168.x.x ou 10.x.x.x, et il y en a des millions) alors que l'adresse IP publique est unique au monde à un instant T et routable sur Internet.

1 - Fonctionnement

Actuellement, on dit qu'un routeur fait du NAT, c'est-à-dire de la translation d'adresses réseaux. Autrement dit, il se charge de traduire l'adresse IP locale (champ IPSource) des paquets provenants du réseau sur lequel il est la passerelle par défaut (c'est-à-dire la passerelle par laquelle on passe pour sortir du réseau local) en adresse publique, et vice-versa.
Un PC a donc bien une adresse IP locale et une adresse IP publique distinctes.
Le NAT statique permet d'associer une adresse IP publique statique unique à une adresse IP locale fixe (et non routable par définition). Cette solution ne résolvant en aucun cas la pénurie d'adresses IPv4 disponibles, elle n'est utilisée que dans des cadres bien précis. Par exemple, une entreprise hébergeant ses sites WEB peut facilement être amené à faire du NAT statique, si elle souhaite attribuer une IP publique différente à chacun de ses sites WEB, ou plus généralement à chacun des services qu'elle propose à l'extérieur. Dans ce cas, l'entreprise réserve non pas une adresse IP au FAI, mais une plage d'adresses IP généralement statiques.
On note que dans certains cas, on peut résoudre cette solution en NAT dynamique multiple en utilisant une redirection de port, ce que nous verrons plus loin.
En NAT dynamique, l'adresse publique associée à une adresse privée est choisie de manière dynamique parmi un pool d'adresses à la différence du NAT statique ou une adresse publique précise est associée à une adresse privée précise. Si certains PC's sont éteints, les adresses ne sont pas bloquées pour les autres. C'est le même principe que le DHCP pour les adresse IP locales. Cette solution ne résout cependant toujours pas la pénurie d'adresses.
Pour cela, on va utiliser du NAT multiple (qu'on associe au NAT dynamique) : le routeur donne la même adresse IP publique (ou une choisie dans une petite série selon la plage d'adresses délivrée par le FAI) à tous les PC's du réseau local, ce qui permet de contrer temporairement la pénurie précédemment exprimée.
Ce qui redonne le schéma suivant :

(https://forum.security-x.fr/proxy.php?request=http%3A%2F%2Fsecurity-x.fr%2Fimg%2Fpublic%2Fschema_logique2.png&hash=a52fa9a3c12def77e5b01917ecc49d3715332a51)

Lorsqu'un paquet navigue au sein du réseau local, l'adresse IP Source du paquet est bien l'adresse IP locale (192.168.x.x ou 10.x.x.x ...), mais lorsqu'il sort du réseau (paquet sortant), le routeur la modifie (champ IPSource dans le datagramme IP) pour la remplacer par la sienne ou par une des adresses qu'il est en droit d'utiliser. L'adresse publique d'un PC sur le réseau X est donc celle(s) du routeur X.

Ce schéma montre la translation d'adresse (de privée vers publique) opérée par le routeur NAT :

(https://forum.security-x.fr/proxy.php?request=http%3A%2F%2Fsecurity-x.fr%2Fimg%2Fpublic%2Fnat_1.png&hash=eb34bb22dc8839e6b6ec70f471bc123be20043c2)

Si 10 PC's sont reliés à ce routeur, on a donc une adresse IP sur Internet pour 10 PC's : on réduit donc considérablement le nombre d'adresses publiques (routables). C'est pourquoi on emploie le terme de mascarade IP.
Cet aspect de NAT est sécuritaire, car il permet de cacher à l'extérieur l'organisation du réseau privé.
Cette solution est bien-sûr temporaire, car les réseaux particuliers ne contiennent en général que relativement peu de PCs. La réduction est donc plus significative pour les réseaux d'entreprise. Mais il faudra bien un jour migrer vers l'IPv6.
De la même manière, pour les paquets entrants, le routeur doit être capable de modifier l'adresse IP de destination du paquet pour mettre l'adresse IP locale du PC auquel il est destiné.
Maintenant, comment cela est possible ? Imaginons qu'on reçoive trois paquets provenant de l'extérieur destinés à trois PC's différents dans le réseau local qui possèdent la même adresse publique (celle du routeur).
Comment gérer ces requêtes provenant de l'extérieur ? Comment savoir à quel PC dans le réseau local le paquet est-il destiné ?

Celui-ci ne va pas se contenter des adresses IP pour faire la correspondance entre IP publique reçue et IP locale correspondante : c'est pourquoi il maintient des enregistrements sur les paquets sortants. Ainsi, lorsqu'il reçoit un paquet en retour, il peut potentiellement savoir à quel enregistrement (PC local) ce paquet répond.
Le routeur va pour cela piocher certaines informations dans le paquet, notamment celles concernant la couche Transport (que nous allons étudier dans le chapitre suivant), puisque l'adresse IP ne suffit plus. Je vous invite donc à lire la fin de ce chapitre et le chapitre suivant (sur la couche Transport) avant de continuer la lecture de cette partie consacrée à NAT.

Lorsqu'un paquet sort du réseau, il contient une adresse IP Source (adresse IP locale), une adresse IP destination (publique), un port source (aléatoire généralement) et un port destination. Le routeur va, pour une durée déterminée (jusqu'à la fermeture d'une connexion TCP par exemple ou grâce à un système de bails), mémoriser ces informations dans une table interne.

Par la suite, lorsqu'un paquet va arriver de l'extérieur, le routeur va effectuer ces trois étapes :
- Analyse de l'adresse IP Source : Le routeur va regarder quelle est l'IP Source du paquet arrivant.
- Analyse du protocole de transport utilisé : Le routeur va ensuite regarder quel est le protocole de transport utilisé (UDP ou TCP).
- Analyse des ports source et destination : Enfin, le routeur va regarder quels sont les ports de communication utilisés (Source et Destination).

Dans le cas le plus simple, le routeur n'aura dans sa table qu'une seule IP de destination qui corresponde à l'adresse IP source du paquet (exemple d'un seul PC du réseau local qui visite le site www.nomdeSite.fr). Dans ce cas, si le protocole et les ports coïncident, il sait qu'il doit délivrer ce paquet au PC local de l'enregistrement.
Dans un autre cas, le routeur aura dans sa table deux entrées avec une IP de destination correspondant à l'adresse IP source du paquet. Si les ports source des PC locaux sont différents et que le reste coïncide, alors, encore une fois, il peut les différencier facilement.

Cela donne un schéma de ce type :

(https://forum.security-x.fr/proxy.php?request=http%3A%2F%2Fsecurity-x.fr%2Fimg%2Fpublic%2Fnat_2.png&hash=1b2b3b02678a91b3e7b5f62fe049ad1740fc0dc9)

Sur ce schéma, le routeur reçoit un paquet d'Internet (IP de Security-x.fr ;)). Pour le renvoyer au bon PC local, il scrute sa table interne et ne trouve qu'une seule entrée qui coïncide parfaitement avec le paquet reçu, il sait alors qu'il doit retransmettre le paquet au PC A.
En effet, le PC C a utilisé un port source différent lors de la connexion TCP, bien que ce soit vers le même site en HTTP (port 80). On remarque par ailleurs, une entrée faisant référence à une requête DNS à un serveur DNS de Free (2e entrée de la table).
Bien entendu, lorsqu'il retransmet la requête au PC A, il prend le soin de refaire la translation d'adresse !

Maintenant, prenons le cas où deux utilisateurs locaux se connectent à la même adresse IP (site web par exemple) en utilisant le même port source et destination (malchance puisque le port source est tiré "aléatoirement"). Là, le routeur ne vas pas savoir auquel des deux PCs locaux renvoyer le paquet.
C'est pourquoi lors de l'envoi des paquets (demande de connexion TCP par exemple) locaux vers l'extérieur, le routeur va effectuer une translation de port (PAT = Port Address Translation) si un PC local utilise les mêmes paramètres qu'un autre (même adresse IP distante, même protocole, même port source et port destination). En même temps qu'il va changer l'adresse IP source du paquet, le routeur va également changer le port source du paquet. Pour cela, il peut choisir dans un pool d'environ 65 535 ports, ce qui laisse tout de même une bonne marge !

Mais cela ne résout pas tous les problèmes liés à NAT !

2 - Parade

Si un de vos PC local exécute un serveur (de jeu, de messagerie instantanée, de n'importe quoi ;) ), et que quelqu'un externe à votre réseau local souhaite s'y connecter (cas typique des jeux en ligne), comment le routeur va-t-il savoir à quel PC local envoyer la trame ?
Exemple typique : Vous créez un serveur de jeu multijoueurs sur n'importe quel jeu grand publique.
En effet, puisque votre PC exécute un serveur, c'est le client externe qui va initier la  connexion (le client qui va se dire : "tiens je veux me joindre à cette partie"). Le routeur va donc recevoir une connexion sur le port du serveur local avec l'adresse IP publique du routeur, sans enregistrement sortant qui y correspond (vous ne vous êtes pas connecté au client avant ! Vous vous êtes sûrement juste connecté au serveur officiel du jeu afin que les autres joueurs puissent voir votre partie). Il ne va donc pas savoir quoi faire du paquet.

Une solution a été prévue, qui s'appelle la redirection de ports (Port Forwarding). Elle consiste à configurer votre routeur pour lui dire : lorsque tu reçois un paquet de protocole X avec le port destination Y, redirige le flux vers le PC local Z sur le port Y.

(https://forum.security-x.fr/proxy.php?request=http%3A%2F%2Fsecurity-x.fr%2Fimg%2Fpublic%2Fport-forwarding.PNG&hash=dcd55b1d7ee060b7c1f6d47657cd1f72cb33a642)

Dans l'exemple encadré en rouge, lorsqu'un paquet arrivera sur le routeur avec le port 2011 (tcp ou udp), le routeur saura quoi en faire : il le renverra à l'adresse IP locale 192.168.0.1 sur le même port. Cette solution marche, mais reste cependant peu souple. Si on commence à avoir beaucoup de serveurs, cela devient embêtant, on y préfèrera une solution de type NAT statique.

Pour terminer, on notera que le protocole NAT est activé sur les routeurs directement connectés à Internet (comme la box/routeur de particulier).