[Linux] Guía rápida de Network bonding en Debian

Introducción

Esta guía no pretende ser guía definitiva ni tampoco ser ampliamente técnica, es más bien una forma de documentar «para los demás» algo que uno hace día tras día y aunque está profusamente documentado en Internet, es bueno repasarlo un poco.

De hecho, esta guía nace de tener que explicarle a los que trabajan en Redes de mi trabajo (¿O.o?) cómo se hacía un bonding y un bond en trunk contra una VLAN.

Espero les sirva a muchos, en especial a mi pana Mario Bilotti que la pidió expresamente.

¿Qué es un Bonding?

Ethernet Bonding o simplemente Bonding (enlazado) es cuando dos canales ethernet se juntan (enlazan) para crear un canal simple (obviamente más ancho). Esto se usa primariamente para redundancia en los paths ethernet al switch y también para balanceo de carga.

Hablando en criollo, cuando tienes dos o más interfaces físicas de red, puedes «enlazarlas» para crear una única interfaz que te permita ampliar el ancho de banda, mejorar la redundancia y acceso a la red y para lograr un balanceo de carga sobre una misma subred desde dos o más interfaces.

 Terminología:

  • * Esclava: interfaz conectada a un bonding
  • * Esclava primaria: interfaz esclava que se encuentra activa por defecto
  • * Balanceo de carga: permitir que una carga de transmisión sea distribuida entre dos o más canales ethernet
  • * Mac Address: dirección física de la interfaz de red

Tipos de Bonding

Active-Backup: una interfaz esclava del bonding es activa en todo momento, mientras la otra permanece en estado «pasivo». Cuando la interfaz activa primaria falla, la otra interfaz toma la MAC Address y se convierte en la interfaz activa.

  • Provee: Tolerancia a fallos únicamente
  • Requiere: no requiere ningún soporte especial en el switch

Balance-RR (balance Round Robin): transmite paquetes de manera secuencial entre todos los esclavos disponibles.

  • Provee: balanceo de carga y tolerancia a fallos

Balance-Xor: Las transmisiones son balanceadas a través de las interfaces esclavas en modo Xor, es decir, el mismo esclavo es seleccionado para cada destino único MAC.

  • Provee: tolerancia a fallos y balanceo basado en el destino

Broadcast: Transmite toda la carga a través de todas las interfaces esclavas activas.

  • Provee: Tolerancia a fallos

802.3ad o modo 4: Modo IEEE Dynamic Link Aggregation, permite gestionar el balanceo, la velocidad y el duplex de la interfaz, pero requiere que el módulo del kernel y el switch lo soporten.

  • Provee: Balanceo de Carga
  • Requiere: Soporte a 802.3ad en el Switch

balance-TLB (Adaptative Transmit Load-Balance): Es transmitido de acuerdo a la actual carga de las interfaces; el tráfico que recibes es gestionado por una única interfaz esclava activa, el tráfico de salida es enviado a través de el resto de las interfaces esclavas, determinado por la carga activa de cada interfaz.

  • Provee: Balanceo de Carga distribuido
  • Requiere: no requiere ningún soporte en el switch

balance-ALB (Adaptative Load-Balancing): provee ambos modos de balanceo de carga (recepción y emisión) para IPv4 a través de negociación ARP.

  • Provee: Balanceo de Carga distribuido
  • Requiere: no requiere nada especial en el switch, pero el módulo del kernel debe soportar cambio de Mac Address en caliente (mientras la interfaz esté abierta).

 Configurando el bonding en Debian Squeeze

Debemos primero, instalar lo necesario:

apt-get install vlan ifenslave-2.6

Y agregamos los módulos a /etc/modules:

  • 8021q
  • bonding

802.1q es el módulo de trunk/vlan y el otro es el módulo de bonding.

Configurando el módulo del kernel

creamos el archivo /etc/modprobe.d/bonding.conf

Y agregamos:

options bonding mode=active-backup miimon=100 downdelay=200 updelay=200 primary=eth0

Las opciones son:

  • mode: el modo, corresponde al modo de bonding explicado más arriba
  • downdelay: la cantidad de milisegundos que espera antes de declarar una interfaz «caída» y asumir el control la otra interfaz
  • updelay: cantidad de milisegundos que espera antes de declarar una interfaz arriba (*)
  • miimon: tiempo de monitoreo del enlace (Link) de la interfaz, en milisegundos
  • primary: qué interfaz es la primaria

