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 

Limitar tamaño del AS-PATH en BGP


Tal cual como expliqué en este post, hace un par de semanas se descubrió un bug de BGP que trajo problemas en internet a nivel mundial.

En este nuevo post vamos a ver como podríamos prevenir de que nos pase (de nuevo) el mismo problema.

Como siempre, Cisco tenía en su IOS un feature que no acepta updates que contengan un AS-PATH más largo que el valor configurado, pero evidentemente nadie lo usaba. Hoy vamos a aprender a usarlo:

Tengamos en cuenta el siguiente caso:





Obviamente estamos analizando un caso simplificado y no representa el backbone de internet de ninguna forma.

Resulta que BuenosAires tiene dos redes para publicar:
  • 192.168.100.0/24
  • 192.168.50.0/24

El administrador novato que trabaja en este sistema autónomo decide que quiere hacer más largo el AS-PATH de la red 192.168.50.0/24 para que el tráfico llegue por otro enlace (que no está dibujado) distinto del que lo vincula con el Router Rosario.

Veamos las configuraciones iniciales de los equipos:

BuenosAires:


!
interface Loopback0
description Red para publicar
ip address 192.168.100.1 255.255.255.0
!
interface Loopback1
description Red para publicar con AS-PATH largo
ip address 192.168.50.1 255.255.255.0
!
interface Serial1/0
description Enlace a Rosario
ip address 192.168.1.1 255.255.255.252
serial restart-delay 0
!
router bgp 100
no synchronization
bgp log-neighbor-changes
network 192.168.50.0
network 192.168.100.0
neighbor 192.168.1.2 remote-as 200
neighbor 192.168.1.2 description Rosario
neighbor 192.168.1.2 password 100200
neighbor 192.168.1.2 version 4
neighbor 192.168.1.2 soft-reconfiguration inbound
 neighbor 192.168.1.2 route-map Cambiar-ASPATH-a-10 out
no auto-summary
!
access-list 10 permit 192.168.50.0 0.0.0.255
!
route-map Cambiar-ASPATH-a-10 permit 10
match ip address 10
set as-path prepend 100 100 100 100 100 100 100 100 100 100
!
route-map Cambiar-ASPATH-a-10 permit 20
!

Rosario:


!
interface Serial1/0
description Enlace a BuenosAires
ip address 192.168.1.2 255.255.255.252
serial restart-delay 0
!
interface Serial1/1
description Enlace a Cordoba
ip address 192.168.1.5 255.255.255.252
serial restart-delay 0
!
router bgp 200
no synchronization
bgp log-neighbor-changes
neighbor 192.168.1.1 remote-as 100
neighbor 192.168.1.1 description Peering con BuenosAires
neighbor 192.168.1.1 password 100200
neighbor 192.168.1.1 version 4
neighbor 192.168.1.1 soft-reconfiguration inbound
neighbor 192.168.1.6 remote-as 300
neighbor 192.168.1.6 description Peering con Cordoba
neighbor 192.168.1.6 password 200300
neighbor 192.168.1.6 version 4
neighbor 192.168.1.6 soft-reconfiguration inbound
no auto-summary
!

Cordoba


!
interface Serial1/0
description Enlace a Rosario
ip address 192.168.1.6 255.255.255.252
serial restart-delay 0
!
router bgp 300
no synchronization
bgp log-neighbor-changes
neighbor 192.168.1.5 remote-as 200
neighbor 192.168.1.5 description Rosario
neighbor 192.168.1.5 password 200300
neighbor 192.168.1.5 version 4
neighbor 192.168.1.5 soft-reconfiguration inbound
no auto-summary
!

Como vemos no hay nada extraño, salvo las configuraciones básicasde BGP  (sin filtrado de rutas) en cada equipo, salvo en BuenosAires donde aplicamos un Route-Map a las actualizaciones salientes para cambiar el AS-PATH de la red 192.168.50.0/24.

Ahora vamos a ver las tablas de enrutamiento y de BGP de todos los equipos.

BuenosAires:


BuenosAires#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

C    192.168.50.0/24 is directly connected, Loopback1
192.168.1.0/30 is subnetted, 1 subnets
C       192.168.1.0 is directly connected, Serial1/0
C    192.168.100.0/24 is directly connected, Loopback0

BuenosAires#show ip bgp
BGP table version is 3, local router ID is 192.168.100.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.50.0     0.0.0.0                  0         32768 i
*> 192.168.100.0    0.0.0.0                  0         32768 i

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

