Configuración de Canal Bonding modo Active-Backup en Ubuntu Server

Jorge Armando Medina

Computación Gráfica de México.
Documentación Técnica

Se otorga permiso para copiar, distribuir y/o modificar éste documento bajo los términos de la Licencia de Documentación Libre GNU, Versión 1.2 o cualquier otra posterior publicada por la Fundación de Software Libre; sin secciones invariantes, sin textos en portada y contraportada. Una copia de la licencia se incluye en la sección titulada Licencia de Documentación Libre GNU.

2011/02/08

Resumen

Este documento describe la implementación de un canal bonding (Port Trunking) en modo Active-Backup para ofrecer tolerancía de fallas a nivel red en un sistema Ubuntu Server.


Tabla de contenidos

Introducción
Canales Bonding en GNU/Linux
Sobre la Politica Active-backup (modo 1) del Canal Bonding en Linux
Otros modos de canal bonding
Requerimientos de Hardware
Requerimientos de Software
Creando una interfaz de canal bonding en modo Active-Backup
Verificando la creación del canal bonding
Pruebas de tolerancía a fallas de un canal bondin modo Activo-Backup
Configuración de bridge usando un canal bonding
Recursos adicionales

Introducción

En este documento explicaremos las configuraciones requeridas para ofrecer tolerancía de fallas a nivel de red, para lograrlo configuraremos un canal bonding el cual será formado por dos interfaces de red fisicas.

Este documento ha sido probado en Ubuntu Server LTS 8.04 y Ubuntu Server Karmic 9.10

Canales Bonding en GNU/Linux

El kernel de Linux permite unir dos interfaces de red en un solo canal usando el modulo del kernel bonding, el modulo bonding nos permitirá crear una interfaz de red virtual llamada Interfaz de Canal Bonding (Channel Bonding Interface), los canales bonding soportan dos o más interfaces de red para actuar como una sola para el sistema operativo y el exterior ofreciendo tolerancía a fallas y balanceo de cargas.

En GNU/Linux la creación de un canal bonding involucra la creación de una interfaz de red virtual, por ejemplo bond0, la cual se considera la interfaz Maestra, las dos interfaces de red fisicas son llamada esclavas, la siguiente figura muestra la distribución lógica.

Figura 1. Canal Bonding

Canal Bonding

Es importante notar que del lado del servidor, el modo de configuración del canal bonding determina la forma en la que el tráfico saliente es distribuído a través de los puertos de red. El tráfico entrante es distribuido de acuerdo a la configuración del switch.

Sobre la Politica Active-backup (modo 1) del Canal Bonding en Linux

En GNU/Linux el canal bonding Active-Backup es formado por dos o más interfaces de red fisicas, una en modo activo y otra en modo pasivo, este modo de configuración ofrece tolerancía a fallas mediante las siguientes caracteristicas:

  • Todo el tráfico de red es manejado por la interfaz esclava Activa

  • En caso de que la interfaz esclava activa falle, la otra interfaz esclava en modo Pasivo manejará el tráfico

  • Solo una interfaz de red esta activa a la vez y solo una interfaz tiene asignada la dirección MAC

[Importante] Importante

Para el modo Active-Backup, se recomienda tener cada interfaz de red fisica a un switch independiente para ofrecer tolerancía a fallas una capa más abajo.

Para seguir este documento se asume que las tarjetas de red cumplen con los requerimientos de hardware y que las conexiones de red ya han sido realidas así como cualquier configuracion en los switches de red.

Otros modos de canal bonding

A continuación se mencionan otros modos de canal bonding disponibles en GNU/Linux

Modo 0 Politica Round Robin

Crea una politica de tipo round robind para ofrecer tolerancía a fallas y balanceo de carga, la transimisión y recepción ocurre en un modo balanceado entre las dos interfaces de red, además que ofrece la tolerancía a fallas en caso de que algúna interfaz de red fisica falle.

Modo 4 IEEE 802.3ad, Politica Dynamic Link Aggregation

Establece una politica de enlace agregado dinamico IEEE 802.3ad. Crea grupos agregados que comparten la misma velocidad y parametros de duplex. Transmite y recibe en todos los esclavos en el agregado activo. Requiere de un switch con soporte 802.3ad.

En este documento no se verán estas configuraciones, para más información ver las referencías.

Requerimientos de Hardware

Del lado del servidor todas las tarjetas de red instaladas en el servidor deben soportar:

  • Misma velocidad

  • Misma configuración de duplex

Asegurese de que dichos requerimientos son satisfechos, puede usar el comando ethtool o mii-tool para verificar el estado de las interfaces de red y los parametros de velocidad y duplex.

En el modo Active-Backup no se requiere configuración en los switches de red ya que solo una interfaz de red fisica estará activa y anunciando la dirección MAC.

Requerimientos de Software

Para configurar los canales bonding instalaremos el paquete ifenslave el cual provee las herramientas de usuario para crear las interfaces de canales bonding en GNU/Linux.

