Hoy en día, todos los sistemas informáticos están redundados con el fin de garantizar un >99,9% de disponibilidad. Al igual que un RAID garantiza el acceso y salvaguarda la información de la información de los discos, un Bonding de interfaces de red, garantiza que un sistema esté siempre accesible a través de una red informática. Si alguna vez te has preguntado como se hace esto, os enseñaré con este pequeño tutorial como se consigue tener HA (high availability) en un servidor con 2 interfaces de red físicas las cuales haremos que formen parte de un Bond.
Contenido
El bonding de interfaces de red es la solución para tener alta disponibilidad y redundancia en los servidores donde realmente la conectividad sea un factor crítico, como en servidores que ofrecen servicios a clientes (servidores web, ftps, bases de datos etc...). Gracias al bonding, podremos agrupar varias interfaces de red físicas en una para conseguir un HA o incrementar el throughput de red.
En este pequeño tutorial os enseñaré como configurar dos interfaces de red para formar un bond en un sistema GNU/Linux Debian. Usaremos el software ifenslave el cual se encargará de añadir/remover/gestionar las tarjetas físicas que forman el bond. Una vez que el bond se configure y se active, comenzará a trabajar como si fuera un dispositivo físico de red como puede eser eth0, eth1 ...
Lo primero que tenemos que hacer antes de proceder a realizar ninguna configuración, es determinar el tipo de bonding que necesitamos para nuestro equipo y nuestras necesidades. Existen 6 tipos de bondings soportados por el Kernel de GNU/Linux. Algunos de estos modos de "bonding" requieren solamente de una pequeña configuración en los equipos, pero otros requieren configuraciones especiales en los switches que establecen los links.
Este modalidad de bonding se la llama ‘Round-Robin‘. Con este método, los paquetes de red enviados son rotados entre cada una de las tarjetas que forman la interfaz del bond.
Por ejemplo, en un equipo con 4 interfaces de red eth0, eth1, eth2 y eth3 todas ellas como "esclavas" de la interfaz bond0. Cuando establecemos el bond en modo 0 (Round-Robin), el primer paquete se enviará por la interfaz eth0, el segundo por eth1, el tercero por eth2 y el 4 de nuevo por eth0.
Con esta modalidad de bonding, solo una de las interfaces está activa mientras que la otra estará en modo de "espera" hasta que la interfaz activa falle por algún motivo. Cuando falla la interfaz de red activa, la otra interfaz que está de backup asume el rol y se pone en activa.
Este método evalúa el origen y el destino de los paquetes en función de la "mac address" para determinar a través de que interfaz de red del bond enviará los paquetes. Este método enviará los paquetes por la misma interfaz que tengan el mismo origen y destino. De esta forma conseguimos una especie de balanceo y tolerancia a fallos.
Transmite todas las tramas por todas las interfaces slave. Este modo nos ofrece tolerancia a fallos
Se trata del estandard IEEE 802.3ad (Dynamic link aggregation) también llamado “port trunking“. Permite la definición de agregados ofreciendo alta disponibilidad y un aumento de la velocidad. Para poder configurar este modo necesitamos:
Este modo transmite balanceando la carga entre los slave en función de la carga de cada slave. En el caso que uno falle la MAC salta a otro slave. Para calcular la carga de cada interfaz es necesario disponer de ethtool.
A diferencia de 802.3ad no se necesario soporte del switch para esta configuración.
Tenemos que tener en cuenta que puede producirse que los paquetes lleguen desordenados, por lo que puede ser peor el remedio que la enfermedad, especialmente en entornos de red complejos.
Balanceo de carga tanto en el envío como en la recepción. Para el balanceo de carga en la recepción lo que se hace es manipulando los replies ARP para indicar una MAC en concreto de una de las interfaces slave.
Deberemos tener en cuenta que cualquier sistema de seguridad basado en las tablas ARP puede quejarse o simplemente tirar el puerto de la interfaz dejando el servidor sin conectividad.
El primer paso se centra en instalar el paquete "ifenslave", encargado de funcionar como parte mediadora entre el bonding y el kernel de GNU/Linux. Lo instalaremos con usuario root ó con otro usuario con permisos de sudo:
# apt-get update# apt-get install ifenslave
Una vez hemos terminado de instalar el paquete ifenslave, necesitamos configurar nuestro equipo para que una vez que se reinicie, el Kernel cargue el módulo necesario para gestionar el bonding. Para ello, bastará con añadir la palabra "bonding" al fichero /etc/modules:
# echo "bonding" >> /etc/modules
Activamos el módulo a mano para proceder a configurar el bonding en los pasos posteriores:
# modprobe bonding
Comprobamos que el módulo está cargado:
# lsmod | grep bonding
Ahora necesitamos crear la configuración necesaria para activar nuestro bonding de interfaces de red. En este ejemplo crearé un bonding de tipo 1, es decir activo-pasivo y probaremos que funciona correctamente. La configuración de red en GNU/Linux Debian se realiza en el fichero /etc/network/interfaces y las 2 interfaces que formarán el bonding son eth0 y eth1. La parte de configuración del bond0 en el fichero de configuración queda de la siguiente forma:
iface bond0 inet static address 192.168.0.187 netmask 255.255.255.0 network 192.168.0.0 gateway 192.168.0.1 slaves eth0 eth1 bond_mode 1 bond_miimon 100 bond_downdelay 200 bond_updelay 200
Una vez hemos realizado los cambios en el fichero de configuración, reiniciaremos la red con el comando:
# /etc/init.d/networking restart
Ahora listaremos las interfaces de red y veremos como tenemos: eth0, eth1, bond0 y el loopback:
# ifconfig -a

Listado de interfaces
El estado del bonding podemos comprobarlo a través del fichero /proc/net/bonding/bond0:
# cat /proc/net/bonding/bond0

Estado del bond0
Abriremos una consola Shell y haremos ping de forma continua hacia Google, por ejemplo:
# ping 8.8.8.8

Ping a Google 2 interfaces UP
Ahora mismo el tráfico está saliendo por una de las 2 interfaces de red. Ambas están UP pero es el bond quién gestiona por cual de ellas sale el tráfico. Podemos indicarle una interfaz preferida en el fichero /etc/network/interfaces con la opción de bond_primary.
Lo siguiente que haremos será desconectar la interfaz de red eth0. Como estoy virtualizando el equipo GNU/Linux Debiancon VMWARE WORKSTATION 11, iré a la configuración de la VM y desconectaré la primera interfaz eth0:

Desconectamos la interfaz de red
La interfaz que está como SLAVE RUNNING es la interfaz eth0 y como SLAVE es la eth1. Podemos verlo con el comando "ifconfig". Con el PING funcionando a Google y desconectando la interfaz eth0 (SLAVE RUNNING), veremos como la intarfaz "cae" pero el PING se recupera y el tráfico lo asume la eth1 (SLAVE ahora nueva SLAVE RUNNING):

Ping a Google se recupera por la interfaz pasiva/slave
Si hacemos un ifconfig, podemos ver como ahora eth0 es la interfaz SLAVE y la eth1 la interfaz SLAVE RUNNING:

Estado del bond tras la desactivación de eth0
El estado del bonding podemos comprobarlo a través del fichero /proc/net/bonding/bond0. Ahora se puede ver que eth0 está DOWN:
# cat /proc/net/bonding/bond0

Estado del bond0
Estos mismos pasos podemos hacerlos con la interfaz eth1, pero debemos tener en cuenta que al estar en modo 1 (activo-pasivo), al menos una de las 2 interfaces de red debe estar UP&RUNNING para que la conectividad funcione correctamente.
BONDING balance-rr
El siguiente paso es la parametrización de la nueva interfaz de red y eliminar (o comentar) todas las referencias a las interfaces físicas que utilizará la nueva interfaz. Estas modificaciones se realizan, por supuesto, en el fichero /etc/network/interfaces:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface # allow-hotplug eth0 # iface eth0 inet dhcp # Static IP address # auto eth0 # iface eth0 inet static # address 192.168.1.100 # netmask 255.255.255.0 # network 192.168.1.0 # broadcast 192.168.1.255 # gateway 192.168.1.1 # Interface bonding # Static IP address auto bond0 iface bond0 inet static slaves eth0 eth1 bond-mode balance-rr bond-miimon 100 bond_downdelay 200 bond_updelay 200 address 192.168.1.100 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1
El parámetro de modo de enlace bond-mode balance-rr indica que la interfaz funcionará en modo de balance-rr, en el que los datos se transmiten alternativamente por las diferentes interfaces físicas que componen la nueva interfaz bond0.
Por último, hay que reiniciar los servicios de red:
root@server:~# service networking restart
El comando ifconfig le permite comprobar el estado de las interfaces de red:
root@server:~# ifconfig bond0 Link encap:Ethernet HWaddr 08:00:27:69:7a:b5 inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1 RX packets:47 errors:0 dropped:0 overruns:0 frame:0 TX packets:62 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:5803 (5.6 KiB) TX bytes:8608 (8.4 KiB) eth0 Link encap:Ethernet HWaddr 08:00:27:69:7a:b5 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:44 errors:0 dropped:0 overruns:0 frame:0 TX packets:31 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5601 (5.4 KiB) TX bytes:2842 (2.7 KiB) eth1 Link encap:Ethernet HWaddr 08:00:27:69:7a:b5 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:31 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:202 (202.0 B) TX bytes:5766 (5.6 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:193243 errors:0 dropped:0 overruns:0 frame:0 TX packets:193243 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:31609190 (30.1 MiB) TX bytes:31609190 (30.1 MiB)
A la interfaz bond0 se le asigna una dirección IP, concretamente 192.168.1.100, y las 3 interfaces (bond0, eth0 y eth1) tienen la misma dirección física (“HWaddr 08:00:27:69:7a:b5”), para que las tres sean “vistas” por el resto de la red como una sola interfaz.
Se puede obtener más informacines sobre el estado de la interfaz bond0 con:
root@server:~# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) Bonding Mode: load balancing (round-robin) MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 200 Down Delay (ms): 200 Slave Interface: eth0 MII Status: up Speed: Unknown Duplex: Unknown Link Failure Count: 0 Permanent HW addr: 08:00:27:69:7a:b5 Slave queue ID: 0 Slave Interface: eth2 MII Status: up Speed: Unknown Duplex: Unknown Link Failure Count: 0 Permanent HW addr: 08:00:27:22:af:bf Slave queue ID: 0
ENJOY!