B    192.168.50.0/24 [20/0] via 192.168.1.1, 00:02:00
192.168.1.0/30 is subnetted, 2 subnets
C       192.168.1.0 is directly connected, Serial1/0
C       192.168.1.4 is directly connected, Serial1/1
B    192.168.100.0/24 [20/0] via 192.168.1.1, 00:02:00

Rosario#show ip bgp
BGP table version is 3, local router ID is 192.168.1.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.50.0     192.168.1.1              0             0 100 100 100 100 100 100 100 100 100 100 100 i
*> 192.168.100.0    192.168.1.1              0             0 100 i

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

B    192.168.50.0/24 [20/0] via 192.168.1.5, 00:02:43
192.168.1.0/30 is subnetted, 1 subnets
C       192.168.1.4 is directly connected, Serial1/0
B    192.168.100.0/24 [20/0] via 192.168.1.5, 00:02:43
Cordoba#
Cordoba#show ip bgp
BGP table version is 3, local router ID is 192.168.1.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.50.0     192.168.1.5                            0 200 100 100 100 100 100 100 100 100 100 100 100 i
*> 192.168.100.0    192.168.1.5                            0 200 100 i

Vemos que en Cordoba el AS-PATH tiene un largo importante, y si BuenosAires llegase a publicar rutas con un AS-PATH extremadamente largo se produciría el bug que vimos en el post anterior.

Aquí el administrador podría resolver esto de dos formas:
  1. Configurar el comando global bgp maxas-limit.
  2. Configurar un AS-PATH Access-List por cada peer que tenga.

Es evidente que la segunda opción es la más granular, pero no puede ser utilizada siempre porque puede implicar que se cambie la forma de filtrar rutas y establecer políticas. Además debe hacerse en cada vecino de BGP que tengamos, lo que puede resultar engorroso.

Vamos a configurar el maxas-limit en Rosario para ver que es lo que pasa:
Rosario#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Rosario(config)#router bgp 200
Rosario(config-router)#bgp maxas-limit 5
Rosario(config-router)#end
Rosario#
*Mar 11 15:24:36.003: %BGP-6-ASPATH: Long AS path 100 100 100 100 100 100 100 100 100 100 100 received from 192.168.1.1: More than configured MAXAS-LIMIT

El proceso ha recortado la ruta de la tabla de BGP por exceder el largo de AS-PATH permitido en la configuración. Podemos ver los resultados de este comando:

BuenosAires:


BuenosAires#show ip bgp
BGP table version is 3, local router ID is 192.168.100.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.50.0     0.0.0.0                  0         32768 i
*> 192.168.100.0    0.0.0.0                  0         32768 i

Rosario:


Rosario#show ip bgp
BGP table version is 4, local router ID is 192.168.1.5
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

Network          Next Hop            Metric LocPrf Weight Path
*> 192.168.100.0    192.168.1.1              0             0 100 i

Cordoba:

Cordoba#show ip bgp
BGP table version is 4, local router ID is 192.168.1.6
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale
Origin codes: i - IGP, e - EGP, ? - incomplete

   Network       Next Hop     Metric LocPrf Weight Path
*> 192.168.100.0 192.168.1.50                      200 100 i
En Rosario tuvimos un aviso de que se descartó de la ruta, y por ende no se la anunció a Cordoba.

Con este sencillo comando podemos proteger nuestros equipos del desastre, hasta que el parche para el mismo sea liberado.

Espero que este post les haya servido.
so a jugar con BGP de una forma muy extraña y sin medir las consecuencias de esto.

Trucos para el enrutamiento estático


El enrutamiento estático puede ser una solución muy conveniente para cuando la cantidad de nodos en nuestra red no es tan amplia como para que valga la pena un protocolo dinámico. Pero puede transformarse en un verdadero dolor de cabeza en caso de que no tengamos en cuenta determinadas pautas.

Veamos el siguiente diagrama:



Supongamos que en esta red WAN todos los vínculos entre equipos son del mismo ancho de banda y tienen la misma tasa de error y confiabilidad.

Si tomamos el ejemplo de una comunicación entre Córdoba y Buenos Aires sería prudente realizar enrutamiento estático de tal forma que se balancee la carga entre los tres enlaces que están directamente conectados a ellos. De esta forma, en principio (sin tener en cuenta CEF y otras pautas) podemos decir que cuando sale un paquete desde Córdoba siempre irá por un camino distinto al anterior.

Por ejemplo los paquetes con numeración:
  1. Sale por Tucumán.
  2. Sale por Rosario.
  3. Sale por La Plata.
  4. Sale por Tucumán.
  5. Sale por Rosario.
  6. Sale por La Plata.
  7. [...]

