Uno no se imagina la potencia de GNU/Linux hasta que se enfrenta a los distintos retos que impone la evolución constante de las necesidades a nivel de la informática y los sistemas. En esta ocasión el reto es lograr que dos tarjetas de red funcionan en balanceo de cargas entre ellas.

Para realizar esto se crea lo que se conoce como "bonding", que no es más que una interfaz de red virtual que agrupa a las dos interfaces físicas que queremos balancear o agrupar para garantizar tolerancia a fallos.

Lo primero antes de comenzar es "googlear", en esa búsqueda me topé con esta guía de Phenobarbital y con esta wiki las cuales adapté a mis necesidades. Las dos guías comienzan instalando un paquete para que funcione el bonding, así que a continuación la tarea es hacer un:

apt-get install ifenslave

No hay necesidad de instalar una versión en particular ya que gracias a la "magia" de los .deb, el metapaquete ifenslave se encarga de instalar la versión actual. Descargado e instalado el paquete detenemos las interfaces de red.

ifdown eth0
/etc/init.d/networking stop

El ifdown se realiza para cada una de las interfaces involucradas en el bonding.

A continuación hay que configurar el módulo, hace un tiempo existía un archivo para ello, en las últimas versiones de Debian existe un directorio /etc/modprobe.d/ que contiene los módulos añadidos, así que como root creamos un nuevo archivo bonding.conf y agregamos las siguientes lineas:

options bonding mode=0 miimon=100 downdelay=200 updelay=200

Para algunos modos específicos es requerido agregar la interfaz maestra para el balanceo.

Los modos corresponden al tipo de balanceo que queremos realizar, puede ser:

- Balance-RR (0): Balance Round Robin, reparte secuencialmente el tráfico de red entre las interfaces disponibles en caso de fallar alguna de las dos, el tráfico solo se transmite por la que se encuentre en funcionamiento.

- Active-Backup (1): Establece una interfaz maestra y otra esclava, esta última toma el lugar de la maestra cuando está queda fuera de funcionamiento.

- Balance-Xor (2): Las transmisiones son balanceadas a través de las interfaces en modo Xor, es decir, la misma interface es seleccionado para cada destino único MAC.

- Broadcast (3): Transmite toda la carga a través de todas las interfaces activas.

También están los modos 4, 5 y 6 o 802.3ad, balance-TLB y balance-ALB respectivamente los cuales pueden consultar en la guía, ya que en mi caso no los exploré por los requerimientos de kernel y del dispositivo activo de red.

Los otros valores configurados del bonding son:

- miimon: El intervalo en milisegundos en que el sistema monitorea las interfaces para verificar que estén conectadas.

- downdelay: El tiempo de espera que se le dará a una interfaz para considerar que está desconectada.

- updelay: El tiempo de espera que se le dará a una interfaz para considerar que ya está conectada otra vez.

Luego de configurar el módulo, se configuran las interfaces:

auto bond0

iface bond0 inet static
address 192.68.1.5
netmask 255.255.255.0
network 192.168.1.0
gateway 192.168.1.1
slaves eth0 eth1
bond_mode balance-rr
bond_miimon 100
bond_downdelay 200
bond_updelay 200

Y para finalizar subimos la nueva interfaz bond e iniciamos el servicio de red:

ifup bond0
/etc/init.d/networking start