Como segmentar el ancho de banda de una red con HTB

Imagen de damage

Viendome en la curiosidad de probar HTB para segmentar el ancho de banda de mi red, he realizado este Script, el cual lo comparto con todos ustedes y espero sea de su utilidad y beneficio.

Vale recalcar que con este script pueden segmentar por IP simples, multiples, subredes o por toda la red, segmenta tanto el upload como el download.
Si tiene alguna sugerencia al mismo bienvenidos sean (realice el script en solo 2 noches osea que puede ser mejorado :cool: )

#!/bin/sh
#
# SCRIPT HTB USANDO FOR-NET-DO v0.1.1
# CREADO POR Damage el 14/12/06 8:00AM

OK="\033[1;0m [ \033[00;32mOK \033[1;0m]\033[0m"
echo -e "ANCHO DE BANDA: $OK"

### VARIABLES ###flow
WAN="0/0"
DEVWAN="eth0"
DEVLAN="eth1"
TC=/sbin/tc
IPTABLES="/sbin/iptables -t mangle"
HTB=/sbin/htb

### PUERTOS ###
PROXY_PORT="8080"
SMTP_PORT="25"
POP3_PORT="110"
FTP_PORT="20:21"

##########
# INICIO #
##########
### ---------------- FLUSH DE REGLAS ----------------- ###
$TC qdisc del dev $DEVWAN root handle 1: htb
$TC qdisc del dev $DEVLAN root handle 2: htb
$IPTABLES -F
$IPTABLES -X

### ---------------- CREANDO CLASE ROOT -------------- ###
$TC qdisc add dev $DEVWAN root handle 1: htb default 97 r2q 10
$TC qdisc add dev $DEVLAN root handle 2: htb default 98 r2q 10

### ----------------- CLASES PADRES ---------------------------------------- ###
$TC class add dev $DEVWAN parent 1: classid 1:100 htb rate 10Mbit ceil 10Mbit quantum 128000
$TC class add dev $DEVLAN parent 2: classid 2:200 htb rate 10Mbit ceil 10Mbit quantum 128000

#ICMP tienen prioridad (marcas por defecto)
$IPTABLES -A OUTPUT -p icmp -j MARK --set-mark 97
$IPTABLES -A FORWARD -p icmp -j MARK --set-mark 97
$IPTABLES -A POSTROUTING -p icmp -j MARK --set-mark 97
$IPTABLES -A PREROUTING -p icmp -j MARK --set-mark 97
$IPTABLES -A OUTPUT -p icmp -j MARK --set-mark 98
$IPTABLES -A FORWARD -p icmp -j MARK --set-mark 98
$IPTABLES -A POSTROUTING -p icmp -j MARK --set-mark 98
$IPTABLES -A PREROUTING -p icmp -j MARK --set-mark 98

### BW1 ANCHO DE BANDA PARA IP O SUBRED ESPECIFICA #####
RATE_LAN1="64kbit"
CEIL_LAN1="128kbit"
NETWORKS_BW1="10.10.10.2"
for NET in $NETWORKS_BW1; do
$IPTABLES -A PREROUTING -s $NET -d $WAN -i $DEVLAN -j MARK --set-mark 1
$IPTABLES -A FORWARD -s $WAN -d $NET -i $DEVWAN -o $DEVLAN -j MARK --set-mark 2
$IPTABLES -A OUTPUT -d $NET -p tcp --sport $PROXY_PORT -o $DEVLAN -j MARK --set-mark 2
$IPTABLES -A OUTPUT -d $NET -p tcp --sport $SMTP_PORT -o $DEVLAN -j MARK --set-mark 2
$IPTABLES -A OUTPUT -d $NET -p tcp --sport $POP3_PORT -o $DEVLAN -j MARK --set-mark 2
done
$TC class add dev $DEVWAN parent 1:100 classid 1:1 htb rate $RATE_LAN1 ceil $CEIL_LAN1 quantum 1500
$TC class add dev $DEVLAN parent 2:200 classid 2:2 htb rate $RATE_LAN1 ceil $CEIL_LAN1 quantum 1500
$TC filter add dev $DEVWAN parent 1:0 protocol ip prio 1 handle 1 fw classid 1:1
$TC filter add dev $DEVLAN parent 2:0 protocol ip prio 1 handle 2 fw classid 2:2

