Updated

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 (en novembre). Vous devez rendre votre compte-rendu pour ce TP (sur AMETICE) au plus tard à la veille de la prochaine séance 12h00.

Ces TPs sont longs, prenez des notes mais ne faites pas votre rapport pendant le TP. En outre, lisez toutes les indications. L'énoncé est 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 ...

1. Mise en Réseau Simple

1.1. Nouvelles VMs

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

Créer deux nouvelle VMs VM1 et VM2 comme précédemment.

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" 

1.2. 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.
  2. Vérifier que les VMs se voient par des ping
  3. Démarrer le logiciel d'écoute réseau wireshark.
  4. 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.

2. Interconnexion de deux Sous-réseaux par un Routeur

2.1. 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"  
    

  2. Créer une nouvelle machine VM3 Cette machine aura une carte connectée à un autre réseau interne, de nom LAN2.

  3. 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.
  4. 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), 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 
    
  2. Désactiver la route par défaut. Pour cela, faire en root:
    VM1 $ sudo -s
    VM1 # ip route delete default
    VM1 # ip route
    
  3. Effectuer la même manipulation pour désactiver la route par défaut de VM3 et VM2.

2.2. Plan d'adressage

  1. Établir un plan de configuration de ces sous-réseaux et machines. Pour cela on subdivisera les 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.

  2. De combien de sous-réseaux disposera-t-on ?
  3. Combien peut-on mettre effectivement de machines sur chaque sous-réseau ?

    On donne comme adresses IP à VM2 172.16.2.132 et 172.16.2.162

  4. Donner le masque réseau et l'adresse de broadcast pour LAN1 et LAN2.

2.3. 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.131 (resp. 172.16.2.163) 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 ?

2.4. 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.132 pour le LAN1 et 172.16.2.162 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 
    

  2. 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
         ....
      
  • Pour finir, on active nos modification
        VM2:~$ sudo sysctl -p /etc/sysctl.conf
    

2.5. 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

3. 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 ansible.

3.1. Exemple de mise en oeuvre

Nous allons reprendre les VMs VM1 et VM2, toujours reliées sur LAN1.

Le logiciel ansible nécessite un fichier de configuration en YAML. Ce fichier doit être déposé dans le répertoire de la VM (et ainsi apparaître dans /vagrant dans la VM). Le fichier de configuration YAML peut intégrer des commandes shell arbitraires mais également des commandes plus évoluées (cf ci-dessous); et est donc plus avantageux qu'un simple script shell.

A noter que nous allons directement modifier les connexions accessibles avec nmcli (CLI pour NetworkManager). Il faudra préalablement supprimer votre connexion "Wired connexion 1", à la main ou bien avec

$ nmcli connection del "Wired connection 1"

Les commandes suivantes appliquent les configurations indiquées dans le fichier config.yml.

VM1 $ cd /vagrant
VM1 $ sudo ansible-playbook -c local -v config.yml

Nous allons détailler. L'entête du fichier détermine que nous allons travailler uniquement en local (il s'agit en effet d'une utilisation simplifiée de ansible)

# Configuration eth1 / Ansible playbook
# RAPPEL: eth0 est à vagrant, ne pas y toucher

- hosts: localhost
  remote_user: root
  tasks:

Chaque tâche ansible est ensuite décrite. Toutes comportent un champ name et utilise un module spécifique, par exemple shell. Ici, on applique la commande shell de suppression de la route par défaut.

  - name: Suppression de la passerelle par défaut
    shell: ip route del default

Avec le module nmcli, on définit une configuration réseau "eth1 via ansible"

  - name: Configuration de VM1/eth1
    nmcli:
      type: ethernet
      conn_name: eth1 via ansible
      ifname: eth1
      state: present
      autoconnect: true
      ip4: 172.16.2.131/28

que l'on doit ensuite activer explicitement (comme avec l'interface graphique ...)

  - name: Activation explicite de cette configuration
    shell: nmcli con up "eth1 via ansible"

On termine par la définition de la route vers LAN2, avec le module nmcli étendu dans la version "community"

  - name: Configuration de la route vers LAN2 via VM2
    community.general.nmcli:
      type: ethernet
      conn_name: eth1 via ansible
      ifname: eth1
      # syntaxe simple : plage passerelle
      routes4: 172.16.2.160/28  172.16.2.132 
      state: present

Vérifier que cette suite d'opérations a correctement défini les paramètres réseaux de VM1. Vous pouvez également activer cette nouvelle connexion avec l'interface graphique.

Comment adapter config.yml pour configurer la première interface de VM2 ?

3.2. Mini-Réseau

Reprendre tout le réseau constitué de VM1, VM2 et VM3. Préparer les fichiers config.yml pour chacune de ces machines. Vérifier que la connectivité obtenue est bien celle attendue.

Noter que la configuration ip_forward s'obtient par le module sysctl avec

  # Activer le routage
  - name: Activation du routage IPv4
    sysctl:
      name: net.ipv4.ip_forward
      value: '1'
      sysctl_set: yes

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