Ahora,  supongamos que se cae el enlace entre Rosario y BsAs, Córdoba no se va a enterar porque no está directamente conectado y no hay un protocolo de enrutamiento que nos avise del fallo. Entonces se seguirá enviando tráfico a Rosario y este último lo descartará por tener el enlace caído.

Por esto podemos decir que 1/3 del tráfico que Córdoba envíe hacia BsAs se va a perder. Esto trae muchos problemas a la red y sus aplicaciones.

Afortunadamente contamos con algunas herramientas para lidiar con este tipo de problema:

La que utilizaremos en este caso se llama IP SLA, y está disponible desde la versión 12.3T de IOS.

La idea es que Córdoba va a estar todo el tiempo tirando un proceso ping a Buenos Aires a través de cada una de las interfases.

Dicho proceso será vinculado a una ruta estática, y por ende cuando un proceso falle se retira la ruta de la tabla automágicamente. A esto se llama 'hacer tracking' a un objeto.

Veamos en principio la configuración de Cordoba  y Buenos Aires:

Router CORDOBA:


interface FastEthernet0/0
description Enlace a Tucuman
ip address 192.168.7.2 255.255.255.252
!
interface FastEthernet0/1
description Enlace a Rosario
ip address 192.168.7.10 255.255.255.252
!
interface FastEthernet1/0
description Enlace a La Plata
ip address 192.168.7.18 255.255.255.252
!
interface FastEthernet1/1
description LAN
ip address 192.168.7.33 255.255.255.224
!
ip route 192.168.7.4 255.255.255.252 192.168.7.1 name TUCUMAN-BAIRES
ip route 192.168.7.12 255.255.255.252 192.168.7.9 name ROSARIO-BAIRES
ip route 192.168.7.20 255.255.255.252 192.168.7.17 name LAPLATA-BAIRES
ip route 0.0.0.0 0.0.0.0 192.168.7.1 name viaTUCUMAN
ip route 0.0.0.0 0.0.0.0 192.168.7.9 name viaROSARIO
ip route 0.0.0.0 0.0.0.0 192.168.7.17 name viaLAPLATA
!

Ahora vamos a configurar el IP SLA en CORDOBA para que detecte las caídas del servicio:

ip sla 1
icmp-echo 192.168.7.6 source-ip 192.168.7.2
ip sla schedule 1 life forever start-time now
ip sla 2
icmp-echo 192.168.7.14 source-ip 192.168.7.10
ip sla schedule 2 life forever start-time now
ip sla 3
icmp-echo 192.168.7.22 source-ip 192.168.7.18
ip sla schedule 3 life forever start-time now

Ahora vinculamos tres objetos track con el ID de IP SLA correspondiente:
track 1 rtr 1 reachability
track 2 rtr 2 reachability
track 3 rtr 3 reachability

Y luego configuramos las rutas estáticas para que sean dependientes de cada track que le corresponda:
ip route 0.0.0.0 0.0.0.0 192.168.7.1 name viaTUCUMAN track 1
ip route 0.0.0.0 0.0.0.0 192.168.7.9 name viaROSARIO track 2
ip route 0.0.0.0 0.0.0.0 192.168.7.17 name viaLAPLATA track 3

Ahora solo hay que dejar que el IP SLA haga su trabajo sacando las rutas estáticas cuando el vecino no sea alcanzable. Obviamente en cualquier momento podemos verificar la configuración:
CORDOBA#show track
Track 1
Response Time Reporter 1 reachability
Reachability is Up
12 changes, last change 10w1d
Latest operation return code: OK
Latest RTT (millisecs) 1
Tracked by:
STATIC-IP-ROUTING 0
Track 2
Response Time Reporter 2 reachability
Reachability is Up
6 changes, last change 15w4d
Latest operation return code: OK
Latest RTT (millisecs) 1
Tracked by:
STATIC-IP-ROUTING 0
Track 3
Response Time Reporter 3 reachability
Reachability is Up
38 changes, last change 1w2d
Latest operation return code: OK
Latest RTT (millisecs) 1
Tracked by:
STATIC-IP-ROUTING 0

También podemos verificar los niveles de SLA que nos dan nuestros proveedores:
CORDOBA#show ip sla statistics details  

Round Trip Time (RTT) for       Index 1
Latest RTT: 1 ms
Latest operation start time: 10:34:54.500 UTC Mon Apr 13 2009
Latest operation return code: OK
Over thresholds occurred: FALSE
Number of successes: 40
Number of failures: 0
Operation time to live: Forever
Operational state of entry: Active
Last time this entry was reset: Never

