Nombre Completo
Tobías Díaz Díaz-Chirón

Probablemente muchos de vosotros tengáis equipos con varias tarjetas de red, esto puede usarse para muchas cosas, una de ellas (a mi entender muy interesante) es el port trunking o también conocido como port bonding.
Es una técnica que permite agregar varios interfaces de red físicos en uno único virtual. A cada interfaz físico se le denominará slave (esclavo). Con esto podemos realizar un balanceo de carga entre las dos interfaces y conseguir un ancho de banda final igual a la suma de los anchos de banda de cada slave. Además de una ventaja adicional inmediata: redundancia de la conexión. Tenemos varios enlaces físicos a la red, perder alguno de ellos implica una degradación de servicio pero no la pérdida completa de conexión.
Es necesario un módulo que viene de serie incluído en los linux 2.4 y 2.6. Además también hace falta el programa que gestiona las interfaces: ifenslave, que viene empaquetado en Debian para disfrute de todos nosotros:
# aptitude install ifenslave-2.6
Para crear la interfaz virtual debemos cargar un módulo que la gestione aplicando alguna política o algoritmo para ello. Este módulo tiene muchos parámetros, aunque creo que antes de listarlos todos explicaremos un poco el funcionamiento teórico para entender mejor los parámetros.
Toda interfaz de red tiene asignada automáticamente una cola de envío y otra de recepción. Cada slave tiene también sus propias colas. El esquema es más o menos el siguiente (supondremos dos slaves):
RED ----> ETH0(RX) --->\
BOND0(RX) ----> S.O.
RED ----> ETH1(RX) --->/
/----> ETH0(TX) ----> RED
S.O. ----> BOND0(TX)
\----> ETH1(TX) ----> RED
(Ole ese ASCII ART!)
En cuanto a la recepción hay poco que decir, cuando llega un paquete
a algún slave se pasa a la cola de recepción de la interfaz virtual. Si un enlace físico falla, hay poco que podamos hacer: símplemente se degradará el servicio. Pero para el envío hay un poco más de historia, puesto que si detectamos que un enlace se ha perdido, deberemos pasar todos los paquetes de la cola de esa interfaz a la esclava que sigue funcionando para después congelar esa cola de envío degradando así el rendimiento de la interfaz. Por tanto debemos poder detectar cuando un enlace se ha caído, a este respecto existen dos posibilidades: detección por ARP o mediante MII (Media Indepent Interface).
Evidentemente, los esclavos deshabilitados se seguirán probando hasta que vuelvan a estar operativos, momento en el cual se volverán a habilitar dentro de la interfaz virtual.
Probablemente este sea el aspecto más importante del bonding: cómo balancear la carga entre todos los esclavos. En este sentido el módulo tiene un parámetro que permite indicar qué algoritmo se debe usar, los algoritmos implementados son:
Aunque todo esto parezca muy bonito, hay que tener en cuenta una cosa: algunos métodos necesitan ciertas configuraciones/capacidades en el switch al que estés conectados los esclavos. Ah! se me olvidaba: si el switch tiene un único link de salida a la red y va a la misma velocidad que nuestros esclavos, el balanceo se hace inútil ya que se produce un cuello de botella en el link de salida del switch.
Cargaremos el módulo como de costumbre:
# modprobe bonding [parámetros]
Y los parámetros los tenemos a continuación:
Con tantos parámetros podremos probar muchas opciones, yo actualmente uso:
# modprobe bonding miimon=100 mode=balance-tlb
Con esto ya tenemos el módulo cargado, sólo nos falta configurar la interfaz y añadir esclavos.
Si véis how-to's por internet veréis que montan un "pitoste" de parámetros en ficheros, etc. Pero es porque usan SuSE y cosas de esas raras, encima para tener IP estática. Pues en Debian abrimos /etc/networking/interfaces y añadimos:
iface bond0 inet dhcp
slaves eth0 eth1Tened en cuenta que eth0 y eth1 no deben estar activos en ese momento (deben estar down). Y finalmente para activar la interfaz:
# ifup bond0
Y ale... a disfrutar... 
Los modos active-backup, balance-tlb y balance-alb no requiere ninguna configuración especial en el switch, ideales si no tenemos acceso a la configuración del equipamiento de red
.
El modo 802.3ad requiere que el switch tenga los puertos donde conectamos los esclavos en modo 802.3ad aggregation. Esto depende de cada switch, por ejemplo, en los switch's de Cisco esta capacidad se llama EtherChannel y debe estar en modo lacp.
Por último, los modos balance-rr, balance-xor y broadcast generalmente requiere poder agrupar puertos. Las nomenclaturas de estos grupos dependen del fabricante del switch, como hemos dicho antes, Cisco llama a estas agrupaciones EtherChannel, también se usa trunk group, etc.
Pues hay mucho por internet, pero lo mejor es la documentación del propio módulo:
Linux Ethernet Bondign Driver HOW-TO.
Si probáis la receta, podéis envíar vuestras configuraciones (tanto del switch si la conocéis y de vuestro bond para hacer comparativas de rendimientos y todo eso. 
Comentarios
bonding, tolerancia a fallos, detectar caida internet
Hola,
Esotoy metido con el tema del bonding, la verdad es que como lo tengo funcionando ahora mismo va de lujo, muy sencillo y eficiente, …pero no para mi propósito.
Tengo configurado un fedora8 con 2 interfaces de red a sendos routers, un ADSL y un 3G de vodafone mobile, con ello debido a la sensibilidad de la linea ADSL pierdo comunicación de vez en cuando, por lo que la solución fue una 3G que me permitiera continuar con internet.
Mi configuración actual es bonding mode=1, con miimon=100 y updelay y downdelay=200. Pero con este modo únicamente me cambia de interfaz cuando falla la conexión FISICAMENTE, yo necesito que sea cuando cae internet. Según he leido y probado por si acaso, no son compatibles las opciones arp_interval y arp_ip_target. cuando he probado mode=1 con arp_interval y arp_ip_target, directamente no tengo salida a internet. Si alguien lo ha probado y sabe alguna forma de hacerlo funcionar…
No me interesan los otros modos, ya que hacen balanceo y yo no quiero emplear la conexión 3G como una mas, únicamente de respaldo.
Gracias,
Un saludo.
MRP
´Cómo puedo solucionarlo?
El modo 1 no puede usar verificación arp.
La opciones arp_interval y arp_ip_target no son incompatibles pues ambas son necesarias para la detección del estado del enlace por petición arp.
Podemos leer en la documentación del módulo bonding lo siguiente:
arp_interval Specifies the ARP link monitoring frequency in milliseconds. If ARP monitoring is used in an etherchannel compatible mode (modes 0 and 2), the switch should be configured in a mode that evenly distributes packets across all links.[…]Es decir, si quieres usar ese tipo de detección del estado del canal sólo puede usar mode=0 o mode=2 (balanceo round-robin o xor).
Creo que la única solución a tu caso sería configurar el router ADSL para que tire el enlace si pierde la conexión. En cuyo caso la detección por mii sería la válida.
—————————————————————
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
—————————————————————
configurar router que tire la conexion
Hola,
gracias por tu respuesta, ando de cabeza con el tema.
Está claro que no podemos usar esa opción con mode=1, pero… como tu me comentas, como configuro el router para que me tire la conexión abajo cuando se quede sin acceso a internet el router? está claro que anulando la conexión, el miimon actuaría perfectamente. He estado mirando las posibilidades de configuración del router pero no he encontrado nada que me permita desactivar el enlace cuando caiga la conexión a internet. Supongo que con esta opción, cuando reconectara activa el enlace y por lo tanto miimon volvería a establecer el enlace primary, como activo.
La verdad, no he dado nunca con esta opción…aunque tampoco es que la haya buscado antes.
Me han comentado que se podría hacer un script, pero la verdad es que no se como se haría.
Gracias.
Saludos,
MRP
El problema de los routers caseros...
El problema de los routers caseros es que opciones tan específicas raras veces las implementan. Ese tipo de cosas supongo que se podrían hacer muy bien con routers Cisco y similares.
Es cuanto a lo del script, supongo que podrías hacerte un script que realizase peticiones ARP (de forma similar a como lo haría el módulo bonding) y si fallasen las peticiones podría levantar el enlace de respaldo. El problema de esto es que eres tú el que debe programar la activación/desactivación de los enlaces y el port bonding creo que se haría innecesario.
—————————————————————
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
—————————————————————
mode 0 o mode 2
Hola de nuevo,
bueno, al final en vista no poder establecer una politica mode=1 por limitaciones.
He probado el mode=2 y el mode=0, parece que la politica de round robin va mas fina que la politica XOR. Me interesa mas la XOR porque puede tener intervalos sin carga de red, mientras que round robin va a partes iguales.
Bueno, probando el funcionamiento de los dos modos, he tenido la situación de que caiga la linea de ADSL y siga la 3G conectada. PERO…. me quedo sin conexión!! y hasta que no retorna la ADSL no tira.
El bonding está hecho, y funciona ya que la politica mode=1 la he probado y funciona, con que los dos interfaces se encuentran como esclavos del bond0.
Que puede estar pasando para que no siga la conexión por la 3G?? supuestamente mode=0 y 2, son tolerancia a fallos también.
Saludos,
MRP
Interesante articulo. Algo
Interesante articulo.
Algo similar al manejo de colas de la memoria x algunos metodos.
muy bueno
No será...
100 Mbps + 100 Mbps = 200 Mbps? De todos modos, tengo entendido que el EtherChannel raramente consigue ratios de más de 1.7.
En cualquier caso, muy interesante y útil la receta, enhorabuena.
No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.
Eso depende de la arquitectura de red...
La cosa está en que tu equipo es capaz de alcanzar los 200Mbps, lo que haga el/los switch's donde estén conectados los PC's es cosa de otra receta
------------------------------------------
For Happy Lusers! Try this as root!
dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------
------------------------------------------------------------
MiniHOW-TO: destroy your hard disk
# dd if=/dev/zero of=/dev/hda bs=1G count=10
------------------------------------------------------------