Configuration réseau avec Netplan
Configuration réseau sous Linux avec Netplan

Configuration réseau avec Netplan

netplan est un utilitaire permettant de configurer facilement la mise en réseau sur un système Linux. Vous créez simplement un fichier YAML de description des interfaces réseau à prendre en charge et la configuration à leur appliquer. À partir de cette description, netplan générera toute la configuration nécessaire pour le gestionnaire de réseau que vous avez choisi.

Comment ça marche ?

Une fois Netplan installé, il suffit de créer un ou plusieurs fichiers .yaml dans /etc/netplan/ et de demander à Netplan d’appliquer cette configuration en fonction du moteur de rendu utiliser.

Actuellement Net plan supporte les moteurs de rendu suivants:

  • NetworkManager
  • Systemd-networkd

Installation de Netplan

Ubuntu, Debian et dériviés

Les distributions Ubuntu Server 20.04 utilisent par défaut Netplan, cette étape n’est donc pas nécessaire sur ces systèmes.

Bash
sudo apt update
sudo apt install netplan.io

Fedora, Rocky Linux, …

Bash
sudo dnf install netplan

Si comme sous Rocky Linux votre système utilise SELinux, il vous faut adapter la configuration de ce dernier sans quoi Netplan ne pourra pas exécuter ses tâches. Il faut pour cela générer une police correspondante (voir plus loin dans l’article).

Vous pouvez éventuellement contourner le problème temporairement en passant SELinux en mode « permissive », mais surtout ne le désactivez pas! La commande ci-dessous n’est pas permanente et ne persiste pas après un redémarrage.

Bash
sudo sentenforce 0

Configuration de Netplan

Comme dit précédemment, Netplan utilise des fichiers de configuration au format YAML. Pour rappel ce format de fichier respecte une syntaxe qui ressemble en beaucoup de points à celle du langage Python:

  • La définition des blocs se faire par indentation des lignes. Deux espaces par niveau de bloc.
  • Il n’y a pas de caractère de fin d’instruction
  • On y trouve des structures de listes et de dictionnaires

Voici un exemple de fichier de configuration Netplan autogénéré à l’installation d’une machine Ubuntu Server 22.04:

YAML
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
      - 192.168.56.142/24
      nameservers:
        addresses: []
        search: []
  version: 2

Comme vous pouvez le voir, il n’y a ici aucune commande, uniquement une structure d’information. Netplan se charge de traduire ces descriptions en configuration via le moteur de rendu souhaîté, dans le cas présent, sur Ubuntu Server, ce sera Systemd-networkd.

Comprendre la structure du fichier YAML

Nous avons ici une structure de dictionnaire avec une entrée network à laquelle est associée une structure. Dans cette structure nous avons deux clés: ethernets (qui regroupe les informations des interfaces Ethernet) et version qui indique quelle version de configuration nous utilisons (ici la version 2).

A la clé ethernets est associé un sous-dictionnaire dont chaque clé est le nom d’une interface du système (enp0s3, enp0s8) et à chacune de ses clés correspond une série de données de différents types.

Par exemple la clé dhcp4 est de type booléen et peut prendre deux valeurs, soit true, soit false suivant qu’on veuille obtenir une configuration IPv4 par DHCP ou non.

Par contre la clé addresses est est de type liste et peut donc avoir en valeur une liste d’adresses, celles qui seront configurées sur l’interface. Les entrées d’une liste peuvent être indiquées par un - au début de chaque élément ou avec une notation plus proche du langage Python [valeur1, valeur2, valeur3].

Exemples de configurations

Dans les exemples ci-dessous je pars du principe que la machine utilise NetworkManager pour gérer le réseau. Si je voulais utiliser systemd-netword (ce qui est par exemple le cas sur Ubuntu Server) je devrais indiquer renderer: networkd.

Configuration d’une interface en client DHCP

/etc/netplan/networking.yaml
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s3:
      dhcp4: true

Configuration statique d’une interface

Pour l’exemple ici l’interface enp0s3 devrai avoir une adresse 10.0.0.10/24, sa passerelle par défaut est 10.0.0.1, le serveur DNS doit être 1.1.1.1 et le suffixe DNS de l’interface linux.local.

Configuration statique d’une interface
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s3:
      dhcp4: false
      addresses:
        - 10.0.0.10/24
      routes:
        - to: default
          via: 10.0.0.1
      nameservers:
        addresses:
          - 1.1.1.1
        search:
          - "linux.local"

Exécuter netplan

Générer les fichiers de backend

Une fois Netplan installé et votre fichier ou vos fichiers YAML créés. Il faut commencer (la première fois) par demander à Netplan de générer ses fichiers de backend:

Bash
sudo netplan generate

Appliquer la configuration

Vous pouvez choisir de travailler de deux manières: soit vous appliquer les réglages de manière inconditionnelle, soit vous demandez à Netplan d’appliquer la configuration et d’attendre une confirmation pendant 120 secondes, après quoi il revient à la configuration précédente.

Bash
sudo netplan apply
Bash
sudo netplan try

Personnellement j’utilise toujours la deuxième solution, en cas d’erreur de configuration je suis sûr qu’après 120s tout rentrera dans l’ordre et je pourrai ainsi corriger le tir.

Configurer SELinux pour Netplan