Round Trip Time (RTT) for       Index 2
Latest RTT: 1 ms
Latest operation start time: 10:34:54.500 UTC Mon Apr 13 2009
Latest operation return code: OK
Over thresholds occurred: FALSE
Number of successes: 35
Number of failures: 5
Operation time to live: Forever
Operational state of entry: Active
Last time this entry was reset: Never

Round Trip Time (RTT) for       Index 3
Latest RTT: 1 ms
Latest operation start time: 10:34:54.500 UTC Mon Apr 13 2009
Latest operation return code: OK
Over thresholds occurred: FALSE
Number of successes: 38
Number of failures: 2
Operation time to live: Forever
Operational state of entry: Active
Last time this entry was reset: Never

Con esta configuración básica podemos ver que el proveedor de WAN que mejor servicio nos da es el correspondiente al SLA 1 (Index 1), que es el que nos provee el enlace contra Tucumán.

La configuración de IP SLA en IOS puede ser tremendamente compleja, y puede permitirnos incluso dejar scripts de configuración que se accionan en caso de algún evento preconfigurado.

Podemos no solamente hacer ping, sino realizar consultas HTTP, DNS y varios más para determinar que el servicio monitoreado está andando bien.

Esta es la config más básica, pero creo que les va a ser muy útil en sus redes.

Configurar QOS con policy-map en IOS


El QOS es una de las cuestiones que todos deberíamos tener en cuenta para el correcto funcionamiento de las redes pero es un tema tan extenso y complejo como para desorientar al más experimentado ingeniero de redes.

La idea de este post es dar unas nociones básicas de cómo manejar los anchos de banda usando IOS usando un ejemplo concreto.

Ates que nada debo aclarar que en este post no voy a ingresar en cuestiones avanzadas del tema, sino que voy a dar una visión general de como se clasifica el tráfico para luego aplicarle una política determinada. Puntualmente estoy hablando de limitar los anchos de banda con las herramientas que nos provee IOS.

En el ejemplo, tenemos un router de borde que da servicio a cinco subredes, y queremos manejar los anchos de banda de cada una por separado.



Veamos el diagrama:





Lo primero que vamos a hacer es definir access lists por cada rango de direcciones IP que vamos a
utilizar para definir los anchos de banda.
access-list 10 permit 200.200.10.0 0.0.0.255
access-list 20 permit 200.200.20.0 0.0.0.255
access-list 30 permit 192.168.30.0 0.0.0.255
access-list 31 permit 200.200.30.0 0.0.0.7
access-list 32 permit 200.200.30.8 0.0.0.7

Ahora definiremos las class-map.

Estas son estructuras que contienen las condiciones que se deben cumplir para que pase algo.

Como un class-map puede tener varias condiciones adentro, debemos decir si se tienen que dar todas a la vez, o bien cualquiera de ellas.

Para eso utilizamos los parámetros match-all ó match-any respectivamente. Si no especificamos ninguno de los dos, se tomará match-all por defecto.

Formato:


Router(config)#class-map [match-all | match-any] NombreDeLaClassMap


Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#class-map match-all Prueba
Router(config-cmap)#
Router(config-cmap)#description matchea el trafico web de una determinada red
Router(config-cmap)#match protocol http
Router(config-cmap)#match access-group 1
Router(config-cmap)#exit
Router(config)#class-map match-any P2P
Router(config-cmap)#description Con esto voy a filtrar CUALQUIER cliente P2P (emule, ares, etc...)
Router(config-cmap)#match protocol ares
Router(config-cmap)#match protocol bittorrent
Router(config-cmap)#match protocol directconnect
Router(config-cmap)#match protocol edonkey
Router(config-cmap)#match protocol gnutella
Router(config-cmap)#match protocol kazaa
Router(config-cmap)#match protocol kazaa2
Router(config-cmap)#match protocol napster
Router(config-cmap)#match protocol winmx
Router(config-cmap)#exit
Router(config)#

Así creamos todos los class-map que sean necesarios. Ellos pueden matchear por:
  • ip de origen
  • ip de destino
  • access-list
  • protocolo (NBAR)
  • Marca de paquete
  • Etiqueta de MPLS
  • Todos los paquetes (any)
  • Clase de Servicio (COS)
  • Interfaz de entrada
  • Otros (dependiendo del IOS)

Configurar la policy-map:

Con esto creamos una política que va a ser un agrupamiento de las classmaps bajo un mismo nombre, en donde vamos a definir qué se hace cuando se cumplen las condiciones que ellas establecen.

Formato:


