Bonding y Teaming de Red en Linux
El bonding y teaming de interfaces de red en Linux permiten combinar múltiples NICs en una sola interfaz lógica para conseguir alta disponibilidad mediante failover o mayor ancho de banda mediante agregación de enlaces. Esta guía cubre los modos de bonding más importantes (active-backup, LACP, round-robin), la configuración con NetworkManager y las pruebas de failover.
Requisitos Previos
- Ubuntu 20.04/22.04 o Debian 11/12 / CentOS 7/8 / Rocky Linux
- Acceso root
- Mínimo 2 interfaces de red (NICs) libres
- Si usas LACP (802.3ad): switch de red con soporte para LACP configurado
# Verificar las interfaces de red disponibles
ip link show
# Ver los módulos del kernel de bonding
lsmod | grep bonding
modprobe bonding
# Verificar que el módulo bonding está disponible
ls /sys/class/net/
Conceptos de Bonding
Los modos de bonding más utilizados:
| Modo | Nombre | Descripción | Requiere switch |
|---|---|---|---|
| 0 | round-robin | Balanceo de carga secuencial | No |
| 1 | active-backup | Failover: un enlace activo, resto en espera | No |
| 2 | balance-xor | Balanceo por hash MAC | No |
| 4 | 802.3ad (LACP) | Agregación dinámica estándar IEEE | Sí |
| 5 | balance-tlb | Balanceo adaptativo sin switch especial | No |
| 6 | balance-alb | Balanceo adaptativo completo | No |
Configuración de Bonding con ifupdown
# Instalar el paquete de bonding
apt install -y ifenslave
# Editar /etc/network/interfaces
cat << 'EOF' > /etc/network/interfaces
auto lo
iface lo inet loopback
# Interfaces esclavas (sin configuración IP propia)
auto eth0
iface eth0 inet manual
bond-master bond0
auto eth1
iface eth1 inet manual
bond-master bond0
# Interfaz de bonding
auto bond0
iface bond0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8 8.8.4.4
# Modo 1: active-backup (failover)
bond-mode active-backup
bond-miimon 100 # Verificar enlace cada 100ms
bond-updelay 200 # Tiempo antes de activar un enlace que vuelve
bond-downdelay 200 # Tiempo antes de marcar un enlace como caído
bond-slaves eth0 eth1
bond-primary eth0 # eth0 es el enlace primario preferido
EOF
# Activar la configuración
systemctl restart networking
# Verificar el estado del bond
cat /proc/net/bonding/bond0
Configuración con NetworkManager
NetworkManager es el método recomendado en sistemas modernos:
# Crear el bond con nmcli
nmcli connection add type bond \
con-name bond0 \
ifname bond0 \
bond.options "mode=active-backup,miimon=100,updelay=200,downdelay=200"
# Asignar una IP estática al bond
nmcli connection modify bond0 \
ipv4.method manual \
ipv4.addresses 192.168.1.10/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns 8.8.8.8
# Añadir las interfaces esclavas al bond
nmcli connection add type ethernet \
con-name bond0-slave-eth0 \
ifname eth0 \
master bond0
nmcli connection add type ethernet \
con-name bond0-slave-eth1 \
ifname eth1 \
master bond0
# Activar las conexiones
nmcli connection up bond0
nmcli connection up bond0-slave-eth0
nmcli connection up bond0-slave-eth1
# Verificar el estado
nmcli device status
cat /proc/net/bonding/bond0
Configurar bonding en modo LACP con nmcli:
# Crear bond en modo LACP (802.3ad)
nmcli connection add type bond \
con-name bond-lacp \
ifname bond0 \
bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4"
# Añadir esclavos
nmcli connection add type ethernet \
con-name bond-lacp-eth0 \
ifname eth0 \
master bond0
nmcli connection add type ethernet \
con-name bond-lacp-eth1 \
ifname eth1 \
master bond0
nmcli connection up bond-lacp
Modos de Bonding
Modo 1: active-backup - Recomendado para alta disponibilidad sin cambios en el switch:
# Configurar active-backup
nmcli connection modify bond0 \
bond.options "mode=active-backup,miimon=100,primary=eth0"
# Solo eth0 transmite; eth1 está en standby
# Si eth0 falla, eth1 toma el relevo automáticamente
Modo 4: 802.3ad (LACP) - Máximo rendimiento con switch compatible:
# LACP requiere configuración en el switch también
nmcli connection modify bond0 \
bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4"
# xmit_hash_policy=layer3+4 usa IP+puerto para el hash de balanceo
# Esto distribuye mejor las conexiones entre los dos enlaces
Modo 6: balance-alb - Balanceo de carga sin switch especial:
# balance-alb funciona sin configuración especial en el switch
nmcli connection modify bond0 \
bond.options "mode=balance-alb,miimon=100"
# Balancea tanto las transmisiones como las recepciones
# No requiere soporte LACP en el switch
LACP con switch gestionado
Configuración en el switch (ejemplo Cisco):
! Configuración del switch Cisco para LACP
! Crear el Port-Channel
interface Port-channel1
description "Bond con servidor Linux"
switchport mode trunk
switchport trunk allowed vlan 100,200,300
! Añadir las interfaces al Port-Channel con LACP activo
interface GigabitEthernet0/1
description "eth0 del servidor"
channel-group 1 mode active
interface GigabitEthernet0/2
description "eth1 del servidor"
channel-group 1 mode active
En el servidor Linux:
# Verificar que LACP está negociando correctamente
cat /proc/net/bonding/bond0 | grep -A5 "802.3ad"
# Ver el estado de LACP
cat /proc/net/bonding/bond0 | grep "LACP"
# El estado debe mostrar:
# MII Status: up
# Aggregator ID: mismo en ambos esclavos
Network Teaming con teamd
Teaming es una alternativa más moderna al bonding clásico:
# Instalar teamd
apt install -y libteam-utils
# Crear una interfaz de teaming en modo failover
nmcli connection add type team \
con-name equipo0 \
ifname team0 \
team.config '{"runner": {"name": "activebackup"}}'
# Asignar IP
nmcli connection modify equipo0 \
ipv4.method manual \
ipv4.addresses 192.168.1.10/24 \
ipv4.gateway 192.168.1.1
# Añadir puertos al equipo
nmcli connection add type team-slave \
con-name equipo0-eth0 \
ifname eth0 \
master team0
nmcli connection add type team-slave \
con-name equipo0-eth1 \
ifname eth1 \
master team0
nmcli connection up equipo0
# Ver el estado del equipo
teamdctl team0 state
Configuración LACP con teamd:
# Team en modo LACP
nmcli connection add type team \
con-name equipo-lacp \
ifname team1 \
team.config '{
"runner": {
"name": "lacp",
"active": true,
"fast_rate": true,
"tx_hash": ["eth", "ipv4", "ipv6", "tcp", "udp"]
},
"link_watch": {
"name": "ethtool",
"delay_up": 200,
"delay_down": 200
}
}'
Pruebas de Failover
# Prueba de failover - desactivar la interfaz primaria mientras hay tráfico
# Primero, iniciar un ping continuo desde otro host hacia el bond
# ping 192.168.1.10
# Ver el estado actual del bond
cat /proc/net/bonding/bond0 | grep "Currently Active Slave"
# Simular un fallo del enlace primario
ip link set eth0 down
# Verificar que el failover ocurrió (debe mostrar eth1 como activo)
cat /proc/net/bonding/bond0 | grep "Currently Active Slave"
# El ping debe continuar con una interrupción mínima (< 200ms)
# Restaurar el enlace primario
ip link set eth0 up
# Verificar que eth0 vuelve a ser el activo
cat /proc/net/bonding/bond0
# Prueba de failover forzado (modo active-backup)
# Cambiar el esclavo activo manualmente
echo eth1 > /sys/class/net/bond0/bonding/active_slave
# Ver el esclavo activo actual
cat /sys/class/net/bond0/bonding/active_slave
# Script de prueba de failover automatizada
cat << 'EOF' > /usr/local/bin/test-failover.sh
#!/bin/bash
# Prueba automática de failover del bond
BOND_IFACE="bond0"
SLAVE_IFACE="eth0"
TEST_IP="8.8.8.8"
echo "=== Prueba de Failover del Bond ==="
echo "Bond activo: $(cat /proc/net/bonding/${BOND_IFACE} | grep 'Currently Active')"
# Desactivar el esclavo primario
echo "Desactivando ${SLAVE_IFACE}..."
ip link set ${SLAVE_IFACE} down
# Esperar el failover
sleep 0.5
echo "Bond activo después del failover: $(cat /proc/net/bonding/${BOND_IFACE} | grep 'Currently Active')"
# Probar conectividad
if ping -c 3 -W 1 ${TEST_IP} > /dev/null 2>&1; then
echo "ÉXITO: La conectividad se mantuvo durante el failover"
else
echo "FALLO: Se perdió la conectividad durante el failover"
fi
# Restaurar la interfaz
echo "Restaurando ${SLAVE_IFACE}..."
ip link set ${SLAVE_IFACE} up
echo "Estado final: $(cat /proc/net/bonding/${BOND_IFACE} | grep 'Currently Active')"
EOF
chmod +x /usr/local/bin/test-failover.sh
Solución de Problemas
# Ver el estado detallado del bond
cat /proc/net/bonding/bond0
# Ver los eventos del bond en los logs del sistema
dmesg | grep -i bond
journalctl -k | grep bond
# Verificar la detección de enlace MII
ethtool eth0 | grep "Link detected"
ethtool eth1 | grep "Link detected"
# Ver estadísticas de los puertos
ip -s link show bond0
ip -s link show eth0
# Verificar la negociación LACP (modo 802.3ad)
cat /proc/net/bonding/bond0 | grep -A 20 "Slave Interface: eth0"
# Comprobar que las interfaces están en el bond
ls /sys/class/net/bond0/bonding/slaves
# Error "cannot enslave eth0: eth0 is already a slave"
# Liberar la interfaz primero
nmcli connection delete bond0-slave-eth0
nmcli connection add type ethernet con-name bond0-slave-eth0 ifname eth0 master bond0
Conclusión
El bonding y teaming de red son componentes esenciales para cualquier servidor de producción que requiera alta disponibilidad o mayor rendimiento de red. El modo active-backup es el más sencillo de configurar y no requiere soporte en el switch, siendo ideal para la mayoría de los casos de uso. LACP ofrece el máximo rendimiento cuando el switch lo soporta, especialmente con cargas de trabajo que generan múltiples flujos de red. Sea cual sea el modo elegido, las pruebas regulares de failover son imprescindibles para garantizar que el sistema funciona correctamente cuando más se necesita.


