Limitar el ancho de banda para un programa o una interfaz

[h]Como configurar sencillamente el ancho de banda disponible para una aplicación
o para una interfaz de redes
[/h]

Fuentes :[list=*]
]How to limit network bandwidth on Linux/]
]Linux Advanced Routing & Traffic Control HOWTO/]
[/list]

Cuando estamos conectados a una red con poco ancho de banda es a veces problemático repartir armoniosamente el “brandwitch” entre dispositivos de redes conectados y/o aplicaciones.
¿Quien no lo ha experimentado?.. ¡Sobre todo cuando el ancho de banda de la red en cuestión no es bueno! Por ejemplo; cuando tu compañero de piso pone el e-mule en acción y que ya no se puede ver un vídeo de youtube sin cortes (además nunca lo cierra, el idiota. :smiley: ).
Siempre nos fijamos en el ancho de banda en bajada pero el ancho de banda en subida es critico también para un buen trafico.
Muchos abonos adsl proponen alrededor de 10Mega/s en bajada y 1Mega/s en subida.
Si un usuario (o una de tus computadoras en tu red personal) sube un archivo pesado y que lo hace a toda velocidad y sin limites puede legar a entorpecer el trafico para todos lo otros clientes.

Linux es el sistema favorito de lo administradores de redes porque tiene multitudes de comandos potentes para estas tareas.
Vamos a ver rápidamente dos de ellos con unos ejemplos básicos y concretos que ilustran perfectamente este gran poder que tenemos en nuestra consola.

[list=1]
]trickle:
Permite gestionar el ancho de banda disponible para una aplicación
pagina web de trickle/
]
]wondershaper:
Para atribuir limites de ancho de banda en bajadas y subidas a una interfaz de redes
pagina web de wondersharper/
]
[/list]

[h]Trickle : el comando que configura el ancho de banda de unba aplicación[/h]

Instalar trickle es una cosa trivial en nuestras distribuciones basadas en debian:

sudo apt-get install trickle

… “Necesito descargar 34,6 kB de archivos.
Se utilizarán 158 kB de espacio de disco adicional después de esta operación.”

Una vez instalado el programa no requiere privilegios de administrador. Tiene pocas opciones

[quote] trickle --help
Usage: trickle -hvVs] -d ] -u ] -w ] -t ]
-l ] -n ] command …
-h Help (this)
-v Increase verbosity level
-V Print trickle version
-s Run trickle in standalone mode independent of trickled
-d <rate> Set maximum cumulative download rate to <rate> KB/s
-u <rate> Set maximum cumulative upload rate to <rate> KB/s
-w Set window length to KB
-t Set default smoothing time to s
-l Set default smoothing length to KB
-n Use trickled socket name
-L Set latency to milliseconds
-P Preload the specified .so instead of the default one
[/quote]

el opción “-d” (download) es para limitar la velocidad en bajada (se expresa en KB/s) y el opción “-u” (upload) regula la velocidad de subida (también en KB/s).
Vamos a decir que quiero bajar un archivo de youtube pero limitando a 1MB/s la velocidad de bajada.

trickle -u 1000 youtube-dl https://www.youtube.com/watch?v=pYS0LtQQktE

Y trickle entra en acción : https://www.wifi-libre.com/img/members/3/limitbrandwitch.jpg
Asi puedo redactar este tema y escuchar la radio sin ninguna latencia debida a la bajada, es muy comodo.

Otra forma de usar trickle es lanzar lo como “demonio”, ejemplo limitando a 1MB : sudo trickled -d 1000
A partir de ahí trickle corre y cada vez que lanzamos una aplicación con trickle usará el ancho de banda así:

  • Si lanzamos firefox con trickle (“trickle firefox” en consola) tendrá 1 MB/s de ancho de banda.
  • Si lanzamos por ejemplo ahora skype (“trickle skype” en consola) tendrá 0,5 MB/s y firefox pasará de 1MB/s a 0,5 MB/s

[h]Limitar el ancho de banda atribuido a una interfaz con wondershaper[/h]

Wondersharper no es un comando pero un script que usa principalmente el comando tc para limitar el ancho de banda y configurar el QoS sobre una interfaz. Instalarlo es como siempre

sudo apt-get install wondershaper

