Mostrando entradas con la etiqueta Traffic Shaper. Mostrar todas las entradas
Mostrando entradas con la etiqueta Traffic Shaper. Mostrar todas las entradas

viernes, febrero 08, 2008

Limitar ancho de banda (server side)

La masividad de la banda ancha nos propone el siguiente problema: como repartir nuestro ancho de banda en la mayor cantidad de clientes posible, sin sacrificar la calidad de servicio.

La solución propuesta para este problema es un modulo llamado mod_bw para apache2, mod_bw es capaz de limitar el ancho de banda en cada virtualhost, directorio o servidor en general, para ello tiene varias opciones:

- Definir el ancho de banda máximo, para que este ancho de banda sea repartido en partes iguales entre las conexiones.

- Definir ancho de banda mínimo para cada conexión, una vez alcanzado el máximo de clientes (máximo de clientes = ancho de banda total / ancho de banda mínimo) rechaza futuras conexiones con un error personalizable.

- Definir ancho de banda máximo para ficheros grandes o de cierto tipo, ej: para archivos de audio no mas de X Kb/s o para archivos de cualquier tipo de mas de 500kb no mas de Y Kb/s.

- Definir Numero de conexiones máximas desde una ip/host/red.

1.- Implementación

Para implementar este modulo en FreeBSD basta con actualizar los ports y dirigirse a la carpeta /usr/ports/www/mod_bw/ y ejecutar el siguiente comando:

# make install clean

Luego abrir el archivo httpd.conf (usualmente en /usr/local/etc/apache2/) y descomentar la linea:

LoadModule bw_module libexec/apache2/mod_bw.so

y agregar la linea (opcional, por motivos de orden, la configuración se podría agregar directamente en httpd.conf pero recomiendo el uso de includes):

Include etc/apache2/mod_bw.conf

A continuacion crear el archivo /usr/local/etc/apache2/mod_bw.conf:

BandWidthModule On
ForceBandWidthModule On
BandWidth 192.168.0.0/255.255.0.0 0 Esta linea define ancho de banda ilimitado para la red 192.168.0.0
BandWidth all 10240 Esta linea define ancho de banda total para todos de 10 kb/s (ojo que las reglas se leen en orden)
MinBandWidth all 1024 Esta linea asegura un minimo de ancho de banda de 1 kb/s para cada cliente
#MinBandWidth all -1 Esta linea asegura un ancho de banda de 10 kb/s para cada conexion.
LargeFileLimit * 200 1024 Esta linea limita la descarga de cualquier tipo de fichero de mas de 200kb a 1kb/s

Y reiniciar el apache

#apachecrl graceful

2.- Reglas Posibles:

1 - BandWidthModule [On|Off]

Por defecto Off es necesario ponerla en On para que el modulo funcione

Example :
BandWidthModule On

2 - ForceBandWidthModule [On|Off]

Por defecto este modulo no va a atender todas las peticiones a menos que este parámetro este On.

Ejemplo :
(normal use)
AddOutputFilterByType MOD_BW text/html text/plain

(enabling Force)
ForceBandWidthModule On

3 - BandWidth [From] [bytes/s] ó BandWidth u:[User-Agent] [bytes/s]

Maximo ancho de banda o ancho de banda por cliente dependiendo del valor de MinBandWidth, acepta ip/host/red o incluro User-Agent.
Las reglas son evaluadas por orden.

Ejemplo :
BandWidth localhost 10240
BandWidth 192.168.218.5 0

BandWidth "u:^Mozilla/5(.*)" 10240
BandWidth "u:wget" 102400


4 - MinBandWidth [From] [bytes/s]

Determina la velocidad mínima por conexión, si es 0 corresponde al default 256 b/s, si es -1 corresponde al valor bandwidth para cada cliente.

Ejemplo :
BandWidth all 102400
MinBandWidth all 50000

En este caso tenemos un total de 10kb/s y un minimo de 50kb/s para cada cliente

BandWidth all 50000
MinBandWidth all -1

En este caso tenemos 50 kb/s para cada cliente

5 - LargeFileLimit [Type] [Minimum Size] [bytes/s]


Ejemplo :
LargeFileLimit .avi 500 10240

En este caso se limita la velocidad de descarga de archivos avi de mas de 500kb a 10kb/s

LargeFileLimit * 500 10240

En este caso se limita la velocidad de descarga de cualquier archivo de mas de 500kb a 10kb/s

6 - BandWidthError [Error]

Para personalizar el error en caso de alcanzar el maximo de conexiones, es posible usar cualquier numero entre 200 y 599 se recomienda usar el 503 y la directiva ErrorDocument de apache para dirigir este error a una pagina que explique el exceso de carga que justifica el problema de acceso.

Ejemplo :

ErrorDocument 510 /errors/maxconexceeded.html
BandWidthError 510

7 - MaxConnection [From] [Max] ó MaxConnection u:[User-Agent] [Max]

Sirve para limitar la cantidad de conexiones simultaneas desde una misma ip/host/red/user-agent, si este limite es sobrepasado se obtendra un error 503

Es NECESARIO definir un limite de BandWidth para el mismo ip/host/red/usr-agent aunque sea 0 ya que el programa usa el mismo espacio de memoria de bandwidthlimit para contar las conexiones, y asi ahorrarse uso de memoria, y si no se define esta variable MaxConnections no va a funcionar:

Ejemplo:
BandWidth all 0
MaxConnection all 20
ó
BandWidth all 0
BandWidth 192.168.0.0/24 10240
MaxConnection all 20
MaxConnection 192.168.0.0/24 5
MaxConnection "u:^Mozilla/5(.*)" 5
MaxConnection "u:wget" 5

por ultimo si se definen limites para un vhost y luego se define una directiva para un directorio dentro del vhost este ultimo tiene todo un nuevo contexto de reglas es decir no hereda las reglas del vhost por ende es necesario re definir todas las reglas pertinenetes.

ej:
<VirtualHost *>
BandWidthModule On
BandWidth all 16384
LargeFileLimit * 500 4096
<Directory />
LargeFileLimit * 100 1024
</Directory>

El directorio / no va a estar limitado a 16384

Saludos

lunes, enero 14, 2008

M0n0wall, QoS (Quality Of Service) y VoIP

Mi segunda tarea fue mejorar la calidad de las comunicaciones a través de teléfonos IP al interior de la empresa para ello contamos con una red interna de 100mb y un enlace hacia inet de 2mb, todo esto manejado por un firewall m0n0wall (FreeBSD), la verdad es que esta tarea no es tan compleja desde el hecho que m0n0wall es un muy buen traffic-shaper.

Existen dos formas de manejo del ancho de banda uno estático y otro dinámico:

Estático: consiste en definir un ancho de banda exclusivo en base a ciertas reglas, por ejemplo designar 512 kbits/s para telefonía IP y 1,5 mbits/s para el resto de las conexiones, este sistema es el mas sencillo pero el menos óptimo ya que mientras no se establece ninguna comunicación VoIP esos 512kb/s no son utilizados por nadie aunque los necesite.
Dinámico: consiste en establecer pesos a cada tipo de conexión y asignar dinámicamente el uso del ancho de banda, esta fue la opción que decidimos implementar.

En m0n0wall existen 3 piezas clave para el manejo del ancho de banda, las reglas (rules), las colas (queue) y las cañerias (pipes):

Las cañerías se usan para establecer anchos de banda estáticos y las colas para racionar estos anchos de banda de manera dinámica, obviamente la reglas determinaran que paquetes acceden a que colas. Por lo tanto necesitamos definir estas tres piezas para tener un uso eficiente de nuestro ancho de banda (para informacion mas detallada ver guia "Traffic shaper 'manual' (alpha)" )

Las cañerías: En este caso (ancho de banda dinamico) definiremos dos cañerías levemente mas pequeñas que nuestro ancho de banda total una de entrada y otra de salida, se definen medianamente mas pequeñas, ya que m0n0wall dispondrá del total de esta cañería para realizar el traffic-shape y en el caso que este valor sea mayor al real (congestión o simplemente tu ISP no te da tus prometidos 2mb sino mas bien 1950kb/s) la distribución de ancho de banda ficticia puede afectar la calidad de la conexión que estas tratando de resguardar, y por ser esta, un factor critico en VoIP mejor prevenir que curar.

Colas: se deben definir dos colas (una de subida y otra de bajada) por cada peso que se quiera asignar, en este caso voy a definir dos colas para VoIP y dos para el resto del trafico Inet, he aquí una de las cosas mas importantes en este proceso los "pesos", para determinar el ancho de banda a utilizar por cada conexión no se utilizan prioridades sino que pesos, lo que quiere decir que aunque tenga mucho trafico VoIP nunca voy a dejar de permitir trafico del otro (web, telnet, ssh, ftp, etc) una prioridad mas alta me pondría en un lugar mas adelante de la cola mientras que un peso me dice cuantos paquetes de cada cola deben pasar a la cañería. Ej: si el peso VoIP es de 70 y el de la otra cola es 30, de cada 100 paquetes que entren a la pipa 70 serán VoIP y 30 de otro tipo, en el caso que existan, de no existir el 100% de la cañería sera usado por la cola que tenga paquetes para enviar.

Reglas: Las reglas determinaran que tipo de paquetes deben ir a que cola, no es muy complejo realizar este proceso gracias a la interfaz gráfica amigable que posee m0n0wall, lo importante es tener en cuenta que las reglas se ejecutan en orden y que en cuanto un paquete cumple una regla no se sigue evaluando, por lo tanto es recomendable siempre poner una regla al final con * para "agarrar" los paquetes que no cumplan ninguna regla de lo contrario estos paquetes se saltarían las colas y arruinarían el traffic-shaper. Para este caso particular la regla que establecí para el trafico VoIP fue en función del servidor de VoIP o PBX es decir todo trafico entrante o saliente de la PBX se marca como trafico VoIP y utiliza la cola de mas alto peso (determinar el peso ideal es un ejercicio de ensayo y error ;) )

Evaluación de la calidad VoIP

Para evaluar la calidad de la comunicación VoIP aparte de pedirle a los usuarios finales que realizaran llamadas y que estuvieran atentos a la calidad, instale un monitor (sniffer) especializado el AdventNet VQManager muy bueno y de fácil instalación tanto en Windows como en Linux, para el correcto funcionamiento de este sniffer, como el de cualquier otro, es necesario conectar la tarjeta de red en un puerto de nuestra topología que permita monitoreo, en el caso de un hub eso no es un problema pero en un switch no cualquier boca sirve, en mi caso utilice el puerto uplink del switch principal que esta fuera del firewall, pero con switch programables es posible poner cualquier otra boca en modo port-mirroring. Para saber mas al respecto es necesario referirse al manual de cada switch.