Outils pour utilisateurs

Outils du site


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 8-)

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.

La configuration IPv4: Dernière modification le: 05/04/2025 à 16:40 par prof