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.