# apt-get install ifenslave

El kernel de Ubuntu Hardy ya incluye el modulo bonding en el kernel predeterminado, puede verificarlo con el comando modinfo:

# modinfo bonding
filename:       /lib/modules/2.6.28-14-server/kernel/drivers/net/bonding/bonding.ko
author:         Thomas Davis, tadavis@lbl.gov and many others
description:    Ethernet Channel Bonding Driver, v3.3.0
version:        3.3.0
license:        GPL
srcversion:     CA9CCB77B640BAD1A0358AC
depends:
vermagic:       2.6.28-14-server SMP mod_unload modversions
parm:           max_bonds:Max number of bonded devices (int)
parm:           num_grat_arp:Number of gratuitous ARP packets to send on failover event (int)
parm:           miimon:Link check interval in milliseconds (int)
parm:           updelay:Delay before considering link up, in milliseconds (int)
parm:           downdelay:Delay before considering link down, in milliseconds (int)
parm:           use_carrier:Use netif_carrier_ok (vs MII ioctls) in miimon; 0 for off, 1 for on (default) (int)
parm:           mode:Mode of operation : 0 for balance-rr, 1 for active-backup, 2 for balance-xor, 3 for broadcast, 4 for 802.3ad, 5 for balance-tlb, 6 for balance-alb (charp)
parm:           primary:Primary network device to use (charp)
parm:           lacp_rate:LACPDU tx rate to request from 802.3ad partner (slow/fast) (charp)
parm:           xmit_hash_policy:XOR hashing method: 0 for layer 2 (default), 1 for layer 3+4 (charp)
parm:           arp_interval:arp interval in milliseconds (int)
parm:           arp_ip_target:arp targets in n.n.n.n form (array of charp)
parm:           arp_validate:validate src/dst of ARP probes: none (default), active, backup or all (charp)
parm:           fail_over_mac:For active-backup, do not set all slaves to the same MAC.  none (default), active or follow (charp)
[Nota] Nota

Las lineas param muestra opciones o parametros que se pueden especificar al cargar el modulo bonding.

Más adelante veremos como cargar y configurar el modulo bonding para la creación de los canales bonding.

Creando una interfaz de canal bonding en modo Active-Backup

Necesitamos que el sistema autocargue el modulo de bonding y creamos un alias para bond0 con las opciones de modo 1 (Active-Backup)

Crearemos un archivo para definir la carga y parametros del modulo bonding que deseamos agregar, por ejemplo creamos el archivo /etc/modprobe.d/bonding con el siguiente contenido:

# Canal bonding 0 modo 1 (Active-Backup)
alias bond0 bonding
options bond0 mode=1 miimon=100

Podemos especificar otras opciones, por ejemplo:

miimon

La opción miimon hace que el sistema bonding revise el enlace (cable conectado) cada 100 milisegundos.

downdelay

La opción downdelay indica el tiempo para considerar una interfaz caída, el tiempo se especifica en milisegundos

updelay

La opción updelay define el tiempo (en milisegundos) antes de considerar una interfaz arriba (despues de estar caida)

En Debian/Ubuntu se definen los canales bonding en el archivo /etc/network/interfaces, en este ejemplo definiremos una interfaz de canal bonding llamada bond0 formada por dos interfaces de red: eth0 y eth1:

# Canal bonding 0 con IP estatica
auto bond0
iface bond0 inet static
  address 192.168.1.10
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.1

  # Configuraciones levantar y desactivar interfaces del bonding
  up /sbin/ifenslave bond0 eth0 eth1
  down /sbin/ifenslave -d bond0 eth0 eth1
[Importante] Importante

Si ya tenía alguna configuracion para las interfaces de red eth0 y eth1 estan configuradas, comente las lineas.

De preferencía reiniciar el servidor para hacer la prueba de fuego :).

Verificando la creación del canal bonding

Después de reiniciar el sistema veamos los mensajes del kernel usando el comando dmesg, si el canal bonding fué creado exitosamente veremos mensajes como los siguientes:

# dmesg
(...)
[  469.467868] ADDRCONF(NETDEV_UP): bond0: link is not ready
[  469.541188] bonding: bond0: enslaving eth0 as a backup interface with a down link.
[  469.550127] e100: eth0: e100_watchdog: link up, 100Mbps, full-duplex
[  469.570291] bonding: bond0: link status definitely up for interface eth0.
[  469.570295] bonding: bond0: making interface eth0 the new active one.
[  469.570320] bonding: bond0: first active interface up!
[  469.570502] ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready
[  469.600106] eth1: link up, 100Mbps, full-duplex, lpa 0x45E1
[  469.600296] bonding: bond0: enslaving eth1 as a backup interface with an up link.
[  480.260019] bond0: no IPv6 routers present
(...)

En los mensajes de arriba podemos ver como el canal bonding es creado, como se ligan las interfaces eth0 y eth0 al canal bonding.

También verificamos el canal bonding usando el comando ifconfig:

