CentOS : Configurer le bonding réseau

I. Présentation

Dans ce tutoriel, je vous propose de mettre en œuvre un agrégat réseau permettant de secourir la connexion d’un serveur en effectuant une bascule automatique d’une interface à une autre, en cas de panne. Cela revient à utiliser deux interfaces réseau agrégées pour disposer d’une distribution redondante :

La technique du bonding appelée aussi channel bonding (ou encore port trucking) consiste à regrouper des liens réseaux, des interfaces ou des cartes réseau pour mettre en place de l’équilibrage de charge (ou load balancing) et améliorer la tolérance aux pannes.

II. Prérequis

Afin de mettre cette technique en œuvre, outre le fait de disposer de deux interfaces minimum, nous devons aussi vérifier quelques petites choses concernant le système d’exploitation. Il est notamment nécessaire d’avoir activé l’option bonding au niveau du noyau :

REMARQUE : la technique de bonding, selon le mode activé peut également permettre de faire de l’équilibrage de charge. On aurait tort de s’en priver, car cela permet aussi d’améliorer les performances de nos serveurs.

En d’autres termes, il faut que le module bonding soit présent au sein du système d’exploitation. On peut donc s’en assurer en exécutant la commande suivante :

# lsmod | grep bond
bonding 130997 0
8021q 25527 1 bonding
ipv6 334932 153 bonding

Si tel n’était pas le résultat obtenu, il faudrait alors installer le module au niveau du système :

# modprobe bonding

Pour une distribution de type Debian (ou dérivée : Ubuntu ou autres), on devra probablement installer le package ifenslave :

# apt-get install ifenslave

Comme on l’a souligné précédemment, il existe plusieurs modes distincts permettant alternativement de faire du secours et/ou de l’équilibrage de charge. Ces modes correspondent aux sept options possibles pour le module bonding :

  • Mode 0 (équilibrage de charge) : les paquets transitent sur une carte réseau active, puis sur une autre, de façon séquentielle. Le débit de la bande passante est ainsi augmenté. Si une des cartes vient à tomber en panne, l’équilibrage de charge met cette dernière à l’écart et continue à tourner de façon cyclique.
  • Mode 1 (sauvegarde active) : simple redondance avec basculement. Une seule interface est active. Dès qu’une panne est détectée, une autre interface est activée et prend le relais. La bande passante reste inchangée.
  • Mode 2 (balance xor) : une interface est affectée à l’envoi vers une même adresse matérielle (adresse MAC). Les transferts sont parallélisés. Le choix de l’interface est régi par la règle : (@MAC Source XOR @MAC Destination) modulo le nombre d'interfaces.
  • Mode 3 (broadcast) : aucune particularité sinon que toutes les données sont transmises sur toutes les interfaces actives (sans aucune règle particulière).
  • Mode 4 (norme 802.3ad) : permettant l’agrégation des liens en élargissant dynamiquement la bande passante. Les groupes sont créés alors dynamiquement sur la base d’un paramétrage commun.
  • Mode 5 (balance TLB ou Traffic Load Balancing) : où le trafic sortant est distribué selon la charge courante, calculée par rapport à la vitesse de chaque interface. Le trafic entrant est reçu par l’interface courante. Si l’interface de réception devient inactive, une autre interface prend l’adresse MAC de cette première.
  • Mode 6 (balance ALB ou Adaptive Load Balancing) : il s’agit d’un mode étendu de la balance TLB incluant de l’équilibrage de charge en réception. Cet équilibrage est réalisé au niveau des réponses ARP. Le module intercepte les réponses ARP et change l’adresse MAC par celle d’une des interfaces disponibles.

Bien, une fois ces modalités d’usage configurées, on peut alors créer le fichier bond0.conf, dans le répertoire /etc/modprobe.d :

alias bond0 bondig
options bond0 mode=balance-tlb miimon=100

REMARQUE : on a sélectionné ici, le mode 5 (balance TLB) qui a déjà fait ses preuves. L’avantage de ce mode est qu’il permet de basculer sur la seconde interface en cas de panne de la première, de façon transparente.

Lorsque la machine est hébergée sur un châssis, type Blade HP C7000, les adresses MAC sont automatiquement distribuées par le châssis. On ne peut donc, pas toujours forcer leur attribution.

ATTENTION : le fait de désactiver les interfaces réseau, interrompt la communication avec le serveur, lorsqu’on se trouve sur une fenêtre de type SSH (PuTty ou autres XTerm). Il est donc préférable de toujours effectuer la configuration du bonding depuis une console IlO ou physique.

III. Configuration du bonding

Comme on l’a mentionné en introduction, pour réaliser le bonding, au niveau d’un serveur, il est nécessaire de disposer de deux interfaces réseau. On va donc préparer la configuration de ces deux points d’entrée, dans le répertoire /etc/sysconfig/network-scripts :

Configuration de l’interface eth0 (fichier ifcfg-eth0)

DEVICE = eth0
ONBOOT = yes
USERCTL = no
BOOTPROTO = none
IPV6INIT = no
MASTER = bond0
SLAVE = yes
HWADDR = 00:17:A4:77:7C:14
NM_CONTROLED = no
TYPE = Ethernet

