Friday, December 24, 2010

Controlando el ancho de banda con CBQ en GNU/Linux


Con CBQ (Class Based Queueing) podemos controlar nuestro ancho de banda de una forma bien sencilla, para su funcionamiento utiliza las herramientas ip y tc, y viene con el paquete llamado iproute, el cual se encuentran en los repositorios de la mayoría de las distribuciones, por lo cual lo instalamos desde los repositorios.


yum install iproute


Nos dirigimos a la ruta raíz de los archivos de configuración, la cual es /etc/sysconfig/cbq/,  en esta ruta crearemos los archivos necesarios para controlar el ancho de banda los cuales tendran la siguiente nomenclatura:

cbq-[Numero de clase].[nombre]

Por ejemplo si queremos crear un archivo para controlar el ancho de banda para el puerto 80 o http, simplemente lo crearíamos de la siguiente manera:

cbq-0002.http-in

Aqui definimos 0002, ya que el numero de clase va desde 0002, y puse http-in simplemente para tener una referencia a lo que vamos a controlar (http-in, entrada por http), para definir la salida podemos crear otro archivo con la siguiente nomenclatura:

cbq-0003.http-out

Aqui definimos out en vez de in, para tener una referencia de que vamos a controlar la salida de datos por http, "IN" vendria siendo la descarga de datos, y "OUT" la subida de datos.

Sabiendo la nomenclatura de estos archivos, vamos a dar un ejemplo de la red en la cual estamos:

Tenemos un servidor con dos interfaces de red, la eth0 va hacia Internet y la eth1 va hacia la red local, los computadores de la red local son enmascarados por el Firewall para salir a Internet por la eth0 (Guia para la implementación de un Firewall con Shorewall).

Partiendo desde esta estructura de red, vamos a definir los parámetros necesarios en los archivos de configuración:

DEVICE: Aqui definiremos la interfaz a controlar y su ancho de banda, en mi caso tengo 1Mbps de bajada y la interfaz a controlar es la eth1:

DEVICE=eth1, 1Mbit

RATE: Aqui definiremos el ancho de banda a asignar a la clase que estamos creando, en mi caso quiero definir 256kbps para http, entonces se veria asi:

DEVICE=eth1, 1Mbit
RATE=256kbit

WEIGHT: Aqui definiremos el peso, el cual es igual a nuestro ancho de banda total entre diez, en nuestro caso que tenemos 1mbps (1Mbit), entonces se veria asi:


DEVICE=eth1, 1Mbit
RATE=256kbit
WEIGHT=100kbit


Y por ultimo el parametro RULE, en el cual se definen las reglas de filtración, su nomenclatura es la siguiente:

RULE=[IP-ORIGEN:PUERTO-ORIGEN],[IP-DESTINO:PUERTO-DESTINO]

No hay mejor manera de explicar esto que con simples ejemplos:

1) Controlar el ancho de banda de el rango de ip 192.168.2.0/24 a el puerto 80:

RULE=192.168.2.0/24,:80

2) Controlar el ancho de banda de cualquier red y puerto a cualquier red y puerto:

RULE=,

Nuestro archivo de configuración para la clase cbq-0002.http-in, la cual controlaria la entrada de datos via http, se veria asi:


DEVICE=eth1, 1Mbit
RATE=256kbit
WEIGHT=100kbit
RULE=:80,192.168.0.0/24
RULE=:443,192.168.0.0/24

Nuestro archivo de configuración para la clase cbq-0003.http-out, la cual controlaria la salida de datos via http, se veria asi:

DEVICE=eth1, 1Mbit
RATE=256kbit
WEIGHT=100kbit
RULE=192.168.0.0/24,:80
RULE=192.168.0.0/24,:443

Para finalizar copiamos el guion de inicio dentro de /etc/init.d:

cp -a /sbin/cbq /etc/init.d

Para probar que las clases estén correctas:

service cbq compile

Para correr cbq:

service cbq start

Para reiniciar:

service cbq restart

Para detener:

service cbq stop

Para arregarlo al inicio del sistema:

chkconfig cbq on


Nota: Si enmascaramos la interfaz eth1 con la eth0, en la clase cbq-0003.http-out no se reflejara el cambio, ya que cuando enmascaramos una interfaz, esta sale como si fuese la otra, asi que para que este cambio se refleje deberíamos aplicar esta clase a eth0, asi:

DEVICE=eth0, 1Mbit
RATE=256kbit
WEIGHT=100kbit
RULE=192.168.0.0/24,:80
RULE=192.168.0.0/24,:443




Si tienen otra solución, les agradecería que la compartan, eso es todo por hoy sobre CBQ, espero que les haya servido, hasta la próxima.

Saludos.

1 comentarios:

Anonymous said...

This is such a great resource that you are providing and you give it away for free. I enjoy seeing websites that understand the value of providing a prime resource for free. I truly loved reading your post. Thanks!

Post a Comment