(*) esto es debido a que algunas interfaces tardan más tiempo que otras en declarar que están activas y enlazadas.

De requerir más de un bond, agregamos al /etc/modprobe.d/bonding.conf:

options bonding max_bonds=2
alias bond0 bonding
options bond0 -o bond0 mode=balance-rr miimon=100
alias bond1 bonding
options bond1 -o bond1 mode=balance-xor miimon=50 

 Donde max_bonds corresponde a la cantidad máxima de bonds que se crearán (con los nombres bond0, bond1, etc)

Luego de configurado (a nivel de módulo del kernel) el módulo bonding, procedemos a configurar las interfaces bond en:

/etc/network/interfaces

auto bond0
iface bond0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.0
network xxx.xxx.xxx.0
broadcast xxx.xxx.xxx.255
gateway xxx.xxx.xxx.1
slaves eth0 eth1
bond_mode active-backup
bond_miimon 100
bond_downdelay 150

Y reiniciamos el servicio de red:

/etc/init.d/networking restart

También podemos configurar manualmente sin necesidad de de editar el network/interfaces del equipo, para ello:

* cargamos el módulo:

modprobe bonding mode=0 miimon=100

* Apagamos las interfaces que deseamos configurar en bond:

ifconfig eth0 down
ifconfig eth1 down
ifconfig eth2 down

* Configuramos la interfaz bond0

ifconfig bond0 hw ether 00:11:22:33:44:55
ifconfig bond0 10.1.1.3 netmask 255.255.255.0

Luego, indicamos cuales interfaces serán esclavas con el comando ifenslave:

ifenslave bond0 eth1
ifenslave bond0 eth0
ifenslave bond0 eth2

Y por último, encendemos la interfaz bond0:

ifconfig bond0 up

Y listo.

Nota: también podemos gestionar la incorporación o remoción de interfaces esclavas de un bond interactuando con el módulo del kernel:

# incorporando eth0 al bond0

echo +eth0 > /sys/class/net/bond0/bonding/slaves

# desincorporando eth0 del bond0

echo -eth0 > /sys/class/net/bond0/bonding/slaves

 Configurando un Bond en una VLAN

Queremos hacer que el bond0 participe de una VLAN, en mi caso, la VLAN 16; configuraremos el network/interfaces para que esta interfaz pueda participar (usando vconfig) conectada a la VLAN 16.

Abrimos el /etc/network/interfaces y configuramos manualmente el bond0:

auto bond0
iface bond0 inet manual
up ifconfig bond0 0.0.0.0 up
slaves eth0 eth1

Y configuramos la interfaz bond0.v16 como objetivo a la VLAN 16:

auto bond0.v16
iface bond0.v16 inet static
address xxx.xxx.xxx.xxx
netmask 255.xxx.xxx.xxx
network xxx.xxx.xxx.0
gateway xxx.xxx.xxx.1
broadcast xxx.xxx.xxx.255
vlan-raw-device bond0
pre-up /sbin/vconfig add bond0 16
down /sbin/vconfig rem bond0.v16
hwaddress ether 00:AB:AB:01:00:03
 

Donde hwaddress es la dirección MAC de la interfaz primaria del bond0.

Pruebas

Podemos chequear el estado de un bond ejecutando:

cat /proc/net/bonding/bond0

Además, podemos probar los distintos modos apagando (ifconfig *iface* down) las interfaces esclavas del bond para chequear su comportamiento.

 

Espero les sea útil esta guía …!

Referencias:

9 comentarios sobre “[Linux] Guía rápida de Network bonding en Debian

  1. La vinculacion de puertos nos permite crear tuberias multi-gigabit para solucionar la congestion en las areas de mayor trafico de la red. Para una mejor documentacion puede ir a la pagina del Proyecto de Vinculacion del Canal de Linux .

  2. Muchas gracias por esta página. Me ha aclarado muchas dudas. Sólo tengo una: si tenemos dos tarjetas de red con su IP, etc y deseo establecer el bonding entre ellas, ¿necesitaría nuevas Ip, máscara etc o podría utilizar las ya existentes?
    Gracias.

    1. Recuerda que un bonding se «ve» como si fuera una tarjeta física, por ende, la tarjeta tendría alguna de las 2 IPs que le tienes asignada, la otra IP pudieras asignarla como IP «virtual» vía un alias del propio bonding, ejemplo:
      inet bond0: IP1
      inet bond0.1: IP2
      Saludos!

Deja un comentario