Y podemos ahora echar un ojo al script (se encuentra en /sbin/

[code]#!/bin/sh

Wonder Shaper

Modifications by Vince Mulhollon for debian package

if $# -eq 0 ]; then
echo Please read the man page for the wondershaper and
echo the file /usr/share/doc/wondershaper/README.Debian.gz
exit
fi

if $# -eq 1 ]; then
/sbin/tc -s qdisc ls dev $1
/sbin/tc -s class ls dev $1
exit
fi

if $# -eq 2 ]; then
/sbin/tc qdisc del dev $2 root 2> /dev/null > /dev/null
/sbin/tc qdisc del dev $2 ingress 2> /dev/null > /dev/null
echo Wondershaper queues have been cleared.
exit
fi

if $# -ne 3 ]; then
echo Please read the man page for the wondershaper and
echo the file /usr/share/doc/wondershaper/README.Debian.gz
exit
fi

please read the README before filling out these values

Set the following values to somewhat less than your actual download

and uplink speed. In kilobits. Also set the device that is to be shaped.

DOWNLINK=$2
UPLINK=$3
DEV=$1

low priority OUTGOING traffic - you can leave this blank if you want

low priority source netmasks

NOPRIOHOSTSRC=

low priority destination netmasks

NOPRIOHOSTDST=

low priority source ports

NOPRIOPORTSRC=

low priority destination ports

NOPRIOPORTDST=

Now remove the following two lines :slight_smile:

#echo Please read the documentation in ‘README’ first :slight_smile:
#exit

#########################################################

#if “$1” = “status” ]
#then

/sbin/tc -s qdisc ls dev $DEV

/sbin/tc -s class ls dev $DEV

exit

#fi

clean existing down- and uplink qdiscs, hide errors

/sbin/tc qdisc del dev $DEV root 2> /dev/null > /dev/null
/sbin/tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null

#if “$1” = “stop” ]
#then

exit

#fi

uplink

install root CBQ

/sbin/tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 10mbit

shape everything at $UPLINK speed - this prevents huge queues in your

DSL modem which destroy latency:

main class

/sbin/tc class add dev $DEV parent 1: classid 1:1 cbq rate ${UPLINK}kbit
allot 1500 prio 5 bounded isolated

high prio class 1:10:

/sbin/tc class add dev $DEV parent 1:1 classid 1:10 cbq rate ${UPLINK}kbit
allot 1600 prio 1 avpkt 1000

bulk and default class 1:20 - gets slightly less traffic,

and a lower priority:

/sbin/tc class add dev $DEV parent 1:1 classid 1:20 cbq rate $((9*$UPLINK/10))kbit
allot 1600 prio 2 avpkt 1000

‘traffic we hate’

/sbin/tc class add dev $DEV parent 1:1 classid 1:30 cbq rate $((8*$UPLINK/10))kbit
allot 1600 prio 2 avpkt 1000

all get Stochastic Fairness:

/sbin/tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
/sbin/tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
/sbin/tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10

start filters

TOS Minimum Delay (ssh, NOT scp) in 1:10:

/sbin/tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32
match ip tos 0x10 0xff flowid 1:10

ICMP (ip protocol 1) in the interactive class 1:10 so we

can do measurements & impress our friends:

/sbin/tc filter add dev $DEV parent 1:0 protocol ip prio 11 u32
match ip protocol 1 0xff flowid 1:10

pablo.iranzo@uv.es provided a patch for the MLDonkey system

The MLDonkey uses small UDP packets for source propogation

which floods the wondershaper out.

/sbin/tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32
match ip protocol 17 0xff
match ip sport 4666 0xffff
flowid 1:30

prioritize small packets (<64 bytes)

/sbin/tc filter add dev $DEV parent 1: protocol ip prio 12 u32
match ip protocol 6 0xff
match u8 0x05 0x0f at 0
match u16 0x0000 0xffc0 at 2
flowid 1:10

some traffic however suffers a worse fate

for a in $NOPRIOPORTDST
do
/sbin/tc filter add dev $DEV parent 1: protocol ip prio 14 u32
match ip dport $a 0xffff flowid 1:30
done

for a in $NOPRIOPORTSRC
do
/sbin/tc filter add dev $DEV parent 1: protocol ip prio 15 u32
match ip sport $a 0xffff flowid 1:30
done

for a in $NOPRIOHOSTSRC
do
/sbin/tc filter add dev $DEV parent 1: protocol ip prio 16 u32
match ip src $a flowid 1:30
done

for a in $NOPRIOHOSTDST
do
/sbin/tc filter add dev $DEV parent 1: protocol ip prio 17 u32
match ip dst $a flowid 1:30
done

rest is ‘non-interactive’ ie ‘bulk’ and ends up in 1:20

/sbin/tc filter add dev $DEV parent 1: protocol ip prio 18 u32
match ip dst 0.0.0.0/0 flowid 1:20

########## downlink #############

slow downloads down to somewhat less than the real speed to prevent

queuing at our ISP. Tune to see how high you can set it.

ISPs tend to have huge queues to make sure big downloads are fast

attach ingress policer:

/sbin/tc qdisc add dev $DEV handle ffff: ingress

filter everything to it (0.0.0.0/0), drop everything that’s

coming in too fast:

/sbin/tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
[/code]

Para ejecutar el script de forma sencilla lo usamos exactamente como tickle :
[list=*]
]-d para limitar la velocidad de bajada (en KB/s)/]
]-u para la velocidad en subidas (en KB/s)/]
]Invocamos wodersharper + interfaz + opciones/]
[/list]

La diferencia es que wondersharper requiere privilegios de administrador, lo lanzamos con “sudo” desde nuestra cuenta de usuario.
Imaginemos que quiera atribuir 1 mega en bajada y medio-mega en subida a mi interfaz eth0:

sudo ifconfig eth0 down && sudo wondershaper eth0 1000 500 && sudo ifconfig eth0 uphttps://www.wifi-libre.com/img/members/3/wondersharper1.jpg

Y paramos el servicio con

sudo wondershaper clear eth0

http://i.imgur.com/lnt22QF.png

Útil y fácil y sin necesidad de intervención sobre el punto de acceso. :slight_smile: