Peligro al retirar un route-map de la redistribución OSPF

Fecha: 6 y 16 de octubre del 2020

 

Escenario

 

Este laboratorio sale de una experiencia retirando rutas de un equipo real, y que casi ocasiona una catástrofe

inyectando rutas que no debían inyectarse en otros equipos.

El escenario es mucho mas complejo (unos 10 routers y unas 30 redes) y unas cuantas rutas estáticas redistribuídas

sin quererlo, pero laidea de la inyección de rutas como daño colateral puede reproducirse.

Lamentablemente este escenario se debe realizar con equipos reales (y que no esten en producción).

 

 

 

Básicamente nace de un error humano (yo mismo) que realizando un rollback y pensando que retirando el route-map de la

redistribución OSPF se terminaba el asunto, y que me generó una avalancha de rutas que se pisaron y/o duplicaron.

 

Afortunadamente resolverlo me llevó mucho menos que realizar este documento.

 

1.- Configuración original:

 

RouterA:

 

Esto es, redistribuye solo las rutas que coincidan con la ACL que esta asociada al route-map.

 

      

 

En otros laboratorios ya lo mencioné: en CCNA aprendemos a leer un running-config en forma lineal y de arriba para abajo,

pero la realidad es mas compleja ya que hay que ir venir para entender la lógica de un route-map y donde esta aplicado.

 

2.- Verificación en Router_B:

 

Esto es en condiciones normales, en Router_B la ruta a 192.168.3.0/24 se aprende desde Router_C, y desde Router_A

no se redistribuye ya que está denegada (por default) en la ACL asociada al route-map (asociado a la redistribución OSPF).

 

Desde Router_A sólo aprendemos la ruta a 192.168.30.0/24 que es la que matchea con la ACL aplicada al route-map

asociado a la redistribución (como muestra el gráfico anterior).

 

Router_B#sh ip route

Codes: L - local, 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, E - EGP

       i - IS-IS, 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

 

     10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks

C       10.0.0.0/30 is directly connected, GigabitEthernet0/0/1

L       10.0.0.2/32 is directly connected, GigabitEthernet0/0/1

O    192.168.1.0/24 [110/2] via 10.0.0.1, 00:48:16, GigabitEthernet0/0/1

     192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks

C       192.168.2.0/24 is directly connected, GigabitEthernet0/0/0

L       192.168.2.1/32 is directly connected, GigabitEthernet0/0/0

     192.168.3.0/24 is variably subnetted, 2 subnets, 2 masks

O          192.168.3.0/30 [110/2] via 192.168.2.2, 00:41:18, GigabitEthernet0/0/0 (se aprende de Router_C)

O E2 192.168.30.0/24 [110/20] via 10.0.0.1, 00:34:13, GigabitEthernet0/0/1 (sólo se aprende de Router_A)

 

Router_B#

 

3.- Retiramos el route-map de la redistribución:

 

Aquí eliminamos la línea de redistribución (en el caso real era mas compleja la historia pero aplica al ejemplo).

 

RouterA(config)#router ospf 1

RouterA(config-router)#no redistribute static subnets route-map REDISTRIBUTE

RouterA(config-router)#^Z

RouterA#

 

4.- Verificamos:

 

En Router_B la ruta a 192.168.3.0/24 se aprende desde Router_C, y desde Router_A (por medio de redistribución),

dependiendo desde donde uno se encuentre administrando el router (por ejemplo desde la red 3.x uno se podría

quedar afuera de la gestión, y habría que saltar desde un router directamente conectado o desde una red no-pisada

por la entrada duplicada en la tabla).

 

Router_B#sh ip route

Codes: L - local, 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, E - EGP

       i - IS-IS, 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

 

     10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks

C       10.0.0.0/30 is directly connected, GigabitEthernet0/0/1

L       10.0.0.2/32 is directly connected, GigabitEthernet0/0/1

O    192.168.1.0/24 [110/2] via 10.0.0.1, 00:48:16, GigabitEthernet0/0/1

     192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks

C       192.168.2.0/24 is directly connected, GigabitEthernet0/0/0

L       192.168.2.1/32 is directly connected, GigabitEthernet0/0/0

      192.168.3.0/24 is variably subnetted, 2 subnets, 2 masks

O E2    192.168.3.0/24 [110/20] via 10.0.0.1, 00:48:16, GigabitEthernet0/0/1  (se aprende de Router_A)

O          192.168.3.0/30 [110/2] via 192.168.2.2, 00:41:18, GigabitEthernet0/0/0  (se aprende de Router_C)

O E2 192.168.30.0/24 [110/20] via 10.0.0.1, 00:34:13, GigabitEthernet0/0/1

 

Router_B#

 

5.- Que podria suceder con este escenario ?

 

Podría suceder que al quedar con dos rutas factibles y legítimas, Router_B comience a balancear tráfico y el paquete #1 iría

a Router_A, luego al terminador VPN (un firewall statefull), este lo reenvía por la VPN a la red 3.0, pero el paquete #2 tal vez

vuelva por Router_C (eso no sería un problema) y el paquete #3 nuevamente siga la ruta Router_B a Router_A y al llegar al

terminador VPN el statefull dropee un TCP ACK debido a que nunca pasó por el un TCP SYN,ACK.

 

 

No sucedería lo mismo si enviaramos varios pings ICMP, ya que la solicitud de eco pasaría por Router_B a Router_A y luego al

terminador VPN, la respuesta (respuesta de eco) iría a la red 2.0 por Router_C.

El próximo ping ya tendría un número de secuencia nuevo, el terminador VPN lo vería como un segundo ping sin respuesta del

primero. Esto desconcertaría (bastante) el diagnóstico del problema ya que para el que lo envía, el ping funcionaría.

 

6.- Verificamos por qué se sigue redistribuyendo:

 

Habiendo tantos comandos lindos y nutritivos, uno a los que un asceta debe renunciar es a # sh runn.

 

RouterA#sh ip protocol

*** IP Routing is NSF aware ***

 

Routing Protocol is "ospf 1"

  Outgoing update filter list for all interfaces is not set

  Incoming update filter list for all interfaces is not set

  Router ID 192.168.1.1

  It is an autonomous system boundary router

 Redistributing External Routes from,

    static, includes subnets in redistribution (la redistribución sigue activa)

  Number of areas in this router is 1. 1 normal 0 stub 0 nssa

  Maximum path: 4

  Routing for Networks:

    192.168.1.0 0.0.0.255 area 0

    10.0.0.0 0.0.0.3 area 0

  Routing Information Sources:

    Gateway         Distance      Last Update

    10.0.0.2          110               1d00h

RouterA#

 

7.- Purgamos el OSPF:

 

Aunque no es una práctica que se haga a la primera, aqui nos sirve de manera didáctica para descartar alguna

“mugre” del OSPF y terminar de asumir que no es necesario andar ejecutando este comando :-/

 

RouterA#clear ip ospf proc

Reset ALL OSPF processes? [no]: yes

RouterA#

 

8.- Verificamos:

 

8.1.- Manera “asceta”:

 

RouterA#sh ip protocol

*** IP Routing is NSF aware ***

 

Routing Protocol is "ospf 1"

  Outgoing update filter list for all interfaces is not set

  Incoming update filter list for all interfaces is not set

  Router ID 192.168.1.1

  It is an autonomous system boundary router

 Redistributing External Routes from,

    static, includes subnets in redistribution (la redistribución sigue activa)

  Number of areas in this router is 1. 1 normal 0 stub 0 nssa

  Maximum path: 4

  Routing for Networks:

    192.168.1.0 0.0.0.255 area 0

    10.0.0.0 0.0.0.3 area 0

  Routing Information Sources:

    Gateway         Distance      Last Update

    10.0.0.2          110               1d00h

RouterA#

 

8.2.- Manera “mortales de a pié”:

 

