Dans une solution à haute disponibilité on pense souvent à doubler les alimentations, les disques dur, mais on oublie fréquemment la carte réseau. Le concept du channel bonding permet de régler ce SPOF très souvent oublié.

Pour que le channel bonding fonctionne il faut utiliser la commande ifenslave qui est fournie dans le package ifenslave-2.6. Les cartes réseau doivent être compatibles ethtools et miitools. Le module bonding doit avoir été implanté dans la configuration du noyau.

[*] Networking support
<M> Bonding driver support

Il existe 7 modes de fonctionnement.

Mode 0, l'équilibrage de charge : Grâce l'équilibrage de charge, les paquets transitent sur une carte réseau active, puis sur une autre, séquentiellement. Le débit de la bande passante est augmenté. Si une des cartes réseaux vient à tomber en rade, l'équilibre de charge saute cette carte et continue à tourner de manière cyclique.

Mode 1, la sauvegarde active : Ce mode est une simple redondance avec basculement. Une seule interface est active. Dès que sa panne est détectée, une autre interface est activée et prend le relais. Votre bande passante ne change pas.

Mode 2, la balance Xor : 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.

Mode 3, le broadcast : Aucune particularité dans ce cas, toutes les données sont transmises sur toutes les interfaces actives. Aucune autre règle.

Mode 4, la norme 802.3ad : La norme 802.3ad permet l'agrégation des liens, élargissant dynamiquement la bande passante. Les groupes sont créés dynamiquement sur la base d'un paramétrage commun. Ce mode exige un équipement réseau, switch, offrant cette possibilité.

Mode 5, la balance TLB : "TLB" pour Traffic Load Balancing.Le trafic sortant est distribué selon la charge courante (calculée relativement à 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 l'interface inactive.

Mode 6, la balance ALB : "ALB" pour Adaptive load balancing. C'est un mode étendu de la balance tlb, qui inclut du load balancing en réception. L'équilibrage de charge de réception 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.

Les modes 0, 2, 5 et 6 assurent l'équilibrage de charge.

Installer le package ifenslave.

aptitude install ifenslave-2.6

Configuration Debian ETCH

Modifier le fichier /etc/network/interfaces, mettre en commentaire les lignes relatives aux interfaces eth0 et eth1 et rajouter les lignes suivantes :

auto eth0
auto eth1
auto bond0
  iface bond0 inet static
  address 192.168.1.110
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.1
  up /sbin/ifenslave bond0 eth0
  up /sbin/ifenslave bond0 eth1
  down /sbin/ifenslave -d bond0 eth0
  down /sbin/ifenslave -d bond0 eth1

Ajouter les lignes suivantes dans le fichier /etc/modprobe.d/arch/i386. La configuration retenue est le mode 1, sauvegarde active.

alias bond0 bonding
options bonding mode=1 miimon=100 downdelay=200 updelay=200
  • miimon : défini la fréquence à laquelle les cartes réseaux sont inspectées pour savoir si ils sont en défaut. La valeur de 100 correspond à 100 millisecondes qui est la valeur recommandée.
  • downdelay : spécifie en millisecondes le temps de désactivation d'une interface suite à un problème, le switch est souvent moins rapide en réaction que le registre miimon de la carte réseau. Ce paramètre doit être un multiple de miimon.
  • updelay : certains switches présentent l'interface réseau active avant que la connexion soit réellement opérationnelle. updelay gère cette particularité. Ce paramètre doit être aussi un multiple de miimon.

Configuration Lenny et Squeeze

Elle est plus simple et demande uniquement une configuration de /etc/network/interfaces

auto eth0
auto eth1
auto bond0
  iface bond0 inet static
  address 192.168.1.110
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.1
  slaves eth0 eth1
  bond_mode active-backup
  bond_miimon 100
///  
Redemarrer le réseau :

/etc/init.d/networking restart

La commande ifconfig renvoie le résultat suivant :

bond0 Link encap:Ethernet HWaddr 00:30:48:89:42:30

         inet adr:192.168.1.110  Bcast:192.168.1.255  Masque:255.255.255.0
         adr inet6: fe80::230:48ff:fe89:4230/64 Scope:Lien
         UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
         RX packets:212 errors:0 dropped:0 overruns:0 frame:0
         TX packets:184 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:0 
         RX bytes:20049 (19.5 KiB)  TX bytes:20458 (19.9 KiB)

eth0 Link encap:Ethernet HWaddr 00:30:48:89:42:30

         UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
         RX packets:202 errors:0 dropped:0 overruns:0 frame:0
         TX packets:179 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:100 
         RX bytes:19317 (18.8 KiB)  TX bytes:19960 (19.4 KiB)

eth1 Link encap:Ethernet HWaddr 00:30:48:89:42:30

         UP BROADCAST SLAVE MULTICAST  MTU:1500  Metric:1
         RX packets:10 errors:0 dropped:0 overruns:0 frame:0
         TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:100 
         RX bytes:732 (732.0 B)  TX bytes:498 (498.0 B)

lo Link encap:Boucle locale

         inet adr:127.0.0.1  Masque:255.0.0.0
         adr inet6: ::1/128 Scope:Hôte
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:0 
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
A partir de cet instant le serveur est vu au travers l'IP : 192.168.1.110. Pour ssh, il importe de corriger la clause ListenAdress dans le fichier /etc/ssh/sshd_config.

La commnde ip addr retourne également des éléments sur le channel bonding

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
   inet6 ::1/128 scope host 
      valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 100

   link/ether 00:30:48:89:42:30 brd ff:ff:ff:ff:ff:ff

3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,SLAVE,UP> mtu 1500 qdisc pfifo_fast master bond0 state DOWN qlen 100

   link/ether 00:30:48:89:42:30 brd ff:ff:ff:ff:ff:ff

4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

   link/ether 00:30:48:89:42:30 brd ff:ff:ff:ff:ff:ff
   inet 192.168.1.110/24 brd 192.168.1.255 scope global bond0
   inet6 fe80::230:48ff:fe89:4230/64 scope link 
      valid_lft forever preferred_lft forever
En consultant le fichier /proc/net/bonding/bond0 on obtient des informations sur l'état du lien channel bonding

cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)

Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 200 Down Delay (ms): 200

Slave Interface: eth0 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:30:48:89:42:30

Slave Interface: eth1 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:30:48:89:42:31

Dans le cas ci-dessus les deux interfaces sont bien connectées. Pour tester débrancher l'une des interfaces et relancer la commande qui montre que l'interface eth1 est hors service.

cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.2.5 (March 21, 2008)

Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth0 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 200 Down Delay (ms): 200

Slave Interface: eth0 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:30:48:89:42:30

Slave Interface: eth1 MII Status: down Link Failure Count: 1 Permanent HW addr: 00:30:48:89:42:31 ///

Lien intéressant sur le channel bonding