Banda Ancha EU

Comunidad de usuarios
de fibra, móvil y ADSL

Colas IMQ, repartiendo equitativamente el ancho de banda entre usuarios (funcionando)

overpeer

Esto ya funciona OK gracias a la ayuda de anthrax, os copio el script final.

Os comento, que aqui se usa con NAT, asi que cambian algunas cosas con respecto al original, ademas de que se ha tenido que parchear el kernel con otro parche mas para que IMQ pueda ver los paquetes nateados.

A partir de un genial script que me paso anthrax estoy ideando un script para repartir de forma equitativa el ancho de banda por IP, de forma que a cada ip le toque una porcion proporcional del ancho de banda total tanto de subida como de bajada. Si tengo 300k de bajada para repartir, la diea es que si hay dos usuarios ellos siempre tengan 150k cada uno, idependientemente de que el otro lo use o no, no hay motivo para que se presten ancho de banda no utilizado.

Script:
________________________________________________________
#!/bin/bash
# Definicion de variables

DEV=eth1 # Interficie mas cercana al modem/router
RD=300 # Canal de bajada (kbits)
RU=150 # Canal de subida (kbits)
NU=3 # Numero de usuarios

# Funciones

function estado()
{
# Se muestran estadisticas de las clases creadas en $DEV y imq0
echo " E S T A D O D E Q o S "
echo " "
echo "---- C L A S E S ----"
echo " "
echo "Clases para ${DEV}"
tc -s class show dev $DEV
echo " "
echo "Clases para imq0"
tc -s class show dev imq0

# Se muestran las reglas de las cadenas SUBIDA y BAJADA

echo "---- R E G L A S ----"
echo " "
echo "Marcado en Subida"
iptables -t mangle -L MYSHAPER-OUT -v -x 2> /dev/null
echo " "
echo "Marcado en Bajada"
iptables -t mangle -L MYSHAPER-IN -v -x 2> /dev/null
echo " "
}

function parada()
{
# Se eliminan todas las clases definidas

tc qdisc del dev $DEV root > /dev/null 2>&1
tc qdisc del dev imq0 root > /dev/null 2>&1

# Se elimina las cadenas SUBIDA y BAJADA (mangle - forward!)

iptables -t mangle -D POSTROUTING -o $DEV -j SUBIDA > /dev/null 2>&1
iptables -t mangle -D PREROUTING -i $DEV -j BAJADA > /dev/null 2>&1

iptables -t mangle -F MYSHAPER-OUT > /dev/null 2>&1
iptables -t mangle -X MYSHAPER-OUT > /dev/null 2>&1

iptables -t mangle -F MYSHAPER-IN > /dev/null 2>&1
iptables -t mangle -X MYSHAPER-IN > /dev/null 2>&1

# Se baja imq0

ip link set imq0 down > /dev/null 2>&1
}

