Bonding o teaming: unire le interfacce linux in un unica interfaccia

I server sono spesso equipaggiati con più di una scheda di rete ( NIC: network inteface card ) per poter essere collegati in infrastrutture di rete ridondanti. Correttamente utilizzate queste schede posso garantire elevati livelli di servizio (SLA) e qualche preoccupazione in meno per il sistemista Linux.

Riporto a titolo di esempio un esempio di struttura ridondata:

Network Redudancy

Supponendo che il server possieda 2 interfacce di rete e che la tua infrastruttura di rete preveda la possibilità di collegare il server a due linee differenti es: due core o due switch ridondati (nell’eventualità che uno dei due si guasti o sia irraggiungibile il carico di lavoro viene gestito dall’altro) la configurazione in bind o team delle schede ti garantirà di non perdere connessione e assicurare un adeguato SLA in condizioni critiche ( con uno switch non funzionante ).

La prima operazione da compiere è creare una interfacccia virtuale di tipo bond, convenzionalmente essa viene definita bond0:

# vi /etc/sysconfig/network-scripts/ifcfg-bond0

il cui contenuto è il seguente:

DEVICE=bond0
IPADDR=192.168.1.2
NETWORK=192.168.1.0
NETMASK=255.255.255.0
USERCTL=no
BOOTPROTO=none
ONBOOT=yes

Le opzioni su cui mi soffermerò sono quelle direttamente legate al tipo di interfaccia utili allo scopo:
DEVICE: definisce il nome dell’interfaccia ( bond0 )
IPADDR: definisce l’IP che questa interfaccia assumerà, indipendentemente da quele NIC (eth0 o eth1) è utilizzato
ONBOOT: indica che tale scheda deve essere resa attiva quando si avvia il server

L’IPADDR deve contenere l’IP che intendi assegnare all’interfaccia di rete, similmente a come avresti fatto se avessi voluto assegnarlo ad una interfaccia fisica come la eth0; di conseguenza anche i parametri NETWORK e NETMASK devono essere impostati per lavorare nella tua rete.

Modifica quindi i file relativi alla configurazione delle schede Eth0 ed Eth1 come descritto di seguito:

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

In particolare le opzioni su cui prestare particolare attenzione sono DEVICE che assume il nome del device a cui la configurazione deve riferirsi, MASTER che indica il device utilizzato come master ossia la scheda che contiene i parametri di riferimento per il funzionamento del bonding o teaming e SLAVE che imposta ciascuna scheda in modalità slave della bond0.

L’operazione successiva consiste nell’impostare il caricamento del modulo e delle relative opzioni necessarie a Linux per inizializzare correttamente il binding delle interfacce, il file da modificare è il /etc/modprobe.conf aggiungendo le righe seguenti:

alias bond0 bonding
options bond0 mode=[modalità] miimon=100

La prima indica a Linux di caricare il modulo bonding con l’alias bond0, per convenzione o coerenza con il nome dell’interfaccia appena creata.
La seconda riga aggiunta inisica con quali opzioni vuoi che il modulo bonding sia caricato, in particolare il valore bond0 indica che tali opzioni sono valide per l’alias appena visto sopra, la modalità può essere specificata secondo una di quelle previste nel kernel, io faccio riferimento a questa pagina.
Tra le modalità disponibili c’è:

active-backup or 1

ogni modalità può essere impostata con la notazione alfabetica (active-backup) o con la notazione numerica (1), nell’esempio che sto descrivendo, dove l’esigenza è di garantire la continuità del servizio a fronte di una indisponibilità lato network di uno switch, la modalità più indicata è proprio l’active-backup che come recita il manuale consente di impostare le due interfacce in modo che siano una attiva e l’altra in stand-by in attesa di poter subentrare in caso di indisponibilità della scheda attiva.
Altre modalità consentono, ad esempio, di ottenere maggiori performance sfruttando l’aggragazione di più link, tale modalità prevede che anche gli switch lo supportino e cablaggi completamente differenti.
Tornando al comando options, l’ultima opzione impostata miimon imposta la frequenza (esperessa in intervallo in millisecondi) con cui il bonding deve essere monitorato per accorgersi della indisponibilità del link, come recita il manuale 100 è un buon punto di partenza, tale valore devi adattarlo alla tua rete valutando i tempi di latenza e la tipologia di rete stessa.

Se avessi creato anche una bond1 avresti dovuto aggiungere un alias e delle options per ciascuna bond, questo perchè potresti avere più di due NIC e volerle mettere in bonding in modalità differenti magari a due a due.
E’ il momento di testare la configurazione, prima di tutto il kernel deve caricare il modulo bonding e leggere le opzioni impostate per tale modulo:

# modprobe bonding

quindi riavviamo la rete per verificare che tutto funzioni correttamente:

# service network restart

Se tutto è stato impostato correttamente dovresti avere il seguente risultato:

# service network restart
Shutting down interface eth0:                             [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface bond0:                               [  OK  ]

ed eseguendo il comando:

# ifconfig

noteremo la presenza della nuova scheda bond0 oltre alle schede eth0 ed eth1, dolo la bond0 ha IP impostato (inet addr) mentre nella seconda riga delle schede eth0 ed eth1 troverai per entrambe:

UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1

Un’altra particolarità di questa configurazione  è che sia la bond0 sia le ethX hanno il medesimo HWaddr ossia il MAC ADDRESS della scheda attiva, normalmente la eth0, tale valore non cambia in caso di switch tra la eth0 e la eth1 per evitare confusione nella tabelle di arp e allarmi come tentativo di mac spoofing.

Per esehuire un test della configurazione e delle performance puoi edeguire un ping continuo al server da una schermata del pc con cui sei connesso, e disabilitare alternatamente la eth0 e la eth1 con i seguenti comandi:

# ifdown eth0
# ifup eth0
#
#
#
# ifdown eth1
# ifup eth1

ATTENZIONE: NON disabilitare contemporaneamente entrambe le schede ( ifdown eth0 e ifdown eth1) perderesti la connessione al server se sono le interfacce attraverso cui sei collegato in ssh.

Se i parametri di configurazione sono corretti non dovresti vedere variazioni al ping, mi è capitato di perdere 1 o 2 ping ad ogni ifdown, in tal caso puoi ritoccare il valore del paramero miimon in modo da ottenere una variazione impercettibile al ping.

Buon lavoro

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/informatica/bonding-o-teaming-unire-le-interfacce-linux-in-un-unica-interfaccia.html

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.