Aller au contenu

Configuration réseau d'un serveur Debian 13

Réseau

Dans cet article, je vais m'intéresser de plus près à la configuration du réseau sur un serveur Debian. Dans la mesure du possible, je vais privilégier une approche pratique et pragmatique, en m'appuyant sur trois cas de figure de mon quotidien :

Note pour les chipoteurs

Le terme serveur LAN est une distinction purement pragmatique qui désigne une machine telle qu'on la trouve dans le local de serveurs d'une école, d'une mairie ou d'une PME, par opposition à un serveur dédié installé dans un datacenter.

Reportez-vous à mon précédent article pour la configuration post-installation de ces machines.

Discours de la méthode

Si vous avez déjà utilisé d'autres systèmes Linux ou BSD, vous savez probablement que la configuration du réseau constitue l'un des éléments qui différencient les distributions entre elles.

À titre d'exemple, les distributions de la famille Red Hat Enterprise Linux vous obligent de passer par NetworkManager pour la configuration du réseau depuis la version 7.0. Les anciennes versions de Red Hat Enterprise Linux permettaient de configurer le réseau en éditant une série de fichiers texte dans /etc/sysconfig/network-scripts avant que les ingénieurs Red Hat ne décident de nous imposer leur dose de merdification habituelle.

NetworkManager sur un serveur ?

NetworkManager est un outil de gestion de réseau qui a révolutionné l'utilisation de Linux sur les ordinateurs portables, c'est-à-dire sur des machines qui doivent pouvoir se connecter à différents réseaux de manière itinérante.

Sur un serveur en revanche, NetworkManager constitue tout au plus une couche d'abstraction supplémentaire en infraction totale avec la philosophie Unix et le principe KISS.

Debian fournit NetworkManager dans ses dépôts et l'installe même par défaut sur toutes les configurations de type poste de travail.

Sur un système minimal de type serveur en revanche, NetworkManager n'est pas installé, et Debian permet de configurer le réseau de façon saine et simple, en éditant une poignée de fichiers de configuration pérennes avec une syntaxe simple et transparente.

Désactiver l'IPv6

L'IPv6 est le protocole réseau du futur et nous l'utiliserons donc dans le futur. En attendant, nous pouvons sereinement le désactiver s'il ne nous sert à rien.1

Concrètement, il me faut modifier deux paramètres du noyau. Pour ce faire, je peux éditer un fichier /etc/sysctl.d/disable-ipv6.conf comme ceci :

/etc/sysctl.d/disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Je prends en compte les modifications :

$ sudo sysctl --system

Désormais on n'utilise plus que l'IPv4 :

$ ip addr show dev enp3s0
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
    link/ether b0:83:fe:90:4d:64 brd ff:ff:ff:ff:ff:ff
    altname enxb083fe904d64
    inet 192.168.2.3/24 brd 192.168.2.255 scope global enp3s0
       valid_lft forever preferred_lft forever

Cette configuration est persistante, c'est-à-dire que vous la retrouverez au prochain redémarrage.

Reconfigurer OpenSSH

Pour faire les choses proprement, on va reconfigurer le serveur SSH en lui indiquant qu'on utilise uniquement l'IPv4. Ouvrez le fichier /etc/ssh/sshd_config avec les privilèges nécessaires et repérez la stance suivante :

/etc/ssh/sshd_config
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

Décommentez et éditez les options AddressFamily et ListenAddress comme ceci :

/etc/ssh/sshd_config
#Port 22
AddressFamily inet
ListenAddress 0.0.0.0
#ListenAddress ::

Prenez en compte les modifications :

$ sudo systemctl restart sshd

Exemple n° 1 : serveur LAN

Lorsque j'ai installé ma machine locale, j'ai opté pour une configuration DHCP provisoire. Sous le capot, cette configuration a été inscrite dans le fichier /etc/network/interfaces :

/etc/network/interfaces
source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp3s0
iface enp3s0 inet dhcp

La syntaxe du fichier /etc/network/interfaces

Les directives utilisées dans le fichier /etc/network/interfaces sont assez intuitives, à l'exception de allow-hotplug qui désigne une interface susceptible d'être activée dès lors qu'elle est détectée par udev. Jetez un œil dans interfaces(5) pour en savoir plus.

Je connais déjà mon adresse IP (192.168.2.3/24). Je me renseigne sur la passerelle et le serveur DNS :