### BW2 ANCHO DE BANDA PARA IP O SUBRED ESPECIFICA #####
RATE_LAN2="64kbit"
CEIL_LAN2="64kbit"
NETWORKS_BW2="10.10.10.3"
for NET in $NETWORKS_BW2; do
$IPTABLES -A PREROUTING -s $NET -d $WAN -i $DEVLAN -j MARK --set-mark 3
$IPTABLES -A FORWARD -s $WAN -d $NET -i $DEVWAN -o $DEVLAN -j MARK --set-mark 4
$IPTABLES -A OUTPUT -d $NET -p tcp --sport $PROXY_PORT -o $DEVLAN -j MARK --set-mark 4
$IPTABLES -A OUTPUT -d $NET -p tcp --sport $SMTP_PORT -o $DEVLAN -j MARK --set-mark 4
$IPTABLES -A OUTPUT -d $NET -p tcp --sport $POP3_PORT -o $DEVLAN -j MARK --set-mark 4
done
$TC class add dev $DEVWAN parent 1:100 classid 1:3 htb rate $RATE_LAN2 ceil $CEIL_LAN2 quantum 1500
$TC class add dev $DEVLAN parent 2:200 classid 2:4 htb rate $RATE_LAN2 ceil $CEIL_LAN2 quantum 1500
$TC filter add dev $DEVWAN parent 1:0 protocol ip prio 1 handle 3 fw classid 1:3
$TC filter add dev $DEVLAN parent 2:0 protocol ip prio 1 handle 4 fw classid 2:4

#### ----------- LINEA DE CLASE Y FILTRO DE CLASE POR DEFECTO ------------ ####
$TC class add dev $DEVWAN parent 1:100 classid 1:97 htb rate 9Mbit ceil 9Mbit
$TC class add dev $DEVLAN parent 2:200 classid 2:98 htb rate 9Mbit ceil 9Mbit
$TC filter add dev $DEVWAN parent 1:0 protocol ip prio 1 handle 97 fw classid 1:97
$TC filter add dev $DEVLAN parent 2:0 protocol ip prio 1 handle 98 fw classid 2:98


Nota aclaratoria: El script no calcula el valor del quantum automaticamente :) (no soy mandrake el mago en bash asi que no pidan magias ni milagros jeje) por lo cual deben tener presente ésta formula:
quantum=rate*1024/8/r2q, con un quantum=1500 se soporta una ancho de banda de hasta 128Kbits si es mayor debes utilizar la formúla para calcularlo y declararlo en la clase respectiva.

Necesito dar un rate de 256Kbit y un ceil de 384Kbit, entonces aplicamos:
quantum=(256*1024)/8)/10)
quantum=3277, esto lo declaramos en la clase del grupo correspondiente por ejemplo:

$TC class add dev $DEVWAN parent 1:100 classid 1:5 htb rate 256kbit ceil 384kbit quantum 3277
$TC class add dev $DEVLAN parent 2:200 classid 2:6 htb rate 256kbit ceil 384kbit quantum 3277


Ejemplo:

Listo eso es todo por ahora, espero haber sido claro :?
Pueden adicionar tantos grupos como deseen solo deben modificar unos pocos parametros :)
VIVA el Software Libre y el Libre Conocimiento..........
*Corregido al 20/6/07@8:55AM

Comentarios

opensuse 10.2

Imagen de zeo3

buenas amigos!!

en opensuse quien ya probo el script???? al momento de probarlo me sale este mensaje..

router:~ # /etc/init.d/cbq
**CBQ: ip-route2 utilities not installed or executable!

Saludos Cordiales En donde

Saludos Cordiales
En donde debo de cambiar la red y tambien el limite de ancho de banda.
Gracias

Que tenga buen dia
Luis Cevallos Cavero.
091763232

Que tenga buen dia
Luis Cevallos Cavero.
091763232

Ayuda!!!

Hola a todos, denme una mano porfa, como lo modifico el script si es que necesito 10MB de ancho de banda para las redes 200.0.28/22 y 172.16.0.0/16 que estan en eth1 y 128kbps para 0.0.0.0/0 (que son todas las salidas a internet) que esta en eth2, me explico, eth1 es mi red interna y eth2 es la salida a internet.

Para los dos comentarios

Imagen de damage

Para los dos comentarios anteriores, Miren las VARIABLES y cambienlas, la cosa no es solo de soplar y hacer botellas miren el script y estudienlo por favor ya esta mas que facil como lo estructure ahora solo toca que lo acomoden a sus necesidades.
Keep The Fire Burning.....
Stryper 1988
http://counter.li.org/

Ayuda con r2q

Imagen de Monkito

Alguien me puede ayudar con los parámetros r2q, quantum y burst??

leí algo que saqué de google pero aún lo tengo confuso, todo comenzó desde que se me ocurrió hacer:


dmesg

y vi algo como:


HTB: quantum of class 10097 is big. Consider r2q change.
HTB: quantum of class 20098 is big. Consider r2q change.

lo arreglé poniendole r2q=1 y un quantum de 640 en las clases por defecto a 5Mbit pero eso porque la fórmula dice rate/r2q >= quantum pero no entiendo el por qué...

Gracias de antemano..

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum

Lo que has hecho esta

Imagen de damage

Lo que has hecho esta correcto :cool: de paso gracias por postear y hacerme acuerdo de este pequeño bug, entrando en materia el manual de HTB indica que el QUANTUM debe estar entre 1500 (valor del MTU) y 60000 (valor maximo del leaf QUANTUM, esto se computan automaticamente dividiendo rate/r2q por ejemplo si el maximo del leaf rate es 1Mbit (120000Bps) entonces r2q debe ser 3. Si el rate maximo es 10kbit (1200Bps) entonces el r2q debe ser 1. EL mensaje que se tiene es solo una llamada de atención, más no afecta a la funcionalidad del script, pero siempre mejor dejar las cosas como deben ser.
Otros ejemplos mas claros:
Smallest rate : 16kbit = 2 kilobyt / r2q (=10) = 200. esto es < 1500. Entonces saldra el mensaje que es pequeño considerando el r2q change.
Biggest rate : 100mbit = 12.5 mbyte / r2q = 1.2 Mbyte > 60.000. Saldrá el mensaje que es mayor.

En tu caso tenias un Leaf rate > 60.000 por eso salia que era mayor que el r2q change.
Confusa la cosa pero de los errores se aprende :)
Ahora solo toca jugar con el valor del r2q y acomodarlo a las necesidades de cada quien.

Saludos.

Keep The Fire Burning.....
Stryper 1988
http://counter.li.org/

Ahora si entendí...!

Imagen de Monkito

Por fin, gracias damage por tu explicación...

me voy corriendo a arreglar unas cosillas que tengo en otros servidores....

bye

Cogito Ergo Sum

------------
counter.li.org

Cogito Ergo Sum

Una pregunta, he histo que

Una pregunta, he histo que se puede crear un canal con prioridades, te digo porque lo he hecho por ip y por puertos, ahora mas bien dentro de esta segmentación se podria crear prioridades por paquetes..?? me refiero mas a la parte de navegacion, tu asigna un AB cualquier que fuera, pero dentro de esa navegacion tu realiza una descarga, de ley se va a consumir todo en la descarga, si dejar poder hacer otra cosas..
dentro de ese mismo Cliente.

Saludos

Páginas