Dynamic QoS, part2.

3ra Variante: Utilizar scripts EEM, script Tcl, autocommand, track y time-based acl.
Requerimiento: Un usuario X (una persona muy importante) en la Entidad1 requiere que la QoS aplicada en el Tu0 del router Core se ajuste para brindarle prioridad a su tráfico generado en el trabajo con la APP1 y APP2.

Nota: Este requerimiento es bastante rebuscado!

Para cumplimentar el requerimiento se puede añadir y/o modificar la configuración en el router WanDR:

WanDR
!
// El usuario autorizado y prioritario de la Entidad1 quiere cambiar la QoS en el router WanDR de manera que su tráfico sea prioritario. Para ello se le configuran unas credenciales en el router WanDR. Pasos:
1ro – El usuario se conectará por telnet (o ssh) al router WanDR.
2do – Este le pedirá las credenciales.
3ro – El usuario tiene que hacer ping a la interfaz loopback 1, añadida específicamente para este propósito.
4to – La entrada dinámica de la ACL allowacces machea el tráfico del ping y genera logs que sirven como base para la ejecución del primer script EEM.
5to – El primer script EEM detect-prio-user-ip detecta el log de la entrada dinámica de la ACL allowacces y:
a) Ejecuta el script Tcl que busca la dirección ip específica incorporada en la entrada dinámica de la ACL allowacces, añade la dirección ip encontrada en la ACL prio-user-ip y cambia la configuación de policy-map SP-1024 para que en lugar de tener anidada la QoS WAN_EDGE, tenga anidada la Qos WAN_EDGE2.
b) Habilita el timer (yo puse 60 seg. para probar, pero se podrían poner 2 horas) en el segundo script EEM un-detect-prio-user-ip.
c) Cambia el estado del track 2 a down. El objetivo del track 2 es que el primer script pueda ejecutarse solamente si se cumplen la generación del log y el estado up. Esto se debe a que el log se puede generar varias veces.
6to – Una vez que el event timer del segundo script está activado pasará el tiempo correspondiente para su primera ejecución. Este tiempo está configurado a 60 seg (puede ser mucho más).
7mo – El segundo script EEM tiene como objetivo revertir todos los cambios realizados por el primer script (volver a restablecer la QoS):
a) Devuelve la QoS a su estado original.
b) Quita la dirección ip detectada de la ACL prio-user-ip.
c) Desactiva su propia ejecución.
username test password 0 test123
username test autocommand access-enable host timeout 1
!
// Este track sirve para complementar la función de ejecución de los dos scripts EEM.
track 2 stub-object
default-state up
!
// Se añade una nueva clase conocidad como usuario-prioritario que será marcada con ef.
class-map match-all PRIO-USER-IP
match access-group name prio-user-ip
class-map match-all PRIO-USER-IP-out
match ip dscp ef
!
// Nueva QoS anidada para incluir al usuario prioritario.
policy-map WAN_EDGE2
class PRIO-USER-IP-out
priority percent 60
class APP2-out
bandwidth percent 15
class APP1-out
bandwidth percent 15
class class-default
bandwidth percent 10
!
// Nueva QoS de entrada para incluir al usuario prioritario.
policy-map MARK-IN
class PRIO-USER-IP
set ip dscp ef
class APP1
set ip dscp af41
class APP2
set ip dscp af31
class class-default
set ip dscp default
!
// Dirección ip para la conexión telnet del usuario prioritario.
interface Loopback1
ip address 200.1.1.1 255.255.255.255
!
interface Tunnel0
ip access-group allowacces in
!
router eigrp 1
network 200.1.1.0
!
// ACL de entrada en la interfaz Tu0.
ip access-list extended allowacces
permit gre any any
permit eigrp any any
permit ip 144.1.0.0 0.0.255.255 144.1.0.0 0.0.255.255
// Entrada dinámica que se activa con el autocommand.
dynamic allowacces1 timeout 1 permit ip 144.1.0.0 0.0.255.255 host 200.1.1.1 log
// ACL que permite marcar el tráfico hacia el usuario prioritario. Es rellenada por el script EEM 1 y vaciada por el script EEM 2.
ip access-list extended prio-user-ip
!
// Primer script EEM.
event manager applet detect-prio-user-ip
//Se ejecuta cuando el track 2 está up y se detecta el log de conexión del usuario prioritario.
event tag 1 syslog pattern “list allowacces permitted icmp”
event tag 2 track 2 state up
trigger occurs 1 delay 5
correlate event 1 and event 2
attribute tag 1 occurs 1
attribute tag 2 occurs 1
action 001 cli command “enable”
// Ejecución del script Tcl que activa la ACL prio-user-ip con la ip del usuario prioritario y cambia la QoS.
action 002 cli command “tclsh nvram:exc7.tcl”
action 003 cli command “conf t”
// Cambiar el track a down para que no se vuelva a ejecutar el primer script EEM por otro log recibido.
action 004 track set 2 state down
// Activar el segundo script EEM.
action 005 cli command “event manager applet un-detect-prio-user-ip”
action 006 cli command “no event none”
action 007 cli command “event timer watchdog time 120”
action 012 cli command “end”
// Segundo script EEM.
event manager applet un-detect-prio-user-ip
event none
action 001 cli command “enable”
action 002 cli command “conf t”
// Cambio hacia la configuración original de QoS.
action 003 cli command “policy-map SP-1024”
action 004 cli command “class class-default”
action 005 cli command “shape average 972800 9728 0”
action 006 cli command “no service-policy WAN_EDGE2”
action 007 cli command “service-policy WAN_EDGE”
// Cambio del track a un estado up para habilitar una de las condiciones de ejecución del primer script.
action 008 track set 2 state up
// Desactivar el segundo script.
action 009 cli command “event manager applet un-detect-prio-user-ip”
action 010 cli command “no event timer watchdog time 60”
action 011 cli command “event none”
// Borrado de la ACL vinculada con los usuarios prioritarios.
action 012 cli command “ip access-list extended prio-user-ip”
action 013 cli command “no 10”
action 014 cli command “end”
!

