sábado, 14 de abril de 2012

Solaris 10 Link Aggregation (NIC Bonding) and switch side Trunking configuration

Link Aggregation también llamado NIC Bonding o NIC Teaming. Es un conjunto de técnicas utilizado combinar múltiples conexiones de red en un solo link a fin de brindar mayor throughput, y proveer redundancia en caso de que el link falle. Es común su utilización en switches o routers y puede ser utilizada también en equipos. Acorde al sistema operativo se pueden configurar varios métodos o políticas para realizar bonding (Round Robin, Active/Backup, XOR, Brodcast) , y en este post específicamente nos vamos a basar en Active/Backup a fin de proveer una mayor rebundancia en la conexión de red del servidor.

Vamos a estructurar el post en tres partes: En la primera comprenderemos como se organiza la configuración de networking en Oracle Solaris 10, de esta manera sabremos donde tenemos que tocar al momento de lograr esta configuración. Luego nos enfocaremos a realizar la configuración del lado del switch suponiendo que el mismo corre Cisco IOS, y donde generaremos un Channel Group en el cual se encontrará conectado nuestro servidor con Solaris 10 y configuraremos Spanning Tree para evitar loops de red.
Durante el post utilizaremos dos interfaces de red, pero cabe notar que esto puede realizarse con varias interfaces, es común encontrar Link Aggregations con tres o más links.

Networking en Solaris 10

Como seguramente sabrán Solaris es un sistema operativo SYSV, que en algún momento del tiempo fue BSD, poco a poco fue convirtiéndose en el sistema operativo que hoy conocemos, pero actualmente conserva algunos elementos que denotan su pasado como BSD. Un ejemplo claro de ello es el nombre de las interfaces de red y su forma de definir el driver que la controlará, el cual va seguido por la instancia de la misma, por ejemplo e1000g0 para la primera NIC Intel PRO/1000 Gigabit o bge1 para la segunda NIC Broadcom Gigabit Ethernet.

Al momento de iniciar Solaris, durante el booteo interviene SMF, el cual llama al servicio svc:/network/physical:default y este invoca al método /lib/svc/method/net-physical, este método el cual es un script ejecuta el comando ifconfig para configurar cada una de las interfaces de red definidas en el sistema buscando dentro del directorio /etc por uno o más archivos llamados hotsname.XXY siendo XX el nombre de la interfaz e Y la instancia de la misma, por ejemplo: /etc/hostname.qfe0.

El archivo /etc/hostname.XXY contiene el nombre del host o la dirección IP de la interfaz de red, lo cual previamente debe encontrarse definido en el archivo /etc/inet/hosts para ser configurado en el equipo. Por ejemplo para la interfaz bge1 en el archivo /etc/hostname.bge1 encontramos:
# cat /etc/hostname.e1000g0
ns1.foobar.org
Aunque también podría ser:
# cat /etc/hostname.e1000g0
172.16.1.215
Otro archivo que interviene en la configuración de networking es /etc/inet/hosts, es una base de datos local que asocia una dirección IP (de una interfaz) con su hostname. Este archivo tiene un formato muy sencillo, y se encuentra compuesto por tres campos separado entre si por una cantidad indistinta de espacios en blanco o tabs. Los campos que lo componen son: Dirección IP, Hostname y opcionalmente un alias. Un ejemplo de su formato es:
# cat /etc/inet/hosts
::1           localhost 
127.0.0.1     localhost
172.16.1.215  ns1.foobar.org ns1
Este archivo, tiene un link simbólico y es el /etc/inet/ipnodes. Podemos decir que las direcciones IP, pueden configurarse tanto en /etc/inet/hosts o en , pero en este ultimo serán buscadas primero en caso de ser necesario. El hostname del equipo debemos modificarlo en /etc/nodename, el cual tiene el siguiente formato:
# cat /etc/nodename
ns1.foobar.org
Pero al hacer esto, también debemos recordar hacerlo en /etc/inet/hosts y posiblemente en el /etc/hostname.XXY. La configuración de la netmask debe realizarse en /etc/netmask, un ejemplo del archivo sería:
# cat /etc/netmask
172.16.1.0  255.255.255.0
La ruta por default es aquella la cual se utiliza en caso de que las rutas de las que tenga el equipo no coincida con la ruta de destino del paquete, es por eso que para 0.0.0.0 (todo lo que no coincide) se envía mediante el default gateway. Esto debe ser configurado mediante el archivo /etc/defaultrouter. Si queremos configurar 172.16.1.254 como default route ejecutamos:
# echo '172.16.1.254' > /etc/defaultrouter
# cat /etc/defaultrouter
172.16.1.254
Las demás rutas, que se agregan de manera estática, son configuradas en el archivo /etc/gateways, si por ejemplo queremos agregar la ruta 192.168.1.0/24, debemos hacerlo mediante este archivo, en este ejemplo para evitar reiniciar la red vamos a agregar la ruta utilizando el comando route, y luego lo haremos de manera persistente en el archivo /etc/gateways:
# route add net 192.168.1.0 netmask 255.255.255.0 172.16.1.254
# cat /etc/gateways
net 192.168.1.0 gateway 172.16.1.254 metric 1 passive
Antiguamente esto debía hacerse mediante los scripts de rc, los cuales eran ejecutados al ingresar a un runlevel específico. Esto ya es anticuado y se hace mediante el archivo /etc/gateways. Para mas información sobre esto: man route gateways.

