Descargar

Herramientas para el control de ancho de banda en servidores Linux

Enviado por produccion


    1. Herramientas
    2. Principios de Funcionamiento
    3. Ejemplo
    4. Conclusión
    5. Bibliografía
    1. Introducción

    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.

    1. Herramientas

    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.

    1. Principios de Funcionamiento

    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.

    1. Ejemplo

    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

    1. 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:

    1. 10Mbps
    2. 256 Kbps
    3. 128 Kbps
    4. 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

    5) Conclusión

    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.

    6) Bibliografía

    • SuperShaper Script, de Smidsrod Consulting

    http://www.smidsrod.no/

    Diego Santoni