Como controlar el ancho de banda usando HTB-GEN

Imagen de damage

HOla distinguidos usuarios, amigos y conocidos del foro, a pedido de muchos, voy a comentarles mi experiencia en cuanto al uso del htb-gen versión 0.8.4, no usaremos la 0.9 porque aún esta en face beta. Bueno pues, el htb-gen es como su nombre lo indica un generador de script del famoso y glorioso HTB, pero bueno vamos al asunto en mención, los pasos son los siguientes:

1.- Descargar el htb-gen de la pagina oficial http://www.praga.org.ar/wacko/DevPraga/htbgen/, aqui escojemos dependiendo de nuestra distro de linux, el paquete mas apropiado, yo como uso Centos 4.4 i386, descargue htb-gen-0.8.4-1.noarch.rpm, también lo he usado en x86_64 ya que es un rpm "noarch".

2. Luego de la descarga respectiva, lo instalamos, ya sea con doble click o desde la consola como sea mejor para cada quien:


rpm -iUvh htb-gen-0.8.4-1.noarch.rpm

3. Ahora ya esta instalado el htb-gen, desde la consola editamos el .conf, no dirijimos hacia:


# vi /etc/htb-gen/htb-gen.conf
Aquí declaramos, las interfaces de red tanto la que esta conectada al internet como la que esta del lado LAN:
iface_down="eth1" # Server LAN iface
iface_up="eth0" # Server INET iface

3.1 Luego declaramos el ancho de banda que tenemos asignado por ejemplo si nuestra red tiene un ancho de banda de 512 Kbits tanto de bajada como de subida lo declaramos asi:

total_rate_down=512
total_rate_up=512

O si tenemos 512k down y 256 up:

total_rate_down=512
total_rate_up=256

3.2 El siguiente paso es declarar los puertos a segmentar, por default viene unos 10 puertos, pero si nuestro server hace de proxy/firewall, es basta con declarar el 80 y el 8080:

prio_ports=80,8080,25,110,443,1863

El resto de variables que estan en el archivo no lo tocamos para nada (mucho cuidado), no hace falta.

4. Ahora vamos a declarar el ancho de banda que tendra cada ip, subred o red, para esto editamos esto:

# vi /etc/htb-gen/htb-gen-rates.conf

Aquí podemos jugar con los valores el archivo muestra 5 columnas donde la primera es la ip, o subred, la segunda el "rate" de bajada, la tercera el "ceil" de bajada y la cuarta y quinta son el "rate" y el "ceil" de subida, todo esto esta debidamente documentado en el mismo archivo (pero en ingles), ejemplo de comfiguración:


192.168.100.2 0 128 0 64
192.168.100.3 64 128 0 64
192.168.100.4 0 64 0 32

Esto que significa por ejemplo la ip 192.168.100.2, tendra un ancho de banda compartido ( ya que esta en 0 el rate), podiendo llegar a un maximo de 128k siempre y cuando exista ancho de banda disponible.
la ip 192.168.100.3, tendra 64k de ancho de banda asegurado ya que esta en el rate y un maximo de 128k.
Dentro del mismo archivo tenemos más ejemplos didacticos. Guardamos los cambios y listo.

5. OJO esto solo en el caso de que no controle bien el ancho de banda le meten mano de lo contrario lo dejan tal como viene.
Luego de hacer todo esto debemos hacerle unos retoques al script principal el cual esta en:

# vi /usr/bin/htb-gen

y vamos hasta donde dice:

# Make extra tables, cleaner & target match faster
iptables -t mangle -N htb-gen.down
iptables -t mangle -A FORWARD -o ${iface_down} -j htb-gen.down
y Añadimos esta linea:
iptables -t mangle -A OUTPUT -o ${iface_down} -j htb-gen.down
Luego bajamos dos lineas y añadimos:
iptables -t mangle -A POSTROUTING -o ${iface_up} -j htb-gen.up

esta parte del script quedará asi:
iptables -t mangle -N htb-gen.down
iptables -t mangle -A FORWARD -o ${iface_down} -j htb-gen.down
iptables -t mangle -A OUTPUT -o ${iface_down} -j htb-gen.down
iptables -t mangle -N htb-gen.up
iptables -t mangle -A POSTROUTING -o ${iface_up} -j htb-gen.up
iptables -t mangle -A FORWARD -o ${iface_up} -j htb-gen.up

Bajamos un poco más y encontraremos esto:
#delete old htb-gen entries(chains)
iptables -t mangle -D FORWARD -o ${iface_down} -j htb-gen.down 2>/dev/null
iptables -t mangle -D FORWARD -o ${iface_up} -j htb-gen.up 2>/dev/null
Y lo remplazamos adicionando lineas correspondientes a las anterirmente declaradas, en fin debe quedar asi:

#delete old htb-gen entries(chains)
iptables -t mangle -D FORWARD -o ${iface_down} -j htb-gen.down 2>/dev/null
iptables -t mangle -D OUTPUT -o ${iface_down} -j htb-gen.down 2>/dev/null
iptables -t mangle -D POSTROUTING -o ${iface_up} -j htb-gen.up 2>/dev/null
iptables -t mangle -D FORWARD -o ${iface_up} -j htb-gen.up 2>/dev/null

6. Una vez guardados los cambios, desde consoloa tecleamos:

# htb-gen tc_all

Con esto htb-gen generara automaticamente, los script's correspondientes con las clases y la parte de iptables.

7. Verificamos que todo se halla generado con:

# iptables -nL -t mangle

8. Listo todo en orden a relajarce con unas chelas ya que tendran un problema menos que cargar, Salud.

NOTA: Deben tener instaldo iproute para que esto funcione de lo contrario, no generara mensajes de error, recuerden que el comando TC es parte de iproute y este comando es parte fundamental tanto en el uso de htb como de cbq.

Debido a la gran cantidad de preguntas respecto a el mensaje de "check rates conf, not enough download bandwidth", eso se da porque estan declarando más RATE del que tienen asignado en el "Total RATE" del htb-gen.conf. Pilas lean las palabritas que tiene cada archivito para que se enteren que no hacer.

Así mismo he visto que preguntan de manera insistente que se les indique porque no les funciona el htb-gen, muchos usuarios solo lo instalan y listo, pero aveces hay que ver que más pasa, yo nunca tuve inconvenientes con el htb-gen realizaba lo posteado y listo, pero con la versión 0.9b, el error se da que este no asigna la chain de mangle a la eth1 si no a la eth0, he ahi el error ya que personalmente la eth0 la declaro como interfaz externa.
Recomiendo tecleen iptables -nL -t mangle y se fijen en que eth se general el reporte, la solución la estoy analizando, la misma la posteare a futuro, por el momento si necesitan usar el htb-gen 0.9 usen la version 0.9-1 con la cual no se me ha presentado el inconveniente.

ACTUALIZACIÓN 11/07/2009
Viendo varios post similares sobre el problema de la segmentación de subida, lastimosamente muchos solo pensaron de que era cosa de instalar dar dos clic's, poner las ip's y listo, pero no este problema de subida se soluciona, y repito como dije hace meses atras (por eso nunca di respuesta antes ya que no lo creía necesario debido a "que lo habia dicho antes") se debe jugar con las reglas de iptables, en la versión del htb gen 0.9.1 que es la cual muchos usan,se debe adicionar una linea en la cual marque el FORWARD con la opción -i, con eso es suficiente para solucionar el dilema de la subida, espero que prueben y apliquen lo recomendado. No me pregunten el porque, se los dejo de tarea.
En cuanto a la versión 0.8.x no hay que hacerlos tal como se explica es suficiente, si tienes algun problema con el squid o alguna relacionado, me he topado con muchas personas que tienen script de iptables que hacen flush de reglas en la cadena mangle lo cual interfiere con las reglas de mangle del htb-gen, deben ver todas las opciones antes de decir NO FUNCIONA.

Actualización al 14 de Septiembre del 2010:

Se me presento en una institución que no es ISP que se necesitaba colo controlar el ancho de banda hacia Internet, pero resulta que como el htb-gen segmenta todo el tráfico en la tabla del FORWARD, pues eso tría complicaciones cuando el mismo gateway de Internet es también el router de varias subredes de una LAN, por ejemplo un servidor de aplicaciones esta dentro del segmento 192.168.0.1/24 y tengo hosts en el segmento 192.168.2.0/29, ambas redes son ruteadas por el Linux en este caso el Htb-gen me segmentara el trafico local entre ambas subredes, lo cual nos pondra en problemas, para solucionar esto se debe hacer los siguiente (gracias a Razametal por dar una luz ;) ):
iptables -t mangle -I FORWARD -p ALL -d 192.168.0.1/24 -s 192.168.2.0/29 -j RETURN
iptables -t mangle -I FORWARD -p ALL -s 192.168.0.1/24 -d 192.168.2.0/29 -j RETURN

Listo con esto adicionado al final del script principal de htb-gen (/usr/local/bin/htb-gen) tenemos todo resuelto.
Recuerden una vez ejecutado el script con las lineas de Return adicionadas, remplacen el -I con -A, ojo.

Saludos amigos.

Comentarios

Si y no si en una sub red

Imagen de damage

Si y no si en una sub red asignas 8 ip's y le das a ese grupo 128Kbps estas haciendo un 8:1, pero sin darle un rate minimo y un maxmo a cada IP, yo personalmente no manejo las cosas asi, yo a cada cliente le doy su ancho de banda por ejemplo 128 o 256, el rate lo dejo en 0 cosa de que si no existe disponibilidad de ancho de banda el HTB le asigná menos, en pocas palabras tendria un ancho de banda compartido, ahora, para lo que tu necesitas si existe una solución y es haciendo un script de HTB tu mismo, como hacerlo ese es el problema ya que es medio complicado el asunto, de pronto si lees el manual de LARTC para que te orientes.

Keep The Fire Burning.....
Stryper 1988

error htb-gen

Imagen de edidanilo

Estimados amigos estoy configurando el hatb-gen en mi linux redhat enterprice 4, con un ancho de banda de 512/256 kbps ya que mis usuarios se extralimitan en el uso del internet llegando a colapsarla, para esto e seguido los pasos de damage:

paso1: instalo la aplicacion tipo rpm

# rpm -iUvh htb-gen-0.8.4-1.noarch.rpm

paso2: configuro y edito la ip interna, ip externa, ancho de banda subida, ancho de banda bajada y los puertos a habilitar.

# vi /etc/htb-gen/htb-gen-rates.conf
iface_down="10.2.19.1" # Server LAN iface
iface_up="190.11.27.1xx" # Server INET iface

total_rate_down=512
total_rate_up=256

prio_ports=80,8080,25,110,443,1863

paso3: configuro y edito el archivo htb-gen-rates.conf, (cabe indicar que no estoy muy seguro con las pruebas que e hecho)

# vi /etc/htb-gen/htb-gen-rates.conf

# down down up up
# min max min max
#ip (rate) (ceil) (rate) (ceil)
10.2.19.1 0 512 0 256
# 10.2.19.2-10.2.19.8 256 512 128 256
# 10.2.19.9 128 256 128 256
# 10.2.19.19 128 256 128 256
# 10.2.19.30-10.2.19.39 128 256 128 256
# 10.2.19.10-10.2.19.18 0 256 0 128
# 10.2.19.20-10.2.19.29 0 256 0 128
# 10.2.19.40-10.2.19.2540 256 0 128
10.2.19.2 0 512 0 256
10.2.19.3 0 512 0 256

Problemas:
1.- no estoy muy seguro si la configuracion del archivo htb-gen-rates.conf este de la forma adecuada ya que lo que pretendo es:


a) la ip 10.2.19.1, servidor
b) (10.2.19.2-10.2.19.8)estas ip son del deparatamento de sistemas por lo que son reservadas
c) 10.2.19.9, 10.2.19.30-10.2.19.39 del departamento financiero que deben de tener un buen ancho de banda pues se maneja un archivo el cual consume 16k de ancho de banada
d) y el resto de ip que deseo que sean limitdas para que no consuman el ancho de banda de miredlocal

2.- tengo el siguiente mensaje de error al ejecutar el comando:

[root@linux4 htb-gen]# htb-gen tc_all
check rates conf, not enough download bandwidth

agradezco todos sus comentarios sobre esta gran solucion para mi red
..........
aburridin
Ekipolinux
(593)-06-2832838
(593)-091351355

..........
edidanilo
Gana mucho dinero
(593)-06-2832726
(593)-091351355

Estas declarando mal las

Imagen de damage

Estas declarando mal las ip's en el rates.conf, el mismo archivo tiene ejemplo clarisimos de como hacerlo, ojo no debes poner la ip del server ya qeu en el htb-gen.conf debes poner cuanto tienes de subida y cuanto de bajada, recomiendo leer bien las instrucciones, es muy facil.

Keep The Fire Burning.....
Stryper 1988

Hey tengo el mismo problema

Imagen de falcom

Hey tengo el mismo problema revise bien mis ips y estan declaradas una por una compartiendo el ancho de banda asignado (la ip del server no esta declarada), cual es la formula para compartir el ancho de banda o cuantas ips se puede colocar por un ancho de banda de 256 Kb??

192.168.0.14 0 256 0 128
192.168.0.15 0 256 0 128
....

a 57 ips les doy un rate de 0 y un ceil max de 256 a pesar de tener 1.7 Mb, eso para los users comunes pero me bota el mismo error a pesar de bajar el ceil a 128
a otro grupo les doy asi:

192.168.0.70 0 128 0 64
192.168.0.71 0 128 0 64
192.168.0.72 0 128 0 64

estas son 13 ips y por ultimo las duras

192.168.0.1 1024 1792 384 384
192.168.0.19 1024 1792 384 384
192.168.0.13 1024 1792 384 384
192.168.0.19 1024 1792 384 384

he tratado bajando el rate pero no funca, en mi archivo de configuracion tengo asi:

total_rate_down=1792 # 1.7 MB Down
total_rate_up=384 # 384 kbps up

Haber si el autor me da un hilo. Thnx
********
Salu2 and Have Fun

Insisto estas haciendo las

Imagen de damage

Insisto estas haciendo las cosas de ofrma errada, al parecer nunca has leido el manual de LARTC, pues dale una leida.
En cuanto a tu problema es cuestion de sumar y restar nada más, tienes una Rate total de 1.7Mb (espero sea el real, que no creo, ya que nadie te vende 1.7Mb, o es 1.5 o es 2Mb, debes declarar lo que tienes en realidad contratado si no de que sirve todo esto pues), pero bueno si ese es real, como puedes declarar a 4 IP's 1024 de Rate asegurado??? te estas pasando lo que tienes declrado que son 1.7Mb estas asignando 4Mb a esas ip en total, eso es incorrecto ya que la suma de todos los rate's dados no puede ser mayor a el RATE total declarado es mas debe darce maximo hasta un 10% menos de lo declarado.

Por eso siempre se recomienda RTFM.

Keep The Fire Burning.....
Stryper 1988

comprobar ancho de banda.

hola tengo un servicio simetrico de 128 . Tengo clientes locales e inalambricos(tambien locales pues mi Ap funciona en bridge) estos casi nunca se conectan al mismo tiempo, por lo que he declarado un ancho de banda mayor al que tengo para poder asignarles una mayor prioridad, ahora mi htb-gen esta en el mismo squid que funciona como cache para acelerar las conexiones html, la pregunta es, como debe trabajar el htb-gen y el squid? considerando el ancho real? o el proyectado que deberia ser el que brinda el squid en modo acelerado???

como puedo testear si efectivamente esta funcionando el htb-gen?? hay algun parametro q me permita testear si efectivamente se segmente el ancho de banda?

si ademas desearia incluir algun canal de voip. como podria darle prioridad sobre todo el trafico?? es posible eso??

saludos.

una forma de verificar si tus reglas funcionan

Imagen de juandarcy2000

es verificando con iptables el trafico que pasa a travez de las reglas mangle.
#iptables -L -t mangle -vxn
tambien prueba en
www.speedtest.net

con eso veras como funciona la regla al pasar por las especificaciones dadas. miraras como aumenta el trafico y veras si la regla esta capturando los datos. un ejemplo.

Chain PREROUTING (policy ACCEPT 36855981 packets, 22397426923 bytes)
pkts bytes target prot opt in out source destination

Chain INPUT (policy ACCEPT 14341495 packets, 11176575916 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 22422251 packets, 11211923414 bytes)
pkts bytes target prot opt in out source destination
798886 373975373 MARK !icmp -- * * 0.0.0.0/0 192.168.30.0/24 MARK set 0x63
599096 122386768 MARK !icmp -- * * 0.0.0.0/0 192.168.30.12 MARK set 0x62
762 282927 MARK udp -- * * 0.0.0.0/0 192.168.30.10 MARK set 0x62
9809 1320872 MARK udp -- * * 0.0.0.0/0 192.168.30.61 MARK set 0x62
138463 186288326 MARK !icmp -- * * 0.0.0.0/0 192.168.30.3 MARK set 0x5f
0 0 MARK !icmp -- * * 0.0.0.0/0 192.168.30.4 MARK set 0x5f
25480 37423936 MARK !icmp -- * * 0.0.0.0/0 192.168.30.15 MARK set 0x5f
4342 619135 MARK !icmp -- * * 0.0.0.0/0 192.168.1.98 MARK set 0x61
0 0 MARK !icmp -- * * 0.0.0.0/0 192.168.30.6 MARK set 0x5a
25275 26271966 MARK !icmp -- * * 0.0.0.0/0 192.168.30.33 MARK set 0x5b
51754 14772197 MARK all -- * * 0.0.0.0/0 192.168.30.0/24 ipp2p v0.8.2 --ipp2p MARK set 0x63
8197 10739416 MARK all -- * * 74.54.221.16 0.0.0.0/0 MARK set 0x64
8197 10739416 MARK all -- * * 74.54.221.16 0.0.0.0/0 MARK set 0x64

Chain OUTPUT (policy ACCEPT 13340397 packets, 7878014550 bytes)
pkts bytes target prot opt in out source destination
0 0 MARK tcp -- * * 0.0.0.0/0 192.168.30.0/24 tcp spt:3128 MARK set 0x63
0 0 MARK tcp -- * * 0.0.0.0/0 192.168.30.12 tcp spt:3128 MARK set 0x62
0 0 MARK tcp -- * * 0.0.0.0/0 192.168.30.3 tcp spt:3128 MARK set 0x5f
0 0 MARK tcp -- * * 0.0.0.0/0 192.168.30.4 tcp spt:3128 MARK set 0x5f
0 0 MARK tcp -- * * 0.0.0.0/0 192.168.30.15 tcp spt:3128 MARK set 0x5f
51510 40941650 MARK tcp -- * * 0.0.0.0/0 192.168.1.98 tcp spt:3128 MARK set 0x61
0 0 MARK tcp -- * * 0.0.0.0/0 192.168.30.6 tcp spt:3128 MARK set 0x5a
0 0 MARK tcp -- * * 0.0.0.0/0 192.168.30.33 tcp spt:3128 MARK set 0x5b
0 0 MARK tcp -- * * 74.54.221.16 0.0.0.0/0 tcp spt:3128 MARK set 0x64

Chain POSTROUTING (policy ACCEPT 34773160 packets, 19046688439 bytes)
pkts bytes target prot opt in out source destination
1070148 264399326 MARK !icmp -- * eth0 192.168.30.0/24 0.0.0.0/0 MARK set 0x63
931906 248309900 MARK !icmp -- * eth0 192.168.30.12 0.0.0.0/0 MARK set 0x62
979 433365 MARK udp -- * eth0 192.168.30.10 0.0.0.0/0 MARK set 0x62
9698 1742380 MARK udp -- * eth0 192.168.30.61 0.0.0.0/0 MARK set 0x62
87268 8279996 MARK !icmp -- * eth0 192.168.30.3 0.0.0.0/0 MARK set 0x5f
0 0 MARK !icmp -- * eth0 192.168.30.4 0.0.0.0/0 MARK set 0x5f
19408 1120999 MARK !icmp -- * eth0 192.168.30.15 0.0.0.0/0 MARK set 0x5f
9104 897681 MARK !icmp -- * eth0 192.168.1.98 0.0.0.0/0 MARK set 0x61
0 0 MARK !icmp -- * eth0 192.168.30.6 0.0.0.0/0 MARK set 0x5a
20888 4512646 MARK !icmp -- * eth0 192.168.30.33 0.0.0.0/0 MARK set 0x5b
169309 22290929 MARK all -- * eth0 192.168.30.0/24 0.0.0.0/0 ipp2p v0.8.2 --ipp2p MARK set 0x63

donde hay valores 0 son ip que no estan navegando si observas la regla de ipp2p veras como hay trafico pasando por ellas y realmente baja el consumo a los especificado, lamentablemente como ipp2p no es un protocolo muy bien depurado te recomendaria que compiles el kernel para que soporte Layer 7 eso si es bastante eficiente pero igualmente siempre habran fallos y a veces saldra a toda velocidad por lo tanto una solucion que he usado algo brusca pero muy eficiente es usar reglas disminuyendo el trafico a todo puerto que supere los puertos bien conocidos, el unico inconveniente es que debes jugar con otras reglas como ftp pasivo de lo contrario afectas esas conexiones y serian consideradas en la regla que especificas para los puertos arriba de los 1024, otra cosa recomiendo usar reglas que bloqueen todos los protocolos excepto los icmp como estan aplicados en mi regla, debido a que cuando haces ping a una pagina es muy util ver la latencia baja asi sabes que dispones de ancho de banda si todos los usuarios empiezan a navegar veras tiempos de repuesta icmp altos con eso sabras que hay saturacion en tu red y podes tomar acciones al respecto, otra cosa las reglas output hay que decirles que sean para el puerto 3128 o el que use tu squid ya que de lo contrario si usas ftp o pop3 en tu servidor que hace traffic shapper con htb o cbq le bajaras la transimision a esos puertos y por lo tanto cuando bajes un email local de tu server de 1 mb lo bajaras igual de lento que navegar y no tendria logica ya que lo tienes local tienes que ser muy delicado en esa regla.

Páginas