$ ip route show default
default via 192.168.2.1 dev enp3s0 proto dhcp src 192.168.2.3 ...
$ cat /etc/resolv.conf
# Generated by dhcpcd from enp3s0.dhcp
# /etc/resolv.conf.head can replace this line
domain microlinux.lan
nameserver 192.168.2.1
# /etc/resolv.conf.tail can replace this line

Je dispose de toutes les infos nécessaires pour définir une configuration réseau statique :

/etc/network/interfaces
auto lo
iface lo inet loopback

# LAN
allow-hotplug enp3s0
iface enp3s0 inet static
  address 192.168.2.3/24
  gateway 192.168.2.1

J'assainis la configuration inscrite dans /etc/hosts :

/etc/hosts
127.0.0.1    localhost.localdomain   localhost
192.168.2.3  sandbox.microlinux.lan  sandbox

À ce stade je redémarre la machine :2

$ sudo reboot

Il ne me reste plus qu'à inscrire les infos DNS dans /etc/resolv.conf :

/etc/resolv.conf
domain microlinux.lan
nameserver 192.168.2.1

Exemple n° 2 : serveur dédié

Voyons comment se passent les choses sur mon serveur dédié fraîchement installé. Je jette un œil dans le fichier /etc/network/interfaces généré par l'installateur de Scaleway, et je suis surpris de trouver une configuration DHCP :

/etc/network/interfaces
source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp1s0
iface enp1s0 inet dhcp

J'aimerais bien la remplacer par une configuration statique. Dans un premier temps, je vais récupérer les paramètres réseau en vigueur :

$ ip addr show dev enp1s0
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
    link/ether 00:08:a2:0c:4d:1e brd ff:ff:ff:ff:ff:ff
    altname enx0008a20c4d1e
    inet 195.154.114.174/24 brd 195.154.114.255 scope global ...
       valid_lft 378052666sec preferred_lft 330773807sec
$ ip route show default
default via 195.154.114.1 dev enp1s0 proto dhcp src 195.154.114.174 ...
$ cat /etc/resolv.conf
# Generated by dhcpcd from enp1s0.dhcp
# /etc/resolv.conf.head can replace this line
domain online.net
nameserver 51.159.47.26
nameserver 51.159.47.28
# /etc/resolv.conf.tail can replace this line

J'édite /etc/network/interfaces en conséquence :

/etc/network/interfaces
auto lo
iface lo inet loopback

# WAN
allow-hotplug enp1s0
iface enp1s0 inet static
  address 195.154.114.174/24
  gateway 195.154.114.1

Là aussi, j'assainis la configuration inscrite dans /etc/hosts :

/etc/hosts
127.0.0.1        localhost.localdomain localhost
195.154.114.174  sd-150204.dedibox.fr sd-150204

Je redémarre le serveur :

$ sudo reboot

Je me reconnecte et j'inscris les infos DNS dans /etc/resolv.conf :

/etc/resolv.conf
domain online.net
nameserver 51.159.47.26
nameserver 51.159.47.28

Exemple n° 3 : routeur

Dans l'exemple ci-dessous, mon routerboard PC Engines est censé faire office de passerelle entre les deux réseaux 192.168.2.0/24 et 192.168.3.0/24.

Pour commencer, je définis une configuration statique pour l'interface externe enp1s0 :

/etc/network/interfaces
auto lo
iface lo inet loopback

# WAN
allow-hotplug enp1s0
iface enp1s0 inet static
  address 192.168.2.251/24
  gateway 192.168.2.1

J'édite /etc/hosts en fonction de mon réseau interne :

/etc/hosts
127.0.0.1    localhost.localdomain localhost
192.168.3.1  squidbox.sandbox.lan squidbox

À ce stade, je redémarre mon routeur :

$ sudo reboot

Je me reconnecte et j'inscris les infos DNS dans /etc/resolv.conf :

/etc/resolv.conf
domain sandbox.lan
nameserver 192.168.2.1

À présent, je peux éditer /etc/network/interfaces et ajouter mon interface enp2s0 :

/etc/network/interfaces
# /etc/network/interfaces

auto lo
iface lo inet loopback

# WAN
allow-hotplug enp1s0
iface enp1s0 inet static
  address 192.168.2.251/24
  gateway 192.168.2.1

# LAN
allow-hotplug enp2s0
iface enp2s0 inet static
  address 192.168.3.1/24

Pas la peine de redémarrer pour prendre en compte cette nouvelle configuration :

$ sudo systemctl restart networking

Voilà le résultat :

$ ip addr
...
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
    link/ether 00:0d:b9:4b:5b:5c brd ff:ff:ff:ff:ff:ff
    altname enx000db94b5b5c
    inet 192.168.2.251/24 brd 192.168.2.255 scope global enp1s0
       valid_lft forever preferred_lft forever
