El siguiente artículo explica cómo balancear la carga de red en una máquina Fedora (Linux), si bien se puede aplicar con pequeñas variaciones a otras distribuciones, de forma que podamos utilizar varios interfaces ethernet como si fueran uno sólo, dejando la sistema operativo la responsabilidad de balancear la carga de red entre los diferentes interfaces físicos.

Para realizar el ensayo trabajaremos con una máquina Fedora con una instalación mínima. En cualquier caso, es recomendable no utilizar NetworkManager (podría funcionar pero no lo he verificado). La idea es que tenemos una máquina/servidor con dos interfaces de ethernet y queremos balancear la carga entre los dos.

Procedimiento

El procedimiento se puede resumir en los siguiente pasos:

  1. Configurar un dispositivo lógico bond0 que será el interfaz maestro de las conexiones ethernet reales.
  2. Configurar cada interfaz ethernet física como esclava de bond0.
  3. Reiniciar el servicio de red, network.
  4. Verificar el estado del dispositivo.

1. Configurar el dispositico bond0

Para ello creamos y/o editamos los siguientes ficheros:

/etc/modprobe.d/bonding.conf
Este fichero configura el módulo del kernel asociado al dispositivo bond0, que representa la interfaz de red virtual que balancea la carga entre las interfaces de red físicas del sistema.

alias bond0 bonding
/etc/network-scripts/ifcfg-bond0
Este fichero contiene la configuración del dispositivo de red virtual, que será utilizado por el servicio network al levantar la interfaz.

NAME="Bonding device"
DEVICE=bond0
BONDING_OPTS="mode=5 miimon=100"
BOOTPROTO=dhcp
NM_CONTROLLED=no
ONBOOT=yes
USERCTL=no
DHCP_CLIENT_ID=<hostname>

De este fichero, la opción que más veces se puede tocar es el parámetro mode=5 de BONDING_OPTS, ya que determina la política de balanceo utilizada. Puede tomar estos valores:

mode=0
Estable una política round-robin para tolerancia a fallos y balanceo de carga. Las transmisiones se reciben y envían secuencialmente por cada uno de los interfaces esclavos vinculados, empezando por el primero disponible.
mode=1
Establece una política active-backup para tolerancia a fallos. Las transmisiones se reciben y envían siempre por el primer dispositivo esclavo vinculado disponible. Los otros interfaces vinculados sólo se utilizan si falla el interfaz activo.
mode=2
Establece una política XOR para tolerancia a fallos y balanceo de carga. Empleando este método la interfaz asocia la dirección MAC de las peticiones entrantes con la dirección MAC de uno de los NICs esclavos. Una vez que se establece el enlace, las transmisiones se envían secuencialmente empezando por el primer interfaz disponible.
mode=3
Estable una política broadcast para tolerancia a fallos. Todas las transmisiones son enviadas por todos los dispositivos esclavos.
mode=4
Establece una política IEEE 802.3ad de agregación de enlaces dinámica. Crea grupos de agregación que comparten la misma velocidad y configuración dúplex. Transmite y recibe por todos los esclavos del agregado activo. Requiere un switch que sea compatible con IEEE 802.3ad.
mode=5
Establece una política transmit load balancing (TLB) para tolerancia a fallos y balanceo de carga. El tráfico saliente se distribuye entre los distintos esclavos de acuerdo a su carga. El tráfico entrante se recibe a través del esclavo activo. Si el esclavo activo falla, otro esclavo toma la MAC del esclavo fallido.
mode=6
Estable una política active load balancing (ALB) para tolerancia a fallos y balanceo de carga. Incluye balanceo de carga de transmisiones y recepciones para el tráfico IPv4. El balanceo de carga entrante se consigue a través de negociación ARP.

2. Configurar cada interfaz ethernet física

Se debe editar y/o crear los ficheros correspondientes a cada dispositivo físico. Se debe tener en cuenta que a partir de Fedora 15, la denominación de las interfaces de red no siempre es eth0, eth1, etc., sino que depende del tipo de interfaz, así que previamente habrá que verificar qué dispositivos físicos son susceptibles de ser configurados (por ejemplo usando el comando ifconfig). Una vez que sepamos su nombre, los ficheros de configuración serán algo así:

/etc/network-scripts/ifcfg-eth?
Estos ficheros contienen la configuración de cada uno de los dispositivos de red físicos, que será utilizado por el servicio network al levantar la interfaz.

NAME="System eth?"
DEVICE=eth?
BOOTPROTO=none
ONBOOT=no
NM_CONTROLLED=no
UUID=<el que corresponda al dispositivo>
HWADDR=<la que corresponda al dispositivo>
USERCTL=no
SLAVE=yes
MASTER=bond0

3. Reiniciar el servicio de red, network

Una vez configurado, la nueva configuración debe activarse usando los comandos

# modprobe bonding
# service network start|restart

en donde usaremos restart o start en función de tuviéramos o no iniciado el servicio network. Insistir nuevamente en el método no ha sido probado si se usa NetworkManager en vez de network, y que es probable que no funcione.

4. Verificar el estado del dispositivo

Se puede revisar el estado del dispositivo bond0 consultando el fichero /proc/net/bonding/bond0, por ejemplo:

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: transmit load balancing
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth?
MII Status: up
Speed: Unknown
Duplex: Unknown
Link Failure Count: 0
Permanent HW addr: ??:??:??:??:??:??

Referencias

Para la preparación de esta instrucción técnica se han utilizado estas referencias externas: