Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

martes, 24 de febrero de 2015

Port bonding en Linux

El nivel de carga de las tarjetas de red se ha ido incrementando de forma meteórica a durante los últimos años. Hace años el uso de una tarjeta de red de 100 Mbps parecía exagerado cuando hoy el uso de una tarjeta de 1 Gbps es algo normal. Los servidores suelen ser los más perjudicados de esta evolución ya que se pueden ver con un tráfico mayor de lo normal debido a distintos factores (más visitas, nuevo software que consume más ancho de banda, etc...) y de pronto el administrador del servidor se da cuenta de que aunque el servidor es capaz de soportar la carga a nivel de RAM y CPU, la tarjeta de red no es capaz de soportar tan tráfico, haciendo que los datos pasen por un cuello de botella que haría que no se pudiese sacar todo el partido que se desearía al servidor. La solución puede parecer sencilla: Cambiar la tarjeta de red; pero no siempre se puede realizar dicho cambio y uno puede verse en una necesidad de ampliar las capacidades de la tarjeta de red sin cambiarla. Afortunadamente existe una solución a dicho problema: Port bonding.

Port bonding consiste en la unificación de dos o más puertos de red para que actúen cómo uno solo. Dicha funcionalidad posee las siguientes ventajas:


  • Fusión de la potencia de todos los puertos que actúan cómo uno sólo. Obviamente todos los puertos fusionados tienen que estar conectados dentro de la misma red. Por ejemplo si se fusionasen 2 puertos de 1 Gbps se obtendrían 2Gbps.
  • Redundancia: Si uno de los puertos se estropea, se pierden las virtudes que ofrece dicho puerto pero el servicio que ofrece el conjunto de puertos en sí no se pierde, con lo que si por ejemplo se tuviesen 2 puertos  de 1 Gbps configurados y se tuviese en marcha un servicio web, en caso de que se estropease uno se podría seguir pudiendo acceder a dicho servicio pero ahora sólo tendría 1 Gbps en vez de 2. Esta funcionalidad es especialmente útil en redes que necesiten alta disponibilidad.
Vistas las ventajas, es lógico que uno desee probarlo; En este caso la "fusión" de puertos se ha hecho en Linux, pero antes de hacerlo uno tiene que mirar que versión de Kernel tiene. Para ello, accediendo a la consola, se escribe el siguiente comando:

uname -r

Al teclear dicho comando aparecerán una serie de números con un pequeño texto al final. Esos números corresponden a la versión del Kernel que se tiene instalada en Linux. El kernel de Linux es un elemento vital usado por muchísimos dispositivos, incluido el todopoderoso Android, que se encarga de acciones indispensables para que el sistema funcione; se trata de básicamente del corazón del sistema, el núcleo. Debería aparecer algo parecido a esto:

3.13.0.32-generic

La versión del Kernel debe de ser superior a 2.4.12, ya que a partir de dicha versión es cuando el Kernel incluye nativamente el soporte del port-bounding. En versiones ligeramente más antiguas existen parches que habría que aplicar a mano, pero se recomienda no usar dichas versiones para evitar contratiempos. De todas formas es difícil no tener dicha versión ya que actualmente la última versión estable es la 3.19. 

En caso de cumplir con la versión de Kernel, con copiar las líneas que aparecen a continuación a un script e incluirlo al arranque, bastaría para activar el port bonding.

  1. #!/bin/bash
  2. #VARIABLES
  3. IPifconfig eth0 |grep inet: |awk '{print $2}' |cut -d ":" -f 2
  4. MAC=ifconfig eth0 |grep Eth |awk '{print $5}'
  5. #MODULO BONDING
  6. modprobe bonding mode=0 miimon=100
  7. #DESHABILITACION DE INTERFACES
  8. ifconfig eth0 down     
  9. ifconfig eth1 down     
  10. #HABILITACION DE INTERFACES CON BONDING
  11. ifconfig bond0 hw ether ${MAC}
  12. ifconfig bond0 ${IP} up
  13. ifenslave bond0 eth0   
  14. ifenslave bond0 eth1

Para aquel que sienta curiosidad con respecto a los modos, le listaré los modos de bonding disponibles:

  1. mode=0 (balance rr)--> Modo balanceado que transmite los paquetes de forma secuencial entre los puertos. Posee balance de carga y además tiene tolerancia a fallos (es decir que si falla uno de los puertos que componen el bounding no pasa nada más que la perdida de "potencia")
  2. mode=1 (active-backup)-->Sólo un puerto está activo y en caso de fallar se activaría el otro. Su propósito es únicamente la alta disponibilidad
  3. mode=2 (balance-xor)-->Este modo siempre escoge el mísmo puerto "esclavo" para cada MAC de destino. Este método también tiene tolerancia a fallos y balance de carga.
  4. mode=3 (broadcast) --> Pasa todo el tráfico a las tarjetas esclavas por igual. Este método tiene tolerancia a fallos.
  5. mode=4 (802.3ad) --> Agregación de link dinámico. Requisitos: Los drivers de la tarjeta de red tienen que soportar Ethtool. El switch tiene que soportar la funcionalidad de agregación de link dinámico.
  6. mode=5 (balance-tlb) -->Balance de carga adaptado a las necesidades de la red.  El tráfico de red saliente escoge una interfaz u otra dependiendo de la carga de los puertos, mientras que el tráfico entrante siempre va a por una interfaz a menos que ésta falle, en cuyo caso el tráfico iría a la otra interfaz de red. Requisitos: Los drivers de la tarjeta de red tienen que soportar Ethtool
  7. mode=6 (balance-alb)--> Balance de carga activo para el tráfico ipv4 que se consigue mediante la negociación de la tabla ARP.
Los modos más usados son los cuatro primeros, y en la mayoría de los casos el 0 es el que mejor cubre las necesidades de uno.

Saludos.

No hay comentarios :

Publicar un comentario