{"cells":[{"metadata":{},"cell_type":"markdown","source":"# TP1 Observation des protocoles applicatifs\n## L3 informatique, Université d'Orléans"},{"metadata":{},"cell_type":"markdown","source":"*L'objectif de ce TP est de se familiariser avec l'utilisation de Kathará et d'observer les échanges réseau qui ont lieu lors d'opérations courantes : visualisation d'une page web, envoi et réception d'un message électronique. Il ne s'agit pas nécessairement de tout comprendre mais d'être confronté à l'ensemble des éléments qui seront étudiés et présentés lors de ce cours.*"},{"metadata":{},"cell_type":"markdown","source":"## 0. Environnement et méthode de travail en TP réseaux"},{"metadata":{},"cell_type":"markdown","source":"Les TPs de réseaux ont lieu en salle machine. Les énoncés sont plutôt détaillés (comme celui-ci) et sont conçus pour être annotés et permettre de repartir à la fin de la séance avec ses annotations pour une relecture à la maison ou une réutilisation lors d'une séance ultérieure. De même, une grande partie des expériences de TP sont réalisés dans un environnement de virtualisation modifiable qui permet de repartir à la fin de la séance avec ses modifications et de les réutiliser plus tard. **Ne passez pas à côté de ces possibilités ! Prenez des notes ! Rejouez les lab en dehors des TP !**"},{"metadata":{},"cell_type":"markdown","source":"### 0.1. Fiches de TP"},{"metadata":{},"cell_type":"markdown","source":"Les énoncés des TP sont fournis sous forme de *notebook Jupyter*. Il s'agit de documents modifiables. Lorsque le document est visualisé dans un navigateur web, des menus (et éventuellement une barre d'outil si elle est activée) permettent de manipuler le document."},{"metadata":{},"cell_type":"markdown","source":"Le document est composé d'une suite de cellules qui peuvent contenir du texte mis en forme au [format Markdown](https://medium.com/analytics-vidhya/the-ultimate-markdown-guide-for-jupyter-notebook-d5e5abf728fd), du code Python ou encore du texte brut. Ces cellules peuvent être *déplacées*, de nouvelles cellules **insérées**, etc."},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q0. Les énoncés comportent des zones question (comme celle-ci) dans lesquelles écrire vos réponses. Prenez le temps de répondre à chacune de ces questions, c'est le meilleur moyen bien assimiler le TP.\n\nSi ce n'est pas déjà fait, activez l'affichage de la barre d'outils.\n\nEn observant les menus et le code source des cellules précédentes, expliquez comment il est possible :\n - d'insérer une cellule de texte Markdown :\n\n - d'éxécuter une cellule Markdown pour passer du code source à la vue formattée :\n\n - de mettre en gras un passage :\n\n - d'insérer un lien vers une page web : \n\n"},{"metadata":{},"cell_type":"markdown","source":"*PS. Pour ceux d'entre nous qui préférent travailler en mode texte ou dans un terminal, il est possible de travailler sur le source de la fiche de TP. On perd simplement la possibilité d'exécuter directement du code Python au fil de l'eau dans la fiche.*"},{"metadata":{},"cell_type":"markdown","source":"### 0.2. Kathará"},{"metadata":{},"cell_type":"markdown","source":"Pour manipuler des réseaux de machines, les observer, les configurer, intéragir avec les machines, les TPs fournissent des *labs* [Kathará](https://www.kathara.org). Cette technologie nous permet de décrire de manière compacte la topologie d'un réseau de machines ainsi que la configuration logicielle associée."},{"metadata":{},"cell_type":"markdown","source":"En salle de TP, le logiciel est déjà installé et il suffit d'extraire les archives des labs dans votre répertoire de travail avant de lancer la simulation à l'aide des commandes fournies dans l'énoncé."},{"metadata":{},"cell_type":"markdown","source":"Sur vos machines personnelles, il convient d'installer dans un premier temps l'ensemble des logiciels nécessaires. Des instructions détaillées sont disponible sur la [page Celene du cours](https://celene.univ-orleans.fr/course/view.php?id=1980). **La séance de TP n'est pas le moment approprié pour réaliser cette installation.**"},{"metadata":{},"cell_type":"markdown","source":"Pour ce premier TP, un lab est fourni sous forme d'une archive `labobs.tar.gz` qu'il convient d'extraire dans un répertoire de travail. **Faites-le maintenant si ce n'est pas déjà fait !**"},{"metadata":{},"cell_type":"markdown","source":"Le répertoire `labobs` contient de nombreux fichiers (qu'il n'est pas nécessaire de lire !) La topologie du réseau est décrite dans le fichier principal `lab.conf`. Chacune des machines qui compose le réseau y est décrite et possède un répertoire à son nom ainsi qu'un éventuel fichier `.startup` *(attention, il y a un petit piège `shared` n'est pas une machine mais un fichier partagé).*"},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q1. Combien de machines composent le lab du jour ?\n"},{"metadata":{},"cell_type":"markdown","source":"Un *lab* se manipule depuis un terminal en se plaçant dans le répertoire du lab (à l'aide de la commande `cd`) à l'aide de la commande [`kathara`](https://www.kathara.org/man-pages/kathara.1.html)."},{"metadata":{},"cell_type":"markdown","source":"Pour démarrer le lab on utilise `kathara lstart`. Après un temps de lancement, certaines machines du lab deviennent accessible à travers leurs consoles (par défaut Kathará ouvre une fenêtre pour chacune de ces consoles, les utilisateurs avertis peuvent configure Kathará pour utiliser `tmux` à la place)."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q2. Démarrer le lab d'observation et vérifier que deux consoles apparaissent. Comment s'appellent les deux machines virtuelles accessibles à travers ces consoles ?\n"},{"metadata":{},"cell_type":"markdown","source":"Pour arrêter le lab on utilise `kathara lclean`. Attention, cette commande arrête les machines virtuelles du lab et l'ensemble des modifications apportées à leurs fichiers sont perdues, au prochain lancement les machines retrouvent leurs fichiers d'origine. Heureusement, le répertoire `/shared` permet aux machines virtuelles d'écrire dans le répertoire `shared/` du lab."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q3. Écrire une phrase dans un fichier `toto` sur la machine `alice` (on peut utiliser par exemple la commande `nano toto`). Arrêter le lab. Relancer le lab et observer que `toto` n'est plus là.\n\nCréer un fichier dans le répertoire `/shared` sur `bob`. Quelle commande permet d'en afficher le contenu sur `alice` ?\n"},{"metadata":{},"cell_type":"markdown","source":"Pour écouter le domaine de collision `lana` à l'intérieur d'un lab en cours d'exécution, on utilise la commande `kathara wire lana`. Cette utilisation sera illustrée plus loin dans ce TP."},{"metadata":{},"cell_type":"markdown","source":"Lorsque les choses vont mal, on peut demander à Kathará de faire le ménage avec `kathara wipe`. Cette commande arrête l'ensemble des machines Kathará et supprime les domaines de collisions. Bref, elle fait le ménage par le vide."},{"metadata":{},"cell_type":"markdown","source":"Pour plus de détails sur le fonctionnement de Kathará, ne pas hésiter à lire la [documentation officielle](https://github.com/KatharaFramework/Kathara/wiki)."},{"metadata":{},"cell_type":"markdown","source":"## 1. Des machines, des noms, des adresses et un peu de topologie\n\nDans ce lab, nous interagissons avec le réseau à travers les consoles de deux machines `alice` et `bob`. Il s'agit de systèmes GNU/Linux avec un accès superutilisateur (**root**). Ces machines font partie d'un réseau IP (*internet protocol*) et sont placées en *bordure de réseau*. Cela signifie que chacune d'entre elle est reliée au réseau par une unique *interface réseau* à laquelle est attribuée une *adresse IP*."},{"metadata":{},"cell_type":"markdown","source":"Dans nos lab, les interfaces réseau connectées aux concentrateurs (*hub*) qui forment le réseau sont nommées `eth0`, `eth1`, `eth2`, *etc*."},{"metadata":{},"cell_type":"markdown","source":"Les adresses IP (souvent notées **inet** dans les outils anglophones) sont notées sous la forme de 4 nombres séparés par des points, par exemple `192.168.16.64`."},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q4. À l'aide de la commande `ip addr`, identifier les adresses IP des machines\n - alice :\n - bob : "},{"metadata":{},"cell_type":"markdown","source":"### 1.1. Ping"},{"metadata":{},"cell_type":"markdown","source":"Les adresses IP sont utiles pour communiquer avec des machines à travers le réseau. Ainsi, la commande `ping` permet de tester si une machine est joignable (*et accepte les messages ping !*)"},{"metadata":{},"cell_type":"markdown","source":"```\nroot@bob:/# ping -c3 41.13.0.50\nPING 41.13.0.50 (41.13.0.50) 56(84) bytes of data.\n64 bytes from 41.13.0.50: icmp_seq=1 ttl=60 time=0.940 ms\n64 bytes from 41.13.0.50: icmp_seq=2 ttl=60 time=1.04 ms\n64 bytes from 41.13.0.50: icmp_seq=3 ttl=60 time=1.02 ms\n\n--- 41.13.0.50 ping statistics ---\n3 packets transmitted, 3 received, 0% packet loss, time 5ms\nrtt min/avg/max/mdev = 0.940/1.000/1.041/0.050 ms\n```\n"},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q5. Quelle commande utiliseriez-vous pour vérifier qu'alice arrive à joindre bob à son adresse ? Exécutez-là !\n- commande utilisée : "},{"metadata":{},"cell_type":"markdown","source":"Il n'est pas toujours pratique de retenir des adresses IP. Les *noms de domaines* permettent de joindre des services à travers le réseau en utilisant des identifiants plus simple à mémoriser. Ainsi, les adresses IP des machines `alice` et `bob` sont accessibles à travers les noms de domaine `alice.blue.net` et `bob.red.net`."},{"metadata":{},"cell_type":"markdown","source":"```\nroot@alice:/# ping -c3 bob.red.net\nPING bob.red.net (80.8.0.50) 56(84) bytes of data.\n64 bytes from 80.8.0.50 (80.8.0.50): icmp_seq=1 ttl=60 time=0.582 ms\n64 bytes from 80.8.0.50 (80.8.0.50): icmp_seq=2 ttl=60 time=0.734 ms\n64 bytes from 80.8.0.50 (80.8.0.50): icmp_seq=3 ttl=60 time=0.886 ms\n\n--- bob.red.net ping statistics ---\n3 packets transmitted, 3 received, 0% packet loss, time 18ms\nrtt min/avg/max/mdev = 0.582/0.734/0.886/0.124 ms\n```"},{"metadata":{},"cell_type":"markdown","source":"### 1.2. Écoute avec Wireshark"},{"metadata":{},"cell_type":"markdown","source":"Pour analyser le trafic réseau, nous utilisons l'outil [Wireshark](https://www.wireshark.org/) qui permet de visualiser et de disséquer l'ensemble des trames qui circulent sur un réseau."},{"metadata":{},"cell_type":"markdown","source":"À l'aide de la commande `kathara wire lana`, il est possible de place une sonde pour écouter le trafic sur le concentrateur (*hub*) `lana` du *lab* (il s'agit du réseau local d'Alice). **Exécutez cette commande ! Une fenêtre wireshark s'ouvre, gardez-là ouverte pour la suite ! Vous pouvez ignorer les éventuels messages ICMPv6 qui y apparaissent.**"},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q6. Depuis la machine `bob` exécutez la commande `ping` pour envoyer un unique paquet ping vers `alice`. Quelles sont les trames qui circulent sur le réseau `lana` ? À quels protocoles correspondent-elles ? Notez pour chaque message ICMP son adresse source, son adresse destination et son type.\n\n(...)\n\n1. SRC -> DST : TYPE\n2. SRC -> DST : TYPE\n\n(...)\n"},{"metadata":{},"cell_type":"markdown","source":"### 1.3. Routes"},{"metadata":{},"cell_type":"markdown","source":"L'acheminement à travers les réseaux IP repose sur l'utilisation de tables de routage. Un paquet IP traverse le réseau de routeur en routeur jusqu'à sa destination finale. À chaque étape, la table de routage permet de déterminer vers quel autre routeur acheminer le paquet."},{"metadata":{},"cell_type":"markdown","source":"Une machine située en *bordure de réseau* possède une table de routage des plus simple. Elle connaît le réseau local auquel elle est connectée (pour livrer des paquets aux machines qui sont sur ce réseau) ainsi qu'une passerelle à qui transmettre tous les paquets IP destinés aux adresses en dehors de ce réseau."},{"metadata":{},"cell_type":"markdown","source":"La commande `ip route` permet de visualiser la table de routage d'une machine GNU/Linux."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q7. Recopier les tables de routage d'alice et de bob. Quelles sont les adresses de leurs passerelles ?\n\n- Table de routage d'alice :\n\n- Table de routage de bob :\n\n- Passerelle d'alice :\n- Passerelle de bob :"},{"metadata":{},"cell_type":"markdown","source":"La commande `traceroute` permet d'identifier les routeurs traversés par un paquet pour joindre une destination. La commande `man` permet de lire le manuel d'une commande."},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q8. À l'aide de `man traceroute`, identifier le rôle du paramètre `-n`. Puis, à l'aide de `traceroute -n`, identifiez le chemin emprunté par les paquets d'`alice` vers `bob` et de `bob` vers `alice` :\n- alice -> bob : 41.13.0.1, , 80.8.0.50\n- bob -> alice : 80.8.0.1, , 41.13.0.50"},{"metadata":{},"cell_type":"markdown","source":"Un routeur est une machine qui possède au moins deux interfaces réseau. En général, chacune de ces interfaces possède une adresse IP différente. Un routeur possède donc plusieurs adresses IP.\n"},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q9. À l'aide des commandes vues jusqu'ici, sur une feuille de papier, commencer à dessiner un schéma du réseau du lab sous la forme d'un graphe dont les nœuds sont les machines et les concentrateurs du lab et sur lequel figurent les adresses IP des différentes interfaces."},{"metadata":{},"cell_type":"markdown","source":"## 2. Consulter une page web (HTTP)"},{"metadata":{},"cell_type":"markdown","source":"La commande `lynx` fournit un navigateur web dans la console.\n"},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q10. Ouvrir votre première page web depuis `alice` à l'aide de la commande `lynx http://www.lexique.com/`, visualiser le source de la page avec la touche `\\` et les informations sur la page avec la touche `=`.\n - Quel est le titre de la page web ?\n - Quel est le format du document visualisé ?\n - Quelle est l'adresse IP de www.lexique.com ?"},{"metadata":{},"cell_type":"markdown","source":"La commande `nmap` permet de scanner les ports ouverts sur une machine (*plus précisément, sur une adresse IP*).\n"},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q11. Quels sont les ports ouverts sur `www.lexique.com` ? À quels services sont associés ces ports ?\n\n\n"},{"metadata":{},"cell_type":"markdown","source":"Pour consulter la page web, le navigateur se connecte au serveur web sur le port associé, demande à accéder à la page et reçoit en retour le document à visualiser. Mais au niveau réseau, quels sont les paquets échangés ? Quel est le protocole qui précise la syntaxe et l'ordre des messages à employer ? Utilisons wireshark pour le découvrir !"},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q12. Placer une sonde wireshark sur le réseau `lanb` puis depuis `bob` visualiser la page http://www.perdu.com.\n\n- Quels sont les protocoles utilisés par les trames qui circulent ?\n\n- Identifier les adresses IP et les ports TCP des extrémités de l'échange : \n\n- Un clic droit puis le menu `Suivre > Flux TCP` permet d'afficher l'échange entre le client et le serveur. Identifier les étapes nécessaires pour récupérer une page web :\n"},{"metadata":{},"cell_type":"markdown","source":"La commande `nc` est un outil très pratique pour communiquer avec des clients et des serveurs. Elle permet de réaliser des échanges en ligne de commande. On peut par exemple l'utiliser pour récupérer un document en utilisant le protocole HTTP *à la main* comme suit (attention, il y a une ligne vide après la ligne `Host` qui est nécessaire pour recevoir une réponse du serveur) :"},{"metadata":{},"cell_type":"markdown","source":"```\nroot@alice:/# nc -C www.perdu.com http\nGET / HTTP/1.0\nHost: www.perdu.com\n\n```\n"},{"metadata":{"lines_to_next_cell":2,"tags":["question"]},"cell_type":"raw","source":"Q13. Quelle commande permet d'utiliser `nc` pour récupérer la page web http://www.lexique.com ? Exécutez-là depuis `bob` !\n - Commande : \n"},{"metadata":{},"cell_type":"markdown","source":"## 3. Envoyer et recevoir des courriers électroniques (SMTP)"},{"metadata":{},"cell_type":"markdown","source":"La commande `alpine` fournit un logiciel de messagerie électronique dans la console. Il est configuré sur les deux machines pour utiliser les serveurs d'envoi et de réception de mail associés aux adresses `alice@jmail.com` et `bob@cold.net`. Les mots de passe des comptes sont respectivement `alice` et `bob`."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q14. Vérifier qu'Alice et Bob sont bien capables d'échanger des messages. À l'aide de la touche `H`, il est possible de visualiser les entêtes des messages. Chaque serveur SMTP traversé par le message ajoute un bloc `Received` en début de message. Recopiez ici les blocs `Received` d'un message d'Alice à Bob.\n\n - Blocs Received :\n\n\n - Combien y en a-t-il ? Pourquoi ?\n\n"},{"metadata":{},"cell_type":"markdown","source":"Le courrier sortant est envoyé à un serveur SMTP. Celui-ci est configuré dans le client de messagerie."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q15. Quels sont les serveurs SMTP sortants pour jmail.com ? cold.net ?\n\nÀ l'aide de la commande `nmap`, identifier le port utilisé pour ce service.\n"},{"metadata":{},"cell_type":"markdown","source":"Le protocole SMTP est très proche du protocole HTTP (*en fait ce dernier s'est inspiré du premier*) mais les échanges sont plus complexes."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q16. À l'aide de wireshark, recopier ici une session d'envoi de message avec le protocole SMTP :\n\n"},{"metadata":{},"cell_type":"markdown","source":"Une fois ce protocole compris, il est possible de l'utiliser directement *à la main* avec `nc`."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q17. Quelle commande utiliser pour se connecter avec `nc` au serveur SMTP smtp.jmail.com ?\n\n\nÉcrire la liste des commandes à envoyer au serveur pour envoyer un message d'alice vers bob :\n\n"},{"metadata":{},"cell_type":"markdown","source":"En écoutant sur le réseau local `lana`, l'envoi d'un message fait apparaître une unique session SMTP. Cependant, le message doit ensuite être acheminé jusqu'à destination. Comme cet échange a lieu en dehors du réseau d'Alice, il reste invisible. Dans ce lab, un réseau spécial `rezo` permet d'analyser l'ensemble des échange de cœur de réseau."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q18. À l'aide de wireshark sur le réseau `rezo`, étudier les sessions SMTP qui ont lieu pour acheminer un message entre alice et bob. Combien y en a-t-il ? Pourquoi pas une seule ?\n\n"},{"metadata":{},"cell_type":"markdown","source":"## 4. BONUS : Transformer des noms en adresses (DNS)"},{"metadata":{},"cell_type":"markdown","source":"Le protocole DNS est le protocole chargé de faire le lien entre noms de domaines et adresses IP (*entre autres informations disponibles dans l'arbre de noms*)."},{"metadata":{},"cell_type":"markdown","source":"Sous Unix, la résolution de nom se configure traditionnellement dans le fichier `/etc/resolv.conf`."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q19. Quel est le serveur DNS utilisé pour résoudre les noms :\n - par alice :\n - par bob :"},{"metadata":{},"cell_type":"markdown","source":"La commande `dig` permet d'interroger l'annuaire DNS."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q20. À l'aide de la commande `dig www.perdu.com`, obtenir l'adresse IP de www.perdu.com\n - sur alice :\n - sur bob :"},{"metadata":{},"cell_type":"markdown","source":"Le protocole DNS est utilisé de manière transparente dès que la résolution de nom est nécessaire. Ainsi lors de la consultation de la page web `http://www.lexique.com/`, le navigateur commence par résoudre l'adresse IP du serveur avant de s'y connecter."},{"metadata":{"tags":["question"]},"cell_type":"raw","source":"Q21. Pour cette dernière expérience, il est nécessaire de relancer (avec `kathara lrestart`) le lab à chaque fois pour vider les caches DNS. Une fois le lab relancé, attacher une sonde au réseau `lana` puis consulter la page web `http://www.perdu.com/` avec `lynx` depuis alice. Refaire ensuite l'expérience en attachant la sonde sur `rezo`. Noter les échanges DNS, la requête et la réponse obtenue à chaque étape.\n\n - Sur lana :\n\n\n - Sur rezo :\n\n"},{"metadata":{},"cell_type":"markdown","source":"L'annuaire DNS contient d'autres informations que des adresses, ainsi la commande `dig -t MX jmail.com` permet de trouver l'adresse du serveur SMTP entrant pour le courrier à destination de `jmail.com`. Rendez-vous en cours pour ne savoir plus !"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.2"}},"nbformat":4,"nbformat_minor":2}