Réseau : créer un bonding

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Le Channel bonding, aussi appelé Port trucking, permet d’appliquer une série de politiques prédéfinies sur un ensemble de liens réseaux regroupés en un seul. Ce groupe d’interfaces réseaux vous donne la possibilité d’effectuer du load-balancing et surtout de la tolérance aux pannes. 7 modes de fonctionnements sont disponibles pour vous permettre d’allier nécessité et flexibilité. Nous allons étudier à travers cet article les possibilités offertes et leurs mises en application

2 Installation

2.1 Prérequis

Deux prérequis apparaissent au niveau du switch réseau, où sont connectés les interfaces :

  • support et configuration du mode "port truking" sur les ports utilisés
  • support de la norme IEEE 802.3ad

Pour votre système linux, il vous faut : Des cartes réseaux (compatibles ethtools et miitools de préférences).

Module bonding pour le kernel.

  • Kernel 2.4.x
[*] Network device support
<M> Bonding driver support
  • Kernel 2.6.x
[*] Networking support
<M> Bonding driver support
Command apt-get
aptitude install ifenslave-2.6

3 ethtools et miitools

Le driver bonding est capable de ne passer que sur une seule interface si un câble se débranche. Sachant que les pannes sur un serveur sont le plus souvent matérielles, cela permet une haute disponibilité. A noter deux petits outils permettant d’interroger les registres ETHTOOL et MII des cartes réseaux. Les outils sont donc mii-tool (issu du package net-tools) et ethtool. Toutes les interfaces ne supportent pas ces registres, dans ce cas on ne peut pas détecter la déconnexion (en fait il existe une solution en utilisant les requêtes ARP mais ça ne rentre pas dans ce cadre). Pour utiliser cette fonction du bonding il faut utiliser des modes tel que active-backup, pour plus d’info lisez la doc :).

3.1 MII

Command mii-tool
> mii-tool eth0
eth0: negotiated 100baseTx-FD, link ok

Command mii-tool
> mii-tool eth1
eth1: negotiated 100baseTx-FD flow-control, link ok

3.2 Ethtool

Avec la carte dual Interl pro :

Command ethtool
> ethtool eth2
Settings for eth2:
      Supported ports:  TP MII
      Supported link modes:   10baseT/Half 10baseT/Full
                              100baseT/Half 100baseT/Full
      Supports auto-negotiation: Yes
      Advertised link modes:  10baseT/Half 10baseT/Full
                              100baseT/Half 100baseT/Full
      Advertised auto-negotiation: Yes
      Speed: 100Mb/s
      Duplex: Full
      Port: Twisted Pair
      PHYAD: 1
      Transceiver: internal
      Auto-negotiation: on
      Supports Wake-on: pg
      Wake-on: d
      Link detected: yes

Avec la carte 3Com, ça ne fonctionne pas

Command ethtool
> ethtool eth0
Settings for eth0:
No data available

4 Les différents modes

Nous allons voir dans ce chapitre les différents modes proposés par le module bonding :

Nom Mode Description
balance-rr: l'équilibrage de charge 0 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.
active-backup: la sauvegarde active 1 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.
balance-xor: la balance Xor 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.
broadcast: le broadcast 3 Aucune particularité dans ce cas, toutes les données sont transmises sur toutes les interfaces actives. Aucune autre règle.
802.3ad: la norme 802.3ad 4 La norme 802.3ad permet l’aggrégation des liens, élargissant dynamiquement la bande passante. Les groupes sont créés dynamiquement sur la base d’un paramètrage commun.
balance-tlb: la balance TLB 5 "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.
balance-alb: la balance ALB 6 "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.

5 Mise en oeuvre

5.1 Présentation par un script

ATTENTION j’utilise le mode0  ! Ceci n’est possible que si chaque interface est sur une switch différent, si non gare à la duplication de paquet.

voyons un script minimal :

Configuration File script_bonding.sh
#!/bin/bash
#Chargement du module bonding.
modprobe bonding mode=0 miimon=100
# On ferme les deux interfaces ethernet
ifconfig eth0 down       
ifconfig eth1 down       
# On crée une interface bond0, qui recoit une adresse Mac bidon (cela va changer)
ifconfig bond0
# On lance l'interface, comme s'il s'agit d'une interface ethernet
ifconfig bond0 192.168.0.4 netmask 255.255.255.0
# On ajoute les interfaces à bond0
ifenslave bond0 eth0
ifenslave bond0 eth1

Voyons de plus près :

  • Chargement du module :

