Objetivo: Detectar el inicio y finalización determinados tráficos mediante ACLs y scripts EEM, y generar cambios de configuración que desvíen esos tráficos por enlaces secundarios, mediante el uso de scripts TCL.
Topología:
Esta topología tiene como objetivos:
– El tráfico de S1 y S2 hacia el Branch 1 y el retorno pase a través del Main link.
– El tráfico de S1 y S2 hacia el Branch 2 y el retorno pase a través del Backup link.
Este laboratorio tiene los siguientes objetivos:
– Detectar que se inicio una comunicación específica hacia el servidor S2 (en este caso una conexión ssh)
– Eliminar el PBR inicial en RA y RB.
– Cambiar en RB el PBR de manera que solo el tráfico de Branch 1 y 2 hacia el servidor S2 se vaya por el Backup link.
– Cambiar en RA el PBR de manera que solo el tráfico del servidor S2 hacia Branch1 y 2 se vaya por el Backup link.
– Detectar el fin de la comunicación específica hacia el servidor S2 y deshacer los cambios anteriores y restablecer el PBR inicial en RA y RB.
Solución en RB:
– Hacer un estudio de tráfico para ver que tipos de pkts y parámetros señalan el inicio y fin de la conexión ssh.
– Contruir una ACL que aplicada en un lugar determinado pueda detectar el inicio y fin de la conexión.
– Crear un sript EEM que chequee la ACL y cuando esta detecte el inicio de la conexión, generar cambios en la configuración y llamar a un script tcl (en este lab el script tcl solo tiene comandos de configuración del cli que hacen el cambio hacia el PBR que debe estar activo cuando inicia la comunicación específica). Este script también tiene que activar al script que chequea el fin de la conexión, desactivarse el mismo y tumbar una intefaz loopback que solo sirve de señalización a RA para saber que tiene que cambiar su PBR.
– Crear un sript EEM que chequee la ACL y cuando esta detecte el fin de la conexión, generar cambios en la configuración y llamar a un script tcl (en este lab el script tcl solo tiene comandos de configuración del cli que hacen el cambio hacia el PBR que debe estar activo cuando no hay comunicación específica ). Este script también debe que activar al script que chequea el inicio de la conexión, desactivarse el mismo, reiniciar los contadores de la ACL y levantar la interfaz loopback que le dice a RA que cambie su PBR hacia la configuración original.
Solución en RA:
– Crear un sla y un track que sigan el estado de la dirección ip de la loopback 0 de RB.
– Crear un script EEM que se active cuando el track cambie a down y que haga el cambio al PBR que debe estar activo cuando inicia la comunicación específica.
– Crear un script EEM que se active cuando el track cambie a up y que haga el cambio al PBR que debe estar activo cuando no hay comunicación específica.
Configuraciones:
RA
! hostname RA ! track 1 ip sla 1 reachability ! interface Loopback0 description Loopback0 ip address 10.1.27.1 255.255.255.255 ! interface FastEthernet0/0 ip address 10.1.1.254 255.255.255.0 ip policy route-map PBR ! interface FastEthernet0/2 description Main ip address 10.1.18.1 255.255.255.252 ! interface FastEthernet0/3 description Backup bandwidth 1000 ip address 10.1.18.5 255.255.255.252 ! router eigrp 1 network 10.0.0.0 ! ip access-list extended Branch1 permit ip any 10.1.136.0 0.0.0.255 ip access-list extended Branch2 permit ip any 10.1.137.0 0.0.0.255 ip access-list extended S2 permit ip host 10.1.1.2 any ! ip sla 1 icmp-echo 10.1.27.2 frequency 10 ip sla schedule 1 life forever start-time now ! route-map PBR permit 10 match ip address Branch2 set ip next-hop 10.1.18.6 ! event manager applet connect-init event track 1 state down action 100 cli command "enable" action 101 cli command "tclsh nvram:cora.tcl" action 102 cli command "end" event manager applet connect-fin event track 1 state up action 100 cli command "enable" action 101 cli command "tclsh nvram:disra.tcl" action 102 cli command "end" !
RB
! hostname RB ! /Interface que sirve para alertar a RA del inicio y final de la comunicación específica. interface Loopback0 description Loopback0 ip address 10.1.27.2 255.255.255.255 ! interface FastEthernet0/0 description Main /Enlace principal con RA ip address 10.1.18.2 255.255.255.252 /ACL que sirve para detectar el inicio y fin de la comunicacion específica. ip access-group DETECT in ! interface FastEthernet0/1 description Backup /Enlace backup con RA bandwidth 1000 ip address 10.1.18.6 255.255.255.252 /ACL que sirve para detectar el inicio y fin de la comunicacion específica. ip access-group DETECT in ! interface FastEthernet0/2 description Branch1 ip address 10.1.136.254 255.255.255.0 /PBR que cumple con los objetivos iniciales y que debe estar activo siempre y cuando no haya comunicación específica. ip policy route-map PBR ! interface FastEthernet0/3 description Branch2 ip address 10.1.137.254 255.255.255.0 /PBR que cumple con los objetivos iniciales y que debe estar activo siempre y cuando no haya comunicación específica. ip policy route-map PBR ! router eigrp 1 network 10.0.0.0 ! ip access-list extended Branch1 permit ip 10.1.136.0 0.0.0.255 any ip access-list extended Branch2 deny ip 10.1.137.0 0.0.0.255 10.1.136.0 0.0.0.255 permit ip 10.1.137.0 0.0.0.255 any /ACL para detectar el inicio y final de la comunicación específico. ip access-list extended DETECT permit tcp host 10.1.1.2 eq 22 10.1.136.0 0.0.1.255 match-all +ack +syn log permit tcp host 10.1.1.2 eq 22 10.1.136.0 0.0.1.255 match-all +ack +fin log permit ip any any ip access-list extended SSH permit ip 10.1.136.0 0.0.1.255 host 10.1.1.2 ! /PBR que cumple con los objetivos iniciales y que debe estar activo siempre y cuando no haya comunicación específica. route-map PBR permit 10 match ip address Branch2 set ip next-hop 10.1.18.5 ! /EEM Script para detectar el inicio de la conexión específica. event manager applet ACL-CHECK-syn /Cada 10 segundos se ejecuta el script. event timer watchdog time 10 action 100 cli command "en" /Obtener el resultado y los hits de la ACL que detecta el inicio y fin de la conexión específica. action 101 cli command "show ip access-list DETECT" action 102 set value "0" /Buscar dentro del resultado del comando una expresión que se corresponda con "syn log X match" y guardar el número de hits en la variable value. action 103 regexp "syn log \(([0-9]+) match\)" "$_cli_result" junk value /Si existe un resultado en la busqueda de la expresión regular continua. action 104 if $_regexp_result eq "1" /Si los hits son mayores que cero continua. action 105 if $value gt "0" action 106 puts "inicio de la conexion" action 107 cli command "conf t" /Activa el script que detecta el fin de la comunicación específica. action 108 cli command "event manager applet ACL-CHECK-fin" action 109 cli command "event timer watchdog time 10" /Desactivar la ejecución periódica de este script. action 110 cli command "event manager applet ACL-CHECK-syn" action 111 cli command "event none" action 112 cli command "end" /Ejecutar el script Tcl que cambia el PBR. action 113 cli command "tclsh nvram:connect.tcl" action 114 else action 115 cli command "clear access-list counters DETECT" action 116 end action 117 else action 118 puts "nada aun" action 119 end event manager applet ACL-CHECK-fin /EEM Script para detectar el final de la conexión específica. event none action 100 cli command "en" /Obtener el resultado y los hits de la ACL que detecta el inicio y fin de la conexión específica. action 101 cli command "show ip access-list DETECT" action 102 set value2 "0" /Buscar dentro del resultado del comando una expresión que se corresponda con "fin log X match" y guardar el número de hits en la variable value2. action 103 regexp "fin log \(([0-9]+) match\)" "$_cli_result" junk2 value2 /Si existe un resultado en la busqueda de la expresión regular continua. action 104 if $_regexp_result eq "1" /Si los hits son mayores que cero continua. action 105 if $value2 gt "0" action 106 puts "fin de la conexion" action 107 cli command "conf t" /Activar el script que detecta el inicia de la comunicación específica. action 108 cli command "event manager applet ACL-CHECK-syn" action 109 cli command "event timer watchdog time 10" /Desactivar la ejecución periódica de este script. action 110 cli command "event manager applet ACL-CHECK-fin" action 111 cli command "event none" action 112 cli command "end" /Limpiar los hits de la ACL y resetearla. action 113 cli command "clear access-list counters DETECT" /Ejecutar el script Tcl que cambia el PBR. action 114 cli command "tclsh nvram:disconnect.tcl" action 115 else action 116 cli command "clear access-list counters DETECT" action 117 end action 118 else action 119 puts "todavia conectado" action 120 end !
Connect.tcl
typeahead "y" ios_config "interface loopback 0" "shutdown" ios_config "route-map PBR permit 10" "match ip address SSH" "no match ip address Branch2" puts [exec "sh route-map"] puts "script ends"
Disconnect.tcl
typeahead "y" ios_config "interface loopback 0" "no shutdown" ios_config "route-map PBR permit 10" "match ip address Branch2" "no match ip address SSH" puts [exec "sh route-map"] puts "script ends"
Cora.tcl
typeahead "y" ios_config "route-map PBR permit 10" "match ip address S2" "no match ip address Branch2" puts [exec "sh route-map"] puts "script ends"
Disra.tcl
typeahead "y" ios_config "route-map PBR permit 10" "match ip address Branch2" "no match ip address S2" puts [exec "sh route-map"] puts "script ends"
Comprobación:
Antes del inicio de la conexión ssh entre PC2 y S2:
*Jun 14 08:18:53.779: %HA_EM-6-LOG: ACL-CHECK-syn: nada aun RB# RB#sh route-map route-map PBR, permit, sequence 10 Match clauses: ip address (access-lists): Branch2 Set clauses: ip next-hop 10.1.18.5 Policy routing matches: 734 packets, 61396 bytes RB# *Jun 14 08:19:04.194: %HA_EM-6-LOG: ACL-CHECK-syn: nada aun Branch1#traceroute 10.1.1.2 Type escape sequence to abort. Tracing the route to 10.1.1.2 VRF info: (vrf in name/id, vrf out name/id) 1 10.1.136.254 1 msec 1 msec 0 msec 2 10.1.18.1 1 msec 1 msec 1 msec 3 10.1.1.2 1 msec * 2 msec S2#traceroute 10.1.136.1 Type escape sequence to abort. Tracing the route to 10.1.136.1 VRF info: (vrf in name/id, vrf out name/id) 1 10.1.1.254 1 msec 0 msec 1 msec 2 10.1.18.2 1 msec 1 msec 12 msec 3 10.1.136.1 6 msec * 1 msec RB# *Jun 14 08:21:24.016: %HA_EM-6-LOG: ACL-CHECK-syn: nada aún RB# *Jun 14 08:21:29.804: %SEC-6-IPACCESSLOGP: list DETECT permitted tcp 10.1.1.2(22) -> 10.1.137.1(24739), 1 packet RB# *Jun 14 08:21:34.221: %HA_EM-6-LOG: ACL-CHECK-syn: inicio de la conexión RB# *Jun 14 08:21:35.389: %SYS-5-CONFIG_I: Configured from console by on vty0 (EEM:ACL-CHECK-syn) *Jun 14 08:21:35.597: %SYS-5-CONFIG_I: Configured from console by on vty1 *Jun 14 08:21:35.598: %SYS-5-CONFIG_I: Configured from console by on vty1 RB# *Jun 14 08:21:37.626: %LINK-5-CHANGED: Interface Loopback0, changed state to administratively down *Jun 14 08:21:38.633: %LINEPROTO-5-UPDOWN: Line protocol on Interface Loopback0, changed state to down RB#sh route-map route-map PBR, permit, sequence 10 Match clauses: ip address (access-lists): SSH Set clauses: ip next-hop 10.1.18.5 Policy routing matches: 766 packets, 64346 bytes RB# *Jun 14 08:21:45.455: %HA_EM-6-LOG: ACL-CHECK-fin: todavia conectado Branch1#traceroute 10.1.1.2 Type escape sequence to abort. Tracing the route to 10.1.1.2 VRF info: (vrf in name/id, vrf out name/id) 1 10.1.136.254 1 msec 1 msec 0 msec 2 10.1.18.5 1 msec 0 msec 2 msec 3 10.1.1.2 1 msec * 1 msec S2#traceroute 10.1.136.1 Type escape sequence to abort. Tracing the route to 10.1.136.1 VRF info: (vrf in name/id, vrf out name/id) 1 10.1.1.254 1 msec 1 msec 0 msec 2 10.1.18.6 2 msec 1 msec 1 msec 3 10.1.136.1 1 msec * 118 msec