Cisco IOS Link aggregation (LACP) y Spanning Tree (STP):

Para configurar Link Aggregation (IEEE 802.3ad) en un dispositivo corriendo CiscoIOS (similar también en switch Allied Tellesis), debemos conectarnos al mismo mediante SSH, Interfaz web (no cubierto aquí) o puerto serie; Nosotros trataremos este último. Para realizar esto, necesitaremos un emulador de terminal, como es el caso de Minicom (que puede ser instalado en Unix o Linux), PuTTy o HyperTerminal desde Microsoft Windows. En el debemos configurar la terminal a 9600 baudios, 8 bits de datos, sin paridad, 1 bit de stop y sin control de flujo, de todas formas es recomendable previamente leer las especificaciones del fabricante ya que no todas las configuraciones de terminal son iguales.

Nota: Es importante realizar un backup del running-config del switch antes de editar la configuración del mismo.

Una vez conectados al dispositivo y autenticados debemos crear un Channel-Group, en el caso de nuestro Link Aggregation sera po1. Debemos hacer el enable, a fin de tener acceso administrativo al switch, y el configure terminal para poder trabajar con las interfaces del switch.
SW-CORE01> enable 
SW-CORE01# configure terminal
Ahora procedemos a configurar el port-channel 1, en los cuales se realizará la conexión y también vamos a configurar LACP en los puertos que elegimos en el switch para realizarlo, en nuestro caso FastEthernet 1/0/1 y FastEthernet 1/0/2, los cuales tendran acceso a la VLAN 10 (Datos en nuestro caso).
SW-CORE01(config)# interface range fastethernet1/0/1-2
SW-CORE01(config)# lacp system-priority 23456
SW-CORE01(config-if-range)# switchport mode access
SW-CORE01(config-if-range)# switchport access vlan 10
SW-CORE01(config-if-range)# channel-protocol lacp
SW-CORE01(config-if-range)# channel-group 1 mode active
SW-CORE01(config-if-range)# no ip address
SW-CORE01(config-if-range)# end 
Podemos ver que ambas interfaces pertenecen al Channel-Group 1, la prioridad por default de las interfaces esta configurada a 23456, mientras mas alto es este valor (65536 como máximo), más baja será la prioridad, y podemos notar también que g2/0/0 tiene configurada una prioridad distinta, 500, ya que será nuestra interfaz activa y por ende requiere una prioridad más alta. Perfecto, Link Aggregation ya está configurado, pero antes de conectar físicamente los puertos, si es que previamente no está configurado, debemos configurar el protocolo Spanning Tree, en este caso en modo STP, caso contrario podríamos producir un loop que podría terminar tirando la red. Spanning Tree se define mediante el estándar IEEE(802.1D), e intenta asegurar una topología de red libre de loops (o bucles), para más información sobre STP referirse a Wikipedia. Aquí configuraremos Spanning Tree (Port Fast), y su configuración es muy sencilla: En el mismo switch, donde ya estamos autenticados y con el enable realizado, procedemos a ejecutar lo siguiente:
SW-CORE01# conf t 
SW-CORE01(config)# interface range fastethernet1/0/1-2
SW-CORE01(config-if-range)# spanning-tree portfast
SW-CORE01(config-if-range)# end
Ahora solo resta salvar la configuración a la NVRAM (startup-config), para que en caso de ser rebooteado el switch esta no se pierda y vuelva a aplicarse. Este paso se recomienda realizar al final de este tutorial, cuando ya hayamos comprobado que todo funciona correctamente y no está dando problemas.
SW-CORE01# copy running-config startup-config
IP Bonding en Solaris