Router(config)#policy-map NombreDeLaPolicyMap
Router(config-pmap)#class NombreDeLaClassMap
Router(config-pmap-c)#police Garantizado Rafagas Pico \
conform-action Accion exceed-action Accion violate-action Accion


Acción puede ser:
  • Dejarlo pasar (transmit)
  • Filtrarlo (drop)
  • Otra (dependiendo del IOS)

Ejemplo:

Router(config)#policy-map TraficoInternet
Router(config-pmap)#class Prueba
Router(config-pmap-c)#police 1000000 1500000 2000000 conform-action \
transmit exceed-action transmit violate-action drop
Router(config-pmap-c)#exit
Router(config-pmap)#class P2P
Router(config-pmap-c)#drop
Router(config-pmap-c)#exit
Router(config)#

Ahora solo queda aplicar todo en las interfases que sean necesarias:

Formato:

Router(config)#interface NombreInterfase
Router(config-if)#service-policy {input | output} NombreDeLaPolicyMap
Router(config)#exit

Ejemplo:

Router(config)#interface FastEthernet0/0
Router(config-if)#service-policy input TraficoInternet
Router(config-if)#service-policy output TraficoInternet
Router(config-if)#exit

Ejemplo completo de la config del diagrama de arriba:


Router#sh run
Building configuration...
Current configuration : 3501 bytes
!
version 12.2
service timestamps debug uptime
service timestamps log uptime
service password-encryption
!
hostname Router
!!
ip subnet-zero
ip cef
!!
ip name-server 209.165.201.1
ip name-server 209.165.201.2
!
ip audit notify log
ip audit po max-events 100
!!
class-map match-all VlanServidores
match access-group 20
class-map match-all VlanAbonados
match access-group 10
class-map match-all VlanEmpresaA
match access-group 31
class-map match-all VlanEmpresaB
match access-group 32
class-map match-any P2P
description Protocolos Basura
match protocol fasttrack
match protocol gnutella
match protocol napster
match protocol netbios
match protocol emule
match protocol ares
match protocol bittorrent
class-map match-all VlanEmpleados
match access-group 30
!!
policy-map TraficoSaliente
description Trafico Saliente
class VlanAbonados
police 2000000 62500 62500 conform-action transmit exceed-action drop
class VlanServidores
police 2000000 4000000 4500000 conform-action transmit exceed-action transmit violate-action drop
class VlanEmpleados
police 1000000 2000000 2000000 conform-action transmit exceed-action transmit violate-action drop
class VlanEmpresaA
police 1000000 31250 31250 conform-action transmit exceed-action drop
class VlanEmpresaB
police 256000 8000 8000 conform-action transmit exceed-action drop
class P2P
police 8000 1500 1500 conform-action drop exceed-action drop violate-action drop
class class-default
police 8000 1500 1500 conform-action drop exceed-action drop violate-action drop
policy-map TraficoEntrante
description Trafico Entrante
class VlanAbonados
police 2000000 62500 62500 conform-action transmit exceed-action drop
class VlanServidores
police 2000000 4000000 4500000 conform-action transmit exceed-action transmit violate-action drop
class VlanEmpleados
police 1000000 2000000 2000000 conform-action transmit exceed-action transmit violate-action drop
class VlanEmpresaA
police 1000000 31250 31250 conform-action transmit exceed-action drop
class VlanEmpresaB
police 256000 8000 8000 conform-action transmit exceed-action drop
class P2P
police 8000 1500 1500 conform-action drop exceed-action drop violate-action drop
class class-default
police 8000 1500 1500 conform-action drop exceed-action drop violate-action drop
!!!
interface FastEthernet0/0
description Interfase al Switch de Core
no ip address
duplex auto
speed auto
!
interface FastEthernet0/0.10
description VLAN10: Abonados de Internet (2mbps)
bandwidth 2000
ip address 200.200.10.1 255.255.255.0
!
interface FastEthernet0/0.20
description VLAN20: Red de Servidores (2mbps)
bandwidth 2000
ip address 200.200.20.1 255.255.255.0
!
interface FastEthernet0/0.30
description VLAN30: Empleados (1mbps)
bandwidth 1000
ip address 192.168.30.1 255.255.255.0
!
interface FastEthernet0/0.31
description VLAN31: Empresa A (1mbps)
bandwidth 1000
ip address 200.200.30.1 255.255.255.248
!
interface FastEthernet0/0.32
description VLAN32: Empresa B (256 kbps)
bandwidth 256
ip address 200.200.30.9 255.255.255.248
!
interface Serial0/0
bandwidth 10000000
ip address 200.43.64.97 255.255.255.224
service-policy input TraficoEntrante
service-policy output TraficoSaliente
!
ip classless
no ip http server
!
access-list 10 permit 200.200.10.0 0.0.0.255
access-list 20 permit 200.200.20.0 0.0.0.255
access-list 30 permit 192.168.30.0 0.0.0.255
access-list 31 permit 200.200.30.0 0.0.0.7
access-list 32 permit 200.200.30.8 0.0.0.7
!
line con 0
line aux 0
line vty 0 4
login
!
end

