martes, 5 de noviembre de 2013

Conceptos de EIGRP Parte I.


Mucho hemos hablado últimamente del tema del famoso EIGRP y sus bondades.

En diversos materiales de Cisco he leído que EIGRP es el protocolo de enrutamiento que más rapido converge, a la vez de que posee muchas variables para establecer el cálculo de la métrica a cada destino y que no consume tanta memoria ni recursos de CPU como los algoritmos de estado enlace. Sumado a esto proporciona balanceo de carga en enlaces desiguales, por lo que resulta una opción más que interesante para evaluar al momento de elegir un protocolo de enrutamiento para nuestra red.

Vamos a ver algunos detalles de los puntos que mencionamos anteriormente:

Antes que nada es necesario aclarar que nos encontramos ante un protocolo que está patentado por Cisco Systems, por lo que sólo podrá ser usado si es que tenemos una red en donde poseemos equipos de esa marca en los puntos donde debe haber enrutamiento. Para los que no tengan todos los equipos de la marca o bien vengan con una línea de pensamiento de estandarización y tecnologías abiertas, mejor vayan por alguno de los otros protocolos.

Una vez aclarado esto, podemos decir que no se sabe a ciencia cierta como está desarrollado el protocolo, aunque se sabe que toda la magia está centrada en su núcleo  DUAL (Diffusing Update ALgorithm), que se encarga de calcular las mejores rutas libres de loops hacia cada destino en particular.
Hay un paper que describe brevemente el algoritmo y puede ser visto aquí.

EIGRP es catalogado en la mayoría de los libros como un protocolo de vector distancia mejorado  y en otros como un híbrido. La cantidad de saltos que se debe atravesar se encuentra presente en la información de cada ruta, pero este dato no interviene en el cálculo de la métrica.
Tengamos en cuenta que el límite de saltos para una ruta que se aprende por EIGRP es 224, y 255 para su antecesor: el viejo IGRP.

El dato anterior no es un detalle menor (dado que casi nadie publica esta información) pero a estas si tenemos un destino que está detrás de más de 224 saltos estamos teniendo un problema grave o bien estamos haciendo todo mal, por lo que estas distancias máximas permitidas por el protocolo son por demás de aceptables.

Otras bondades del protocolo son:
  • Dado que envía la máscara de red en las actualizaciones, soporta VLSM.
  • Soporta el envío de actualizaciones parciales hacia los vecinos.
  • Soporta varios protocolos de capa tres mediante la inclusión de los módulos PDM (Protocol Dependent Modules).
  • Tiene su propio protocolo de transporte de información, llamado RTP (Reliable Transport Protocol).
  • Detecta a sus vecinos intercambiando mensajes de saludos al igual que los protocolos de estado enlace.
  • Es relativamente fácil de configurar.
  • Puede definirse administrativamente la cantidad de ancho de banda que se utilizará en las actualizaciones.
  • Detecta automáticamente las redes NBMA (multiacceso sin broadcast) tales como las topologías de frame-relay multipunto.


    • Estas topologías son un dolor de cabeza a la hora de configurar los otros protocolos.



  • Sus métricas son de 32 bits, por lo que ofrece una gran granularidad.

Tiene diversos componentes para evaluar la métrica, y estos pueden ser activados según las necesidades del administrador:
  • Ancho de banda.
  • Retraso.
  • Confiabilidad.
  • Carga del enlace.
  • MTU(*).

El cálculo de la métrica se define según la siguiente ecuación:




No me voy a detener en este post a explicar cada una de estos puntos, sino que voy a hablar puntualmente de por qué el protocolo converge más rápido que el resto:

Supongamos que tenemos esta topología:




Tengamos en cuenta que los costos del camino están simplificados a fin de que se entienda mejor la explicación.

Nuestra PC está conectada al Router Oeste, que posee tres enlaces hacia el Router Este que contiene la red de destino, 192.168.90.0/24.

Debido a que los tres enlaces son de diferentes ISP, los anchos de banda y el delay (variables K1 y K3 habilitadas por defecto) de cada uno nos generan una distinta métrica.

Analicemos ahora las distancias para llegar hacia la red 192.168.90.0/24:
  • 30 (20+10) para llegar mediante el router Norte.
  • 20 (10+10) para llegar mediante el router Centro.
  • 275 (20+255) para llegar mediante el router Sur.

Es evidente que el mejor camino es pasando por el router Centro, por lo que esa es la ruta que EIGRP instalará en nuestra tabla de enrutamiento.
A esta ruta la llamaremos Ruta Sucesora.

Observemos también que las otras dos rutas son válidas, dado que  representan caminos sin bucles (loops).

Para esto, vamos a seguir definiendo términos:

El Router Oeste cuenta con datos como una Distancia Factible (Feasible Distance, FD) que es la distancia calculada por Oeste hasta la red remota, que en este caso es de 20 pasando por Router Centro que a su vez,  le "reporta" al Router Oeste que su distancia hacia la red remota (la distancia desde el Router Centro) es de 10.

A esta distancia se la llama Distancia Reportada (Reported Distance, RD).

O sea que el Router Oeste cuenta con los siguientes datos para calcular la FD hacia la red 192.168.90.0/24:
Tengo una distancia de 20 hacia Router Norte, el me reporta una distancia de 10 hacia la red 192.168.90.0/24, por lo que la distancia factible (FD) a través de el es 30.

