Copyright © 2009 Jorge Armando Medina
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
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
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.
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.
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 |
|---|---|
|
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.
A continuación se mencionan otros modos de canal bonding disponibles en GNU/Linux
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.
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.
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.
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 |
|---|---|
|
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.
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:
La opción miimon hace que el sistema bonding revise el enlace (cable conectado) cada 100 milisegundos.
La opción downdelay indica el tiempo para considerar una interfaz caída, el tiempo se especifica en milisegundos
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 |
|---|---|
|
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 :).
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 |
|---|---|
|
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 |
|---|---|
|
Use watch cat /proc/net/bonding/bond0, para ver el estado en tiempo real cuando haga las pruebas. |
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:
Desconectar Interfaz primaria (integrada)
Ver que los pings continuan sin retrasos aparentes/perceptibles
Ver estado con watch cat /proc/net/bonding/bond0
Desconectar Interfaz secundaria (externa)
Ver estado con watch cat /proc/net/bonding/bond0
Ver que la conexión se pierde (ping)
Conectar solo interfaz secundaria (externa)
Ver que la conexión se re establece (ping)
Ver estado con watch cat /proc/net/bonding/bond0
Desconectar interfaz secundaria
Ver que la conexión no se pierde (aparentemente/perceptible) (ping)
Ver estado con watch cat /proc/net/bonding/bond0
Conectar solo interfaz primaria
Ver que la conexión se re establece (aparentemente/perceptible) (ping)
Ver estado con watch cat /proc/net/bonding/bond0
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 |
|---|---|
|
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']
Para obtener más información, consulte los siguientes recursos:
IEEE Link Aggregation
http://standards.ieee.org/getieee802/download/802.1AX-2008.pdf
Pagina del manual ifenslave(8)
Net:Bonding:
Configuraciones para RHEL5: