El presente artículo se divide en dos bloques: una exposición teórica de las listas de acceso
(estructura, tipos, formación de las condiciones que las conforman) y una serie de ejemplos
prácticos que aclararán rápidamente todos los conceptos establecidos en la primera parte.
Las reglas que componen las listas de acceso tienen tres partes: un número que identifica la
lista, una instrucción deny o permit y una condición
El número utilizado para identificar una lista concreta debe ser seleccionado de un rango
numérico acorde con el uso concreto de la lista. En la Tabla 1 vemos los principales tipos
de listas disponibles. En este artículo nos centraremos especialmente en las listas IP, en sus
formas Estándar y Extendida.
Desde la versión de Cisco IOS 11.2, y para listas IP, el identificador numérico de la lista
puede ser reemplazado por un identificador alfanumérico de hasta 64 caracteres (el
primero, obligatoriamente alfabético). Versiones posteriores de IOS extienden esta
característica al protocolo IPX. A este tipo de listas se les llama "Listas de acceso con
nombre" (Named ACLs) y su forma es la siguiente:
ESPECIFICACION DE CONDICIONES
Las condiciones de las listas de acceso permiten identificar las direcciones de origen y
destino de los paquetes. Junto con las direcciones se especifican máscaras que permiten
identificar la parte de la dirección que debe coincidir exactamente y la parte que puede ser
ignorada
Las máscaras de las listas de acceso son distintas a las máscaras de red y subred utilizadas
para configurar interfaces o rutas estáticas. Concretamente los ceros de las máscaras
significan que el bit correspondiente de la dirección es relevante, mientras que los unos
significan que el bit correspondiente de la dirección no ha de ser tenido en cuenta a la hora
de decidir si la condición se cumple. A las máscaras de las listas de acceso se les denomina
wildcard mask o máscaras comodín.
Decimal Binario
00001010.00001010.00001010.0000000
Dirección 10.10.10.0
0
00000000.00000000.00000000.1111111
Máscara 0.0.0.255
1
Esta condición selecciona las direcciones que comprenden desde la 10.10.10.0 hasta la
10.10.10.255, o dicho de otra forma las direcciones de la forma 10.10.10.x. Por ejemplo la
dirección 10.10.9.7 no cumple la condición (el tercer byte de la dirección es distinto en la
dirección y en la condición, y este tercer byte es relevante, tal como se indican los ceros de
la máscara para este tercer octeto) pero la dirección 10.10.10.254 si que cumpliría las
condiciones especificadas por la condición del ejemplo.
Las máscara inversa de las listas de acceso también puede ser determinada sustrayendo la
máscara normal de la máscara 255.255.255.255. En el ejemplo, la máscara comodín para la
red 10.10.10.255 con una máscara normal 255.255.255.0 sería 255.255.255.255 -
255.255.255.0 (normal) = 0.0.0.255 (inversa, comodín)
El uso adecuado de las máscaras comodín puede ayudarnos a seleccionar subconjuntos de
direcciones. En el siguiente ejemplo queremos crear una lista de acceso capaz de
seleccionar las redes
10.1.32.0/2 00001010.00000001.00100000.00000000/11111111.11111111.11111111.0000
4 0000
10.1.33.0/2 00001010.00000001.00100001.00000000/11111111.11111111.11111111.0000
4 0000
10.1.34.0/2 00001010.00000001.00100010.00000000/11111111.11111111.11111111.0000
4 0000
10.1.35.0/2 00001010.00000001.00100011.00000000/11111111.11111111.11111111.0000
4 0000
10.1.36.0/2 00001010.00000001.00100100.00000000/11111111.11111111.11111111.0000
4 0000
10.1.37.0/2 00001010.00000001.00100101.00000000/11111111.11111111.11111111.0000
4 0000
10.1.38.0/2 00001010.00000001.00100110.00000000/11111111.11111111.11111111.0000
4 0000
10.1.39.0/2 00001010.00000001.00100111.00000000/11111111.11111111.11111111.0000
4 0000
32 00100 000
33 00100 001
34 00100 010
35 00100 011
36 00100 100
37 00100 101
38 00100 110
39 00100 111
00000 111
podemos observar que la parte común a todas estas direcciones es la que comprende los
cinco bits de la derecha (los que ponemos a cero en la última fila. La dirección de red que
comprende las subredes del ejemplo será en binario
00001010.00000001.00100000.00000000 (usando para construirla los bits comunes a todas
las subredes y el resto a cero). Construiremos la máscara inversa o comodín usando ceros
para la parte que queremos seleccionar y unos para la que nos es indiferente que cambie:
00001010.00000001.00100000.00000000
00000000.00000000.00000111.11111111
El valor del tercer octeto de la máscara es en este caso 00000111, y pasado a decimal es 7.
Para el conjunto de redes de nuestro ejemplo la máscara 0.0.7.255 es capaz de seleccionar
todas las subredes.
* * *
En definitiva, buscaremos la máscara de red (o subred) que mejor recoja la condición que
queremos especificar y usaremos la fórmula anterior o una tabla como la 4 para convertir
de la máscara directa (la normal, la que usamos para configurar interfaces o rutas estáticas)
en una máscara inversa (el complemento de la máscara normal, que ya veremos en alguna
otra ocasión como también son utilizadas en la configuración de los protocolos de
enrutamiento OSPF y EIGRP)
Terminaremos presentando dos palabras clave bastante útiles a la hora de especificar ciertas
máscaras de uso muy corriente, host y any.
La palabra clave host se usa como atajo para especificar una dirección única (la de una
máquina específica). Por ejemplo
La palabra clave any se usa como atajo para especificar cualquier dirección:
access-list 10 deny any
10.208.60.1/24 eth ---[router A]--- se0 172.35.1.46/30 --WAN LINK-- 172.35.1.45/30 se0
---[router B]--- se1 172.35.1.49/30 --WAN LINK-- 172.35.1.50/30 se0 ---[router C]--- eth
10.208.48.1/24
La última línea es fundamental, debido a una especial característica de las listas de acceso:
siempre añaden de forma automática una denegación implícita del total (un deny any), de
forma que la lista
denegaría todo. Siempre tiene que haber una condición permit en una lista (si queremos que
deje pasar algo).
Por cierto, podemos configurar lo anterior de una forma más compacta mediante el uso de
host:
Vamos a aplicar la lista de acceso 1 en la interfaz serial 0 del router B. Lo haremos "de
entrada", esto es, aplicaremos el filtro a los paquetes que cumplan la condición de la lista de
acceso 1 pero sólo chequearemos contra esta lista los paquetes que entran al router B por la
interfaz serial 0. Para aplicar la lista de acceso se usa la órden access-group en la interfaz
adecuada:
interface serial 0
ip access-group 1 in
La lista anterior dejaría pasar paquetes con origen en las máquinas 10.208.60.10 y
10.208.60.25 si estos paquetes pasan por cualquier otra interfaz del router en cuelquier
sentido, e incluso si pasan por la interfaz serial0 en sentido saliente. Lo de entrante (in) o
saliente (out) es siempre desde el punto de vista del router donde se aplica la lista.
Antes de continuar con el resto de ejemplo de uso de las listas acceso vamos a ver una serie
de indicaciones acerca de su manipulación práctica
Esto se puede leer también como "consejos desde la trinchera". Con las listas de acceso se
filtra el tráfico: los efectos de las listas de acceso en la practica son bastante potentes, y los
usuarios que se ven afectados por ellas lo manifestarán sin duda de formas muy claras.
Recuerde que si aplica una lista de acceso en una interfaz que le está dando en ese
momento a Usted acceso al router (un caso típico, dado que los routers son equipos de red y
generalmente se gestionan de forma remota) se la "está jugando": es muy fácil crear una
lista de acceso que filtre más de la cuenta, u olvidarse de dar paso a los paquetes con origen
la red local desde la que gestiona el equipo. Nada más aplicar la lista el router le echará.
Cuando le pase no se lo tome a mal, más bien siéntase parte de la corporación: quedarse sin
gestión de un equipo en red forma parte del folklore. La situación tiene varios remedios que
se me ocurran de primeras: reload, reset y loopback:
Puede llamar a la delegación remota y pedir que reinicien el router (Manolo de seguridad
puede darle sin problemas el botonazo al "vídeo oscuro" del rack de la sala de
comunicaciones). Quedará con la configuración que tenía la última vez que se grabó con
write o con copy running startup. Por supuesto habrá perdido las últimas configuraciones
realizadas.
Una segunda alternativa es el uso de la orden de IOS reload in o reload at, por ejemplo
reload in 5 (que reinicia el router a los 5 minutos) o reload at 22:15 (que reinicia el equipo
a la hora especificada). Programe un reload, haga sus cambios y cancele el reinicio con
reload cancel. El router le avisará un minuto antes del reinicio. Puede ver como anda de
tiempo con show reload. Consulte la documentación de su versión de IOS para ver más
detalles sobre el uso de esta instrucción.
La tercera vía es algo más sofisticada. Sin entrar en muchos detalles, sabiendo la lista
configurada, puede crear una interfaz virtual (loopback interface) con una dirección de las
que permite la lista de acceso (porque... ¿puso un permit, no?) y hacer un telnet extendido
(telnet ip_router /source-interface loopback_número). En próximos artículos abordaré este
tipo de técnicas.
En general, es mejor escribir las listas en un editor de texto tipo vi o notepad y copiar/pegar
las configuraciones en el router. Esto es por varias razones, siendo una de las más
importantes que al borrar una línea (una condición) de una lista de acceso, borramos la lista
entera (y mucho ojo, porque la lista, aunque inexistente, sigue aplicada en la interfaz, línea
o dónde sea que la estemos usando). Osea, que si configuro
y me doy cuenta de que no quiero filtrar a Juan de contabilidad 10.208.60.10 sino a Julio de
recursos humanos 10.208.60.12, voy y configuro
Pero créame, da igual lo que yo le diga: hasta que no lo experimente Ud. mismo no verá
porqué hay que hacerlo de esta manera.
Podemos realizar un filtrado extendido, por ejemplo para dejar pasar los paquetes con
origen en la LAN del router A
hostname RouterB
!
interface ethernet0
ip access−group 101 in
!
access−list 101 permit ip 10.208.60.0 0.0.0.255 10.208.48.0 0.0.0.255
Con la orden show line puede ver las líneas de acceso al router, tales como las líneas
virtuales (VTY), el puerto de consola (CON), el puerto Auxiliar (AUX) y las líneas
Asíncronas (ASYNC). Podemos filtrar todas estas líneas y puertos por medio de la
instrucción access-class. La siguiente lista permite el acceso por los cinco terminales
virtuales (del 0 al 4) a aquellas máquinas que tengan por origen la LAN de A
hostname RouterC
!
interface serial0
ip access−group 105 in
!
access−list 105 deny tcp any any eq 23
access−list 105 permit ip any any
Digamos que queremos dejar navegar por internet , hacer telnet y el correo:
hostname RouterB
!
interface Serial0
ip access−group 120 in
!
access−list 120 permit tcp any any eq www
access−list 120 permit tcp any any eq telnet
access−list 120 permit tcp any any eq smtp
access−list 120 permit tcp any any pop3
Una lista como la anterior no dejaría pasar el tráfico ftp, por ejemplo. A veces podemos ser
víctimas de un ataque de denegación de servicio distribuido. Podemos ser inundados con
peticiones ping (ICMP) de muy diversos origenes. Probemos con
hostname RouterC
!
interface serial0
ip access−group 130 in
!
access−list 130 deny icmp any any
access−list 130 permit ip any any
Quedarán registrados en el log del router (show logg) todos los origenes y destinos de los
paquetes que encajan con la condición. Podemos convertir el router en un analizador de
tráfico con un par de instrucciones:
hostname RouterB
!
interface serial0
ip access−group 140 in
ip access−group 150 out
!
access−list 140 permit ip any any log
access−list 150 permit ip any any log
Este era el mecanismo usado en el artículo sobre ping para ver el origen y destino de los
paquetes. Más ejemplos: con listas de acceso horarias podemos controlar el uso de
determinados servicios en función de la hora
time-range bloquear-internet
periodic weekdays 8:30 to 17:45
!
access−list 150 deny any any eq www time-range bloquear-internet
access−list 150 permit any any
!
interface ethernet0
ip access−group 150 in
A veces queremos que en función del origen los paquetes vayan por una ruta (es distinto a
usar rutas estáticas, porque estas miran el destino, no el origen de los paquetes) ¿Puede
hacerse? Si. ¿Cómo?
Las listas de acceso sirven también para especificar el tráfico interesante capaz de lanzar
una llamada bajo demanda tipo RDSI, por ejemplo
interface Dialer1
dialer-group 1
!
dialer-list 1 protocol ip list 8
router eigrp 1
redistribute static route-map filtro
!
route-map filtro permit 10
match ip address 10
Otras aplicaciones interesantes de las listas de acceso son la priorización por protocolo, el
uso ajustado de la orden debug y el filtrado dinámico (con estado) de sesiones. Veremos en
próximos artículos algunos de estos usos.
RESUMEN
Las listas de acceso son el mecanismo por excelencia para seleccionar tráfico. Una vez que
un conjunto de paquetes ha sido seleccionado el router puede realizar diversas tareas sobre
ellos. Uno de los usos más extendidos de las listas de acceso es el de controlar el flujo de
tráfico entrante y saliente de un router, pero hemos visto otras muchas aplicaciones
prácticas. El proceso de configuración de listas de acceso consta de dos pasos generales, la
creación de la lista de acceso en sí y su aplicación en la interfaz correspondiente (o, de
forma más general, en el proceso deseado). Hay que tomar unas precauciones generales a la
hora de aplicar listas de acceso. Hemos mencionado tres mecanismos para prevenir o
corregir los problemas derivados de una mala configuración, recuerde: reload, reset y
loopback