L’agrégation de liens Ethernet sous Linux avec ifenslave (pour les nuls)

Au cours de vos projets ou de vos expériences en matière d’administration systèmes et réseau, vous allez sans doute un jour être confronté aux problématiques de répartition de charge et de haute-disponibilité de liens ethernet. Derrière ces mots barbares se cache en fait un concept très simple : utiliser deux cartes réseau physiques (ou plus) sur la même machine pour n’en avoir qu’une d’un point de vue logique et répartir les différents flux TCP/IP en fonction de leur disponibilité. Du 2 en 1 quoi…

Ici le serveur aura l'adresse IP attribuée au bonding. eth0 et eth1 n'ont pas d'adresse...

Ici le serveur aura l’adresse IP attribuée au bonding. eth0 et eth1 n’ont pas d’adresse…

Si le Kernel Linux fourni le pilote pour agréger plusieurs interfaces réseau en une interface logique appelée bondXX est le numéro de l’interface, la création et la gestion de ces interfaces nécessite quand même l’utilisation d’un outil intitulé ifenslave et que je vous propose de découvrir dans ce tutoriel !

De quoi avons-nous besoin ?

Conditions de test

Cet article a été réalisé sur une machine virtuelle Debian 7.2 Stable fraîchement installée. Il vous faut au moins 2 interfaces connectées au même réseau, et installer le paquet ifenslave-2.6 :

sudo apt-get install ifenslave-2.6

Je travaillerai sur le réseau 192.168.24.0/24 avec les interfaces eth0 et eth1.

Configuration de l’agrégation (ou bonding)

Configuration du pilote

Et oui, même si le pilote est fourni avec le noyau Linux, il faut quand même le configurer en ajoutant un fichier dans /etc/modprobe.d/ Nommez-le comme vous voulez mais restez cohérent… 'bonding.conf' ou 'aliases.conf' par exemple :

alias bond0 bonding
options bonding mode=0 arp_interval=2000 arp_ip_target=192.168.24.110

Que venons-nous de faire ?

Nous venons simplement de créer un fichier de configuration destiné au pilote linux intitulé bonding, avec les paramètres suivants :

  • mode correspond au mode de bonding que nous souhaitons (ici 0). Il y en a 7 et je vous en parle un peu plus bas.
  • arp_interval indique la fréquence de surveillance de liaison ARP, en millisecondes.
  • arp_ip_target indique la ou les adresses IP à utiliser pour la surveillance ARP. Typiquement c’est l’adresse IP que vous allez donner à votre bonding, et nous ça sera 192.168.24.110.

Après cela il ne vous reste plus qu’à configurer votre interface de manière classique via le fichier /etc/network/interfaces. Si jamais le pilote n’est pas chargé automatiquement (ce qui ne m’est jamais arrivé sous Debian), vous pouvez utiliser la commande suivante :

modprobe -v bonding mode=0 arp_interval=2000 arp_ip_target=192.168.24.110

Configuration de l’interface

Alors voyons ce que ça donne. En fait les deux interfaces que vous allez agréger vont devenir « esclaves » de votre bonding. C’est pourquoi il faut arrêter ces interfaces. Ici je fais une agrégation entre eth0 et eth1 :

sudo ifdown eth0 && sudo ifdown eth1

Voici mon fichier /etc/network/interfaces :

auto bond0
iface bond0 inet static
        address 192.168.24.110
        netmask 255.255.255.0
        gateway 192.168.24.2
        dns-nameservers 192.168.24.8
        dns-search mondomaine.com
        slaves eth0 eth1
        bond_mode balance-rr
        bond_miimon 100
        bond_downdelay 200
        bond_updelay 200
        mtu 9000

Qu’avons-nous écrit ?

Je vous passe les lignes address, netmask, gateway et slaves qui restent relativement explicites… Pour le reste :

  • bond_mode définit le mode de bonding à utiliser, je vous les détaille plus bas.
  • bond_miimon détermine la fréquence d'inspection des liens esclaves afin de vérifier leur état de santé. eth0 et eth1 seront surveillés toutes les 100 millisecondes.
  • bond_downdelay vous vous en doutez peut-être, détermine le délai maximum avant qu’un esclave ne soit déclaré en panne.
  • bond_updelay détermine le temps à attendre avant de redémarrer un esclave détecté comme sain.

Ensuite nous avons deux ou trois petites choses qui ne concernent pas l’agrégation de liens mais qu’il peut être bon de rappeler :

  • dns-nameservers liste les serveurs DNS à utiliser (nécessite l’installation du paquet resolvconf).
  • dns-search indique le domaine de recherche local.
  • mtu 9000 permet la prise en charge des Jumbo Frames.

