Updated Modifié

Préliminaires

Les TPs sont évalués par un contrôle continu, ie par des rendus de TP (en début d'année) ainsi qu'un projet (ensuite en novembre et décembre). Vous devez rendre votre compte-rendu pour ce TP sur AMETICE.

Ces TPs sont longs, prenez des notes mais ne faites pas votre rapport pendant le TP. En outre, lisez toutes les indications. L'énoncé s'efforce d'être très complet. Il est en général plus judicieux, en cas de problème, de relire vos cours et TDs, puis, éventuellement, interroger votre chargé de TP plutôt que d'aller à la "pêche" aux renseignements sur google Qwant ChatGPT Deepseek ...

Mise en Réseau Simple

Nouvelles VMs

On rappelle qu'une VM est simplement constituée d'un répertoire contenant un ficher Vagrantfile.

Si vous ne l'aviez pas déjà fait, créez deux VMs VM1 et VM2 avec vagrant : voir ici.

Lancer VM1 (resp. VM2). Ces machines communique via le réseau LAN configuré dans le Vagrantfile par cette ligne :

 config.vm.network "private_network", ip:"0.0.0.0", auto_config: false, virtualbox__intnet: "LAN"

Observation du Trafic Réseau

  1. On va considérer que les machines sont reliées par un réseau privé en /24. Mettre comme adresse 192.168.1.1 (resp. 192.168.1.2) pour VM1 (resp. VM2) en utilisant la connexion nommée "Connexion Filaire 1" ("Wired Connection 1") de l'applet NetworkManager (en haut à droite), ou avec la commande

ip address add 192.168.1.1/24 dev eth1. Il ne faut pas utiliser le Vagrantfile pour configurer le réseau.

  1. Vérifier que les VMs se voient par des ping
  2. Démarrer le logiciel d'écoute réseau wireshark.
  3. A partir du trafic réseau intercepté entre VM1 et VM2, mettre en évidence le protocole ARP. Il pourra être nécessaire de vider les caches ARP en désactivant les interfaces puis en les réactivant.

Interconnexion de deux Sous-réseaux par un Routeur

initialisation des VMS

Nous allons maintenant utiliser 3 nouvelles machines virtuelles.

  1. Modifier (le Vagrantfile de) la machine VM1

pour utiliser une configuration réseau au réseau interne de nom LAN1 avec :

  config.vm.network "private_network", ip:"0.0.0.0", auto_config: false, virtualbox__intnet: "LAN1"
  1. Créer une nouvelle machine VM3

Cette machine aura une carte connectée à un autre réseau interne, de nom LAN2.

  1. Modifier (le Vagrantfile de) la machine VM2 pour qu'elle ait

deux cartes en réseau interne:

  • La carte 1 connectée au réseau de nom LAN1.
  • La carte 2 connectée au réseau de nom LAN2.

  • Démarrer les trois VMs

Astuce: pour afficher seulement l'interface ethX désirée dans le terminal, faire

$ ip addr show ethX
  1. Vérifier que la table de routage initiale de chaque machine est

vide Par exemple sur VM1, regardons plus précisément le contexte réseau :

VM1 $ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:63:f8:24 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
    inet6 fe80::a00:27ff:fe63:f824/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:69:c2:c1 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::a00:27ff:fe69:c2c1/64 scope link 
       valid_lft forever preferred_lft forever

L'interface eth0 est configurée (c'est celle utilisée par vagrant, on fera donc comme si elle n'était pas là), mais pas eth1. La table de routage admet comme route par défaut une adresse accessible via eth0.

VM1 $ ip route
default via 10.0.2.2 dev eth0 
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
  1. Désactiver la route par défaut. Pour cela, faire en root:
VM1 $ sudo -s
VM1 # ip route delete default
VM1 # ip route
  1. Effectuer la même manipulation pour désactiver la route par

défaut de VM3 et VM2.

Plan d'adressage

Afin de répartir les adresses entre les différents sous-réseaux, nous allons établir un plan d'adressage. Pour cela on subdivisera la plage d'adresses privées 172.16.2.128/25 (``172.16.2.128`` à 172.16.2.255) avec 4 bits pour les numéros de machine.

Il reste donc 3 bits pour les sous-réseaux, nous disposerons donc de 8 sous-réseaux avec comme masque de réseau /28. Finalement, on donne comme adresses IP à VM2 172.16.2.eth2g et 172.16.2.eth2d, donc LAN1 sera 172.16.2.128/28 et LAN2 sera 172.16.2.160/28

Configuration des machines VM1 et VM3

Pour que VM1 et VM3 puissent accéder à l'autre LAN, il faut :

  1. Leur donner une adresse dans leur LAN. On prendra 172.16.2.eth1d (resp. 172.16.2.eth3g) pour VM1 (resp. VM3).

  2. Indiquer à VM1 et VM3 que VM2 est la passerelle (remplir avec NetworkManager le champ passerelle ou gateway de la connexion avec l'adresse IP de VM2 sur le même LAN).

    Comment cela peut-il se faire avec ip route add ?

Configuration de VM2 comme un routeur entre LAN1 et LAN2

  1. Si ce n'est pas encore fait, configurer les deux interfaces de VM2 avec 172.16.2.eth2g pour le LAN1 et 172.16.2.eth2d pour le LAN2.

Lorsque l'on configure les deux interfaces avec NetworkManager, celui-ci crée automatiquement les routes de sorties vers les deux interfaces :

     VM2 $ ip route
     10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15 
     172.16.2.128/28 dev eth1  proto kernel  scope link  src 172.16.2.132 
     172.16.2.160/28 dev eth2  proto kernel  scope link  src 172.16.2.162
  1. Par défaut, les machines Linux ne routent pas d'une interface vers l'autre. Pour cela, il faut activer le drapeau de routage ip_forward :
VM2:~$ sudo sysctl -w net.ipv4.ip_forward=1

Cependant cela ne sera pas mémorisé pour le prochain boot. Pour cela utiliser la méthode suivante :

  • Modification du fichier de configuration réseau
VM2:~$ sudoedit /etc/sysctl.conf

# Sous Debian, on décommente la ligne suivante et on sauvegarde fichier

   ....     
   #net.ipv4.ip_forward=1      <==== décommenter et sauver
   ....
  • Sous Centos, on met à 1 la ligne suivante
   ....
   net.ipv4.ip_forward = 0      <==== Mettre à 1 et sauver
   ....
  • Pour finir, on active nos modification
    VM2:~$ sudo sysctl -p /etc/sysctl.conf

Vérifications

  • Vérifier qu'on a bien accès à toutes les autres machines depuis chacune en utilisant ping.

Vérifier bien vos routes si le ping ne passe pas.

  • Faire une capture du trafic sur VM2 et proposer une interprétation

Automatisation de la configuration

Certaines des manipulations précédentes ne sont pas identiques sous Debian et sous d'autres OS (même pour des distributions Linux comme CentOS). En outre, certaines ont été faites avec une interface graphique, ce qui n'est pas possible en général sur un serveur.

Nous allons donc utiliser un outil de gestion de configuration

salt.

Exemple de mise en oeuvre

Le logiciel salt nécessite deux fichiers top.sls et config.sls. Le premier doit toujours porter ce nom et être déposé dans le répertoire de la VM (et ainsi apparaître dans /vagrant dans la VM). Le second est obtenu par indirection. Vous pouvez donc en utiliser plusieurs, en modifiant le fichier top.sls.

Nous allons considérer VM1. Si les fichiers top.sls et config.sls apparaissent bien dans /vagrant, vous pouvez appliquer la configuration, en tant que root :

VM1 $ sudo -s
VM1 # salt-call state.apply

Il est possible de voir des informations supplémentaires lors de l'appel avec

VM1 # salt-call state.apply -l debug

Cette commande applique les configurations indiquées dans config.sls (pointé par top.sls). La syntaxe est très simple. Une documentation complète se trouve sur https://docs.saltproject.io/en/latest/contents.html. Voir notamment les exemples de la partie réseaux.

Vérifier que cette opération a correctement redéfini les paramètres réseaux de VM1.

Mini-Réseau

  1. Considérer l'ensemble du réseau constitué de VM1, VM2 et VM3.

Préparer un fichier config.sls pour chacune de ces machines. Vérifier que la connectivité obtenue est bien celle attendue.

Noter que la configuration de ip_forward s'obtient par

# enable ipv4 forwarding
net.ipv4.ip_forward:
  sysctl:
    - present
    - value: 1

Noter également qu'il est toujours possible d'effectuer une commande shell arbitraire avec

# commande shell arbitraire, ici ip route
ip route delete default:
  cmd:
    - run

Cependant il est toujours préférable, lorsque c'est possible, d'utiliser les commandes spécialisées de CONFIG car elles sont idempotentes.

  1. Comparer cette méthode de configuration avec celle utilisée précédemment.

Pour conclure, comparer cette méthode de configuration avec celle utilisée précédemment.

Nettoyage

N'oubliez pas de stopper vos VMs avec

$ vagrant halt

Et avant de partir, dans chaque répertoire de VM, détruire les VMs.

Les informations utiles (``Vagrantfile``, config.yml) sont copiés dans les répertoires de l'hôte

$ vagrant destroy

Par ailleurs, il existe une VM maîtresse qui est aussi à supprimer, vagrant ne fait pas le nettoyage automatiquement, donc il faut également faire

$ rm ~/.vagrant.d/boxes/m1reseaux/0/virtualbox/master_id