3: enp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc ...
    link/ether 00:0d:b9:4b:5b:5d brd ff:ff:ff:ff:ff:ff
    altname enx000db94b5b5d
    inet 192.168.3.1/24 brd 192.168.3.255 scope global enp2s0
       valid_lft forever preferred_lft forever
...

Configurer un bridge

Ce n'est peut-être pas inutile de mentionner un cas de figure que je peux rencontrer dans mon quotidien professionnel : la mise en place d'un bridge. Concrètement, lorsque je veux installer et configurer un hyperviseur KVM sur une machine locale, j'aurai besoin d'un bridge si je veux retrouver mes machines virtuelles dans le même sous-réseau.

Prenons l'exemple de la machine sandbox.microlinux.lan configurée plus haut. Voici sa configuration actuelle :

/etc/network/interfaces
auto lo
iface lo inet loopback

# LAN
allow-hotplug enp3s0
iface enp3s0 inet static
  address 192.168.2.3/24
  gateway 192.168.2.1

J'installe les outils nécessaires pour mettre en place un bridge :

$ sudo apt update
$ sudo apt install -y bridge-utils

Je définis mon bridge dans /etc/network/interfaces :

/etc/network/interfaces
auto lo
iface lo inet loopback

# LAN
auto enp3s0
iface enp3s0 inet manual

# Bridge
auto br0
iface br0 inet static
  bridge_ports enp3s0
  hwaddress ether b0:83:fe:90:4d:64
  address 192.168.2.3/24
  gateway 192.168.2.1

Définir l'adresse MAC du bridge

Vous aurez remarqué que j'attribue l'adresse MAC de l'interface enp3s0 à mon bridge. Je peux très bien le faire dans une configuration simple comme celle-ci. Si cela vous choque, dites-vous que c'est le fonctionnement par défaut des systèmes Red Hat Enterprise Linux.

Je prends en compte cette nouvelle configuration :

$ sudo systemctl restart networking

Et voici mon bridge flambant neuf :

$ ip addr
...
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
    link/ether b0:83:fe:90:4d:64 brd ff:ff:ff:ff:ff:ff
    altname enxb083fe904d64
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
    link/ether b0:83:fe:90:4d:64 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.3/24 brd 192.168.2.255 scope global br0
       valid_lft forever preferred_lft forever

Pour l'anecdote, rien ne m'empêche d'utiliser cette méthode pour configurer un bridge sur un serveur dédié dans un datacenter. Le principe est exactement le même. Voici la configuration réseau par défaut de ma Dedibox :

/etc/network/interfaces
auto lo
iface lo inet loopback

# WAN
allow-hotplug enp1s0
iface enp1s0 inet static
  address 195.154.114.174/24
  gateway 195.154.114.1

J'installe les outils nécessaires :

$ sudo apt update
$ sudo apt install -y bridge-utils

J'édite /etc/network/interfaces pour mettre en place le bridge :

/etc/network/interfaces
auto lo
iface lo inet loopback

# WAN
auto enp1s0
iface enp1s0 inet manual

# Bridge
auto br0
iface br0 inet static
  bridge_ports enp1s0
  hwaddress ether 00:08:a2:0c:4d:1e
  address 195.154.114.174/24
  gateway 195.154.114.1

Je prends en compte la nouvelle configuration :

$ sudo systemctl restart networking

Et voilà le résultat :

$ ip addr
...
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
    link/ether 00:08:a2:0c:4d:1e brd ff:ff:ff:ff:ff:ff
    altname enx0008a20c4d1e
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
    link/ether 00:08:a2:0c:4d:1e brd ff:ff:ff:ff:ff:ff
    inet 195.154.114.174/24 brd 195.154.114.255 scope global br0
       valid_lft forever preferred_lft forever

Et maintenant ?

La suite au prochain numéro, où nous allons mettre en place un pare-feu pour toutes ces machines.


  1. Payez-moi un euro pour chaque Taliban du réseau qui prononce sa fatwa lorsque je me permets de désactiver l'IPv6 sur une machine où je ne m'en sers pas, et je peux envisager de prendre ma retraite. 🙃 

  2. Je vous vois frétiller sur vos chaises pour me sommer d'utiliser sudo systemctl networking restart pour prendre en compte la nouvelle configuration sans redémarrage. Essayez donc... et demandez-vous par la suite pourquoi la configuration de votre fichier /etc/resolv.conf disparaît mystérieusement au prochain redémarrage. 


La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.