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