Table des matières
La configuration IPv4
Tout nœud présent sur un réseau doit disposer d'une configuration IP complète et cohérente. Au minimum une adresse IP et un masque de réseau, chaque nœud du même réseau devant avoir une partie commune, celle qui représente justement le réseau.
Plusieurs méthodes sont possibles pour réaliser cette configuration, allant de la plus transparente à la plus professionnelle.
Zeroconf
Sous ce terme plus ou moins générique se cachent des systèmes destinés à attribuer une configuration IP à chaque nœud du LAN de façon totalement transparente pour les utilisateurs. Dans les distributions GNU/Linux, c'est le démon Avahi
qui se charge de cette tâche, ainsi d'ailleurs que la gestion des relations entre IP et nom des nœuds.
Comme ce démon ne possède pas le pouvoir de divination, il est contraint de lancer des diffusions (broadcast) périodiques pour tenir à jour le système. C'est une solution que nous n'étudierons pas ici. Si l'on s'intéresse aux réseaux, on cherche à maîtriser ce qu'il se passe sur le notre
Configuration manuelle
Comme indiqué, demoserver
dispose d'une configuration manuelle. Ce qui suit est spécifique à Debian et dérivées, mais les autres systèmes disposent tous d'un moyen de configuration manuelle.
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
allow-hotplug enp7s0
iface enp7s0 inet static
address 192.168.61.1/24
En une seule ligne, nous fournissons l'adresse du nœud et le masque de réseau en notation CIDR.
Autrefois, les interfaces réseaux de type Ethernet se nommaient ethn
n variant de 0 à un certain nombre, suivant la quantité d'interfaces installées sur la machine. C'était simple, c'était lisible, mais sa avait un inconvénient (très mineur la plupart du temps). Les interfaces étaient numérotées dans l'ordre de leur découverte par le kernel, ce qui pouvait faire que l'interface nommée eth0
puisse éventuellement se retrouver renommée en eth1
si l'on ajoute un nouveau périphérique Ethernet dans la machine. Tout le monde faisant ça touis les jours, il était urgent de trouver une parade.
Désormais le nom est calculé en fonction de plusieurs critères. C'est udev
, le gestionnaire de périphériques du kernel qui nomme les interfaces. L'avantage des logiciels libres, c'est que le code source est accessible et qu'on y troude quelque chose de ce genre:
* Two character prefixes based on the type of interface: * en -- ethernet * sl -- serial line IP (slip) * wl -- wlan * ww -- wwan * * Type of names: * b<number> -- BCMA bus core number * ccw<name> -- CCW bus group name * o<index>[d<dev_port>] -- on-board device index number * s<slot>[f<function>][d<dev_port>] -- hotplug slot index number * x<MAC> -- MAC address * [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>] * -- PCI geographical location * [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>] * -- USB port number chain
Bref, tout ceci fait que notre interface se nomme bien intuitivement enp7s0
DHCP
Dynamic Host Configuration Protocol, voilà du sérieux… Il faut un serveur DHCP sur le réseau. Il se trouve que généralement les «box» d'accès à l'internet embarquent ce serveur, naturellement configuré par défaut, mais qu'il est possible de modifier. Par exemple, la Freebox Révolution permet de faire quasiment tout ce qu'il est possible de faire avec un serveur DHCP de qualité professionnelle comme isc-dhcp-server
ou son successeur kea-dhcpv4-server
. Bien que Internet Systems Consortium ait annoncé la fin de la maintenance de ce serveur depuis 2022, Il est toujours présent dans la distribution Debian actuelle «Bookworm» (Février 2025), il l'est encore dans la «Trixie» (actuellement au stade «Testing»). ISC propose donc désormais son successeur «kea» qui, du reste, est également fourni dans la version Debian «Bookwarm». Mais ici, nous nous bornerons à énumérer les fonctions élémentaires d'un serveur DHCP. Une installation détaillée sera étudiée plus loin.
Le client
Ce protocole nécessite un logiciel serveur sur le réseau local et des logiciels clients sur les autres nœuds. Pour l'instant, ce logiciel serveur n'est pas installé. Voyons avec notre sniffeur favori ce qu'il se passe si un client démarre:
1 0.000000000 0.0.0.0 255.255.255.255 DHCP 342 DHCP Discover - Transaction ID 0xc356da15 2 7.278755900 0.0.0.0 255.255.255.255 DHCP 342 DHCP Discover - Transaction ID 0xc356da15 3 22.288572403 0.0.0.0 255.255.255.255 DHCP 342 DHCP Discover - Transaction ID 0xc356da15 4 35.326945321 0.0.0.0 255.255.255.255 DHCP 342 DHCP Discover - Transaction ID 0xc356da15 5 52.906541227 0.0.0.0 255.255.255.255 DHCP 342 DHCP Discover - Transaction ID 0xc356da15 ...
Quelqu'un qui n'a pas d'adresse IP (0.0.0.0) diffuse (255.255.255.255) une demande de découverte de serveur DHCP. Il n'y en a pas, le client essaye encore… et encore…
Voyons dans le détail l'une quelconque de ces trames:
Ethernet II, Src: RealtekU_b7:66:81 (52:54:00:b7:66:81), Dst: Broadcast (ff:ff:ff:ff:ff:ff) Destination: Broadcast (ff:ff:ff:ff:ff:ff) Address: Broadcast (ff:ff:ff:ff:ff:ff) .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default) .... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast) Source: RealtekU_b7:66:81 (52:54:00:b7:66:81) Address: RealtekU_b7:66:81 (52:54:00:b7:66:81) .... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default) .... ...0 .... .... .... .... = IG bit: Individual address (unicast) Type: IPv4 (0x0800) Internet Protocol Version 4, Src: 0.0.0.0, Dst: 255.255.255.255 0100 .... = Version: 4 .... 0101 = Header Length: 20 bytes (5) Differentiated Services Field: 0x10 (DSCP: Unknown, ECN: Not-ECT) 0001 00.. = Differentiated Services Codepoint: Unknown (4) .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0) Total Length: 328 Identification: 0x0000 (0) 000. .... = Flags: 0x0 0... .... = Reserved bit: Not set .0.. .... = Don't fragment: Not set ..0. .... = More fragments: Not set ...0 0000 0000 0000 = Fragment Offset: 0 Time to Live: 128 Protocol: UDP (17) Header Checksum: 0x3996 [validation disabled] Source Address: 0.0.0.0 Destination Address: 255.255.255.255 User Datagram Protocol, Src Port: 68, Dst Port: 67 Source Port: 68 Destination Port: 67 Length: 308 Checksum: 0x7714 [unverified] UDP payload (300 bytes) Dynamic Host Configuration Protocol (Discover) Message type: Boot Request (1) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0xc356da15 Seconds elapsed: 53 Bootp flags: 0x0000 (Unicast) 0... .... .... .... = Broadcast flag: Unicast .000 0000 0000 0000 = Reserved flags: 0x0000 Client IP address: 0.0.0.0 Your (client) IP address: 0.0.0.0 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: RealtekU_b7:66:81 (52:54:00:b7:66:81) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Discover) Length: 1 DHCP: Discover (1) Option: (50) Requested IP Address (192.168.61.101) Length: 4 Requested IP Address: 192.168.61.101 Option: (12) Host Name Length: 11 Host Name: democlient1 Option: (55) Parameter Request List Length: 13 Parameter Request List Item: (1) Subnet Mask Parameter Request List Item: (28) Broadcast Address Parameter Request List Item: (2) Time Offset Parameter Request List Item: (3) Router Parameter Request List Item: (15) Domain Name Parameter Request List Item: (6) Domain Name Server Parameter Request List Item: (119) Domain Search Parameter Request List Item: (12) Host Name Parameter Request List Item: (44) NetBIOS over TCP/IP Name Server Parameter Request List Item: (47) NetBIOS over TCP/IP Scope Parameter Request List Item: (26) Interface MTU Parameter Request List Item: (121) Classless Static Route Parameter Request List Item: (42) Network Time Protocol Servers Option: (61) Client identifier Length: 19 IAID: 00b76681 DUID Type: link-layer address plus time (1) Hardware type: Ethernet (1) Time: 741453611 Link layer address: 52:54:00:7b:28:d0 Option: (255) End Option End: 255 Padding: 00
- Couche Ethernet, c'est logiquement du broadcast MAC ff:ff:ff:ff:ff:ff
- Couche IP c'est non moins logiquement du broadcast IP 255.255.255.255, nous apprenons que c'es UDP qui va être utilisé par l'application;
- côté UDP donc, nous découvrons les ports utilisés: 68 par le client et 67 par le serveur;
- enfin, l'application cliente indique son adresse MAC , et réclame une liste impressionnante de paramètres. Le pauvre ne sait pas du tout dans quel environnement il se trouve et cherche à savoir…
Mais personne ne lui répond
Le serveur
Installons un logiciel serveur sur demoserver
. Pourquoi pas le kea-dhcp4-server
de chez ISC puisque isc-dhcp-server n'est plus maintenu.
apt install kea-dhcp4-server
Une fois finie l'installation, il faut effectuer un minimum de configuration. Ce serveur utilise un fichier au format JSON (c'est pour faciliter les erreurs de syntaxe ).
Voici un fichier minimum /etc/kea/kea-dhcp4.conf
:
{ "Dhcp4": { "interfaces-config": { "interfaces": [ "enp7s0" ] } "valid-lifetime": 360, "renew-timer": 180, "rebind-timer": 350, "authoritative": true, "lease-database": { "type": "memfile", "persist": true, "name": "/var/lib/kea/kea-leases4.csv", "lfc-interval": 3600 }, "subnet4": [ { "subnet": "192.168.61.0/24", "pools": [ { "pool": "192.168.61.100 - 192.168.61.120" } ], } ] } }
- en jaune, la ou les interfaces par lesquelles le serveur doit rester à l'écoute. ici
enp7s0
; - en vert des grandeurs temporelles concernant la validité du bail attribué:
- durée de vie de 360 secondes (très peu, pour la manip. Dans la pratique, c'est à évaluer en fonction du besoin);
- durée à partir de laquelle le client commence à demander un renouvellement; (généralement au milieu de la durée de vie);
- durée à partir de laquelle le client doit commencer à s'affoler s'il n'a toujours pas de réponse et refaire une recherche de serveur.
- en bleu le réseau concerné, ici bien entendu
192.168.61.0/24
; - la réserve d'adresses dont le serveur dispose pour configurer ses clients, ici de
192.168.61.100
à192.168.60.120
, ce qui est pour l'instant suffisant, mais qui peut être étendu dans la limite du réseau défini.
Il faut (re)démarrer le serveur:
systemctl restart kea-dhcp4-server.service
et s'assurer qu'il a bien démarré. La moindre erreur de syntaxe dans le fichier JSON étant fatale.
Retour sur le client
Voyons maintenant ce qu'il se passe:
1 0.000000000 0.0.0.0 255.255.255.255 DHCP 342 DHCP Discover - Transaction ID 0x9c1733a 2 0.001231474 192.168.61.1 192.168.61.101 DHCP 350 DHCP Offer - Transaction ID 0x9c1733a 3 0.001655257 0.0.0.0 255.255.255.255 DHCP 347 DHCP Request - Transaction ID 0x9c1733a 4 0.002352680 192.168.61.1 192.168.61.101 DHCP 350 DHCP ACK - Transaction ID 0x9c1733a
Clairement, ça se passe beaucoup mieux. Voyons ce que le serveur offre:
Dynamic Host Configuration Protocol (Offer) Message type: Boot Reply (2) Hardware type: Ethernet (0x01) Hardware address length: 6 Hops: 0 Transaction ID: 0x09c1733a Seconds elapsed: 0 Bootp flags: 0x0000 (Unicast) 0... .... .... .... = Broadcast flag: Unicast .000 0000 0000 0000 = Reserved flags: 0x0000 Client IP address: 0.0.0.0 Your (client) IP address: 192.168.61.101 Next server IP address: 0.0.0.0 Relay agent IP address: 0.0.0.0 Client MAC address: RealtekU_b7:66:81 (52:54:00:b7:66:81) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (53) DHCP Message Type (Offer) Length: 1 DHCP: Offer (2) Option: (1) Subnet Mask (255.255.255.0) Length: 4 Subnet Mask: 255.255.255.0 Option: (12) Host Name Length: 11 Host Name: democlient1 Option: (51) IP Address Lease Time Length: 4 IP Address Lease Time: (360s) 6 minutes Option: (54) DHCP Server Identifier (192.168.61.1) Length: 4 DHCP Server Identifier: 192.168.61.1 Option: (58) Renewal Time Value Length: 4 Renewal Time Value: (180s) 3 minutes Option: (59) Rebinding Time Value Length: 4 Rebinding Time Value: (350s) 5 minutes, 50 seconds Option: (61) Client identifier Length: 19 IAID: 00b76681 DUID Type: link-layer address plus time (1) Hardware type: Ethernet (1) Time: 741453611 Link layer address: 52:54:00:7b:28:d0 Option: (255) End Option End: 255
Le serveur fournit une adresse et les paramètres du bail alloué, mais ne répond bien sûr pas aux autres requêtes.
Le client ayant déjà un nom, en l’absence de directive particulière, il confirme ce nom.
En laissant tourner wireshark, nous observons dans la suite:
1 192.168.61.101 192.168.61.1 DHCP DHCP Request 2 192.168.61.1 192.168.61.101 DHCP DHCP ACK
Pas la peine d'aller voir en profondeur, ici le client a déjà son adresse 192.168.61.101
et interroge directement le serveur 192.168.61.1
qui lui renouvelle son bail dans les mêmes conditions.
Tout le processus sera étudié dans le détail dans le chapitre des Protocoles applicatifs. Entre temps, nous aurons ajouté quelques services, amélioré les configurations pour avoir quelque chose de plus proche d'un réseau en production.
Un coup d'œuil sur le client
Debian utilise par défaut isc-dhcp-client
, ce qui est d'autant plus cohérent que nous utilisons le serveur issu également de chez ISC.
Il existe un fichier de configuration dans /etc/dhcp/dhcp.conf
. Sans entrer dans les détails qui seront largement développés dans l'installation pratique d'un serveur DNS, voici l'allure générale ce ce fichier:
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; send host-name = gethostname(); request subnet-mask, broadcast-address, time-offset, routers, rfc3442-classless-static-routes, ntp-servers;Simplement, nous remarquons que le client envoie au serveur son «hostname» et lui réclame un certain nombre de paramètres. Bien sûr une adresse IP, un masque, une adresse de broadcast, un décalage horaire et les adresses de passerelles (routeurs).
Ce client stocke les baux qu'il reçoit dans le fichier /var/lib/dhcp/dhclient.enp1s0.leases
. Nous y trouvons une liste mise à jour à chaque nouveau bail reçu.
Pour l'instant, contentons-nous d'une lecture rapide du dernier bail reçu:
lease {
interface "enp1s0";
fixed-address 192.168.61.100;
option subnet-mask 255.255.255.0;
option dhcp-lease-time 360;
option routers 192.168.61.1;
option dhcp-message-type 5;
option dhcp-server-identifier 192.168.61.1;
option dhcp-renewal-time 180;
option dhcp-rebinding-time 350;
option host-name "democlient1";
option dhcp-client-identifier ff:0:b7:66:81:0:1:0:1:2c:31:af:2b:52:54:0:7b:28:d0;
renew 0 2025/03/02 19:01:25;
rebind 0 2025/03/02 19:04:33;
expire 0 2025/03/02 19:04:43;
}
En regardant ce bail, nous pouvons voir que le serveur n'a pas répondu à toutes les demandes. En revanche, les les dates pour la demande de renouvellement, de recherche d'un nouveau serveur DHCP et celle de l'expiration de ce bail sont imposées par le serveur.