# ifconfig                                            
bond0     Link encap:Ethernet  HWaddr 00:1d:7d:d4:09:74  
          inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::21d:7dff:fed4:974/64 Scope:Link              
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1      
          RX packets:50 errors:0 dropped:0 overruns:0 frame:0            
          TX packets:74 errors:0 dropped:0 overruns:0 carrier:0          
          collisions:0 txqueuelen:0                                      
          RX bytes:7116 (6.9 KB)  TX bytes:11653 (11.3 KB)               

eth0      Link encap:Ethernet  HWaddr 00:1d:7d:d4:09:74  
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:50 errors:0 dropped:0 overruns:0 frame:0     
          TX packets:74 errors:0 dropped:0 overruns:0 carrier:0   
          collisions:0 txqueuelen:1000                            
          RX bytes:7116 (6.9 KB)  TX bytes:11653 (11.3 KB)        
          Interrupt:21 Base address:0xa000                        

eth1      Link encap:Ethernet  HWaddr 00:1d:7d:d4:09:74  
          UP BROADCAST SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:19 Base address:0x8000

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:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

En este ejercicio podemos ver que la interfaz bond0 tiene el atributo MASTER, y las interfaces de eth0 y eth1 tienen el atributo SLAVE.

[Nota] Nota

En este caso solo la interfaz eth0 está activa, ver el atributo RUNNING.

También podemos verificar el estado del canal bonding viendo el contenido del archivo /proc/net/bonding/bond0, por ejemplo:

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.3.0 (June 10, 2008)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0f:ea:46:af:b1

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:13:f7:66:6c:00
[Sugerencia] Sugerencia

Use watch cat /proc/net/bonding/bond0, para ver el estado en tiempo real cuando haga las pruebas.

Pruebas de tolerancía a fallas de un canal bondin modo Activo-Backup

Para verificar que el canal bonding que recien configuramos ofrece tolerancía a fallas realizaremos algunas pruebas, para las pruebas se recomienda mantener un ping en otro host hacía la dirección IP asignada al canal bond0, también puede abrir una conexión SSH al equipo remoto, las pruebas que realizaremos serán:

  1. Desconectar Interfaz primaria (integrada)

    Ver que los pings continuan sin retrasos aparentes/perceptibles

    Ver estado con watch cat /proc/net/bonding/bond0

  2. Desconectar Interfaz secundaria (externa)

    Ver estado con watch cat /proc/net/bonding/bond0

    Ver que la conexión se pierde (ping)

  3. Conectar solo interfaz secundaria (externa)

    Ver que la conexión se re establece (ping)

    Ver estado con watch cat /proc/net/bonding/bond0

  4. Desconectar interfaz secundaria

    Ver que la conexión no se pierde (aparentemente/perceptible) (ping)

    Ver estado con watch cat /proc/net/bonding/bond0

  5. Conectar solo interfaz primaria

    Ver que la conexión se re establece (aparentemente/perceptible) (ping)

    Ver estado con watch cat /proc/net/bonding/bond0

Configuración de bridge usando un canal bonding

Habrá situaciones en las que se requiere crear un switch virtual o bridge formado por un canal bonding, por ejemplo para un entorno de virtualización, para tal caso usaremos la siguiente configuración:

# Interfaz loopback
auto lo
iface lo inet loopback

# Canal bonding 0, red local
auto bond0                  
iface bond0 inet manual
  # Iniciar y detener el canal bonding
  up /sbin/ifenslave bond0 eth0 eth1
  down /sbin/ifenslave -d bond0 eth0 eth1

# Configuramos el bridge de nombre xenbr0, conectamos la interfaz bond0 al bridge,
# y asignamos una dirección IP al bridge.
auto xenbr0
iface xenbr0 inet static
  address 192.168.1.20
  netmask 255.255.255.0
  network 192.168.1.0
  broadcast 192.168.1.255
  gateway 192.168.1.1
  pre-up ip link set bond0 down
  pre-up brctl addbr xenbr0
  pre-up brctl addif xenbr0 bond0
  pre-up ip link set bond0 up
  pre-up ip link set xenbr0 up
  post-down ip link set xenbr0 down
  post-down brctl delbr xenbr0
[Nota] Nota

La definición del canal bonding no tendrá configurada dirección IP alguna, solo le especificaremos el modo manual.

Si usa Xen recuerde comentar la linea de network-script en /etc/xen/xend-config.sxp, por ejemplo:

#(network-script network-bridge)

La opción de vif-script que para nuestro caso se usa para agregar una interfaz virtual (vifX) conectado a la interfaz ethx del DomU, podemos dejar la configuración predeterminada, tal como:

(vif-script vif-bridge)

Recuerde que debe especificar el nombre del bride en la configuración del DomU, por ejemplo en /etc/xen/domU001.cfg:

vif = [ 'mac=00:16:3E:EF:91:2F, bridge=xenbr0']

Recursos adicionales

Para obtener más información, consulte los siguientes recursos: