miércoles, 11 de marzo de 2009

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.

Saludos!

0 comentarios:

Publicar un comentario