Deux options ont été inclues ici : mode (load balancing round-robin) et miimon (Fréquence de surveillance des interfaces)
Il est possible de mettre dans le fichier /etc/modules.conf le chargement du module bonding ou dans /etc/modprobe.d/arch/i386 :

Configuration File /etc/modules.conf
alias bond0 bonding
options bond0 mode=0 miimon=100

Ce premier exemple montre le cas d’un seul bonding. Il est en effet possible de mettre plusieurs bonding avec des modes différents.
Pour cela modifions le /etc/modules.conf en conséquence :

Configuration File /etc/modules.conf
alias bond0 bonding
options bond0 -o bond0 mode=2 miimon=100 primary=eth1 max_bonds=2

  • primary=eth1 : permet de forcer l'interface eth1 a être primaire
  • max_bonds=2 : permet d'avoir 2 bonds (donc 4 interfaces mais 2 bond). Il suffit d'augmenter ce numéro si vous voulez plusieurs bonds.
  • -o bond0 : ceci est indispensable si vous voulez utiliser plusieurs bond ! Il faudra alors spécifier bond0, bond1, bond2...

5.2 Ajout des interfaces dans bond0

La commande ifenslave nous permet d’ajouter à bond0 les interfaces ethernet (appelées alors interfaces esclaves). Lors de l’ajout de la première interface réseau dans bond0, ce dernier prend l’adresse MAC de cette interface. Les autres interfaces perdent alors leurs adresses MAC, recouvertes par celle de l’interface bond0.

Pour enlever une interface, il suffit de lancer la commande :

Command ifenslave
ifenslave -d bondx ethx

Le module bonding redonne alors à ethX sa vraie adresse MAC. Si on enlève la première adresse MAC (celle utilisée par bond0), alors bond0 récupère celle de eth1.

Pour vérifier notre bonding :

Command cat
> cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v2.5.0 (December 1, 2003)
 
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
 
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
 
Slave Interface: eth1
MII Status: up
Link Failure Count: 0

5.3 Fichiers de configuration automatique

5.3.1 Red Hat

Si vous êtes sur RHEL 6, dans le fichier /etc/modprobe.d/bonding.conf, on créer la ligne suivante :

Configuration File /etc/modprobe.d/bonding.conf
alias bond0 bonding

Si vous êtes sur RHEL <6, ce sera dans le fichier /etc/modprobes.conf qu'il faudra insérer ce même contenu.

Dans /etc/sysconfig/network-script/, créer le fichier ifcfg-bond0 pour y inscrire la configuration du bonding :

Configuration File /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
IPADDR=192.168.0.104
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
ONBOOT=yes
BOOTPROTO=static
BONDING_OPTS="mode 1"

Puis nous allons passer sur nos interfaces réseaux pour leurs dire qu'elles vont être utilisées pour faire du bonding :

Configuration File /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
MASTER=bond0
ONBOOT=yes
SLAVE=yes
BOOTPROTO=static

Faites pareil pour l'interface 1 :

Configuration File /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
MASTER=bond0
ONBOOT=yes
SLAVE=yes
BOOTPROTO=static

5.3.2 Debian

Voici les fichiers à modifier pour charger au démarage votre configuration rajoutez dans /etc/modules.conf ou /etc/modprobe.d/arch/i386 :

Configuration File /etc/modules.conf
alias bond0 bonding
options bond0 mode=0 miimon=100

Dans /etc/network/interfaces :

Configuration File /etc/network/interfaces
auto bond0
 
iface bond0 inet static
    address 10.31.1.5
    netmask 255.255.255.0
    network 10.31.1.0
    gateway 10.31.1.254
    slaves eth0 eth1
    bond_mode active-backup
    bond_miimon 100
    bond_downdelay 200
    bond_updelay 200

5.4 Options du module bonding

Voici donc une série d’options les plus utilisées pour le module bonding qui permet d’ajuster finement le fonctionnement de votre bonding :

Paramètre Description
Primary Uniquement pour active-backup. Favorise une interface esclave. Celle-ci redeviendra active dès qu’elle le peut, même si une autre interface est active.
updelay (0 par défaut) Temps de latence entre la découverte de la reconnexion d’une interface et de sa ré-utilisation.
downdelay (0 par défaut) Temps de latence entre la découverte de la déconnexion d’une interface et de sa désactivation de bond0.
miimon (0 par défaut) Fréquence de surveillance des interfaces par Mii ou ethtool. La valeur conseillée est 100.
use_carrier (1 par défaut) Spécifie l'utilisation de la surveillance des interfaces par miitool ou par la carte réseau elle même (nécessite les instructions intégrées).
arp_interval (en ms) Système de surveillance par ARP, évitant l’utilisation de miitool et ethtool. Si aucune trame est arrivée pendant l’arp_interval, on envoie par cette interface jusqu’à 16 requêtes ARP à 16 adresses IP. Si aucune réponse n’est obtenue, l’interface est désactivée.
arp_ip_target Liste des adresses IP, séparées par une virgule, utilisée par la surveillance ARP. Si aucune n’est renseignée, la surveillance ARP est inactive