El comando "do"


Este truco ya es viejo, pero aún en día veo gente que no lo sabe y termina escribiendo de mas:

¿Cuántas veces nos pasó al levantar un enlace nuevo y al instante queremos probarlo?. Lo habitual es que pase esto:
ero#conf t
Enter configuration commands, one per line. End with CNTL/Z.
ero(config)#interface g1/0
nero(config-if)#ip address 10.0.0.1 255.255.255.0
ero(config-if)#no shutdown
*Feb 16 17:51:19.643: %LINK-3-UPDOWN: Interface GigabitEthernet1/0, changed
e to up
ero(config-if)#ping 10.0.0.2
                      ^
% Invalid input detected at '^' marker.

El apuro nos nubla el cerebro y no podemos apretar Ctrl+Z para volver al modo privilegiado!!!.

Ni hablar de si estamos editando algún tipo de política de enrutamiento, access-list o cualquier cosa que sea un submodo de configuración:
ero(config)#route-map COSA-IMPORTANTE permit 156
ero(config-route-map)#match ip address prefix-list LISTA-PRIVADA 
ero(config-route-map)#set tag 65333
ero(config-route-map)#set ip next-hop ?
  A.B.C.D              IP address of next hop
  dynamic              application dynamically sets next hop
  peer-address         Use peer address (for BGP only)
  recursive            Recursive next-hop
  verify-availability  Verify if nexthop is reachable

¿Cual era el next-hop?... hay que sacarlo de la tabla de enrutamiento... pero... tengo que salir del modo de configuración del route-map... ver la tabla... y luego volver a entrar...
Pare de sufrir amigo!!
Para estos menesteres existe el comando DO:

ero(config-route-map)#do 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 192.168.76.43 to network 0.0.0.0

C    192.168.76.0/24 is directly connected, FastEthernet0/0
     10.0.0.0/24 is subnetted, 1 subnets
C       10.0.0.0 is directly connected, GigabitEthernet1/0
S*   0.0.0.0/0 [1/0] via 192.168.76.43
ero(config-route-map)#set ip next-hop 192.168.76.43ero(config-route-map)#endero#

Siempre que quieras ejecutar un comando estando en un modo de configuración antepone el comando do para que IOS lo ejecute igual.
ero(config-if)#ip address 10.0.0.1 255.255.255.0
ero(config-if)#no shutdown
*Feb 16 17:51:19.643: %LINK-3-UPDOWN: Interface GigabitEthernet1/0, changed
e to up
ero(config-if)#do ping 10.0.0.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 10.0.0.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/8/12 ms

ero(config)#cry keyring security
ero(conf-keyring)#do show ip interface brief
Interface                  IP-Address      OK? Method Status     Protocol
FastEthernet0/0            192.168.76.40   YES manual up            up
GigabitEthernet1/0         10.0.0.1        YES manual up            up
SSLVPN-VIF0                unassigned      NO  unset  up            up
Loopback0                  unassigned      YES unset  up            up

El único problema con esto es que no vas a poder autocompletar con la tecla [TAB] ni va tener la ayuda contextual con el ?.  Pero bueno, al fin y al cabo la felicidad nunca es completa.

Usar un router como servidor DNS


Esto es una cosa bastante extraña, pero nos puede ayudar en muchos laboratorios y prácticas donde necesitamos jugar con la resolución de nombre a IP y viceversa.

Yo no recomiendo usar esto en un entorno de producción dado que varias fallas se han publicado alrededor de los servicios de DNS y el router no debería proveerlos salvo en determinados escenarios o bien por razones de fuerza mayor.

La configuración es muy sencilla, y vamos a crear el dominio capaocho.net, donde tenemos el router servidor DNS con la ip 172.19.25.229 y el cliente con la 172.19.25.230.

Habilitamos el servicio y declaramos el registro SOA del dominio:
ip dns server
ip dns primary capaocho.net soa dns-server.capaocho.net 
info@capaocho.net 86400 3600 864000 86400

Ahora configuramos los RR

