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=eth0Las 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=100alias 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 150Y 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 eth1Y 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:03Donde 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:
- Debian Network Configuration: http://wiki.debian.org/NetworkConfiguration
- Ethernet bonding (debian help): http://www.debianhelp.co.uk/bonding.htm
- Referencia: http://tuxjm.net/docs/Configuracion_Canal_Linux_Bonding_Active-Backup_en_Ubuntu_Server/
Excelente jesus! Muchas gracias por publicar esta guia! nunca esta de mas contar con informacion sencilla y digerible.
Excelente artículo, muchas gracias, es un deleite visitar tu blog !
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 .
Gracias por la nota! Muy completa y justo para Debian 🙂
Excelente Doña, una pregunta, has logrado hacer el bonding en xen?
Si, de hecho, para eso es que los uso …
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.
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!