# Diagnostiquer une configuration réseau et configurer une interface réseau ## 1. Objectifs Savoir - auditer et configurer le paramétrage réseau sur votre machine Linux - utiliser les commandes réseaux : `ip`, `ping`, `ss`... - savoir lire les affichages retournés par les commandes réseaux - connaître l’existence des commandes `ifconfig` (remplacée par `ip addr`), `arp` (remplacée par `ip n(eigh(bo(u)r))`, `route` (remplaçable par `ip route`), `netstat` (remplacée par `ss`) Depuis la Debian 10 (sortie en juillet 2019), les commandes `ifconfig`, `arp` et `netstat` ne sont plus présentes. Il faut utiliser `ip` et `ss`. ## 2. Connaître ### 2.1 Connaître la configuration des interfaces IP réseau La commande `ip` (et anciennement `ifconfig`) permet de consulter et configurer le paramétrage des interfaces réseaux. Pour consulter le _manuel_ d'une commande linux (savoir à quoi elle sert, quelles sont ses options, voir des exemples d'utilisation), il faut taper dans un teminal : man ip `man` signifie _manuel_ La commande `ip` indique les _interfaces_ disponibles, leur état d'activité, leur adresse MAC, ainsi que leur configuration réseau éventuelle en termes d'adresse IP v4/v6, masque, adresse de diffusion. Les _interfaces_ sont un moyen pour désigner les différentes portes d'entrée/sortie sur le réseau de la machine courante. L'interface _locale (lo)_ est ce que l'on appelle la _boucle sur soi-même_ (*loopback*). Elle permet, depuis votre machine, de faire appel à une application réseau qui tourne sur votre propre machine. Une application réseau se compose en fait de deux applications : une application _cliente_ qui sollicite un service et une application _serveuse_ qui rend un service. Pour attaquer une application serveuse, il faut son adresse _IP_ et son numéro de _port_ d'écoute. L'adresse IP associée est `127.0.0.1`. L'adresse MAC sert à identifier une machine dans un réseau local. A chaque carte réseau correspond une adresse MAC unique. Dans les réseaux d'infrastructure Ethernet, l'adresse MAC est aussi appelée adresse Ethernet. L'adresse IP permet d'identifier une machine à un niveau indépendant de l'infrastructure physique qui soutient le réseau. En particulier elle permet d'identifier une machine dans l'Internet (c'est-à-dire à un niveau qui interconnecte tous les réseaux). L'adresse IP compte une partie pour désigner une adresse d'un réseau et une autre partie pour identifier une machine sur ce réseau. Un masque sert à connaître la partie de l'adresse IP qui correspond à l'identifiant du réseau IP dans lequel se trouve la machine (via un "et logique"). Par complémentarité, la partie restante désigne l'identifiant IP machine. Une adresse de diffusion permet d'adresser dans un même temps toutes les machines d'un réseau IP. #### Questions Sans relire, les définitions ci-dessous arrivez-vous à rappeler à quoi sert : une interface, l'interface locale, l'adresse MAC, l'adresse IP, le masque, l'adresse de diffusion ? A quoi sert l'interface locale ? A quoi sert une adresse MAC ? A quoi sert une adresse IP ? A quoi sert un masque ? A quoi sert une adresse de diffusion ? Tapez : `ip addr` (ou `ip a` en abrégé) Pour une interface qui ne soit pas la locale, reconnaissez vous l'adresse MAC, les adresses IPv4, masque et adresse de diffusion ? Quels sont leurs "petits noms" ? Même question pour IPv6. Dans la description de l’activité d’une interface, `` le « `UP` » signifie que l’interface est « active ». Quelles interfaces sont disponibles ? Lesquelles sont effectivement actives ? `LOWER_UP `est relatif à l’activité au niveau liaison. Si vous êtes en filaire et que vous lisez `NO-CARRIER` c’est probablement que votre câble est mal branchée… ### 2.2 Connaître l'état du cache ARP sur la machine ARP est un protocole qui permet de trouver l'adresse MAC correspondant à une adresse IP donnée sur le réseau local. La commande `ip n(eigh(bo(u)r))` (et anciennement `arp`) rend compte de l'état des associations connues à un moment donné. Par défaut, la commande affiche les adresses numériques des hôtes. Si vous souhaitez que le système substitue les adresses numériques par les noms symboliques des hôtes qu'il connait, il faudra utiliser le paramètre -h (e.g. `ip -h n`) qui correspond à un affichage plus "humain". #### Questions Tapez : `ip neighbour` (ou `ip n` en abrégé) Quelles IP de machines sont actuellement présentes dans votre cache ARP ? Voyez-vous une différence entre `ip -h n` et `ip n` ? Qu'en déduisez-vous ? ### 2.3 Connaître l'état des routes pour accéder aux réseaux locaux interfacés et joindre le(s) routeur(s)/gateway (i.e. passerelle) La commande `ip r(oute)` (et anciennement `route`) permet de consulter et configurer la table de routage de la machine courante. Dans une table de routage, chaque ligne spécifie une route pour joindre une destination i.e. un réseau. Une route se compose donc en général de : * d'un couple adresse IP réseau de destination et masque associé. Le fait qu'une machine possède une adresse réseau signifie qu'elle sait joindre toutes les machines du réseau indiqué. Une entrée supplémentaire pour indiquer comment joindre une machine appartenant à ce réseau est donc inutile. * d'une interface (ou *device*) par laquelle il faut sortir pour prendre la route qui conduit à la destination * Lorsqu'une destination n'est pas directement accessible (e.g. que l'IP de la machine demandée ne se trouve pas sur un des réseaux locaux de la machine courante), on indique l'adresse IP de la *gateway/passerelle* (machine sur un réseau local directement accessible) à qui transmettre les paquets et donc *via* laquelle les paquets envoyés seront acheminés au destinataire ; on suppose que cette gateway saura quoi faire... * On rajoute en général une ligne pour décrire une "route par défaut" (implicitement avec masque 32 en IPv4) pour traiter tous les paquets dont le destinataire ne correspondrait à aucune des routes configurées. Si une destination n'est pas présente ou qu'il n'y a pas de route par défaut, on ne saura pas transmettre de paquets à cette destination. Dans l'affichage suivant, on peut observer que la route par `default` passe *via* la machine ayant l'IP 192.168.1.254 et que pour atteindre cette machine il faut passer par l'interface (appelée *dev(ice)*) `wlo1`. On note aussi que la machine possède une route pour joindre le réseau 192.168.1.0 avec le masque 24. On lit sur cette ligne que la machine courante possède l'adresse IPv4 192.168.1.2 sur ce réseau. default via 192.168.1.254 dev wlo1 proto dhcp metric 600 192.168.1.0/24 dev wlo1 proto kernel scope link src 192.168.1.2 metric 600 #### Questions Tapez : `ip route` (ou `ip r` en abrégé). Identifier la liste des adresses de destination référencées. S'agit-il d'adresses machine ou réseau ? Pour chaque destination indiquez l'adresse de destination, le masque, l'interface de sortie et éventuellement l'adresse de la passerelle. Dans le cas où vous voyez le symbole « * », que signifie t’il à votre avis ? A toutes fins utiles, la commande suivante permet d'améliorer le visuel de l’affichage en transformant les espaces en tabulations… : `ip route|column -s " " -t` ### 2.4 Connaître les numéros de port des services Les numéros de port servent à identifier des instances de service (serveur). Si l'on souhaite faire tourner deux serveurs identiques (par exemple deux serveurs web) sur une même machine, il faudra leur octroyer deux ports d'écoute distincts ! Les 1024 premiers numéros de port sont réservés. Il n'y a pas forcément un serveur qui écoute derrière un port. Quelques services sélectionnés : * `ftp` est un protocole et une application réseau pour gérer l'hébergement de fichiers à distance * `ssh` est un protocole et une application réseau pour obtenir un shell distant sécurisé * `smtp` est un protocole et une application réseau gérant la transmission de mail * `dns` est un protocole et une application réseau gérant la résolution d'adresse IP et de nom de domaine * `http` (ou Word Wide Web / www) est un protocole et une application réseau la demande et la réception de contenu distant ; réseau dit Web Pour se faire taper la ligne suivante cat /etc/services La commande `ss -taupen` (et anciennement `netstat`) permet de connaître l'état des connexions de votre machine avec d'autres machines et par là de connaître les services qui tournent sur votre machine et les clients de votre machine impliqués dans des connexions. Une colonne désigne l'IP et le port local, une autre désigne éventuellement l'IP et le port de la machine distante. Une colonne désigne si la connexion est établie (`ESTABLISHED`) ou seulement en écoute (`LISTEN`). En "écoute", signifie que votre machine a un service (identifié par le numéro de port ou un nom symbolique) qui est disponible sur votre machine. Le paramétrage `-taupen` de `ss` et de `netstat` est identique. #### Questions A quoi servent les services suivants : ftp, ssh, smtp, doman (dns), http ? Quel est leur numéro de port théorique ? Tapez la commnande `ss -taupen`. Les services précédemment mentionnés tournent-ils actuellement sur votre machine ? ### 2.5 Connaître les serveurs DNS Pour se faire taper la ligne suivante cat /etc/resolv.conf (sur ubuntu et à partir de la version 12.04 `cat /etc/network/interfaces` et `/run/resolvconf/resolv.conf`) ## 3. Configuration et test d'une interface réseau La commande `ip` (anciennement `ifconfig`) permet de configurer une interface. C'est-à-dire d'associer une adresse IP à une interface. Avec la commande `ifconfig` quand le masque n'était pas communiqué, celui-ci était déduit de la classe d'adresse supposée de l'adresse. On va constater que ce n’est pas le cas de la commande `ip`… L'adresse de diffusion est déduite quant à elle automatiquement du masque. Avec la commande `ifconfig`, lorsqu'une adresse IP était associée à une interface, l'interface était automatiquement activée et une route était automatiquement ajoutée (visible avec la commande `ìp route`). Nous verrons qu’avec la commande `ip`, il faudra clairement expliciter ces différentes informations. Chacune de vos machines ont un identifiant. Voir le cablage derrière votre poste. Par la suite vous utiliserez l'adresse IP suivante 192.168.1.VOTRE_IDENTIFIANT. Nous travaillerons avec une interface disponible, ce devrait être le cas de l'interface 1 bleue. Passez en root avec la commande `sudo su` Tapez `ip a`. L'interface bleue est-elle configurée (voyez-vous une IP) ? Ajoutez une adresse IP » à l’interface en oubliant de préciser le masque... Tapez ip a add 192.168.1.VOTRE_IDENTIFIANT dev bleue puis `ip a`. Quel est le masque associé ? Pour tenter de corriger, tapez la commande suivante en précisant un masque (ici /24) ip a add 192.168.1.VOTRE_IDENTIFIANT/24 dev bleue puis `ip a`. Est-ce que cela a corrigé le problème ? Pour supprimer une configuration associée à une interface, utiliser la commande suivante (attention à bien préciser le masque…). ip a del 192.168.1.VOTRE_IDENTIFIANT/MASQUE dev bleue L'interface est-elle active (voyez-vous un « UP ») ? Pour activer une interface, tapez : sudo ip link set up dev bleue (pour la désactiver utiliser `down` à la place de `up`) Vérifiez que vous avez bien une route pour la remise directe (i.e. vers votre réseau local) ip r Demander à votre voisin de vous indiquer son adresse MAC. Consulter votre cache ARP. Est-elle présente ? (elle ne le devrait pas) Configurez votre interface pour être sur le même réseau (même masque et même identifiant réseau) que votre voisin. "Pinguez le". ping IP_DE_VOTRE_VOISIN Si l'affichage n'indique pas que le host est inconnu alors le ping est reçu et le "pong" est renvoyé. Si le ping a fonctionné, consulter votre cache ARP, l'adresse MAC de votre voisin est-elle présente ? Configurer votre interface pour être sur un réseau différent de votre voisin (changer seulement le masque). Est-ce que le ping marche encore ? ## 4. Pour aller plus loin * présentation de la salle réseau (système live + baie de brassage) * écouter via wireshark la communication ping entre deux stations et demander à une 3e station "d'emprunter" l'IP d'un de deux communiquants. Même question avec l'adresse MAC. * simuler un client web `nc localhost 80` * ouvrir une communication tcp entre deux stations en ouvrant un serveur sur une station `nc -l 8080` et en lançant un client depuis l'autre station `ǹc ip_station 8080` * réaliser une capture de trames sur différents réseaux et observez ce qui a été capturé (avec/sans traffic de votre part)