! El DNS
ip host capaocho.net ns dns-server.capaocho.net.
! Los servidores de mails con sus prioridades
ip host capaocho.net mx 10 mx1.capaocho.net.
ip host capaocho.net mx 20 mx2.capaocho.net.
! La ip del router/servidor DNS
ip host dns-server.capaocho.net 172.19.25.229
! Los registros A de los servidores de mails
ip host mx1.capaocho.net 192.0.2.10
ip host mx2.capaocho.net 192.0.2.11

Para usar el servicio de cliente de dns en un router usamos:

ip name-server 172.19.25.229
ip domain-lookup

Probamos...

DNS-Client#ping dns-server.capaocho.net
Translating "dns-server.capaocho.net"...domain server (172.19.25.229) [OK]

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 172.19.25.229, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/5/8 ms

DNS-Client#ping mx1.capaocho.net

Translating "mx1.capaocho.net"...domain server (172.19.25.229) [OK]

Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.0.2.10, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/8/12 ms

Y en el server vemos las estadísticas:

DNS-Server#show ip dns statistics 
DNS requests received = 4 ( 4 + 0 )
DNS requests dropped  = 0 ( 0 + 0 )
DNS responses replied = 4 ( 4 + 0 )

Espero que les sea de utilidad para sus prácticas.

Configuración de Switch de Frame Relay


Más de una vez me ha pasado que configuro un lab con GNS3 y tengo problemas con los switches de Frame Relay. Las configuraciones se me borran, o bien se cambian los números de DLCI y de puertos.

El problema pasa habitualmente al momento de cargar una topología guardada, por lo que busqué la solución a mis problemas configurando un router como para conmutar frame relay tal cual como hacíamos en la academia CCNA hace varios años atrás.
Nota: La configuración de un dispositivo Cisco como switch Frame Relay no se incluye dentro de los temas de estudio del exámen CCNA.

En este ejemplo vamos a configurar la siguiente topología:

Para el FR-SW en dynamips utilizamos un Cisco 7200 con varias interfaces serie (también se puede con los otros routers más chicos, incluso con un 1700).



Estas son las configuraciones:

FR-SW:


FRSWITCH#show running-config

Building configuration...
!
![config recortada para mejor lectura...]
!
hostname FR-SW
!
frame-relay switching
!
![...]
!
interface Serial1/1
no ip address
 encapsulation frame-relay
serial restart-delay 0
 frame-relay intf-type dce
frame-relay route 100 interface Serial1/2 200
!
interface Serial1/2
no ip address
 encapsulation frame-relay
serial restart-delay 0
 frame-relay intf-type dce
frame-relay route 200 interface Serial1/1 100
!
![sigue la config...]
! 

Los dos nodos que se van a intercomunicar deben configurarse como cualquier otro, ya sea usando la interface física o subinterfaces.

RouterA:


RouterA#show running-config
Building configuration...

Current configuration : 1374 bytes

!
hostname RouterA
!
interface Serial1/0
no ip address
 encapsulation frame-relay
serial restart-delay 0
!
interface Serial1/0.100 point-to-point
ip address 192.168.0.1 255.255.255.252
frame-relay interface-dlci 100
![...]

RouterB:


RouterB#show running-config
Building configuration...

Current configuration : 1374 bytes
!
hostname RouterB
!
![...]
!
interface Serial1/0
no ip address
 encapsulation frame-relay
serial restart-delay 0
!
interface Serial1/0.200 point-to-point
ip address 192.168.0.2 255.255.255.252
frame-relay interface-dlci 200
!

Pruebas de conectividad:


Obviamente podemos verificar que todo esté funcionando correctamente con:
RouterB#ping 192.168.0.1 repeat 15

Type escape sequence to abort.
Sending 15, 100-byte ICMP Echos to 192.168.0.1, timeout is 2 seconds:
!!!!!!!!!!!!!!!
Success rate is 100 percent (15/15), round-trip min/avg/max = 16/45/76 ms

RouterB#traceroute 192.168.0.1

Type escape sequence to abort.
Tracing the route to 192.168.0.1

1 192.168.0.1 148 msec 80 msec  68 msec

RouterB#show cdp neighbors
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
S - Switch, H - Host, I - IGMP, r - Repeater

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
RouterA          Ser 1/0.200        164           R       7206VXR   Ser 1/0.100

También podemos ver en el switch que el PVC se encuentra en estado SWITCHED:
FR-SW#show frame-relay pvc

PVC Statistics for interface Serial1/1 (Frame Relay DCE)

Active     Inactive      Deleted       Static
Local          0            0            0            0
Switched       1            0            0            0
Unused         0            0            0            0

DLCI = 100, DLCI USAGE = SWITCHED, PVC STATUS = ACTIVE, INTERFACE = Serial1/1

input pkts 91            output pkts 92           in bytes 21257
out bytes 20440          dropped pkts 0           in pkts dropped 0
out pkts dropped 0                out bytes dropped 0
in FECN pkts 0           in BECN pkts 0           out FECN pkts 0
out BECN pkts 0          in DE pkts 0             out DE pkts 0
out bcast pkts 0         out bcast bytes 0
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 0 bits/sec, 0 packets/sec
switched pkts 91
Detailed packet drop counters:
no out intf 0            out intf down 0          no out PVC 0
in PVC down 0            out PVC down 0           pkt too big 0
shaping Q full 0         pkt above DE 0           policing drop 0
pvc create time 00:52:08, last time pvc status changed 00:23:16

PVC Statistics for interface Serial1/2 (Frame Relay DCE)

Active     Inactive      Deleted       Static
Local          0            0            0            0
Switched       1            0            0            0
Unused         0            0            0            0

DLCI = 200, DLCI USAGE = SWITCHED, PVC STATUS = ACTIVE, INTERFACE = Serial1/2

input pkts 93            output pkts 91           in bytes 20769
out bytes 21257          dropped pkts 2           in pkts dropped 2
out pkts dropped 0                out bytes dropped 0
in FECN pkts 0           in BECN pkts 0           out FECN pkts 0
out BECN pkts 0          in DE pkts 0             out DE pkts 0
out bcast pkts 0         out bcast bytes 0
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 0 bits/sec, 0 packets/sec
switched pkts 92
Detailed packet drop counters:
no out intf 0            out intf down 0          no out PVC 0
in PVC down 0            out PVC down 2           pkt too big 0
shaping Q full 0         pkt above DE 0           policing drop 0
pvc create time 00:51:42, last time pvc status changed 00:23:13



Y que CDP no se interpreta, dado que las tramas se conmutan:
FR-SW#show cdp neighbors
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
S - Switch, H - Host, I - IGMP, r - Repeater

Device ID        Local Intrfce     Holdtme    Capability  Platform  Port ID
FRSWITCH#

Espero que lo usen y les sirva tanto como a mí.

Sumarización de direcciones IP


Siempre vemos que se trata el tema de la sumarización de redes contiguas. Esto es aplicar CIDR para agrupar muchas direcciones de red en una sola que las contiene a todas.
  • Esto trae muchos beneficios como por ejemplo:
  • Hace más pequeñas las tablas de enrutamiento.
  • Esto hace que las búsquedas en la tabla sean más rápidas.
  • Vuelve más legible la información.
  • Oculta información específica acerca de las redes sumarizadas.
  • Las redes más pequeñas incluídas pueden caerse sin que esto afecte a la publicación del sumario.
  • Los protocolos de enrutamiento dinámico pueden evitar consumir ancho de banda para las actualizaciones.
Hablando propiamente con números podemos decir que las redes:
  • 10.56.248.0/24
  • 10.56.249.0/25
  • 10.56.249.128/26
  • 10.56.249.192/26
  • 10.56.250.0/23

Pueden sumarizarse como: 10.56.248.0/22.

Ahora vamos a ver como hacemos este cálculo:

Paso 1: Escribir las direcciones en binario.

10.56.248.0/24:
00001010.00111000.11111000.00000000

10.56.249.0/25
00001010.00111000.11111001.00000000

10.56.249.128/26
00001010.00111000.11111001.10000000

10.56.249.192/26
00001010.00111000.11111001.11000000

10.56.250.0/23
00001010.00111000.11111010.00000000

Paso 2: Ver cuantos bits coinciden de izquierda a derecha en todas las redes a la vez.


Con esto sacamos el prefijo en bits:
00001010.00111000.11111000.00000000
00001010.00111000.11111001.00000000
00001010.00111000.11111001.10000000
00001010.00111000.11111001.11000000
00001010.00111000.11111010.00000000
22 bits coinciden perfectamente de izquierda a derecha, por lo que vemos que el resultado va a ser un /22.

Paso 3: Ponemos en cero todos los bits que no coinciden y escribimos un número único:

00001010.00111000.11111000.00000000

Paso  4: Pasamos ese número a decimal:

00001010 = 10
00111000 = 56
11111000 = 248
00000000 = 0

= 10.56.248.0

Paso 5: Concatenamos el resultado anterior con el prefijo del paso 2:

10.56.248.0/22

Paso 6: Opcionalmente transformamos el prefijo en máscara decimal:

22 bits = 11111111.11111111.11111100.00000000 = 255.255.252.0
Espero que este método les sirva.