RouterA#sh runn | beg ospf 1

router ospf 1

 router-id 192.168.1.1

 redistribute static subnets  (sigue figurando pero sin el route-map, o sea, redistribuye todas las estáticas)

 network 192.168.1.0 0.0.0.255 area 0

 network 10.0.0.0 0.0.0.3 area 0

!

 

9.- Solución 1:

 

Esta es la solución mas rápida, o sea, quitar la redistribución por segunda vez.

 

RouterA#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

RouterA(config)#router ospf 1

RouterA(config-router)#no redistribute static subnets

RouterA(config-router)#^Z

RouterA#

 

10.- Verificamos:

 

10.1.- Versión asceta:

 

RouterA#sh ip protocol

*** IP Routing is NSF aware ***

 

Routing Protocol is "ospf 1"

  Outgoing update filter list for all interfaces is not set

  Incoming update filter list for all interfaces is not set

  Router ID 192.168.1.1

  It is an autonomous system boundary router

 Redistributing External Routes from, (no hay redistribución)

   Number of areas in this router is 1. 1 normal 0 stub 0 nssa

  Maximum path: 4

  Routing for Networks:

    192.168.1.0 0.0.0.255 area 0

    10.0.0.0 0.0.0.3 area 0

  Routing Information Sources:

    Gateway         Distance      Last Update

    10.0.0.2          110         1d00h

RouterA#

 

10.2.- Versión “gente de a pie”:

 

RouterA#sh runn | beg ospf 1 (no hay redistribución)

router ospf 1

 router-id 192.168.1.1

 network 192.168.1.0 0.0.0.255 area 0

 network 10.0.0.0 0.0.0.3 area 0

!

 

11.- Solución 1 (versión completa):

 

RouterA#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

RouterA(config)#router ospf 1

RouterA(config-router)#no redistribute static subnets route-map REDISTRIBUTE

RouterA(config-router)#no redistribute static subnets

RouterA(config-router)#end

RouterA#

 

12.- Solución 2 (la más elegante):

 

Sin quitar el route-map de la redistribución, ponemos en primer lugar una sentencia que deniegue.

 

Router_A#conf t

Enter configuration commands, one per line. End with CNTL/Z.

Router_A(config)#ip access-list standard REDISTRIBUYE

Router_A(config-std-nacl)#5 deny any

Router_A(config-std-nacl)#no 10

Router_A(config-std-nacl)#end

Router_A#

 

13.- Verificación:

 

ip access-list standard REDISTRIBUYE

 deny any

!

 

router ospf 1

 router-id 192.168.1.1

 redistribute static subnets  route-map REDISTRIBUTE (hay redistribución, pero de ninguna ruta)

 network 192.168.1.0 0.0.0.255 area 0

 network 10.0.0.0 0.0.0.3 area 0

!

 

14.- Verificación en Router_B:

 

Router_B#sh ip route

Codes: L - local, 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, E - EGP

       i - IS-IS, 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

 

     10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks

C       10.0.0.0/30 is directly connected, GigabitEthernet0/0/1

L       10.0.0.2/32 is directly connected, GigabitEthernet0/0/1

O    192.168.1.0/24 [110/2] via 10.0.0.1, 00:48:16, GigabitEthernet0/0/1

     192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks

C       192.168.2.0/24 is directly connected, GigabitEthernet0/0/0

L       192.168.2.1/32 is directly connected, GigabitEthernet0/0/0

     192.168.3.0/24 is variably subnetted, 2 subnets, 2 masks

O       192.168.3.0/30 [110/2] via 192.168.2.2, 00:41:18, GigabitEthernet0/0/0 (se aprende sólo desde Router_C)

 

Router_B#

 

15.- Resumen:

 

La redistribución es un tema largo y complejo, este lab nos muestra básicamente como evitar un error humano de manera

elegante y que tener en cuenta si algún mal día de trabajo esto nos pasara.

 

 

(2020) OSPF it’s almost alchemy

Rosario, Argentina