Inicio / Artículos / Ancho de banda de subida limitado.

Artículos

Ancho de banda de subida limitado.

Tenemos usuarios que se conectan a Internet a travéz de nuestro proxy o router linux y regularmente el tráfico de bajada de datos está libre, pero igual de lento... ¿Qué está pasando?.

Cuando un usuario se conecta a un servidor en Internet, sea un servidor de páginas web, correo o cualquier otro, comienza a recibir los paquetes de información a ser mostrados, pero debe con cada paquete enviar un paquete de respuesta que sirve como indicador del estado de la recepción. Con esto el emisor (servidor web, etc) se asegura que a el receptor está llegando correctamente la información. Estos paquetes de respuestas representan un consumo de subida que muchas veces se vé retrasado enormemente por tráfico fantasma*, generado regularmente por los programas P2P como Kazaa, emule, bittorrent, etc.
Si ese tráfico de subida es muy grande y cercano al límite contratado con la compañía que presta el servicio de conexión a Internet, entonces "mata" el tráfico de subida del resto de los programas, lo cual afecta el tráfico de bajada.
Para evitar este inconveniente, se puede crear un guión con BASH que permita regular la subida del tráfico fantasma y asegurar buena subida del tráfico que es importante en cada caso.

El guión está explicado en su código con las marcas de comentario "#".

#!/bin/bash
#CdS.bash
#Control de ancho de banda 0.1
#CdS -> Control de Subida. Haciendo analogía con
#QoS -> Quality of Service.
#Autor: Hugo Sandoval
#Correo: hugo@softwarelibre.com.ve

#Donde se encuentra nuestro programa tc?
TC=`which tc`
#Si queremos controlar tambien el tráfico de bajada por ip,
#bajamos e instalamos el cbq desde 
#http://sourceforge.net/projects/cbqinit
#Aqui renombre el archivo como cbq-init, pero es posible que
#venga en otra forma como: cbq.init o simplemente cbq.
CBQ=`which cbq-init` 

#Subida
#Tarjeta de red que apunta "hacia" internet
INTERNET=eth0
#Bajada
#Tarjeta de red que apunta "hacia" la red interna
REDLAN=eth1

#Borramos todas las reglas antes de comenzar
tc qdisc del dev $INTERNET root 2> /dev/null
tc qdisc del dev $REDLAN root 2> /dev/null
#pero si instalamos el CBQ mencionado anteriormente es mas facil y
#claro con $CBQ stop

#ANCHOTOTALSUBIDA se define con un poco menos del total asignado.
#Aproximadamente de un 4% a un 5% menos. Si son 256kbit de subida
#entonces definimos esta variable como 245kbit -> 256 x 4%=10.24 y
#256-10.24=245.76
#Facil!. Esto se hace con el fin de darle la sobrecarga de subida a
#nuestra PC Linux y no al dispositivo que nos provee el internet.
ANCHOTOTALSUBIDA=490kbit

#Otros anchos de banda que nos interesan
#La suma de todos debe ser igual a ANCHOTOTALSUBIDA
#Trafico web de subida
WEBS=200kbit
#SSH
SSH=110kbit
#Resto  !!!AQUI ES DONDE SE CREA LA MAGIA ;-) !!!
RESTO=180kbit

#Definimos la principal y la clase por defecto (default 4) por donde se
#dirige el trafico que "no" definamos. En este script solo vamos a definir
#los puertos 80, 25 y 53 que son de los servicios que nos interesan tengan
#buen ancho de banda.
$TC qdisc add dev $INTERNET root handle 1:0 htb default 4

#Definimos el ancho total de subida.
$TC class add dev $INTERNET parent 1:0 classid 1:1 htb \
rate $ANCHOTOTALSUBIDA

#Creamos las clases que se dividen el ancho total de subida 
#(Atencion con el classid, el 1:4 corresponde al default)
$TC class add dev $INTERNET parent 1:1 classid 1:2 htb rate $WEBS
$TC class add dev $INTERNET parent 1:1 classid 1:3 htb rate $SSH
$TC class add dev $INTERNET parent 1:1 classid 1:4 htb rate $RESTO

#Asignamos los puertos que nos interesan a la primeras clases. Las que
#tienen $WEBS y $SSH, que son las clases 1:2 y 1:3
#Lo que no este definido aqui se dirige por la clase 1:4 de $RESTO, que
#definimos como default 4 en la principal (default 4 -> classid 1:4)
#Las palabras "dport" y "sport" significan "destination port" y "source port"
#respectivamente. "0xffff" corresponde a la mascara aplicable a ese puerto,
#lo cual nos permite crear rangos de puertos sin necesidad de definirlos
#todos y cada uno de ellos.
#A WEB se asignan los puertos 25, 53 y 80. Correo, DNS y
#HTTP respectivamente.
#A SSH se asignan 22 y 1863. SSH y Messenger de Hotmail.

$TC filter add dev $INTERNET parent 1:0 protocol ip prio 1 u32 match ip \
 dport 80 0xffff flowid 1:2
$TC filter add dev $INTERNET parent 1:0 protocol ip prio 1 u32 match ip \
 dport 25 0xffff flowid 1:2
$TC filter add dev $INTERNET parent 1:0 protocol ip prio 1 u32 match ip \ 
 sport 25 0xffff flowid 1:2
$TC filter add dev $INTERNET parent 1:0 protocol ip prio 1 u32 match ip \
 dport 53 0xffff flowid 1:2
$TC filter add dev $INTERNET parent 1:0 protocol ip prio 1 u32 match ip \
 dport 1863 0xffff flowid 1:3
$TC filter add dev $INTERNET parent 1:0 protocol ip prio 1 u32 match ip \
 dport 22 0xffff flowid 1:3
$TC filter add dev $INTERNET parent 1:0 protocol ip prio 1 u32 match ip \
 sport 22 0xffff flowid 1:3

#Se afinan las clases con qdisc (largo y dificil de explicar, pero funciona
#muy bien con estos valores)
$TC qdisc add dev $INTERNET parent 1:2 handle 120:0 pfifo limit 10
$TC qdisc add dev $INTERNET parent 1:3 handle 130:0 pfifo limit 10
$TC qdisc add dev $INTERNET parent 1:4 handle 140:0 sfq perturb 10

#************************************************************************************
#Para la bajada se usa cbq si lo instalamos (recordar quitar el comentario para
#que funcione x-D)
#$CBQ start

Para controla el tráfico utilizamos: CdS y enter. Luego con iptraf se puede revisar que esté funcionando como es lo deseado.

-------------------------
[ * ]Tráfico Fantasma: Le llamo así a todo tráfico de información que existe pero es negado o no es notado por el usuario. Ejemplo de éllo es la información emitida por los programas P2P.

(Publicado en el portal anterior, en fecha: 15/04/2006).

Comentarios

Log in or create a user account to comment.