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

Cabe recalcar que el Script

Imagen de damage

Cabe recalcar que el Script en menciòn ha sido probado en varias redes con varias Distros de Linux, la red mas grande es de 45 PC's, y el server en el que ha implementado tiene distros como Debian etch, Centos 4.x y Fedora Core.
Keep The Fire Burning.....
Stryper 1988
http://counter.li.org/

Ayuda

Saludos y un buen año para ti y todos los integrantes de ecuaug.

Si me puedes ayudar con el enlace desde donde descargaste y q version es el HTB, Y si hay q recomplilar el Kernel o algo adicional q tenga q realizarce. De antemano Gracias.

Htb

Disculpa Damage la ignorancia, tengo redhat 9, para que tu script corra debe estar en el /sbin el script del htb.init, que se baja de internet y se debe configurar algo dentro del /etc/sysconfig/htb, en mi linux el htb esta dentro del /etc/rc.d/init.d, la verdad he leido mucha documentacion del asunto y estoy confundido, hay varias versiones y en linux no soy tan perito, en mi caso debo limitar el ancho de banda a un solo equipo por el momento en un puerto especifico, de resultar a las mil maravillas empezare a limitarle a toda la red.

Saludos, espero me puedas ayudar con mi inconveniente

Asi es debes bajar en

Imagen de damage

Asi es debes bajar en htb.iniv0.8.5 (algo asi se llama) y copiarlo a /sbin con el nombre de htb, luego hacerlo ejecutable con chmod a+x.

Una vez hecho eso solo copias este script a un archivo y lo colocas donde tu prefieras puedes crearle un directorio como por ejemplo vi /etc/htb/htb.sh y para ejecutarlo teclear /etc/htb/htb.sh, previo debes modificar puertos, ip's, subredes, etc, lo que necesites y listo.

P.D. Te recomiendo actualizar o cambiar el RH9 que tiene es muy viejito el pobre y ya no tiene soporte, usa Centos, dependiendo de el harware de tu PC puedes usar Centos 5(si es un PC bien puesta minimo Athlon XP/P4) si estas medio pobre en hardware usa centos 4.4 (desde PIII) o Centos 3.8 (desde PI hasta el que sea). No te garantizo funcióne la segmentación en el RH9.
Keep The Fire Burning.....
Stryper 1988
http://counter.li.org/

Pues solo necesitas htb.init

Imagen de damage

Pues solo necesitas htb.init dentro de /sbin, asi lo dice la variable del script, en cuanto a lo otro de sysconfig, no es necesario, pero no te aseguro que funcione en el RH9, es más estoy muy seguro que no va a funcionar ya que su kernel es muy viejo y no soporta hacer QoS y demás, pilas que debes tener instalado iproute en tu linux, pero como te digo no creo que tengas resultados en el rh9, debes actulizarte, esa version de RedHat es muy vieja, te recomiendo pongas o actualices a CentOS 4.6 o 5.1 depende de tu hardware.

Keep The Fire Burning.....
Stryper 1988

se debe configurar el kernel?

Imagen de edleo

Hola a todos, alguien me podría aclarar la siguiente duda!! he estado leyendo información sobre segmentación de ancho de banda (Qos, HTB) y encontrado documentación que indica que lo primero que hay que hacer es parchar y configurar el kernel incluso en las nuevas distribuciones. es cierto eso? podría funcionar sin parchar el kernel?

Gracias por sus respuestas :)

Si funciona sin parchear el

Imagen de damage

Si funciona sin parchear el Kernel al menos que necesites implementar alguna solucion con Layer7, de lo contrario solo sigue las instrucciones y listo.

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

Páginas