Tcl script:
// Busca dentro de la ACL allowacces la ip registrada y reconfigura la QoS. Genera un log para avisar del cambio.
!
set a [exec “show access-lists allowacces”]
set empty “”
if {$a != $empty} {
set temp [split $a “\n”]
foreach j $temp {
regexp {permit ip host (.+?) host 200.1.1.1} $j => word
}
}
if {$word != $empty} {
ios_config “ip access-list extended prio-user-ip” “permit ip 144.1.0.0 0.0.255.255 host $word”
ios_config “policy-map SP-1024” “class class-default” “shape average 972800 9728 0” “no service-policy WAN_EDGE” “service-policy WAN_EDGE2”
}
set fd [open “syslog:” “w”]
puts $fd {%SYS-5-CONFIG_I: La acl prio-user-ip ya tiene la ip $word del usuario prioritario}
close $fd
!

Comprobación:

Antes

WanDR#sh track 2
Track 2
Stub-object
State is Up
16 changes, last change 00:59:18, by EEM
Tracked by:
EEM applet detect-prio-user-ip

WanDR#sh policy-map SP-1024
Policy Map SP-1024
Class class-default
Average Rate Traffic Shaping
cir 972800 (bps) bc 9728 (bits) be 0 (bits)
service-policy WAN_EDGE

WanDR#sh ip access-lists prio-user-ip
Extended IP access list prio-user-ip

WanDR#sh access-lists allowacces
Extended IP access list allowacces
10 permit gre any any
20 permit eigrp any any (2864 matches)
30 permit ip 144.1.0.0 0.0.255.255 144.1.0.0 0.0.255.255 (1038 matches)
40 Dynamic allowacces1 permit ip 144.1.0.0 0.0.255.255 host 200.1.1.1 log

Durante

WanDR#sh access-lists allowacces
Extended IP access list allowacces
10 permit gre any any
20 permit eigrp any any (2884 matches)
30 permit ip 144.1.0.0 0.0.255.255 144.1.0.0 0.0.255.255 (1119 matches)
40 Dynamic allowacces1 permit ip 144.1.0.0 0.0.255.255 host 200.1.1.1 log
permit ip host 144.1.100.1 host 200.1.1.1 log (100 matches) (time left 42)
WanDR#
*Jun 7 20:33:18.090: %SEC-6-IPACCESSLOGDP: list allowacces permitted icmp 144.1.100.1 -> 200.1.1.1 (8/0), 100 packets
WanDR#
*Jun 7 20:33:23.670: %SYS-5-CONFIG_I: Configured from console by on vty1
*Jun 7 20:33:23.854: %SYS-5-CONFIG_I: Configured from console by on vty1
WanDR#
*Jun 7 20:33:23.878: %SYS-5-CONFIG_I: La acl prio-user-ip ya tiene la ip $word del usuario prioritario
*Jun 7 20:33:24.054: %TRACK-6-STATE: 2 stub-object Up -> Down
WanDR#
*Jun 7 20:33:24.330: %SYS-5-CONFIG_I: Configured from console by on vty0 (EEM:detect-prio-user-ip)

WanDR#sh track 2
Track 2
Stub-object
State is Down
17 changes, last change 00:00:10, by EEM
Tracked by:
EEM applet detect-prio-user-ip

WanDR#sh policy-map SP-1024
Policy Map SP-1024
Class class-default
Average Rate Traffic Shaping
cir 972800 (bps) bc 9728 (bits) be 0 (bits)
service-policy WAN_EDGE2

WanDR#sh ip access-lists prio-user-ip
Extended IP access list prio-user-ip
10 permit ip 144.1.0.0 0.0.255.255 host 144.1.100.1

Después

WanDR#
*Jun 7 20:37:30.382: %TRACK-6-STATE: 2 stub-object Down -> Up
WanDR#
*Jun 7 20:37:30.954: %SYS-5-CONFIG_I: Configured from console by on vty0 (EEM:un-detect-prio-user-ip)

WanDR#sh track 2
Track 2
Stub-object
State is Up
20 changes, last change 00:00:11, by EEM
Tracked by:
EEM applet detect-prio-user-ip

WanDR#sh policy-map SP-1024
Policy Map SP-1024
Class class-default
Average Rate Traffic Shaping
cir 972800 (bps) bc 9728 (bits) be 0 (bits)
service-policy WAN_EDGE

WanDR#sh ip access-lists prio-user-ip
Extended IP access list prio-user-ip

Notas:
– Ciertamente los requerimientos de esta variante son muy específicos.
– Se pueden acortar los script EEM si se crean otros script Tcl.
– La búsqueda de la dirección IP se podía haber hecho con las expresiones regulares de EEM.
– Esta variante solo tiene en cuenta la ip de un usuario. Pudiera que la conexión de ese usuario active una modificación de la QoS para priorizar una vlan, una aplicación, etc.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s