Si votre système utilise SELinux, comme c’est par exemple le cas avec Rocky Linux, vous devrez ajouter une police autorisant Netplan à faire son travail. La méthode la plus simple consiste à exécuter Netplan et a utiliser les alertes SELinux pour générer une nouvelle police et l’installer.

Pour ce faire commencez par passer SELinux en mode permissif (le temps de la manipulation). Ca permettra à Netplan de ne pas planter mais aussi d’obtenir les informations nécessaires dans les logs générés par SELinux.

Passer SELInux en mode permissif
sudo setenforce 0

Ensuite nous pouvons lancer Netplan

Lancer l’execution de Netplan
sudo netplan generate
sudo netplan try

A ce stade vous devriez avoir un message vous demandant de confirmer les modification en appuyant sur ENTER endéans les 120s. Si tout va bien, confirmez.

SELinux devrait, si il était en mode « enforcing » avoir bloqué Netplan. Comme nous l’avons mis en mode « permissif » il se sera contenté de générer un log d’alerte. Il nous suffit de chercher les logs correspondants:

Bash
sudo ausearch -c "netplan"

Vous devriez voir quelque chose qui ressemble à ceci:

ausearch -c « netplan »
time->Wed Aug  9 20:26:59 2023
type=PROCTITLE msg=audit(1691605619.475:359): proctitle=2F7573722F6C69622F73797374656D642F73797374656D2D67656E657261746F72732F6E6574706C616E002F72756E2F73797374656D642F67656E657261746F72002F72756E2F73797374656D642F67656E657261746F722E6561726C79002F72756E2F73797374656D642F67656E657261746F722E6C617465
type=PATH msg=audit(1691605619.475:359): item=1 name=(null) inode=38964 dev=00:17 mode=0100644 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:udev_var_run_t:s0 nametype=CREATE cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=PATH msg=audit(1691605619.475:359): item=0 name=(null) inode=19199 dev=00:17 mode=040755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:udev_var_run_t:s0 nametype=PARENT cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(1691605619.475:359): cwd="/"
type=SYSCALL msg=audit(1691605619.475:359): arch=c000003e syscall=82 success=yes exit=0 a0=12617f0 a1=125d4a0 a2=1230020 a3=74656e2d30392f64 items=2 ppid=2681 pid=2684 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="netplan" exe="/usr/lib/netplan/generate" subj=system_u:system_r:init_t:s0 key=(null)
type=AVC msg=audit(1691605619.475:359): avc:  denied  { rename } for  pid=2684 comm="netplan" name="90-netplan.rules.QS9F91" dev="tmpfs" ino=38964 scontext=system_u:system_r:init_t:s0 tcontext=system_u:object_r:udev_var_run_t:s0 tclass=file permissive=1

En quelques mots ce message nous explique que Netplan devrait être bloqué parce qu’il n’utilise pas le bon contexte SELinux.

Heureusement, nous pouvons faire appel à l’utilitaire audit2allow pour générer une police qui permettra de résoudre le problème rencontré et donc ensuite de repasser SELinux en mode « enforcing ».

Générer les règles en fonction des messages d’alerte SELinux
sudo ausearch -c "netplan" --raw | audit2allow

Ce qui devrait vous donner ceci:

Résultat
#============= init_t ==============
allow init_t NetworkManager_var_run_t:file { create rename write };
allow init_t udev_var_run_t:file { create rename write };

Bien sûr ici le résultat est simplement affiché à l’écran, nous avons besoin de générer la police…

Générer la police SELinux
sudo ausearch  -c "netplan" --raw | sudo audit2allow -M my-netplan

La dernière étape consiste à installer et à charger la police. Le nom « my-netplan » provoquera la création du module my-netplan.pp.

Installer le module SELinux
sudo semodule -i my-netplan.pp

Une fois cela fait, relancez Netplan et regardez à nouveau le fichier d’audit. Normalement aucun nouveau message d’alerte ne devrait avoir été ajouté.

Si tel est le cas, vous pouvez repasser SELinux en mode « enforcing ».

Passer SELinux en mode « enforcing »
sudo setenforce 1

Remarque importante

Si votre système n’utilisait pas Netplan de base mais que NetworkManager était bien opérationnel, il se peut que ce dernier ait déjà des profils de configuration pour votre/vos interface(s). Ceux-ci peuvent empêcher Netplan d’appliquer les configurations. Assurez-vous donc que seuls les profils de Netplan sont actifs.

Afficher les profils de connexion de NetworkManager
sudo nmcli connection

Vous devriez voir quelque chose comme ceci:

sudo nmcli connection
[steve@just-sudo-it ~]$ sudo nmcli connection
NAME            UUID                                  TYPE      DEVICE
netplan-enp0s3  1eef7e45-3b9d-3043-bee3-fc5925c90273  ethernet  enp0s3
netplan-enp0s8  9a683faa-2cc7-384f-9230-8beaf91f9f29  ethernet  enp0s8
[steve@just-sudo-it ~]$

Si d’autres profils utilisent les mêmes interfaces, il faudra les supprimer pour que Netplan fasse son travail sans être court-circuité.

Supprimer un profil de connexion NetworkManager
sudo nmcli connection delete <connexion>

Attention toutefois, si c’est le profil actif, vous pourriez perdre l’accès à la machine étant donné que vous supprimez la configuration de l’interface.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.