Tengo una distancia de 10 hacia Router Centro, el me reporta una distancia de 10 hacia la red 192.168.90.0/24, por lo que la distancia factible (FD) a través de el es 20.

Tengo una distancia de 20 hacia Router Sur, el me reporta una distancia de 255 hacia la red 192.168.90.0/24, por lo que la distancia factible (FD) a través de el es 275.

Instalaré en la tabla de enrutamiento una entrada calculada mediante DUAL pasando por Router Centro para llegar a la red 192.168.90.0/24.

EIGRP va a guardar los otros caminos en su tabla de topología, y prestará extrema atención a aquellos que cumplan con la llamada Condición de Factibilidad que define lo siguiente:
Serán rutas de backup o alternas llamadas Sucesoras Factibles (Feasible Successors) las rutas que tengan una distancia reportada (RD) menor que la distancia factible (FD).

Por esto, si analizamos el diagrama según el punto de vista del Router Oeste:
  • La ruta a través de Centro es la sucesora, por lo que no la analizamos.
  • La ruta a través de Norte tiene una RD de 10, que es menor que mi FD hacia la red 192.168.90.0/24. Esta ruta cumple la condición de factibilidad. La instalo como sucesora factible en mi tabla de topología.
  • La ruta a través de Sur tiene una Distancia Reportada (RD) de 255, que es mayor que la distancia factible (FD) igual a 20. Esta ruta no cumple la condición de factibilidad, por lo que no la considero como backup.





En caso de que se caiga el enlace entre Router Oeste y Router Centro, la ruta sucesora factible será automáticamente promovida a Sucesora, sin tener que recalcular nada.
Esto es lo que hace extremádamente rápido al protocolo en términos de velocidad de convergencia.




En caso de que la nueva sucesora falle, Router Oeste no va a tener otra ruta backup, por lo que va a mandar consultas acerca de 192.168.90.0/24 a todos los vecinos que estén disponibles.

En este momento, EIGRP va a calcular activamente cómo llegar a la red destino, por lo que las rutas que sean inalcanzables aparecerán como A (Ruta Activa).




Acto seguido realizará un Query (consulta) a sus vecinos activos para ver si alguno de ellos tiene una ruta sin bucles hasta la red de destino.




El router Sur va a responder diciendo que conoce una ruta para llegar a la red en cuestión y se lo informa a Oeste.




Ahora el único camino hacia la red remota es vía el Router Sur, por lo que se transforma en sucesor.




Esto es parte de lo que debería saber cualquier CCNA. En la siguiente entrega veremos como realizar el bendito balanceo de carga con enlaces desiguales.

OSPF Básico I: DR y BDR


Ya todos sabemos que Open Shortest Path First (OSPF) es un protocolo de enrutamiento de estado enlace, que es un estándar abierto y que se define en la RFC2328.

OSPF usa un algoritmo llamado SPF que ya sabemos que busca los caminos de menor costo teniendo en cuenta que debe generar una topología libre de loops de enrutamiento. Cada nodo que lo utiliza contiene en memoria un mapa completo de la red para que se le permita calcular las rutas, por lo que es evidente que este protocolo va a tener requerimientos más altos en lo que se refiere a memoria y procesamiento en cada router donde se ejecute.

Dentro de los parámetros requeridos para funcionar, cualquier router que ejecuta OSPF requiere de lo que se denomina un router-id, que es básicamente un número de 32 bits que identifica unívocamente a cada equipo.

El router-id se selecciona de la siguiente manera:
  1. Utiliza el id configurado con el comando router-id.
  2. Si existe una loopback configurada, utiliza su dirección IP como router-id.
  3. Si existen varias loopback configuradas, busca la que tenga la IP más alta.
  4. Finalmente, si no hay ninguna loopback configurada, utiliza la IP más alta que encuentra en las interfaces.

Ahora viene la pregunta lógica... ¿por qué una loopback?.

Bien, veamos que si el equipo no tiene un router-id el proceso de enrutamiento se cae, por lo que se pierde la convergencia. Si yo pongo el proceso de OSPF asignado a una IP de una interfase (por ejemplo una ethernet) y esa ethernet se cae (se desconecta, falla el cable, se apaga el switch, etc...) el proceso de enrutamiento se cae también, obligando a elegir otro router-id y recomenzar el cálculo de todo de nuevo.

Ahora, una loopback es una interface que es virtual y nunca se va a caer salvo que le pongamos el fastuoso comando shutdown o la borremos. Con esto aseguramos que el proceso de OSPF se mantenga activo siempre.

Ya que tenemos el proceso de elección del router-id concluído, hay determinadas cuestiones que hacen a la optimización de recursos que se debieron tener en cuenta al momento de definir el protocolo.

Sabemos que los routers generan lo que se llama un Link State Update (LSU) que contiene Link State Advertisements (LSA) que son básicamente paquetes de datos que contienen los enlaces directamente conectados con todos los detalles de dicho enlace. Esto lo envía cada router a todos sus vecinos directamente conectados, que a su vez luego reenvían a los demás.

Esto es lo que se llama la inundación de información de LSA's, y básicamente es el proceso en el que cada router aprende todos los enlaces de toda la red para luego armar el famoso mapa topológico en su memoria que posteriormente se procesa con el algoritmo SPF.

El problema del multiacceso:


Supongamos que tenemos un switch ethernet donde están conectados varios routers -en la misma VLAN-.

Si cada router debe enviar los LSU a todos los otros, resulta que debo tener demasiados diálogos (uno por cada vecino), quedando para toda la VLAN:

[math]DialogosTotales=\frac{n(n-1)}{2}[/math]

Digamos, si tenemos 8 routers se deben establecer [math]\frac{8(8-1)}{2}[/math], es decir 28 conversaciones para enviar la información a todos los vecinos. Esto genera una carga extra en todos los equipos que puede -y debe- ser evitada.




La solución: el DR.


El Designated Router es el puesto que toma uno de los routers de cada segmento multiacceso. Se utiliza para que los intercambios de LSU se realicen sólo contra el DR. Es decir, todos los routers dialogan (intercambian LSU) únicamente contra el DR, y con esto se logra:

DialogosTotales=n-1, es decir que si hay 8 routers en el segmento y un DR, se establecen 7 diálogos de intercambio de LSU.



¿Cómo se selecciona el DR?


Muy fácil:
  1. El router que tenga configurada a mano la ip ospf priority más alta en la interfase.
  2. El router que tenga el router-id más alto.

Agregando redundancia: el BDR.


El Backup Designated Router es otro router que realiza intercambios de LSU con los demás nodos del segmento multiacceso. Se utiliza para agregar redundancia, ya que si el DR se cae, el BDR lo reemplazará para mantener la convergencia. Obviamente el BDR también estaba dialogando con el resto de los equipos.

Esto lleva la relación anterior a:

[math]DialogosTotales=2n-3[/math] es decir que si hay 8 routers en el segmento y un DR y BDR, se establecen 13 diálogos de intercambio de LSU.

Por lo que vemos es un buen balance entre cantidad de diálogos y redundancia.




¿Cómo se elige el BDR?


  1. El router que tenga configurada la ip ospf priority más baja que el DR pero más alta que el resto.
  2. El router que tenga el router-id más bajo que el DR pero más alto que el resto.

Por defecto la priority de todas las interfaces está configurada en 1. Si configuramos en 0, ese router nunca va a tratar de ser DR o BDR.

Obviamente queda mucho más por decir acerca de este protocolo, pero lo voy a dejar aquí para poder responder sus comentarios y ampliar el tema si es que les interesa.

IS-IS Integrado: Conceptos básico y configuración.


Desde que me lo nombraron me llamó la atención:


Era muy raro, los grandes ISP lo usan y a pesar de eso no se da en el CCNA... algo extraño tenía que tener...

La cuestión es que ahora que lo estoy estudiando en profundidad entiendo por qué no se encuentra en el plan de estudio del CCNA: a pesar de que su configuración es bastante sencilla, hay un montón de cabos sueltos dando vueltas y como no se encapsula en IP sino directamente en la capa de enlace de datos, tiene muchas cosas raras que podrían desorientar hasta al más aplicado estudiante de CCNA.

El protocolo se basa en el algoritmo de Dijkstra y es un protocolo de estado enlace tal cual como OSPF. De hecho, fueron lanzados en la misma época y dicen que ambos grupos de desarrollos se robaban ideas del otro al momento de crearlos.

El nombre significa Sistema Intermedio - Sistema Intermedio y viene dado que (como se ve en la teoría de CCNA1) los equipos de usuario fuinal (PC, impresoras, servers, etc) son denominados Sistema Inicial o Sistema Final (End Sistem) porque ahí se origina o se destina el tráfico que pasa por los Sistemas Intermedios (Intermediate Systems) que son los routers.

Por esto podemos intuír que hay un proceso entre ES - IS (Host a Router) y un IS-IS (Router a Router):




La definición más clara que describe a IS-IS (para los que saben de OSPF) es
IS-IS es como usar OSPF multiárea donde todas las áreas que no son backbone son Totalmente Stub.

Este protocolo usa el Connection Less Network Service (CLNS) que mal y pronto vendría a ser como la contra del TCP/IP que desarrolló OSI y nunca llegó a prevalecer ante el archifamoso TCP/IP.

Ahora, el gobierno de EEUU dispuso que cada sistema operado por ellos debería ser capaz de usar OSI, lo que produjo que IS-IS se prepare para pasar también rutas de IP (de ahí viene el nombre IS-IS integrado) y por eso es que aún este protocolo sigue vivo.

¿Cómo es que se preparó para pasar prefijos IP?


Muy facil: gracias a los TLV que son los encabezados de las PDU que transportan los datos de este protocolo. La sigla TLV significa TipoLargoValor (TypeLengthValue en inglés) y viene dado en que no existen campos fijos en el header salvo esos 3,


Este formato es muy versátil, ya que por ejemplo si queremos transmitir información de autenticación, llenamos la PDU con TIPO=10, el LARGO apropiado y el VALOR que hay que enviar; si queremos mandar información de IP ponemos TIPO=128, y así sucesivamente.

Gracias a esto, cuando sale un protocolo nuevo que queremos integrar en IS-IS, sólo hace falta crear un TIPO nuevo de TLV. En el caso de IPv6 IS-IS se adaptó muy rápido mientras que OSPF tuvo que sacar una versión totalmente nueva (la 3).

¿Cómo calcula la métrica este IGP?

Según la documentación, este protocolo analiza 4 variables para calcular la métrica:



  • Variable Default (asignada por el administrador).


  • Variable  Delay (Retraso).


  • Variable Expense (Costo monetario del enlace).


  • Variable Error (Tasa de error del enlace).


Ahora, la verdad de la milanesa es que Cisco sólo soporta la variable Default. O sea, nosotros pondremos arbitrariamente el costo de cada enlace.

No importa qué cálculo hagamos para especificarla, como por ejemplo:



  • Ancho de banda teórico del enlace/Ancho de banda real.


  • Latencia máxima.


  • Largo del patchcord.


  • Número al azar que se nos ocurrió a la mañana.


En cualquier caso vas a tener que poner un costo a la interfase del router que esté usándose en IS-IS. En caso de no ponerlo, el costo será de 10 por defecto.

Ahora, vas a tener que conocer el sistema de Direccionamiento CLNS, porque la network que vas a insertar dentro del modo de configuración de enrutamiento va a ser utilizando el esquema antes mencionado (y por lo tanto no va a ser el (w.x.y.z) tradicional de IP.

De nuevo y según la documentación, la dirección única de cada router va a tener la forma:




Vamos a ver cada parte de la dirección que está en el ejemplo:

Siempre usen algo como:

49.%numero hexa de 1 byte%.%direccion mac completada con 0 a la izq.%.00

En donde:
  • 49 siempre va al principio porque significa numeración privada.
  • %numero hexa de 1 byte% es el número de Area (tal cual como el area 15 de OSPF).
  • %direccion mac completada con ceros a la izquierda% es el ID del router dentro de esa Area.
  • 00 va siempre al final porque significa que es un router.

Todos los routers que pertenezcan al mismo Level1 (Area) deben tener el mismo Area ID. A su vez, todos los routers deben tener IDs de router distintos (obviamente).

¿Qué es Level1 y Level2?


Fácilmente lo podemos entender teniendo en cuenta que toooodos los routers que estén en la misma área van a ser Level1 (tal cual como los routers internos de OSPF que comparten la misma área que no sea la backbone).

Level2 son los routers de backbone, (El área 0 de OSPF) en donde se intercambia el tráfico destinado a distintos Level1.

Level1-2 son los símiles de los ABR de OSPF, o sea es un equipo que tiene al menos una interface en un Level2 y otra en un Level1.

Veamos un ejemplo más claro:




Lo interesante es que todos los Level1 reciben solamente una ruta por defecto desde el Level1/2 más cercano, y conocen las rutas que les pasan los Level1 adyacentes. Esto hace tablas de enrutamiento muy chicas.

A su vez, en cada L1/L2 podemos configurar sumarización hacia el backbone para agregar todas las rutas internas L1 al que ese equipo pertenezca.

Ahora vamos a ver las configuraciones para poner a andar la siguiente red:





Estos son los pasos a seguir:
  1. Determinar las áreas a las que pertenece cada equipo y las interfaces donde IS-IS va a ser habilitado.
  2. Activar el proceso de IS-IS mediante el comando router isis.
  3. Configurar la Net de cada equipo mediante el comando net.
  4. Activar ISIS en las interfaces correspondientes con el comando ip router isis. Debe notarse que deben habilitarse las interfaces de tránsito así como también las que estén conectadas a redes STUB.

Bien, ahora que nos ponemos a configurar:

Neuquen:


interface FastEthernet0/0
 ip address 192.168.10.1 255.255.255.0
 ip router isis

!
interface GigabitEthernet1/0
 description Enlace a Rosario
 ip address 172.16.1.2 255.255.255.0
 ip router isis
!
router isis
 net 49.000a.ca07.0b1c.001c.00
 log-adjacency-changes
!

Cordoba:


interface GigabitEthernet1/0
 description Enlace a Neuquen
 ip address 172.16.1.1 255.255.255.252
 ip router isis
 isis circuit-type level-1
!
interface GigabitEthernet2/0
 description Enlace a Rosario
 ip address 172.16.1.6 255.255.255.252
 ip router isis
isis circuit-type level-2-only
!
router isis
 net 49.000a.ca0a.0b1c.001c.00
 log-adjacency-changes

 summary-address 192.168.0.0 255.255.240.0
!

Rosario:


interface FastEthernet0/0
 ip address 192.168.16.1 255.255.240.0
 ip router isis

!
interface GigabitEthernet1/0
 description Enlace a Cordoba
 ip address 172.16.1.5 255.255.255.252
 ip router isis
!
interface GigabitEthernet2/0
 description Enlace a Pinamar
 ip address 172.16.1.9 255.255.255.252
 ip router isis
!
router isis
 net 49.000b.ca09.0d78.001c.00
 is-type level-2-only
 log-adjacency-changes
 summary-address 192.168.16.0 255.255.240.0
!

Pinamar:


interface GigabitEthernet1/0
 description Enlace a Rosario
 ip address 172.16.1.10 255.255.255.252
 ip router isis
 isis circuit-type level-2-only
!
interface GigabitEthernet2/0
 description Enlace a Carilo
 ip address 172.16.1.13 255.255.255.252
 ip router isis
 isis circuit-type level-1
!
router isis
 net 49.000c.ca0b.0d78.001c.00
 log-adjacency-changes
 summary-address 192.168.32.0 255.255.240.0
! 

Carilo:


 interface FastEthernet0/0
 ip address 192.168.32.1 255.255.255.240
 ip router isis

!
interface GigabitEthernet1/0
 description Enlace a Pinamar
 ip address 172.16.1.14 255.255.255.252
 ip router isis
!
router isis
 net 49.000c.ca08.0eac.001c.00
 is-type level-1
 log-adjacency-changes
!

Podemos ver que en Rosario pusimos el comando is-type level-2-only para no tener que poner el comando de level-2 en cada una de las interfaces. También podemos ver que en Rosario, Cordoba y Pinamar sumarizamos con el comando summary-address.

Ahora veamos las tablas de enrutamiento de cada equipo:

Neuquen:


Neuquen#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is 172.16.1.1 to network 0.0.0.0

C    192.168.10.0/24 is directly connected, FastEthernet0/0
     172.16.0.0/16 is variably subnetted, 2 subnets, 2 masks
i L1    172.16.1.0/30 [115/20] via 172.16.1.1, GigabitEthernet1/0
C       172.16.1.0/24 is directly connected, GigabitEthernet1/0
i*L1 0.0.0.0/0 [115/10] via 172.16.1.1, GigabitEthernet1/0

Cordoba:


Cordoba#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

i L1 192.168.10.0/24 [115/20] via 172.16.1.2, GigabitEthernet1/0
     172.16.0.0/16 is variably subnetted, 5 subnets, 2 masks
i L2    172.16.1.12/30 [115/30] via 172.16.1.5, GigabitEthernet2/0
i L2    172.16.1.8/30 [115/20] via 172.16.1.5, GigabitEthernet2/0
C       172.16.1.4/30 is directly connected, GigabitEthernet2/0
C       172.16.1.0/30 is directly connected, GigabitEthernet1/0
i L1    172.16.1.0/24 [115/20] via 172.16.1.2, GigabitEthernet1/0
i su 192.168.0.0/20 [115/20] via 0.0.0.0, Null0
i L2 192.168.16.0/20 [115/20] via 172.16.1.5, GigabitEthernet2/0
i L2 192.168.32.0/20 [115/40] via 172.16.1.5, GigabitEthernet2/0

Rosario:


Rosario#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

     172.16.0.0/16 is variably subnetted, 5 subnets, 2 masks
i L2    172.16.1.12/30 [115/20] via 172.16.1.10, GigabitEthernet2/0
C       172.16.1.8/30 is directly connected, GigabitEthernet2/0
C       172.16.1.4/30 is directly connected, GigabitEthernet1/0
i L2    172.16.1.0/30 [115/20] via 172.16.1.6, GigabitEthernet1/0
i L2    172.16.1.0/24 [115/30] via 172.16.1.6, GigabitEthernet1/0
i L2 192.168.0.0/20 [115/30] via 172.16.1.6, GigabitEthernet1/0
C    192.168.16.0/20 is directly connected, FastEthernet0/0
i L2 192.168.32.0/20 [115/30] via 172.16.1.10, GigabitEthernet2/0

Pinamar:


 Pinamar#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

     172.16.0.0/16 is variably subnetted, 5 subnets, 2 masks
C       172.16.1.12/30 is directly connected, GigabitEthernet2/0
C       172.16.1.8/30 is directly connected, GigabitEthernet1/0
i L2    172.16.1.4/30 [115/20] via 172.16.1.9, GigabitEthernet1/0
i L2    172.16.1.0/30 [115/30] via 172.16.1.9, GigabitEthernet1/0
i L2    172.16.1.0/24 [115/40] via 172.16.1.9, GigabitEthernet1/0
     192.168.32.0/28 is subnetted, 1 subnets
i L1    192.168.32.0 [115/20] via 172.16.1.14, GigabitEthernet2/0
i L2 192.168.0.0/20 [115/40] via 172.16.1.9, GigabitEthernet1/0
i L2 192.168.16.0/20 [115/20] via 172.16.1.9, GigabitEthernet1/0
i su 192.168.32.0/20 [115/20] via 0.0.0.0, Null0

Carilo:


 Carilo#show ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is 172.16.1.13 to network 0.0.0.0

     172.16.0.0/30 is subnetted, 1 subnets
C       172.16.1.12 is directly connected, GigabitEthernet1/0
     192.168.32.0/28 is subnetted, 1 subnets
C       192.168.32.0 is directly connected, FastEthernet0/0
i*L1 0.0.0.0/0 [115/10] via 172.16.1.13, GigabitEthernet1/0

Vemos como aparecen las rutas por defecto en los equipos Level1 y las sumarizadas en los Level2. Todo funciona correctamente y en muy pocos pasos.

Si tuviésemos que configurar esto mismo en OSPF seguramente nos llevaría unos cuantos comandos de más.

Piensen que sin ahondar en la teoría básica este hubiese sido un post demasiado corto, ya que los comandos para resolver el problema que presentamos son muy breves y concisos.

OSPF Básico II: Router ID


Ya estuvimos viendo algunas cuestiones básicas de este interesante protocolo en algún post anterior, hoy en esta entrega vamos a aprender algo acerca del proceso inicial, del primer paso que se realiza para poner OSPF en marcha.

Nosotros utilizamos OSPF versión 2 para el intercambio de prefijos en IPv4. Este protocolo fue desarrollado exclusivamente para IPv4 en forma tan monolítica que debió desarrollarse una versión enteramente nueva para IPv6 (la versión 3).

Para comenzar con la configuración del protocolo, debemos identificar el router en cuestión con lo que comunmente se llama un router-id.

Este router-id es un número de 32 bits que en la mayoría de las implementaciones se presenta en formato de dirección IP.

Dicho número va a representar unívocamente a nuestro equipo en la red donde se use OSPF, y en el caso de Cisco, existe un algoritmo que se utiliza para definir este id, que funciona de la siguiente manera.
Nota: Para poder usar OSPFv2 debemos tener por lo menos una interfase configurada con dirección IP y en estado operativo (up-up). De otra forma el protocolo no levantará.

El proceso de selección de router-id es el siguiente:

  1. Se utiliza el id que esté configurado estáticamente con el comando router-id dentro del modo de configuración de enrutamiento global.

  2. Se utiliza la dirección IP más alta que se encuentre en cualquier interfaz loopback que esté configurada.

  3. Se utiliza la dirección IP más alta de cualquier interfase directamente conectada al equipo.

Esto es bien conocido, pero algunos detalles no se menciona en la bibliografiá tradicional acerca del tema:
¿Cómo se define si una IP es mayor a otra?

Fácil: pasamos los números de forma w.x.y.z a binario y luego vemos cual es mayor.

Vuelvo a insistir que este protocolo funciona exclusivamente si hay direcciones IP configuradas en interfases levantadas (operativamente preparadas para funcionar). Si pongo una IP en una interfase que está en modo shutdown o bien sin el cable conectado, esta no será tenida en cuenta.

Antes que nada es conveniente que el router-id se tome de una interfaz loopback, dado que estas interfases por su naturaleza de ser virtuales nunca se pueden caer.

Si yo tomo el router-id del equipo desde alguna IP de una interfase física, y esta interfase física se cae, todo el proceso de OSPF se caerá ocasionando problemas importantes a toda la red.
Cuando un router cambia su router-id todos los routers del área deben volver a calcular el árbol SPF.

Hay muchos administradores de red que lo que hacen es crear una interfase loopback, ponerle una IP con máscara /32, configurar el comando router-id a mano y luego publicar esa IP dentro de OSPF para que sea alcanzable desde cualquier parte del sistema autónomo.

Esa práctica está bien, pero en realidad es innecesario el último paso. Dijimos que el router-id era utilizado únicamente para identificar un equipo.

No hay diferencia en cuanto a usar una IP pública o una IP privada, de hecho una buena práctica sería usar un número que realmente sirva de identificación, como por ejemplo: 1.1.1.1.

Dado que las actualizaciones entre vecinos salen con la IP de origen de la interfaz que las envía, no es necesario que el router-id asignado a cada equipo sea alcanzable dentro de la red. O sea que no hay que publicar en OSPF la loopback que configuremos para dicha tarea.

Veamos una configuración real de un equipo:
interface Loopback0
 description OSPF Router-ID
 ip address 1.1.0.1 255.255.255.255
!
router ospf 1
 ! Mi forma de identificación es: "1.CodigoDeCiudad.AreaDeOSPF.NumeroDeRouter"
 router-id 1.1.0.1
 network 10.128.16.0 0.0.15.255 area 0
[...]
!

Script para hacer backup's de bases de datos MySQL


En estos días me vi ante la necesidad de mejorar los backups de mis servidores {es:MySQL}, por lo que me puse a jugar con {es:Perl} para llevar a cabo el trabajo.

En la primer parte del mismo podrán ver que tuve que definir la ruta hacia los archivos ejecutables que utilizo para llevar a cabo la tarea, esto es porque este script lo utilizo en un servidor con {es:Solaris_(sistema_operativo)|Solaris} y debo utilizar algunas herramientas de GNU tal como el GNU tar.

Al momento de usarse, deben configurar las variables que contienen el hostname del servidor de bases de datos, el usuario y el password. Además deben completar el directorio en donde se deben almacenar los archivos.

Además Perl debe contar con los módulos DBI y DBD::mysql. En caso de que uses {es:Debian_GNU/Linux|GNU/Linux Debian} o alguno de sus derivados debes tener instalados los siguientes paquetes de APT:

  • libdbi-perl

  • libdbd-mysql-perl

Inicio del script:


#!/usr/bin/perl

# Script que realiza el backup de las bases de datos de MySQL
# Hecho por Ariel S. Weher

use strict;
use warnings;
use DBI;

# Defino los parametros de la base de datos a la que me voy a conectar
my $host = 'mysqlserver';
my $usuario = 'mysqlbackupuser';
my $password = 'My5QL53cr37p455w0rd';
my $dirdestino = '/nfs-mounts/zfs1/backup_servers/mysql-1/';

# Cuantos archivos de backup voy a mantener?
my $numbackup = 14;

# Path de los programas a usar
my $mysqlprogram = '/usr/bin/mysql';
my $dumpprogram = '/usr/bin/mysqldump';
my $tarprogram = '/opt/csw/bin/gtar';
my $rmprogram = '/usr/bin/rm';
my $lsprogram = '/usr/bin/ls';
my $dateprogram = '/usr/bin/date';
my $mkdirprogram = '/usr/bin/mkdir';
my $headprogram = '/usr/bin/head';
my $wcprogram = '/usr/bin/wc';
my $catprogram = '/usr/bin/cat';

# Defino el programa que voy a usar para obtener la copia de la base de datos y sus parametros de funcionamiento
my $parametros = "-h$host -u$usuario -p$password --flush-logs --opt";

# Obtengo todas las bases del server

my @bases = ();
my @lineas = `$mysqlprogram -h $host -u$usuario -p$password -e "show databases" --batch`;

my $n = 0;
foreach (@lineas){
 $n++;
 chomp;
 push(@bases, $_) unless $n eq 1;
} 

# Obtengo la fecha en este formato: 20070606-120645
my $fechahora = `$dateprogram +%Y%m%d-%H%m%S`;
chomp $fechahora;

# Directorios
my $existeeldir = 0;
my $directorio = $dirdestino.$fechahora.'.borrame/';

# Extraigo las bases...
foreach my $base (@bases){
 print "Haciendo Backup de la Base: $base ($fechahora)...\n";

 # Creo el directorio si es que no existe...
 if (!$existeeldir){
  my $tmpcmd = `$mkdirprogram $directorio`;
  $existeeldir = 1;
 }
 my $tmparchivo = $directorio.$base.'.sql';
 my $tmpcmd = `$dumpprogram $parametros $base > $tmparchivo`;
 $fechahora = `/bin/date +%Y%m%d-%H%m%S`;
 chomp $fechahora;
}

# Comprimo el archivo usando bzip2
print "Comprimiendo el directorio temporal ($directorio)\n";

$fechahora = `$dateprogram +%Y%m%d-%H%m%S`;
chomp $fechahora;

# Voy a ver cuantos archivos hay en el directorio...
my $cantarchivos = `$lsprogram -t -r -1 | $wcprogram -l $dirdestino`;
chomp $cantarchivos;

if ($cantarchivos gt $numbackup){
 # Obtengo el archivo mas viejo del directorio
 my $archivomasviejo = `$lsprogram -t -r -1 $dirdestino | $headprogram -1`;
 chomp $archivomasviejo;
 my $jobh = `$rmprogram -rf $archivomasviejo`;
}

my $archivodestino = $dirdestino."bases.$fechahora.tar.bz2";
chomp $archivodestino;

my $tmpcmd = `$tarprogram cvfj $archivodestino $directorio`;
print "\nCreado el archivo $archivodestino\n";
print "Limpiando los directorios temporales...\n";
$tmpcmd = `$rmprogram -rf $directorio` if ($directorio =~ /.*borrame.*/);
print"Que tenga un buen dia...\n";

exit 0;

On Demand Routing (ODR)


Ahora vamos a ver un protocolo de enrutamiento que es casi una curiosidad, no está muy difundido y no conozco que se tome en ninguna certificación.

Es más, solo lo vas a poder usar si:

  • Todo tu equipamiento es Cisco.

  • Usas CDP en tu toda red o bien sos muy vago como para desactivarlo.

  • La topología lógica es Hub n' Spoke o estrella.

  • Los equipos no tienen tanto CPU para lidiar con todo eso del protocolo híbrido, estado enlace o el Bellman-Ford.

  • Te encantan los protocolos de enrutamiento no autenticados e inseguros.

  • Tu religión no te permite un protocolo de enrutamiento con PDU de capa 3 y no querés aprender las simbologías extrañas del IS-IS integrado.

  • Querés jugar o aprender un chiche nuevo para guardar en el maletín de soluciones.

Si todas o la mayoría de los ítems presentados anteriormente son afirmativos en tu caso, es hora de aprender ODR!.



On Demand Routing es un protocolo que se vale del CDP (Cisco Discovery Protocol) para propagar prefijos IP. Las tramas CDP contienen un campo para transportar 4 bytes, o sea que puede enviar la máscara por lo que soporta VLSM y su configuración es muy sencilla.

Lamentablemente sólo funciona en redes Hub & Spoke, en donde los Spokes son stub, o sea que no se conectan a ningún otro router que no sea el HUB o centro de la estrella.

Veamos un diagrama para clarificar:




[caption id="attachment_186" align="aligncenter" width="392" caption="Diagrama de Topología con On Demand Routing"][/caption]

Obviamente el tiempo de convergencia es horrible, ya que se el HUB se limita a esperar las tramas de CDP (que por defecto se envían cada 60 segundos) pero esto no quita que bajemos el timer de envío de CDP de cada equipo para que los anuncios se reenvíen en intervalos de tiempo más cortos.

Vamos a las configuraciones:

HUB:
HUB#sh run
Building configuration...

Current configuration : 1451 bytes
!
![...]
!
interface FastEthernet0/0
 description Enlace a LAN
 ip address 192.168.2.1 255.255.255.0
 duplex half
 no keepalive
!
interface Serial1/0
 description Enlace a Spoke1 S1/0
 bandwidth 128
 ip address 192.168.1.5 255.255.255.252
 serial restart-delay 0
!
interface Serial1/1
 description Enlace a Spoke2 S1/0
 bandwidth 128
 ip address 192.168.1.1 255.255.255.252
 serial restart-delay 0
![...]
!
router odr
!
end

SPOKE1:
SPOKE1#sh run
Building configuration...

Current configuration : 1365 bytes
!
![...]
!
interface FastEthernet0/0
 description LAN
 ip address 192.168.3.1 255.255.255.0
 duplex half
 no keepalive
!
interface Serial1/0
 description Enlace a HUB S1/0
 bandwidth 128
 ip address 192.168.1.2 255.255.255.252
 serial restart-delay 0
!
![...]
!
end

SPOKE2:
SPOKE2#sh run
Building configuration...

Current configuration : 1374 bytes
!
![...]
!
interface FastEthernet0/0
 description Enlace a LAN
 ip address 192.168.4.1 255.255.255.0
 duplex half
 no keepalive
!
interface Serial1/0
 description Enlace a HUB S1/0
 bandwidth 128
 ip address 192.168.1.6 255.255.255.252
 serial restart-delay 0
!
![...]
!
end

Difícil... ¿no?.

Solo hizo falta un comando en el router HUB. Veamos si funciona:

HUB#sh ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is not set

o    192.168.4.0/24 [160/1] via 192.168.1.6, 00:00:00
     192.168.1.0/30 is subnetted, 2 subnets
C       192.168.1.0 is directly connected, Serial1/1
C       192.168.1.4 is directly connected, Serial1/0
C    192.168.2.0/24 is directly connected, FastEthernet0/0
o    192.168.3.0/24 [160/1] via 192.168.1.2, 00:00:59

Notamos que a diferencia de la O mayúscula que denota OSPF, aquí vemos una o minúscula que indica ODR.

También podemos ver que los timers se resetean cada vez que llegan las tramas de CDP, por lo tanto una vez pasado los 59 segundos, vuelven a 00:00:00.

Ahora, ¿qué pasa en los Spoke?... Veamos:
SPOKE2#sh ip route
Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route

Gateway of last resort is 192.168.1.1 to network 0.0.0.0

C    192.168.4.0/24 is directly connected, FastEthernet0/0
     192.168.1.0/30 is subnetted, 1 subnets
C       192.168.1.4 is directly connected, Serial1/0
o*   0.0.0.0/0 [160/1] via 192.168.1.1, 00:00:35

Tenemos una ruta por defecto (eso es lo que indica el *) con una distancia administrativa de 160, una métrica de 1 y aprendida por ODR.

El router spoke se comporta tal cual como si fuese un área totalmente stub de OSPF. Sólo aprende la default por ODR.

Créanme que el Spoke1 tenía aprendido lo mismo.

Ahora, ¿se pueden hacer algunas cosas interesantes con este protocolo?

¡¡Claro que si!!.

Algunas cosas son:

  • Cambiar los timers.

  • Filtrar anuncios entrantes con un distribute list.

  • Redistribuír ODR en otro protocolo (OSPF, EIGRP, etc).

  • Cambiarle la distancia administrativa.

Captura de tráfico en un Switch Cisco


Bien sabemos que cuando un switch tiene completa las tablas de direcciones MAC la conmutación de unicast se hace puerto a puerto entre el origen y el destino de la información, esto permite que las comunicaciones sean extremadamente rápidas y que el ancho de banda sea dedicado entre los dos equipos intervinientes.

Esta es una de las ventajas que poseen los switches con respecto a los hubs. Pero sin embargo y casi sin querer logramos otro efecto positivo para la red.


Dado que las comunicaciones son punto a punto, en teoría no hay posibilidad de que un equipo pueda recibir tramas que no estén destinadas a el, con el consiguiente beneficio en la seguridad.


En este caso si conectamos un dispositivo destinado a analizar los paquetes que se envían los equipos, este nunca recibirá tráfico salvo que esté explícitamente destinado a su dirección MAC.

Para solucionar este inconveniente, los switches implementan una tecnología de mirroring o espejado, en donde la información que se trasmite hacia/desde los equipos que se quieren analizar se conmuta normalmente pero también se envía una copia al puerto donde se encuentra enchufado el equipo de análisis.


Cuando hablamos de Switches Cisco, esta tecnología se llama SPAN (SwitchPort ANalyzer) o bien como Monitor Session, y puede dirigir el tráfico que se origina en un puerto físico o en una VLAN hacia un puerto destino donde se encuentra conectado -por ejemplo- un IDS.

Algunas consideraciones para tener en cuenta:
  • El puerto de destino no soporta determinados protocolos de capa 2 (DTP, VTP, CDP, STP).
  • Tampoco soporta determinados features de seguridad (802.1X, pVLAN).
  • El ancho de banda del puerto de destino debe soportar la sumatoria de la cantidad de datos que se generan desde los puertos de origen. No deberíamos capturar el tráfico de 5 puertos de 100 mbps e intentar copiarlos a un puerto de destino de 100 mbps que se satura rápidamente.
  • Un puerto origen no puede ser a la vez un puerto de destino ni viceversa.
  • Un puerto de destino deja de trabajar como puerto de switch, y solo transmite información de los puertos origen.
  • La sesión de monitoreo solo se activa si los puertos en cuestión están operativos (al menos uno de origen y el de destino).

Vamos a ver un ejemplo de configuración en donde capturaremos el tráfico entrante y saliente del port 5, el saliente del 6 y el entrante del 7. Todo ese tráfico se replicará en el IDS que tenemos instalado en el puerto Gigabit 0/1. Además establecemos otra sesión de monitoreo para el tráfico que se cursa por la vlan 405.

Switch(config)#monitor session 1 source interface FastEthernet 0/5
Switch(config)#monitor session 1 source interface FastEthernet 0/6 tx
Switch(config)#monitor session 1 source interface FastEthernet 0/7 rx
Switch(config)#monitor session 1 destination interface GigabitEthernet 0/1
Switch(config)#monitor session 2 source vlan 405
Switch(config)#monitor session 2 destination interface GigabitEthernet 0/2