Il ne reste plus qu’à démarrer l’interface :

sudo ifup bond0

Un petit ip addr show devrait afficher quelque chose de similaire à :

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast master bond0 state UP qlen 1000
    link/ether 00:0c:29:e2:28:13 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast master bond0 state UP qlen 1000
    link/ether 00:0c:29:e2:28:13 brd ff:ff:ff:ff:ff:ff
4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP 
    link/ether 00:0c:29:e2:28:13 brd ff:ff:ff:ff:ff:ff
    inet 192.168.24.110/24 brd 192.168.24.255 scope global bond0

On voit bien que seul bond0 a une adresse IP et que les autres interfaces sont marquées comme esclaves.

Monitorer votre interface

Pour vérifier l’état du bonding, vous pouvez aussi utiliser cat /proc/net/bonding/bond0 :

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
 
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
 
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:e2:28:13
Slave queue ID: 0
 
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:e2:28:1d
Slave queue ID: 0

Et pour aller un peu plus loin, un exemple de sortie en cas de panne de eth0 donnerait :

Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
 
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 200
Down Delay (ms): 200
 
Slave Interface: eth0
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1
Permanent HW addr: 00:0c:29:e2:28:13
Slave queue ID: 0
 
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:e2:28:1d
Slave queue ID: 0

D’ailleurs /var/log/messages vous fournit aussi des informations intéressantes en cas de problème :

Jan 14 10:32:51 GFS-01 kernel: [ 2382.250953] e1000: eth0 NIC Link is Down
Jan 14 10:32:51 GFS-01 kernel: [ 2382.308566] bonding: bond0: link status down for interface eth0, disabling it in 200 ms.
Jan 14 10:32:52 GFS-01 kernel: [ 2382.505813] bonding: bond0: link status definitely down for interface eth0, disabling it

Les différents modes d’agrégation

L’agrégation de liens sous Linux propose jusqu’à 7 modes de fonctionnement que je vous propose de résumer ici. Attention, tous les modes ne sont pas forcément compatibles avec la configuration que j’utilise ici. Renseignez-vous bien avant de vous lancer sous peine d’avoir de sérieux problèmes…

  • balance-rr ou 0 : dans ce mode, les paquets sont transmis aux esclaves dans un ordre séquentiel suivant une ronde. Ce mode gère évidemment la répartition de charge et la tolérance de panne.
  • active-backup ou 1 : un esclave sur les deux est actif et le passif devient actif en canne de panne de ce dernier. Ce mode ne gère que la tolérance de panne.
  • balance-xor ou 2 : une interface est affectée à l’envoi vers une même adresse MAC. Ainsi les transferts sont parallélisés et le choix de l’interface suit la règle : (Adresse MAC de la source XOR Adresse MAC de la destination) modulo nombre d’interfaces. Ce mode gère tolérance de panne et répartition de charge.
  • broadcast ou 3 : tous les paquets sont transmis à tous les esclaves. Ce mode gère la tolérance de panne, mais on est loin d’une répartition de charge…
  • 802.3ad ou 4 : crée des groupes d’agrégation qui partagent les mêmes paramètres de vitesse / duplex. Utilise tous les esclaves dans l’agrégateur actif selon la spécification 802.3ad. La plupart des commutateurs de réseau nécessiteront un peu de configuration pour activer le mode 802.3ad.
  • balance-tlb ou 5 : (adaptive transmit load balancing) seule la bande passante en sortie est répartie selon la charge calculée en fonction de la vitesse, ceci pour chaque interface. Le flux entrant est affecté à l’interface courante. Si celle-ci devient inactive, une autre prend alors l’adresse MAC et devient l’interface courante.
  • balance-alb ou 6 : (adaptive load balancing) ce mode inclut en plus du tlb une répartition de charge sur le flux entrant et seulement pour un trafic IPv4. L’équilibrage est réalisé au niveau ARP. Le module intercepte les réponses pour y réécrire l’adresse MAC de l’une des interfaces du bond tout en tenant compte des spécificités du protocole ARP. La répartition entre les différentes interfaces se fait de façon séquentielle (round robin).

ET voilà l’agrégation de liens sous Linux n’a maintenant plus de secret pour vous !


Ils m’ont aidé à écrire cet article :

Cet article vous a plu ? Partagez-le sur les réseaux sociaux !

Twitter Facebook Google Plus email