function inicio()
{

# C A N A L D E B A J A D A

# Se sube el dispositivo imq0
ip link set imq0 up

# Se crea rama principal
tc qdisc add dev imq0 root handle 1: htb default 1

# minimo asegurado es rate, el maximo es ceil

tc class add dev imq0 parent 1: classid 1:10 htb rate $[$RD/$NU]kbit ceil $[$RD/$NU]kbit
tc class add dev imq0 parent 1: classid 1:11 htb rate $[$RD/$NU]kbit ceil $[$RD/$NU]kbit

# Asociacion de colas SFQ con nuestas clases de tipo HTB

tc qdisc add dev imq0 parent 1:10 handle 10: sfq
tc qdisc add dev imq0 parent 1:11 handle 11: sfq

# Se asocia la marca 10 a la banda 10 y la marca 11 a la banda 11

tc filter add dev imq0 protocol ip parent 1: handle 10 fw classid 1:10
tc filter add dev imq0 protocol ip parent 1: handle 11 fw classid 1:11

# Se marcan las diferentes clases hijas(tipos de trafico) con iptables

iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -I FORWARD -i $DEV -j MYSHAPER-IN

iptables -t mangle -A MYSHAPER-IN -p all -d 10.0.0.2 -j MARK --set-mark 10 # entrada a 10.0.0.2

iptables -t mangle -A MYSHAPER-IN -p all -d 10.0.0.3 -j MARK --set-mark 11 # entrada a 10.0.0.3

iptables -t mangle -A MYSHAPER-IN -j IMQ

echo " "
echo "QoS aplicado en el canal de bajada - Ratio=${RD}kbits/s"
echo "Velocidad por direccion IP - Ratio=$[$RD/$NU]kbits/s"
echo " "

# C A N A L D E S U B I D A

tc qdisc add dev $DEV root handle 1: htb default 1

#minimo asegurado es rate, el maximo es ceil

tc class add dev $DEV parent 1: classid 1:20 htb rate $[$RU/$NU]kbit ceil $[$RU/$NU]kbit
tc class add dev $DEV parent 1: classid 1:21 htb rate $[$RU/$NU]kbit ceil $[$RU/$NU]kbit

# Se asocia la marca 20 a la banda 20 y la marca 21 a la banda 21 :P

tc filter add dev $DEV protocol ip parent 1: handle 20 fw classid 1:20
tc filter add dev $DEV protocol ip parent 1: handle 21 fw classid 1:21

# Se marcan las clases con iptables

iptables -t mangle -N MYSHAPER-OUT
iptables -t mangle -I POSTROUTING -o $DEV -j MYSHAPER-OUT

iptables -t mangle -A MYSHAPER-OUT -p all -s 10.0.0.2 -j MARK --set-mark 20 # salida de 10.0.0.2

iptables -t mangle -A MYSHAPER-OUT -p all -s 10.0.0.3 -j MARK --set-mark 21 # salida de 10.0.0.3

echo " "
echo "QoS aplicado en el canal de subida - Ratio=${RU}kbits/s"
echo "Velocidad por direccion IP - Ratio=$[$RU/$NU]kbits/s"
echo " "

}

case "$1" in
start)
inicio
echo
echo QoS activado!
echo;;
stop)
parada
echo
echo QoS parado!
echo;;
restart)
parada
inicio
echo
echo QoS reiniciado!
echo;;
status)
estado;;
*)
echo "Uso: $0 {start|stop|restart|status}"
exit 1
esac

# EOS (End Of Script)

______________________________________________________________

Lo dicho, funciona bien ;)

Mas informacion y los parches en (link roto)

Se requiere parchear el kernel para soporte IMQ, parchear iptables y en caso de quere usar NAT tambien, otro parche mas ;)

Un saludo.

Este tema está cerrado a nuevas respuestas. Abre un nuevo tema para retomar la conversación.
BocaDePez
BocaDePez

Hola, me podrías enviar el script original desde el cuál has hecho la modificación?

Yo actualmente estoy utilizando cbq para gestionar el ancho de banda de los usuarios de mi red, pero me gustaria probar otro tipo de colas.

Mi e-mail raveiga en hotmail.com

Muchas gracias.

🗨️ 1
overpeer

... controlar el ancho de banda de bajada ???

Un saludo.

overpeer

Tal y como pide alguien, aqui lo pongo y asi lo veis todos :)

Script:
_______________________________________________________
#!/bin/bash
#
####################################################################
## ShapinG ScripT v1.0 -- 9/9/03 ##
####################################################################
#
#
# Script basado en myshaper:
# www.tldp.org/HOWTO/ADSL-Bandwidth-Management-HOWTO/implementation.html
#
#
# En este script se intenta controlar de una manera mas o menos eficiente
# el ancho de banda tanto de subida como de bajada.Se asegura un ancho de
# banda minimo para cada usuario/servicio,impidiendo que uno se imponga a
# los demas satarando el enlace.Tambien se intenta mejorar la latencia
# del trafico interactivo en condiciones de una alta carga en el enlace.
# Esto se consigue entre otras cosas dando mayor prioridad (menor latencia)
# al trafico UDP,ICMP y los pequeños paquetes ACK TCP.
# La idea es que cada tipo de trafico (http,ftp,udp,etc.) que se quiera
# administrar ira en una clase o banda.Puede existir mas de un tipo de trafico
# en una clase.A cada clase se le asigna/asegura un ancho de banda minimo,
# pudiendo tener el total del enlace en ausencia del resto de clases.
#
# Para realizar esta tarea se usaran las capacidades QoS presentes en el kernel
# de Linux.
#
# CANAL DE BAJADA
#
# Para controlar el canal de bajada se usa el dispositivo virtual IMQ. Dentro del
# mismo se aplican los algoritmos de manejo de colas HTB y SQF.Se ajusta el ancho
# de banda ligeramente por debajo del real, para evitar que en la bajada se llenen
# las colas de los routers de las ISP.Asi se consigue mejorar la latencia.
#
#
# CANAL DE SUBIDA
#
# Se ajusta tambien este canal un poco por debajo de la capacidad real del enlace,
# para evitar que se genere una cola en el modem/router (de tipo fifo), sino en
# nuestro propio Linux.La cola de datos del canal de bajada tambien se gestiona
# mediante HTB.Otra ventaja añadida es que se mejora la latencia del trafico de datos.
#
#
#
# Requisitos previos :
#
# Parchear tanto el kernel >= 2.4.18 como iptables para dar soporte al
# dispositivo IMQ.Aparte de activar Netfilter y QoS (HTB,SFQ,etc) en el
# kernel ;)
#
# Los parches y instrucciones para IMQ se encuentran en :
# trash.net/~kaber/imq/
#
# El necesario patch-o-matic en www.netfilter.org
#
# El paquete iproute en trash.net/~kaber/imq/
# NOTA : el binario tc ha de estar actulizado para la ultima version de HTB!
#
#
#
# E N L A C E S
#
# lartc.org
# www.docum.org
# www.tldp.org/HOWTO/ADSL-Bandwidth-Management-HOWTO
# trash.net/~kaber/imq/
# luxik.cdi.cz/~devik/qos/htb/
# (link roto)

# Definicion de variables

IPTABLES="/usr/local/sbin/iptables"
TC="/sbin/tc"

DEV=eth0 # Interficie mas cercana al modem/router
RD=196 # Canal de bajada (kbits)
RU=96 # Canal de subida (kbits)

# Funciones

function estado()
{
# Se muestran estadisticas de las clases creadas en $DEV y imq0

echo "Clases creadas"
$TC -s class show dev $DEV
$TC -s class show dev imq0

# Se muestran las reglas de las cadenas SUBIDA y BAJADA

echo "Reglas"
$IPTABLES -t mangle -L SUBIDA -v -x 2> /dev/null
$IPTABLES -t mangle -L BAJADA -v -x 2> /dev/null
}

function parada()
{
# Se eliminan todas las clases definidas

$TC qdisc del dev $DEV root > /dev/null 2>&1
$TC qdisc del dev imq0 root > /dev/null 2>&1

# Se elimina las cadenas SUBIDA y BAJADA (mangle - forward!)

$IPTABLES -t mangle -D POSTROUTING -o $DEV -j SUBIDA > /dev/null 2>&1
$IPTABLES -t mangle -D PREROUTING -i $DEV -j BAJADA > /dev/null 2>&1

$IPTABLES -t mangle -F SUBIDA > /dev/null 2>&1
$IPTABLES -t mangle -X SUBIDA > /dev/null 2>&1

$IPTABLES -t mangle -F BAJADA > /dev/null 2>&1
$IPTABLES -t mangle -X BAJADA > /dev/null 2>&1

# Se baja imq0

ip link set imq0 down > /dev/null 2>&1
}

function inicio()
{

# C A N A L D E B A J A D A

# Se crea el arbol de clases en el disp. IMQ.La clase por defecto sera la 1.
# La disciplina de cola (qdisc) utilizada es HTB

$TC qdisc add dev imq0 root handle 1: htb default 1

# La clase 1:1 prestara el ancho de banda no usado a sus hijas

$TC class add dev imq0 parent 1: classid 1:1 htb rate ${RD}kbit

# Clases hijas, la clase 10 tiene mayor prioridad (prio 0) y menor latencia. El ancho de banda
# minimo asegurado es rate, el maximo es ceil

$TC class add dev imq0 parent 1:1 classid 1:10 htb rate $[$RD/2]kbit ceil ${RD}kbit prio 0
$TC class add dev imq0 parent 1:1 classid 1:11 htb rate $[$RD/2]kbit ceil ${RD}kbit prio 1

# Asociacion de colas SFQ con nuestas clases de tipo HTB. Asi se consigue
# un mejor comportamiento, al repartir el ancho de banda entre las clases hijas
# de la forma mas justa posible

$TC qdisc add dev imq0 parent 1:10 handle 10: sfq
$TC qdisc add dev imq0 parent 1:11 handle 11: sfq

# Se asocia la marca 10 a la banda 10 y la marca 11 a la banda 11 (k original xDD)

$TC filter add dev imq0 protocol ip parent 1: handle 10 fw classid 1:10
$TC filter add dev imq0 protocol ip parent 1: handle 11 fw classid 1:11

# Se marcan las diferentes clases hijas(tipos de trafico) con iptables

#iptables -t mangle -N MYSHAPER-IN
#iptables -t mangle -I PREROUTING -i $DEV -j MYSHAPER-IN
#iptables -t mangle -A MYSHAPER-IN -p ! tcp -j MARK --set-mark 20 # Set non-tcp packets to highest priority
#iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 20 # short TCP packets are probably ACKs
#iptables -t mangle -A MYSHAPER-IN -p tcp --dport ssh -j MARK --set-mark 20 # secure shell
#iptables -t mangle -A MYSHAPER-IN -p tcp --sport ssh -j MARK --set-mark 20 # secure shell
#iptables -t mangle -A MYSHAPER-IN -p tcp --dport telnet -j MARK --set-mark 20 # telnet (ew...)
#iptables -t mangle -A MYSHAPER-IN -p tcp --sport telnet -j MARK --set-mark 20 # telnet (ew...)
#iptables -t mangle -A MYSHAPER-IN -m mark --mark 0 -j MARK --set-mark 21 # redundant- mark any unmarked packets as 26 (low prio)
#iptables -t mangle -A MYSHAPER-IN -j IMQ

# Se sube el dispositivo imq0
ip link set imq0 up

echo "QoS aplicado en el canal de bajada - Ratio=${RD}kbits/s"

# uncomment following line if you only want downstream shaping.
# exit

# C A N A L D E S U B I D A

# Se crea el arbol de clases en el disp. $DEV, la clase por defecto sera la 1

$TC qdisc add dev $DEV root handle 1: htb default 1

# La clase 1:1 prestara el ancho de banda no usado a sus clases hijas

$TC class add dev $DEV parent 1: classid 1:1 htb rate ${RU}kbit

# Clases hija, la clase 20 tiene mayor prioridad (prio 0) y menor latencia. El ancho de banda
# minimo asegurado es rate, el maximo es ceil

$TC class add dev $DEV parent 1:1 classid 1:20 htb rate $[$RU/2]kbit ceil ${RU}kbit prio 0
$TC class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RU/2]kbit ceil ${RU}kbit prio 1

# Se asocia la marca 20 a la banda 20 y la marca 21 a la banda 21 :P

$TC filter add dev $DEV protocol ip parent 1: handle 20 fw classid 1:20
$TC filter add dev $DEV protocol ip parent 1: handle 21 fw classid 1:21

# Se marcan las clases con iptables

#iptables -t mangle -N MYSHAPER-OUT
#iptables -t mangle -I POSTROUTING -o $DEV -j MYSHAPER-OUT
# add fwmark entries to classify different types of traffic - Set fwmark from 20-26 according to
# desired class. 20 is highest prio.

#iptables -t mangle -A MYSHAPER-OUT -p tcp --sport 0:1024 -j MARK --set-mark 23 # Default for low port traffic
#iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 0:1024 -j MARK --set-mark 23 # ""
#iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 20 -j MARK --set-mark 26 # ftp-data port, low prio
#iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 5190 -j MARK --set-mark 23 # aol instant messenger
#iptables -t mangle -A MYSHAPER-OUT -p icmp -j MARK --set-mark 20 # ICMP (ping) - high prio, impress friends
#iptables -t mangle -A MYSHAPER-OUT -p udp -j MARK --set-mark 21 # DNS name resolution (small packets)
#iptables -t mangle -A MYSHAPER-OUT -p tcp --dport ssh -j MARK --set-mark 22 # secure shell
#iptables -t mangle -A MYSHAPER-OUT -p tcp --sport ssh -j MARK --set-mark 22 # secure shell
#iptables -t mangle -A MYSHAPER-OUT -p tcp --dport telnet -j MARK --set-mark 22 # telnet (ew...)
#iptables -t mangle -A MYSHAPER-OUT -p tcp --sport telnet -j MARK --set-mark 22 # telnet (ew...)
#iptables -t mangle -A MYSHAPER-OUT -p ipv6-crypt -j MARK --set-mark 24 # IPSec - we don't know what the payload is though...
#iptables -t mangle -A MYSHAPER-OUT -p tcp --sport http -j MARK --set-mark 25 # Local web server
#iptables -t mangle -A MYSHAPER-OUT -p tcp -m length --length :64 -j MARK --set-mark 21 # small packets (probably just ACKs)
#iptables -t mangle -A MYSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 26 # redundant- mark any unmarked packets as 26 (low prio)

echo "QoS aplicado en el canal de subida - Ratio=${RU}kbits/s"

}

case "$1" in
start)
inicio
echo
echo QoS activado!
echo;;
stop)
parada
echo
echo QoS parado!
echo;;
restart)
parada
inicio
echo
echo QoS reiniciado!
echo;;
status)
estado;;
*)
echo "Uso: $0 {start|stop|restart|status}"
exit 1
esac

# EOS (End Of Script)
___________________________________________________________

Un saludo.

🗨️ 4
anthrax

Over, un par de cosillas:

Cuando yo usé este script, lo hice en la máquina final (que estaba directamente conectada a internet), no en un router que da servicio a una red. Creo que seria mejor que en vez de poner las reglas de marcado de paquetes en POSTROUTING y PREROUTING las pongas en FORWARD. Solo sería cuestión de discernir cuando es bajada o subida por las ip's origen/destino ;)
Ten en cuenta que esta cadena se usa tanto en la subida como la bajada, después de que el router sabe si el tráfico es para él o lo tiene que enrutar hacia otra máquina.

De todas maneras es probarlo, y comprobar que funcione. ;)

Otra cosilla, fijate que yo creaba/usaba las cadenas SUBIDA y BAJADA. Tú usas la MYSHAPER. Pero aún hay sitios donde sigues usandolas ... :)

Saludos 8)
P.D: Ya te fale poner aquí mi script "tan alegremente" ... :P

🗨️ 3
BocaDePez
BocaDePez

Solo habia modificado lo de la funcion inicio ... ahora que lo dices ... :SSSS

¿que es SUBIDA y BAJADA?

Un saludo.

🗨️ 2
anthrax

Tio, claro que debes quitarlas. Tú usas MYSHAPER-IN/OUT ... xDD

Saludos 8)

🗨️ 1
overpeer

Porque no me limita la bajada :S

Si hago un
iptables -t mangle -L MYSHAPER-OUT -v -x 2> /dev/null

Veo que hay paqutes de salida de ambas ips ( 10.0.0.2 y 10.0.0.3) que han sido marcados, pero sin embargo al hacer:

iptables -t mangle -L MYSHAPER-IN -v -x 2> /dev/null

Veo que no se han marcado ninguno de llegada ni nada, y los test de velocidad me siguen dando todo el ancho :|

Un saludo.