Si vous souhaitez la liste complète des options, vous pouvez l'obtenir de cette façon :

Command modinfo
> modinfo bonding
filename:       /lib/modules/2.6.32-220.el6.x86_64/kernel/drivers/net/bonding/bonding.ko
author:         Thomas Davis, [email protected] and many others
description:    Ethernet Channel Bonding Driver, v3.6.0
version:        3.6.0
license:        GPL
srcversion:     B956376CB253D2B7312733C
depends:        ipv6
vermagic:       2.6.32-220.el6.x86_64 SMP mod_unload modversions 
parm:           max_bonds:Max number of bonded devices (int)
parm:           tx_queues:Max number of transmit queues (default = 16) (int)
parm:           num_grat_arp:Number of gratuitous ARP packets to send on failover event (int)
parm:           num_unsol_na:Number of unsolicited IPv6 Neighbor Advertisements packets to send on failover event (int)
parm:           miimon:Link check interval in milliseconds (int)
parm:           updelay:Delay before considering link up, in milliseconds (int)
parm:           downdelay:Delay before considering link down, in milliseconds (int)
parm:           use_carrier:Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default) (int)
parm:           mode:Mode of operation; 0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb (charp)
parm:           primary:Primary network device to use (charp)
parm:           primary_reselect:Reselect primary slave once it comes up; 0 for always (default), 1 for only if speed of primary is better, 2 for only on active slave failure (charp)
parm:           lacp_rate:LACPDU tx rate to request from 802.3ad partner; 0 for slow, 1 for fast (charp)
parm:           ad_select:803.ad aggregation selection logic; 0 for stable (default), 1 for bandwidth, 2 for count (charp)
parm:           xmit_hash_policy:balance-xor and 802.3ad hashing method; 0 for layer 2 (default), 1 for layer 3+4, 2 for layer 2+3 (charp)
parm:           arp_interval:arp interval in milliseconds (int)
parm:           arp_ip_target:arp targets in n.n.n.n form (array of charp)
parm:           arp_validate:validate src/dst of ARP probes; 0 for none (default), 1 for active, 2 for backup, 3 for all (charp)
parm:           fail_over_mac:For active-backup, do not set all slaves to the same MAC; 0 for none (default), 1 for active, 2 for follow (charp)
parm:           all_slaves_active:Keep all frames received on an interfaceby setting active flag for all slaves; 0 for never (default), 1 for always. (int)
parm:           resend_igmp:Number of IGMP membership reports to send on link failure (int)

6 Quelques exemples

Une simple redondance avec priorité sur eth1 :

Command bonding.sh
#!/bin/bash
modprobe bonding -o bond0 mode=1 miimon=100 priority=eth1
ifconfig eth0 down       
ifconfig eth1 down       
ifconfig bond0
ifconfig bond0 192.168.0.4 netmask 255.255.255.0
ifenslave bond0 eth0
ifenslave bond0 eth1

Un équilibrage de charge avec vérification par requêtes ARP :

Command bonding.sh
#!/bin/bash
modprobe bonding -o bond1 mode=0 arp_interval=1000 arp_ip_target=x.x.x.x
ifconfig eth0 down       
ifconfig eth1 down       
ifconfig eth2 down
ifconfig bond1
ifconfig bond1 192.168.1.5 netmask 255.255.255.0
ifenslave bond1 eth0
ifenslave bond1 eth1
ifenslave bond1 eth2

7 Tableau récapitulatif des modes

Voici les différents modes proposés par le module bonding avec le support du load balancing :

Mode Load-Balancing
0 entrante
1 aucune
2 entrante
3 aucune
4 aucune
5 entrante
6 entrante et sortante

8 Conclusion

La redondance des cartes réseaux est souvent perçue comme inutile et couteuse malgré une installation simple. Avec ces 7 modes de fonctionnements, vous avez la possibilité d’obtenir une interface réseau haute disponibilité, répondant même à des besoins précis pour le load-balancing. Alors pourquoi s’en priver ?


9 Autres documentations

Documentation bonding sur Ubuntu
http://www.linux-foundation.org/en/Net:Bonding
NIC Bonding On Debian Lenny
http://bisscuitt.blogspot.fr/2007/10/redhat-linux-rhel-4-nic-bonding.html