LINUX:IPv6-Serveur DHCP

De WIKI sur Linux (ADB)
Aller à la navigation Aller à la recherche

retour aux Notions de réseau


But

Un serveur DHCP est destiné à distribuer des adresses IP, ici pour le protocole IPv6, aux machines du réseau local par défaut qui le demandent.

Ce serveur doit être installé sur une machine qui fait partie du réseau local et qui a une adresse stable, qui ne change pas, par exemple via la méthode manuelle ou la méthode automatique basée sur l'adresse MAC. Notons qu'il est possible de distribuer des adresses à un autre réseau. Mais une installation spéciale doit être mis en oeuvre pour faire transiter les paquets du protocole DHCP d'un réseau à l'autre. Par défaut, ces paquets sont bloqués par les routeurs. Nous n'aborderons pas cet aspect dans cet article.

Il est aussi possible d'imposer une adresse à une machine sur base de son adresse MAC.

Dans cet article, nous irons au plus simple et seulement pour le protocole IPv6.


Installation

Il faut au préalable installer le paquet qui contient le serveur DHCP:

dnf install dhcp-server

Ce paquet est valable pour les deux protocoles IPv4 et Ipv6.


Configuration

Le fichier de configuration est à placer dans le répertoire "/etc/dhcp". Il se nomme "dhcpd6.conf".

Le fichier existant est vide. On va se baser sur celui donné en exemple dans la documentation "/usr/share/doc/dhcp-server/dhcpd6.conf.example".

Nous devons disposer du prefix assigné par notre ISP si on veut avoir une connectivité à Internet (voir les articles précédents).

Voici le contenu du fichier "dhcpd6.conf":


default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;
 
dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases";
 
option dhcp6.name-servers 2001:4860:4860::8888;
option dhcp6.domain-search "home.dom";
 
subnet6 2a02:a03f:c92a:aa00::/64 {
#  range6 2a02:a03f:c92a:aa00:1000:2:3:10 2a02:a03f:c92a:aa00:1000:2:3:15 ;
  range6 2a02:a03f:c92a:aa00:2000::/72;
}

En début, nous avons laissé six options générales.

Ensuite on notera le nom du fichier "/var/lib/dhcpd/dhcpd6.leases" qui contiendra les adresses IPv6 distribuées. Ce fichier doit exister et vide lors du premier démarrage et il doit appartenir et être accessible à l'utilisateur/groupe "dhcpd/dhcpd".

Dans cette configuration, nous avons ajouté l'envoi de l'adresse du serveur DNS de Google et notre nom de domaine local de recherche (facultatif).

La partie "subnet6" est la partie la plus importante; il peut y en avoir plusieurs. En argument, on remarque le prefix.

On a laissé, en dessous, deux façons de déclarer des pools d'adresse IPv6.

  • La première, en commentaire, désactivée, donne explicitement une tranche de 16 adresses.
  • La seconde donne une tranche par filtrage sur base des bits. Avec le masque de 72 bits (deux chiffres hexadécimaux ou 8 bits en plus du prefix), la tranche va de "2a02:a03f:c92a:aa00:2000:0000:0000:0000" à "2a02:a03f:c92a:aa00:20ff:ffff:ffff:ffff".

Cette configuration est simple.


Limitations

Il faut savoir que le serveur DHCP pour le protocole IPv6 a quelques informations cruciales qu'il ne fournit pas alors que celui pour le protocole IPv4 les distribue.

Il s'agit:

  • de la longueur du prefix,
  • de l'adresse du routeur par défaut.

Cette tâche est dévolue aux routeurs.


Activation

Maintenant, on va activer et lancer le service concerné:

systemctl enable dhcpd6.service
systemctl start dhcpd6.service

Pour utiliser ce nouveau service, il faudra configurer les machines clients.


Note: Il existe un fichier dans lequel on peut ajouter des options lors du lancement du service: "/etc/sysconfig/dhcpd" via la variable:


DHCPDARGS=" "


Deux réseaux et un routeur

Nous avons monté une infrastructure indépendante pour essai.


Schéma

Le schéma ci-dessous présente cette organisation. Nous avons deux réseaux et un routeur qui les relient. Chaque réseau comporte deux machines. Toutes ces cinq machines sont sous Linux et utilisent le protocole IPv6.

Chaque réseau a un prefix de réseau différent: "2a02:a03f:c92a:aa00::/64" et "2a02:a03f:c92a:aa01::/64".



Machines - clients DHCP

Les quatre machines des deux réseaux sont configurées au niveau de la couche IPv6 selon la méthode "Automatique(DHCP uniquement)". Voyez l'article sur l'IPv6-Méthode DHCP.

Dans le fichier de configuration de NetworkManager "/etc/NetworkManager/system-connections/enp0s25.nmconnection", l'interface étant "enp0s25", cette configuration est très réduite.


...
[ipv6]
method=dhcp
...


Le routeur

Le routeur a deux interfaces configurés selon la méthode "Automatique".

Dans le fichier de configuration de NetworkManager "/etc/NetworkManager/system-connections/enp0s25.nmconnection", l'interface étant "enp0s25" dans ce cas, cette configuration est très réduite.


...
[ipv6]
method=auto
addr-gen-mode=eui64
...


Comme c'est un routeur, il faut modifier un paramètre du système afin que le transfert entre réseaux puisse se faire.

On crée un fichier, par exemple, "/etc/sysctl.d/router.conf" dans lequel on ajoute la ligne:


net.ipv6.conf.all.forwarding=1

Pour l'activer, soit on redémarre la machine soit on lance la commande:

sysctl -p /etc/sysctl.d/router.conf


Serveur DHCPv6 sur le routeur

Nous avons vu plus haut un exemple de configuration pour une machine ayant un seul interface réseau. Nous allons la doubler.

Voici le contenu de ce fichier "/etc/dhcp/dhcpd6.conf" semblable au précédent pour sa partie globale:


default-lease-time 2592000;
preferred-lifetime 604800;
option dhcp-renewal-time 3600;
option dhcp-rebinding-time 7200;
allow leasequery;
option dhcp6.info-refresh-time 21600;
 
dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases";
 
option dhcp6.name-servers 2001:4860:4860::8888;
option dhcp6.domain-search "home.dom";
 
subnet6 2a02:a03f:c92a:aa00::/64 {
        range6 2a02:a03f:c92a:aa00:A000::/72;
}
 
subnet6 2a02:a03f:c92a:aa01::/64 {
        range6 2a02:a03f:c92a:aa01:B000::/72;
}

On retrouve les prefix de nos deux réseaux.

On n'oublie pas de relancer ce service "dhcpd6.service".


Le serveur RADVD sur le routeur

Dans le protocole IPv6, un routeur a une fonction spéciale. C'est lui qui définit le prefix de chaque réseau qui lui sont connectés et l'adresse de la route par défaut. Eventuellement il fournit un autre routage et l'adresse d'un serveur DNS. Dans notre cas, l'adresse d'un serveur DNS est fournie par le serveur DHCP malgré que suivant notre configuration, elle est inutile; ce réseau n'étant pas connecté à Internet.

Il envoie régulièrement ses informations sur le réseau concerné et répond aux sollicitations des machines de ce réseau.


Installation

Il faut installer le paquet concerné:

dnf install radvd


Configuration

Voici le contenu du fichier de configuration "/etc/radvd.conf":


interface enp0s25
{
       AdvSendAdvert on;
       MinRtrAdvInterval 30;
       MaxRtrAdvInterval 100;
       AdvManagedFlag off;
       AdvOtherConfigFlag off;
       AdvDefaultPreference medium;
 
       prefix 2a02:a03f:c92a:aa00::/64
       {
               AdvOnLink on;
               AdvAutonomous on;
               AdvRouterAddr off;
       };
};
 
interface enp6s0
{
       AdvSendAdvert on;
       MinRtrAdvInterval 30;
       MaxRtrAdvInterval 100;
       AdvManagedFlag off;
       AdvOtherConfigFlag off;
       AdvDefaultPreference medium;
 
       prefix 2a02:a03f:c92a:aa01::/64
       {
               AdvOnLink on;
               AdvAutonomous on;
               AdvRouterAddr off;
       };
};

Cette configuration est basique. Elle comporte deux sections, une par interface réseau:

  • l'interface "enp0s25" est connecté au réseau du haut du schéma,
  • l'interface "enp6s0" est connecté au réseau du bas du schéma.

Remarquons que les options "AdvManagedFlag" et "AdvOtherConfigFlag" sont désactivées (sur "off") car j'ai remarqué que la première n'a d'effet que sur la méthode "Automatique" d'IPv6 et la seconde permet d'envoyer l'adresse du serveur DNS au client DHCP. Or cette adresse est fournie par le serveur DHCP.


Activation

Maintenant, on va activer et lancer le service concerné:

systemctl enable radvd.service
systemctl start radvd.service


Vérification

Pour effectuer cette vérification, on doit installer le paquet "rdisc6":

dnf install rdisc6

On effectue ensuite notre requête; il lui faut indiquer sur quel interface réseau effectuer cette demande "enp0s25" pour la première:

rdisc6 enp0s25

et ensuite pour l'autre interface:

rdisc6 enp6s0

Elles envoient cette requête sur le réseau local et attend la réponse du service "RADVD".

Voici la réponse pour l'interface "enp0s25":


Solicitation de ff02::2 (ff02::2) sur enp0s25...
 
Limite de saut (TTL)      :           64 (      0x40)
Conf. d’adresse par DHCP  :          Non
Autres réglages par DHCP  :          Non
Agent domestique (mobile) :          Non
Préférence du routeur     :        moyen
Proxy (découverte voisin) :          Non
Durée de vie du routeur   :          300 (0x0000012c) secondes
Temps d’atteinte          :  non indiqué (0x00000000)
Temps de retransmission   :  non indiqué (0x00000000)
 Préfixe                  : 2a02:a03f:c92a:aa00::/64
  Sur le lien (on-link)   :          Oui
  Conf. autonome d’adresse:          Oui
  Durée de validité       :        86385 (0x00015171) secondes
  Durée de préférence     :        14400 (0x00003840) secondes
 Adresse source de lien   : 00:1C:C0:2A:C4:25
 de fe80::21c:c0ff:fe2a:c425

Voici la réponse pour l'interface "enp6s0":


Solicitation de ff02::2 (ff02::2) sur enp6s0...
 
Limite de saut (TTL)      :           64 (      0x40)
Conf. d’adresse par DHCP  :          Non
Autres réglages par DHCP  :          Non
Agent domestique (mobile) :          Non
Préférence du routeur     :        moyen
Proxy (découverte voisin) :          Non
Durée de vie du routeur   :          300 (0x0000012c) secondes
Temps d’atteinte          :  non indiqué (0x00000000)
Temps de retransmission   :  non indiqué (0x00000000)
 Préfixe                  : 2a02:a03f:c92a:aa01::/64
  Sur le lien (on-link)   :          Oui
  Conf. autonome d’adresse:          Oui
  Durée de validité       :        61867 (0x0000f1ab) secondes
  Durée de préférence     :            0 (0x00000000) seconde
 Adresse source de lien   : 00:1B:21:3B:B0:77
 de fe80::21b:21ff:fe3b:b077


Déroulement

La mise en place de l'adressage réseau se passe en plusieurs phases:

  • Chaque machine crée son adresse IPv6 Link-Local
  • Les deux interfaces réseau du routeur configurent leurs adresses IPv6 Unicast Global respectives et leurs routes par défaut avec l'aide des informations du serveur RADVD.
  • Chacun des deux interfaces du routeur ont donc maintenant leur prefix attribué. Le serveur DHCP peut donc maintenant savoir sur quel réseau, il peut distribuer ses adresses aux clients suivant le prefix attribué aux interfaces réseaux du routeur.
  • Chaque machine client-DHCP demande alors au serveur DHCP, une adresse Unicast Global.

Le problème, c'est que le serveur RADVD ne répond pas aux sollicitations des machines client-DHCP.

  • L'adresse Unicast Global est donnée par le serveur DHCP et le prefix a d'office la longueur maximale de 128 bits.
  • La route par défaut est inconnue.

Mais heureusement, la couche qui permet de récolter les informations du voisinage est actif. On peut la visualiser grâce à la commande à exécuter sur les machines client-DHCP:

ip -6 neighbour show

Au début, elle ne comporte que l'adresse du router.

Pour ajouter cette route par défaut sur base de cette information, nous ajoutons un script au niveau du processus du client-DHCP comme décrit dans l'article sur l'IPv6-Méthode DHCP.


Conclusion

Après divers essais, cette méthode "Automatique (seulement DHCP)" n'est pas pratique. Elle demande une configuration particulière par l'ajout d'un script. Et dans le cadre de la méthode "Automatique", le serveur DHCP ajoute une adresse Unicast Globale en plus de celle ajoutée nativement par la méthode "Automatique" mais avec un prefix de longueur de 128 bits. Je ne vois pas directement d'intérêt à cette seconde adresse. Il pourrait peut-être y avoir un intérêt dans le cadre d'un filtrage au niveau du FireWall. A voir.




retour aux Notions de réseau