Si bien los enlaces y conexiones a
internet son
hoy en día muy veloces, es normal que nos encontremos
con enlaces multipropósito, es decir, con conexiones que
nos sirven de soporte para varios tipos de servicio,
como por ejemplo, interet, correo corporativo, video conferencia,
canales de voz, consulta a servidores internos,
etc…
Aunque nuestras redes estén
configuradas para trabajar a 100Mbps o 10Mbps, no siempre (por no
decir nunca) es posible alcanzar estas velocidades de
transmisión, debido a la gran cantidad de colisiones que
presenta ethernet, sin
duda la topología más usada en la
actualidad. Debido a esto es conveniente tener bien definido que
servicios son
los fundamentales y cuanto ancho de banda requieren.
No sólo es importante definir las prioriedades en
cuanto a los servicios, también es muy importante definir
las prioridades que tienen las diferente subnets de nuestra
empresa, por
ejemplo, no podemos asignarle el mismo ancho de banda a areas
como desarrollo o
gerencia y a
areas como atención al
cliente o archivo. No
podemos permitir que el gerente de
nuestra empresa participe de una videoconferencia "entrecortada"
porque alguien aburrido en el archivo baja los últimos
mp3 desde
internet. Pensemos que ésta persona en el
archivo, luego de bajar los mp3, tiene la brillante idea de de
enviárselos a sus amigos dentro de la empresa por
correo corporativo, la gente de desarrollo no podría
acceder a sus bases de datos
debido al exesivo uso de ancho de banda ocupado por los mails
llenos de mp3. Todo esto hace a una buena administración de recursos.
Creo conveniente advertir, antes de que sea tarde, que
para poder
implementar este tipo de control, debemos tener un cierto
conocimiento
acerca de direccionamiento
IP, subnets, y puertos. O sea para poder limitar el uso de
Internet, debemos saber que puerto usa nuestro servidor proxy, para
limitar o liberar el uso de video conferencias, debemos saber que
puertos se utilizan para establecer el enlace, o la ip de la
máquina en la que se realiza dicha video
conferencia.
Para lograr nuestro objetivo no
vamos a utilizar ningún software especial ni
costoso, sólo utilizaremos herramientas
que vienen en las últimas distribuciones de linux (a partir
de la versión 2.4.20 de kernel), éstas herramientas
son, un controlador de tráfico (tc) y una especie de
temporizador (htb).
Debido a que éstas herramientas son relativamente
nuevas, hay que prestar mucha atención a la sintaxis y a los valores
que se asignan, ya que un valor
erróneo significaría dejar sin conexión a un
determinado sector o dejarlo totalmente libre con ancho de banda
ilimitado.
Este tipo de herramientas, al formar parte del propio
sistema operativo
tiene un elevado nivel de eficiencia y
precisión. Además de ser muy eficiente, es muy
sencillo anular su efecto ya que con una simple línea, se
anulan los efectos producidos.
Antes de hablar sobre sintaxis o de
explicarles algún ejemplo, creo conveniente explicar los
terminos y los elementos que hacen a que la
organización del "limitador" sea sencilla y
eficiente.
Es muy importante tener en claro antes de empezar a
limitar algo, saber los limites propios de lo que queremos
limitar, no tendría sentido ajustar el limitador de
velocidad de
un automóvil en 200Km/h cuando su velocidad final es de
140Km/h…. En nuestro caso pasa exactamente lo mismo, si
contamos con un enlace punto a punto de 64Kbps, de nada
servirá ajustar el limitador en 128Kbps o en 256Kbps,
nuestra línea seguirá saturada siempre.
Hecha la aclaración anterior, ya podemos empezar
a dar definiciones sobre cuanto ancho de banda habilitaremos para
determinados servicios, usuarios o subnets.
Establecemos primero el ancho de banda máximo
disponible en nuestras líneas de transmisión, este
valor puede ser, por ejemplo, de 10Mbps (Clase 1).
Luego definimos todos los límites
previstos o CLASES. Por ejemplo hemos definidos de que los
diferentes límites serán (sin importar aún a
que corresponde cada límite), 512Kbps (Clase 2), 256Kbps
(Clase 3) y 24Kbps (Clase 4). Con estos valores
tenemos definidas 4 CLASES. Esto significa que tendremos algunos
servicios, usuarios o subnets, con 1Mbps, otros con 512Kbps,
otros con 256Kbps y los últimos con 24Kbps.
Luego de definidas las CLASES, debemos empezar a definir
que corresponderá a cada clase, por ejemplo, gerencia
tendrá el máximo ancho de banda posible (Clase 1),
el correo corporativo será de Clase 3, Internet Clase 4,
Desarrollo Clase 2, Videoconferencia Clase 1, y el resto de
usuarios estarán limitados a la Clase 4.
Para que cada sector o servicio corresponda a una
determinada CLASE debemos aplicar FILTROS. Hay muchas formas de
hacer esto, por ejemplo se puede hacer trabajando en conjunto con
las entradas de las IPTABLES, pero esto ya hace todo un poco mas
complejo. Mi recomendación es trabajar sólo con los
comandos
mencionados anteriormente ya que nos brindan las mismas
potencialidades con una facilidad de implementación muy
superior.
Luego que tenemos las CLASES y los FILTROS, sólo
nos queda escribir el Script que implemente el
"limitador".
Creo conveniente explicar la implementación con
un ejemplo de Script que limita diferentes cosas, por ejemplo, un
grupo de
usuarios, una subnet y un servicio, dejando así en claro
como se implementa cada cosa, para que luego ustedes puedan
implementarlo a su medida.
Describiré brevemente los recursos
con los que contamos y como he decidido distribuirlos.
El limitador se aplicará, en un servidor Linux
por donde pasa todo el tráfico de Internet,
videoconferencia y correo corporativo. Este servidor tiene dos
placas de red, una
externa (eth0) y la otra interna (eth1). Nuestro proveedor de
Internet conectado a eth0 nos brinda un ancho de banda de 1Mbps.
Nuestra red interna está configurada para funcionar a
10Mbps máxima. Además tenemos contratado un enlace
punto a punto con una sucursal de 64Kbps por el cual viaja tanto,
internet, correo corporativo y canales de voz.
Nuestra distribución de direcciones ip y puertos es
la siguiente:
a)La Gerencia forma una subnet con la siguiente
numeración: 172.16.21.0/24.
b)Nuestra sucursal es la subnet
172.16.31.0/24
- El resto de los usuarios pertenecen a la subnet
172.16.1.0/24
d)El puerto usado por nuestro proxy de internet es el
3128
Vamos a definir 4 clases de ancho de banda:
- 10Mbps
- 256 Kbps
- 128 Kbps
- 24Kbps
Ahora definimos que grupo pertenece a cada
clase. Gerencia pertenecerá a la Clase I, Internet
pertenecerá a la Clase II, el resto de los usuarios
ocupará la Clase III y la sucursal será parte de la
Clase IV. En el caso de la sucursal, por ejemplo, los servicios de
internet y correo corporativo estarán limitados a
24Kbps, dejando el resto para canales de voz y otros servicios
que no pasen por el servidor donde instalaremos el
limitador.
El Script tendría el siguiente
contenido:
#!/bin/bash
#Definimos la placa de red interna, ya que es la que nos
interesa administrar.
DEV=eth1
#Definimos el camino al comando "tc", en caso de que no
este en el PATH
TC=tc ; este es el caso en el que esta en el
PATH
#Definimos todos los limites de ancho de banda a
utilizar en Kbps.
RATE1=1000
RATE2=256
RATE3=128
RATE4=24
# Esta linea elimina toda posible definicon anterior de
FILTROS y CLASES
$TC qdisc del dev $DEV root 2>&1
>/dev/null
#Definimos las CLASES existentes, ademas de la CLASE
root y la CLASE master que son necesarias para el funcionamiento
del script, pero que no debemos modificar.
#CLASE root y master
$TC qdisc add dev $DEV root handle 1: htb default
60
$TC class add dev $DEV parent 1: classid 1:1 htb rate
${RATE1}kbit
#CLASES y orden prioridad
#ClASE I
$TC class add dev $DEV parent 1:1 classid 1:10 htb rate
${RATE}kbit ceil ${RATE}kbit prio 1
$TC qdisc add dev $DEV parent 1:10 handle 10: sfq
perturb 10
#ClASE II
$TC class add dev $DEV parent 1:1 classid 1:20 htb rate
${RATE2}kbit ceil ${RATE2}kbit prio 2
$TC qdisc add dev $DEV parent 1:20 handle 20: sfq
perturb 10
#ClASE III
$TC class add dev $DEV parent 1:1 classid 1:30 htb rate
${RATE3}kbit ceil ${RATE3}kbit prio 3
$TC qdisc add dev $DEV parent 1:30 handle 30: sfq
perturb 10
#ClASE IV
$TC class add dev $DEV parent 1:1 classid 1:40 htb rate
${RATE4}kbit ceil ${RATE4}kbit prio 1
$TC qdisc add dev $DEV parent 1:40 handle 40: sfq
perturb 10
#Ya están las 4 CLASES definidas, ahora hay que
definir los FILTROS.
# FILTRO1 (Subnet GERENCIA a CLASE I)
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip dst 172.16.21.0/24 flowid 1:10
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip src 172.16.21.0/24 flowid 1:10
# FILTRO2 (INTERNET a CLASE II)
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip dport 3128 flowid 1:20
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip sport 3128 flowid 1:20
# FILTRO3 (Subnet RESTO USUARIOS a CLASE III)
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip dst 172.16.1.0/24 flowid 1:30
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip src 172.16.1.0/24 flowid 1:30
# FILTRO4 (Subnet SUCURSAL a CLASE IV)
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip dst 172.16.31.0/24 flowid 1:40
$TC filter add dev $DEV parent 1: protocol ip prio 1 u32
match ip src 172.16.31.0/24 flowid 1:40
#Ya esta listo para correr, si queremos podemos mostrar
las clases y limites establecido (no muestra a quien
pertenece cada subnet o servicio).
$TC qdisc show dev $DEV
$TC class show dev $DEV
#Fin del Script
Con este sencillo Script, hemos logrado
desarrollar una muy potente herramienta que nos permite
administrar muy eficientemente los recursos con los que
disponemos. Demás está decir que recomiendo
firmemente leer los manuales de los
comandos utilizados, ya que esto dara una solidez de conocimiento
muy superior, y una posibilidad de ajustar más aun el
Script a la medida de sus necesidades.
- SuperShaper Script, de Smidsrod
Consulting
- Apuntes sobre control de Tafico en http://www.opalsoft.net/
- Kernighan/Pike (1987), Kernighan & Pike,
Prentice Hall
Diego Santoni