Aperçu des sections
Généralités
Dans le contexte de l'enseignement de la nouvelle spécialité « Numérique et sciences informatiques » (NSI) en 1ère et terminale au Lycée, le DIU "Enseigner l'Informatique au Lycée" proposé par l'Université de Bordeaux se découpe en 5 blocs. Dans ce cours Moodle de 5h, nous nous concentrons sur la partie Réseaux du bloc 3. Le cours abordera les notions suivantes :
- Modèle client-serveur et modèle OSI
- Protocoles de communication d'Internet et du web
- Sécurité des communications (chiffrement symétrique et asymétrique)
- abdou.guermouche@u-bordeaux.fr
- aurelien.esnard@u-bordeaux.fr
Avec un programme client GIT, vous pouvez récupérer toutes les ressources d'un coup... Par exemple, sous Linux :
$ git clone https://github.com/diu-uf-bordeaux/bloc3
Latence, Débit, Sous-Réseaux, ...
Exercice : pigeonnet versus internet !
On souhaite transférer 4 Go de données entre deux villes distantes de 100 km. Plusieurs moyens de transfert sont envisagés :
- Un pigeon voyageur portant un carte microSD, volant à une vitesse de 60 à 110 km/h selon la direction du vent ;
- Le réseau Internet avec ligne ADSL2 ayant un débit descendant de 8Mbit/s et montant de 1 Mbit/s.
Calculez le débit du pigeonnet ? Quel moyen de transfert est le plus performant ?
Exercice : Dans un réseau 193.51.199.0/24, on souhaite constituer 5 sous-réseaux.
- Combien de bits sont nécessaires pour coder ces sous-réseaux ?
- Combien de machines trouve-t-on dans chaque sous réseau ?
- Quel est le masque de réseau et de sous-réseau ?
- A quel adresse de sous-réseau appartient la machine 193.51.199.67 ?
- Donner l'adresse de diffusion correspondant à ce sous-réseau ?
- Quel sont les adresses des autres sous-réseaux ?
Calculatrice : http://cric.grenoble.cnrs.fr/Administrateurs/Outils/CalculMasque/
Analyse de Trames avec Wireshark
Prérequis : notions sur les protocoles, encapsulation, web.
- Objectifs : analyse du traffic réseau avec Wireshark.
Préambule
Voici les informations utiles sur la machine qui a servi à capturer ces traces réseaux. Ces informations sont obtenues avec les commandes Linux suivantes :
$ ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING, MULTICAST> mtu 1500 inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 ether 08:00:27:0b:03:37 txqueuelen 1000 (Ethernet) RX packets 60 bytes 8043 (7.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 63 bytes 10204 (9.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 loop txqueuelen 1 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 $ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0 10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 $ cat /etc/resolv.conf nameserver 192.168.1.1
? Vous devez reconnaître l'adresse IP de la machine utilisée (et son masque de réseau), l'adresse IP de la passerelle vers Internet, ainsi que l'adresse du serveur DNS local...
On voit apparaître dans la partie du haut une ligne pour chaque trame Ethernet que la carte réseau de la machine a traitée (en émission comme en réception). Ici on voit donc une séquence de trames avec un petit résumé qui indique la source, la destination, le protocole et quelques infos supplémentaires.
Lorsqu’une trame est sélectionnée, le contenu brut (i.e. octet par octet) apparaît dans la partie du bas, et une version décodée apparaît dans la partie du milieu. Il est alors possible d'inspecter cette trame en profondeur, couche par couche, en affichant à chaque niveau tous les détails sur le protocole utilisé. Cliquez sur ► pour explorer un niveau.
Ping
La commande ping disponible sur toutes les plateformes permet de tester rapidement si une machine est joignable sur le réseau Internet à partir de son nom ou de son IP... Par exemple :
$ ping www.google.com PING www.google.com (172.217.19.132) 56(84) bytes of data. 64 bytes from 172.217.19.132: icmp_seq=1 ttl=63 time=15.4 ms 64 bytes from 172.217.19.132: icmp_seq=2 ttl=63 time=15.8 ms 64 bytes from 172.217.19.132: icmp_seq=3 ttl=63 time=15.7 ms 64 bytes from 172.217.19.132: icmp_seq=4 ttl=63 time=15.8 ms 64 bytes from 172.217.19.132: icmp_seq=5 ttl=63 time=15.8 ms 64 bytes from 172.217.19.132: icmp_seq=6 ttl=63 time=15.7 ms 64 bytes from 172.217.19.132: icmp_seq=7 ttl=63 time=15.7 ms Ctrl^C --- www.google.com ping statistics --- 7 packets transmitted, 7 received, 0% packet loss, time 26ms rtt min/avg/max/mdev = 15.442/15.722/15.847/0.207 ms
? Par défaut, la commande ping envoie une requête echo-request (protocole ICMP) chaque seconde et affiche en retour la réponse echo-reply avec quelques statistiques... Notamment, le temps affiché correspond au temps d'aller-retour du message (RTT = Round-Time Trip). On considère souvent que la Latence représente la moitié du RTT.
La trace enregistrée se divise en trois étapes principales identifiées avec des couleurs différentes dans Wireshark :
- Trames 1-2 (ARP) : On cherche à découvrir l'adresse Ethernet de la passerelle, afin de connaître la porte de sortie du réseau local vers Internet.
- Trames 3-4 (DNS) : On cherche à trouver l'adresse IP de la machine cible (www.google.com).
- Trames 5-18 (ICMP) : 7 pings et leurs réponses...
Exercice : Répondez aux qestions suivantes concernant la trace ping.pcap en vous aidant de Wireshark.
- A quelle adresse Ethernet est destinée la requête ARP (trame 1) émise par la machine cliente ? Il s'agit en fait de l'adresse de diffusion (broadcast). Elle ne correspond à aucune machine particulière ! A votre avis pourquoi doit on proceder ainsi ?
- La requête ARP "WHO HAS" (trame 1) cherche à trouver l'adresse Ethernet de la machine 10.0.2.2. Pourquoi cette machine et non pas la machine cible www.google.com ?
- Quel est le protocole de transport utilisé pour les échanges DNS (trames 3-4) ? Observez en détail la réponse DNS (section Answers) et découvrez ainsi l'adresse IP de la "machine" www.google.com retourné par le serveur DNS.
- Observez la première requête / réponse ICMP (trames 5-6) et observez la valeur du champs type dans l'en-tête...
Une page Web : Je suis perdu !
Que se passe-t-il quand je consulte une page web (par exemple, http://www.perdu.com ) sur Internet avec mon navigateur préféré ? Pour comprendre en détail ce qui se passe, nous avons capturé, à l'aide de l'outil tcpdump (en ligne de commande) ou directement avec Wireshark, tout le traffic réseau entrant & sortant de la carte réseau (Ethernet) de cette machine.
$ tcpdump -w http.pcap & # on démarre la capture en arrière-plan (&) $ wget http://www.perdu.com # on télécharge la page web en ligne de commande $ pkill tcpdump # on stoppe la capture
La trace enregistrée effectue les mêmes étapes préliminaires que précédemment : requêtes ARP et DNS... Concentrons nous ici sur la conversation TCP/IP (trames 7-17). On demande la page d'accueil "/" ou "/index.html" du serveur web (www.perdu.com) en utilisant le protocole HTTP au dessus de TCP, ce qui implique plusieurs étapes intermédiaires :
- La connexion TCP en trois temps (trames 7-9)
- La requête HTTP ainsi que la réponse incluant le code HTML (trames 10-13).
- La phase de déconnexion (trames 14-17).
Exercice : Répondez aux qestions suivantes concernant la trace http.pcap en vous aidant de Wireshark.
- Considérons la première trame TCP/IP qui ouvre la connexion (trame 7). Trouvez dans l'en-tête TCP le port source et le port de destination. Ce dernier est standard pour tous les serveur web (80). A quoi correspond le flag SYN dans cette en-tête ?
- Identifiez dans la conversation TCP les trames correspondant à la requête HTTP et à la réponse HTTP...
- Dans l'en-tête de la requête HTTP, on observe sur la première ligne qu'il s'agit de la requête "GET / HTTP/1.1". Identifiez le rôle des champs suivants : User-Agent, Host, Connection.
- La réponse HTTP commence par la ligne suivante "HTTP/1.1 200 OK" qui indique que tout s'est bien passé (code 200). Vous devez déjà connaître le fameux code d'erreur 404 (cf. liste des codes HTTP).
- Observez maintenant les différents champs dans la réponse HTTP et en déduire le logiciel serveur, la longueur et le type de contenu dans cette réponse.
- Immédiatement après l'en-tête HTTP, vous pouvez identifier le code HTML de la page web : "<html>...</html>".
- Trames 7-16 : Pour lire plus facilement la conversation TCP, vous pouvez cliquer sur un des paquets TCP et utiliser "Follow -> TCP Stream"... Notez qu'il est possible de reconstruire précisément le fil de la conversation grâce au sequence number (en octets) qui se trouve dans l'en-tête TCP.
- Considérons la première trame TCP/IP qui ouvre la connexion (trame 7). Trouvez dans l'en-tête TCP le port source et le port de destination. Ce dernier est standard pour tous les serveur web (80). A quoi correspond le flag SYN dans cette en-tête ?
Tempus Fugit
Pour aller plus loin, étudions cette page web : http://aurelien.esnard.emi.u-bordeaux.fr/tempus.html. Etudiez son code source dans Chrome ou Firefox (Ctrl+U). Voici la capture des trames réseaux lorsqu'un navigateur consulte cette page...
Exercice : Ouvrez la trace tempus.pcap dans Wireshark.
- Une page web comme tempus.html se compose en général de plusieurs fichiers annexes (JavaScript, Images, ...). Ici, combien de fichiers sont téléchargés en plus ? Lesquels ?
- Combien y-a-t-il de connexions TCP/IP ? Que signifie le champs "Connection: Keep-Alive" dans l'en-tête de la requête HTTP ?
Un Simulateur de Réseaux : Filius
Pour préparer des TPs réseau, il faut souvent disposer de nombreuses machines, de switchs et de cables Ethernet pour les interconnecter... De plus, il est souvent nécessaire de disposer des droits administrateur (root) sur ces machines. Tout cela complique fortement la mise en oeuvre de ces TPs. La virtualisation avec des outils comme Qemu, VirtualBox ou VMware propose une alternative de premier choix pour surmonter ce problème... Cependant, bien que ces outils offrent un niveau de fonctionnalité optimal, il est en général assez compliqué de les utiliser pour des activités d'enseignement. Ainsi, dans ce cours, nous allons utiliser un simulateur de réseau simple nommé Filius pour créer un réseau virtuel de machines et pouvoir ainsi mettre en pratique les notions abordées dans les cours.
Le programme doit être installé au préalable
De la documentation est disponible ici en français et ici pour ce qui est de la version officielle en anglais.
Voici la topologie de notre réseau virtuel, qui se compose de trois serveurs dans un réseau local, d'un ordinateur portable et d'un ensemble de dispositifs réseau (routeurs et switchs)...
L'objectif de l'exercice est que toutes les machines communiquent deux à deux.
Une fois la topologie finalisée il suffit de lancer la simulation et de cliquer sur la ressource à laquelle on s'intéresse pour tester la communication ou analyser le trafic.
Si vous souhaitez partir d'une topologie déjà construite, il suffit de télécharger le fichier de configuration suivant: net.fls (une version dans laquelle toutes les machines sont configurées peut être téléchargée ici)
Pour aller plus loin (exercice optionnel), nous vous proposons de considérer la topologie réseau suivante:
Elle peut être téléchargée ici.
Tout comme pour l'exercice précédent, il s'agit de faire communiquer les machines deux à deux. Cette fois-ci toutes les machines sont déjà configurées. Il s'agit donc de consulter la configuration des différentes entités. La principale différence avec l'exercice précédente réside dans la configuration des routeurs. En effet, nous allons utiliser un protocole de routage dynamique (RIP (Routing Information Protocol) pour être plus précis)pour construire la table de routage des différents routeurs (Filius permet ce genre de configuration de manière native). Il vous est donc demandé d'écouter le traffic au niveau des routeurs pour voir le traffic utile ainsi que le traffic lié au protocole RIP.
Réseau de machines virtuelles (Qemunet)
Dans cette deuxième partie du cours, nous allons déployer un réseau virtuel de machines virtuelles en se basant sur un outil maison QemuNet (entièrement basé sur Qemu).
Voici la topologie de notre réseau virtuel, qui se compose d'un machine Windows 10, d'une machine Linux Debian 10 (en mode graphique) et de trois machines Linux Debian 10 (en mode texte)...
Sur votre machine réelle au CREMI, ouvrez un terminal et tapez la commande suivante (sans le $ qui représente l'invite de votre terminal) :
$ cd /net/ens/qemunet $ ./qemunet.sh -s demo/xchain.tgz
En principe, vous devez obtenir l'environnement suivant...
- Pour vous connectez aux machines Linux, vous pouvez utiliser le compte administrateur root (pas de mot de passe).
- Pour la machine Windows, il faut utiliser le compte toto (mot de passe toto), qui a les droits administrateur.
- ? Une fois le travail terminé, n'hésitez pas à tuer la session QemuNet en faisant en Ctrl-C dans le terminal qui a servi à lancer cette commande...
Les commandes en ligne pour le réseau
- Prérequis : un peu de shell (Linux ou Windows).
Exercice : Lancez le réseau virtuel et testez les commandes suivantes dans un terminal Linux (bash) ou Windows (powershell). Les commandes Linux et Windows sont assez proches ! Voici un résumé des commandes de base :
Description Linux Windows Afficher toutes les interfaces réseaux ifconfig -a ipconfig /all Tester si la machine d'adresse <ip> est vivante ping <ip> ping <ip> Afficher l'état des connexions réseaux (TCP) netstat -tapn netstat Afficher la table ARP (correspondance des adresses IP / Ethernet) arp -n arp -a Afficher la table de routage route -n route print Afficher le chemin que va suivre un paquet IP pour atteindre la machine <ip> traceroute <ip> tracert <ip> Ouvrir une connexion TCP vers la machine <ip> (port <port>) et lire/écrire des caractères netcat <ip> <port> ncat <ip> <port> Outil d'exploration réseau avec de nombreuses possibilités... nmap <...> nmap <...> Obtenir l'adresse IP d'une machine à partir de son nom <name> en interrogeant le serveur DNS nsloopup <name> nslookup <name> Afficher le traffic réseau associé à toutes (any) les interfaces réseaux tcpdump -i any -n
Aide :Pour obtenir de l'aide sur une commande, vous pouvez en général utiliser l'option -h (éventuellement /? sous Windows). Par exemple :
$ nestat -h
Sous Linux, vous disposez également du man (manuel) :
$ man route
Tapez 'q' pour quitter le man...
Exercice : Capturer une trace avec Wireshark...
- Faire un ping depuis syl vers nile (ou opeth)....
- Lancer la commande suivante sur immortal pour voir la requête entrer (par eth1) et sortir (par eth0), ainsi que la réponse !
$ tcpdump -i any -n 01:00:11.749659 IP 147.210.21.2 > 192.168.0.11: ICMP echo request, id 1199, seq4 01:00:11.749692 IP 147.210.21.2 > 192.168.0.11: ICMP echo request, id 1199, seq4 01:00:11.751041 IP 192.168.0.11 > 147.210.21.2: ICMP echo reply, id 1199, seq 14 01:00:11.751058 IP 192.168.0.11 > 147.210.21.2: ICMP echo reply, id 1199, seq 14 01:00:12.751193 IP 147.210.21.2 > 192.168.0.11: ICMP echo request, id 1199, seq4 01:00:12.751217 IP 147.210.21.2 > 192.168.0.11: ICMP echo request, id 1199, seq4 01:00:12.755724 IP 192.168.0.11 > 147.210.21.2: ICMP echo reply, id 1199, seq 14 01:00:12.755741 IP 192.168.0.11 > 147.210.21.2: ICMP echo reply, id 1199, seq 14 Ctrl-C
- Sur nile (ou opeth), lancer wireshark... et capturer la trace du ping !
- Sur syl, faire Ctrl-C pour arrêter le ping...
Programmer les Sockets en Python
- Prérequis : protocoles TCP/IP, langage Python3, notion de client/serveur.
? L'utilisation des Sockets ne nécessite pas de droits administrateur. Seul les numéros de ports inférieur à 1024 sont réservés aux services standards (ssh = 22, ftp = 21, http = 80, https = 443, ...).
Exercice : Sur la machine du CREMI...
- Commencez par éditer les codes Python 3 hello client & server fournis ci-dessous...
- Ouvrez trois terminaux et lancez les commandes suivantes, dans cette ordre :
terminal1$ python3 hello-server.py # 1) je lance le serveur sur localhost terminal2$ python3 hello-client.py # 2) je lance le client... terminal3$ netstat -tapn # 3) j'affiche l'état des connexions TCP/IP
- Modifiez la variable HOST de votre programme client pour qu'il se connecte au serveur de votre voisin !
- Que se passe-t-il si on met dans le code client HOST="www.google.com" ?
- Modifiez maintenant le client pour programmer un client web qui envoie la requête HTTP "GET / HTTP/1.0\r\n\r\n" vers le serveur www.google.com... Encore un peu d'effort, et vous pouvez programmer votre propre navigateur web
- Une solution en HTTP/1.1 est donné plus bas dans le fichier http-get.py Notez qu'en HTTP/1.1, le champs Host est obligatoire dans l'en-tête du protcole HTTP.
Sécurité des Communications
- Prérequis : réseau non sécurisé...
Exercice :
- Avec un navigateur web consulter la page web https://www.perdu.com... cadenas, certificat, ...
- Ajoutez un exo avec un formulaire accessible en http et https... mettre en évidence l'encryption des données
- mettre en évidence le problème d'authentification...
Mise en place d'un réseau simple de machines virtuelles VirtualBox
La documentation relative à la configuration d'un réseau virtuel de machines VirtualBox est disponible à cette URL: https://github.com/orel33/vboxnet
Autres Emulateurs & Simulateurs de Réseaux Virtuels
Filius : logiciel libre disponible sous Windows & Debian/Ubuntu & Mac
- download : https://www.lernsoftware-filius.de/Herunterladen (site allemand)
- documentation : http://www.lernsoftware-filius.de/downloads/Introduction_Filius.pdf
- autres ressources :
- Un petit tutoriel : https://pixees.fr/informatiquelycee/n_site/snt_internet_sim1.html
- De nombreux tuto vidéo, comme par exemple https://www.youtube.com/user/technopujades
- https://ent2d.ac-bordeaux.fr/disciplines/sti-college/2019/09/25/filius-un-logiciel-de-simulation-de-reseau-simple-et-accessible/
- https://pixees.fr/informatiquelycee/n_site/snt_internet_sim1.html (vidéo de David Roche)
- https://pixees.fr/informatiquelycee/n_site/nsi_prem_simReseau.html
- download : https://www.lernsoftware-filius.de/Herunterladen (site allemand)
- Cisco Packet Tracer : simulateur, logiciel gratuit (inscription obligatoire) sous Windows & Debian/Ubuntu
- https://www.netacad.com/portal/resources/packet-tracer
- test docker : https://hub.docker.com/r/somatorio/packet-tracer
- GNS3 : émulateur, logiciel libre... sous Linux & Windows & Mac
Installation sous Ubuntu :
$ sudo add-apt-repository ppa:gns3/ppa
$ sudo apt update
$ sudo apt install gns3-gui gns3-serverOu alternativement en utilisant python3 :
$ pip3 install gns3-gui gns3-server
Kathara : Un simulateur de réseaux multi-plateformes basé sur Docker
- Site officiel : https://www.kathara.org/
- Lien github : https://github.com/KatharaFramework/Kathara
- Exemple d'utilisation en environnement lycée : https://siocours.lycees.nouvelle-aquitaine.pro/doku.php/kathara/installdecouverte
- Site officiel : https://www.kathara.org/