Le bonding d'interfaces réseaux sous Linux permet d'agréger plusieurs interfaces physiques en une seule interface virtuelle. Les deux principales raisons d'utiliser ce type de technologie sont d'une part l'augmentation de la bande passante, et d'autre part la redondance, qui permet donc de sécuriser un accès réseau. Cette solution contient notamment une implémentation du protocole 802.3ad de l'IEEE.

Voyons donc les différents types de bonding, comment déclarer une interface réseau en bonding, et les manipulations propres au bonding sur une interface active. Comme pour mes autres articles récents sur Linux, le cas considéré ici est celui d'une RedHat Enterprise Linux (ou plus simplement RHEL).

Différents modes de bonding

Le mode de bonding se définit dans le fichier /etc/modprobe.conf :

alias bond0 bonding options bond0 miimon=100 mode=1

C'est l'option mode qui détermine le type de bond :

  • mode=0 : round-robin (balance-rr) : les paquets sortent alternativement par chaque interface physique disponible
  • mode = 1 : actif/backup (active-backup) : une seule interface physique est utilisée, et le bond bascule sur l'autre en cas de perte de lien
  • mode = 2 : répartition par MAC (balance-xor) : pour chaque nouvelle MAC de destination, on sélectionne alternativement une interface physique disponible, mais les paquets à destination d'une MAC donnée sortiront toujours par la même interface
  • mode = 3 : broadcast (broadcast) : tous les paquets sont transmis sur toutes les interfaces physiques
  • mode = 4 : 802.3ad (802.3ad) : agrégation de liens dynamique, nécessite un switch supportant ce protocole
  • mode = 5 : répartition de charge en émission (balance-tlb) : la répartition des paquets sortants sur les interfaces physiques se fait en fonction de leur charge réelle (calculée à partir de leur vitesse), mais les paquets entrants arrivent sur l'interface active, l'autre prenant le relais en cas de panne
  • mode = 6 : (balance-alb) : identique au mode 5, avec en plus une répartition de charge sur les paquets entrants (basée sur la charge des interfaces), le driver interceptant les requêtes ARP pour envoyer les adresses de différentes interfaces physiques à des pairs différents
Les modes les plus couramment utilisés sont les 4 premiers.

Détection d'une panne

On peut utiliser deux modes distincts pour détecter une panne sur une interface:
  • l'état du lien ethernet : avec l'option miimon=XX, on suit l'état du lien MII (media-independent interface), la valeur XX étant l'intervalle de test en millisecondes
  • la recherche d'une adresse IP spécifique via le protocole ARP : dans ce cas, le bond essaie d'obtenir l'adresse MAC associée à l'IP spécifiée. On utilise pour cela les options arp_interval=XX où XX est l'intervalle entre 2 tests en millisecondes, et arp_ip_target=XX.XX.XX.XX pour spécifier l'IP à tester, par exemple l'IP de la gateway par défaut.
Notez que ces deux modes sont incompatibles. Par défaut, les deux modes sont désactivés.

Déclarer une interface en bonding

Pour cela, rien de bien compliqué, on va créer un fichier de description de l'interface tout à fait classique dans le répertoire /etc/sysconfig/network-scripts :
# cat ifcfg-bond0 DEVICE=bond0 IPADDR=1.2.3.4 NETMASK=255.255.255.0 ONBOOT=yes BOOTPROTO=none

On va ensuite attribuer des interfaces physiques à cette interface virtuelle, en modifiant leurs propres fichiers de description :

# cat ifcfg-eth1 DEVICE=eth1 ONBOOT=yes BOOTPROTO=static MASTER=bond0 SLAVE=yes # cat ifcfg-eth2 DEVICE=eth2 ONBOOT=yes BOOTPROTO=static MASTER=bond0 SLAVE=yes

Observer une interface en bonding

Une fois l'interface montée, on peut l'observer dans /proc/net/bonding. Les adresses MAC sont anonymisées, mais à ce niveau, on voit les adresse physiques de chaque interface, sachant que le bond en lui-même ne présentera qu'une seule adresse MAC, celle de la première interface physique utilisée. Dans notre cas, il s'agit d'un bond actif/passif (voir ci-dessous pour plus de détails sur les modes) :

cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.2.4 (January 28, 2008) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eth1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eth1 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:24:81:xx:xx:xx Slave Interface: eth2 MII Status: up Link Failure Count: 0 Permanent HW addr: 00:24:81:xx:xx:xx

Manipulation du bonding

Il y a deux types de modifications spécifiques réalisables à chaud sur une interface en bonding :

  • ajout/suppression d'une interface physique au bond
  • changement de l'interface active du bond dans le cas d'un bond actif/passif

Suppression d'une interface physique du bond

# ifenslave -d bond0 eth2 # cat /proc/net/bonding/bond0 | grep Slave Primary Slave: None Currently Active Slave: eth1 Slave Interface: eth1

Ajout d'une interface physique au bond

# ifenslave bond0 eth2 # cat /proc/net/bonding/bond0 | grep Slave Primary Slave: None Currently Active Slave: eth1 Slave Interface: eth1 Slave Interface: eth2

Changement de l'interface active dans un bond actif/passif

# ifenslave -c bond0 eth2 # cat /proc/net/bonding/bond0 | grep Slave Primary Slave: None Currently Active Slave: eth2 Slave Interface: eth1 Slave Interface: eth2