Nuestro equipo cuenta con tres interfaces de red, ce0 es la que utilizaremos para conectarnos al equipo y dos de ellas utilizan el driver INTEL PRO/1000 Gigabit, y son llamadas por nuestro sistema operativo e1000g0 y e1000g1. Por lo cual interfieren los archivos /etc/hostname.e1000g0 y /etc/hostname.e1000g1, configuraremos esto de manera dinámica primero, y si todo funciona lo haremos de manera estática utilizando el modo Active/Backup. Para poder trabajar, necesitaremos estar conectados al equipo, mediante alguna interfaz de red que no sean estas que utilizaremos para el bonding o estando físicamente en el equipo ya que perderemos la conectividad de red durante el procedimiento. Lo primero que debemos hacer es determinar el estado de las interfaces que tenemos disponibles en el sistema
# dladm show-link
ce0             type: legacy    mtu: 1500       device: ce0
e1000g0         type: non-vlan  mtu: 1500       device: e1000g0
e1000g1         type: non-vlan  mtu: 1500       device: e1000g1
Y luego efectuamos el unplumbing de las interfaces, por lo cual ejecutamos:
# ifconfig unplumb e1000g0
# ifconfig unplumb e1000g1
Ahora mediante dladm, vamos a proceder a crear el Link Aggregation, al cual debemos pasarle el nombre de nuestras interfaces que formaran parte de esto:
# dladm create-aggr -d e1000g0 -d e1000g1 1
Y volvemos a efectuamos el plumbing de nuestra interfaz aggr1 que fue creada previamente con dladm y volvemos a verificar el estado de las mismas:
# ifconfig aggr1 plumb 172.16.1.215 up
# dladm show-aggr
key: 1 (0x0001) policy: L4      address: 0:3:ba:7:84:5e (auto)
     device   address           speed         duplex  link    state
     e1000g0  0:3:ba:7:84:5e    1000  Mbps    full    up      attached
     e1000g0  0:3:ba:7:84:5e    0     Mbps    unknown down    standby
Y si miramos con ifconfig, podemos ver:
# ifconfig -a
lo0: flags=2001000849  mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
ce0: flags=1000843  mtu 1500 index 2
        inet 192.168.1.115 netmask ffffff00 broadcast 192.168.1.255
        ether 0:3:ba:7:84:5e
aggr1: flags=1000843  mtu 1500 index 3
        inet 172.16.1.115 netmask ffffff00 broadcast 172.16.1.255
        ether 0:3:ba:7:84:5e
Perfecto, nuestro Link Aggregation fue creado, y se encuentra funcionando. Podemos probar esto desconectando la interfaz activa y viendo si hace de manera automática el switch a e1000g1 Ahora solo nos resta un paso mas: En nuestro equipo, e1000g0 tenía configurada la dirección IP 172.16.1.215, para seguir manteniendo la misma simplemente movemos el archivo /etc/hostname.e1000g0 a /etc/hostname.aggr1.
# mv /etc/hostname.e1000g0 /etc/hostname.aggr1
Y en caso de exister alguna configuración para e1000g1 en /etc/hostname.e1000g1 borramos dicho archivo.

4 comentarios:

  1. Que grande Facu..
    Solaris 10 link Aggregation da esta pagina como primer resultado!

    ResponderEliminar
  2. esto es aplicable para multi-wan ? aumentar ancho de banda ?

    ResponderEliminar
  3. Exactamente, se podrían establecer links simultáneos pudiendo manejar el límite de cada medio físico cada link de manera independiente. Por tener 2 links de 1 gbps no significa que vas a tener 2 gbps, sino que vas a poder establecer simultáneamente dos conexiones a gbps. La diferencia entre etherchannel y LACP es que LACP envia LACPDU's, y combinado con un adecuado método de spanning-tree (mstp, pvstp), podrías lograr incrementar el throughput. De todas formas, esta es una configuración activo/pasivo, cosa que deberías tocar la configuración por parte del OS.

    ResponderEliminar