il très important ici, de mentionner l’adresse MAC attribuée à l’interface eth0 et la positionner en tant qu’esclave (option SLAVE=yes). L’option NM_CONTROLLED permet de désactiver le contrôle du programme NetworkManager qui peut engendrer des désagréments ou des conflits, s’il est toujours actif.

Configuration de l’interface eth1 (fichier ifcfg-eth1)

DEVICE = eth1
ONBOOT = yes
USERCTL = no
BOOTPROTO = none
IPV6INIT = no
MASTER = bond0
SLAVE = yes
HWADDR = 00:17:A4:77:7C:16
NM_CONTROLED = no
TYPE = Ethernet

Après avoir créé le fichier d’interface pour eth1, on peut ensuite créer le fichier pour l’interface maître : bond0

Configuration de l’interface bond0 (fichier ifcfg-bond0)

DEVICE = bond0
ONBOOT = yes
USERCTL = no
BOOTPROTO = none
IPV6INIT = no
IPADDR = 192.168.1.20
NETMASK = 255.255.255.0
GATEWAY = 192.168.1.1
TYPE = Ethernet

REMARQUE : évidemment, il vous faut adapter l’adresse IP de l’interface bond0 selon vos besoins (ainsi que le masque de sous-réseau et sa passerelle). De plus, on peut également configurer l’interface de bonding à l’aide du mode commande :

# ifconfig bond0 hw ether 00:17:A4:77:7C:14
# ifconfig bond0 192.168.1.20 netmask 255.255.255.0 gateway 192.168.1.1 up

Lorsque l’interface de bonding est active, on peut alors ajouter les interfaces esclaves eth0 et eth1 en utilisant les commandes suivantes :

# ifenslave bond0 eth0
# ifenslave bond0 eth1

On peut toujours libérer une de ces interfaces, en cas de besoin, de panne ou de remplacement à l’aide de l’instruction suivante :

# ifenslave –d bond0 eth1

Sur une distribution Debian (ou dérivée), le fichier de configuration se trouvent dans le répertoire /etc/network et s’appelle interfaces. Il doit contenir la déclaration des différentes interfaces esclaves et de l’interface de bonding .

Exemple : déclaration de deux interfaces eth0 et eth1 :

auto bond0
iface bond0 inet static
address 192.168.1.20
netmask 255.255.255.0
network 192.168.1.0
gateway 192.168.1.1
slaves eth0 eth1
bond_mode balance_tlb
bond_miimon 100

ATTENTION: depuis la version CentOS7, les interfaces réseau ne s’appellent plus ethx mais ensx. Il faut donc adapter les noms des interfaces en fonction de la version et de la distribution.

IV. Activation

Avant de démarrer les services précédemment configurés, il faut vérifier que le fichier de résolution /etc/resolv.conf possède les bonnes informations :

search mydmn.org
nameserver 192.68.1.15

Il est conseillé de préciser également le nom du serveur et la passerelle par défaut dans le fichier /etc/sysconfig/network :

NETWORKING=yes
HOSTNAME=srvxxxx.mydmn.org
GATEWAY=192.168.1.1

On doit également s’assurer que la passerelle par défaut est bien celle figurant dans la table de routage:

# netstat –rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 bond0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 bond0
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 bond0

Lorsque l’on estime que la configuration est prête à être chargée, on peut alors l’activer via la commande suivante :

# service network restart

REMRQUE : depuis la version CentOS7, la commande d’activation de service est systemctl. Il faut donc passer la commande suivante :

# systemctl restart network

Par ailleurs, sur une distribution Debian, le service à redémarrer ne s’appelle pas network mais networking. Si l’on ne souhaite pas avoir d’interruption de service du réseau, on peut effectuer un rechargement via la commande suivante :

# systemctl reload network

L’activation du bonding dispose de quelques options axées sur l’archivage, les latences et la surveillance ARP. Ci-dessous un tableau récapitulatif de ces différentes options :

V. Conclusion

J’espère qu’avec ce petit tutoriel, vous n’aurez plus de soucis de déconnexion intempestive de vos interfaces.

Le bonding est un des nombreux moyens de rendre plus pérenne les systèmes d’exploitation en redondant les architectures : réseau (comme dans l’exemple ci-dessus), ressources système (disques, multipathing), ou même "clusterisation" d’un service, au travers d’un heartbeat.

Ce mécanisme a longuement fait ses preuves dans un environnement de production et en cas de panne, la seconde interface sous-jacente prend le relais, et laisse du temps à l’administrateur de dépanner l’interface défectueuse.

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Philippe PIERRE

A exercé de nombreuses années en tant qu'administrateur de base de données et comme administrateur Système Unix/Linux. Il a enseigné les réseaux au CNAM (Paris). Aujourd'hui, employé en tant qu'ingénieur infrastructure, au sein d'un laboratoire pharmaceutique et administrant un cluster de calculs HPC, il connaît parfaitement les environnements GNU/Linux dans le cadre d'une entreprise et des systèmes de haute disponibilité. Il aime partager son expérience.

    philippe-pierre a publié 17 articles sur IT-Connect.See all posts by philippe-pierre

    Laisser un commentaire

    Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *