QOS para VoIP con HFSC
Debido a que en mi oficina implantaremos de aquí a poco un proveedor que nos proporcionará las lineas telefónicas a traves del protocolo SIP el cual viaja a traves de internet, deberemos ser capaces de hacer que conviva con otro tipo de tráfico que generamos y sale a internet y además de convivir debemos priorizar el tráfico VoIP sobre otro tipo de paquetes.
Para hacer esto con debian o alguna otra distibución basada en linux, debemos utilizar tc (Traffic Control) un comando de la colección de utilidades iproute.
Lo que conseguiremos es minimizar la latencia de los paquetes deseados, maximizar la salida de estos paquetes y por el contrario, parar la salida de trafico, por ejemplo, P2P.
Os dejo con el script de QOS que tiene todas las explicaciones para poder entender el funcionamiento de TC y las colas HFSC.
Para implementar uns sistema efectivo de QOS o Calidad de Servicio es importante antes entender el funcionamiento de TC, para ello os recomiendo leer detenidamente los comentarios de script y si además nos quedan dudas leer este documento que aunque no habla del tipo de cola que utilizaremos, HFSC, clarificará un montón el funcionamiento de TC.
El script consta de un dos partes difereciadas, la creación de las colas con TC y el marcado de paquetes con iptables, también podríamos haber utilizado para muchas de los filtros el comando tc, que es más rapido dentro del kernel que iptables, pero también algo más complicado. En este documento, sacado de LARTC, explica perfectamente como podemos crear filtros para ir añadiendo tipos de paquetes a las colas que vayamos creando.
** Ojo a los saltos de linea
El script:
#!/bin/bash
#
# Un poquito de teoria para poder entender el script:
#
# Cada cola HFSC (Hierarchical Fair Service Curve) tiene los siguientes
# parámetros encargados de garantizar su caudal:
#
# * ul UpperLimit: Caudal máximo para la cola. Nunca tendrá más
# tráfico que el indicado.
# que se tenga en la interfase se garantiza este caudal.
#
# * rt RealTime: Caudal mínimo para la cola. Independientemente del tráfico
# que se tenga en la interfase se garantiza este caudal.
#
# * ls LinkShare: HFSC calcula el caudal sobrante en la interfaz teniendo
# en cuenta que se cumplan los caudales mínimos (RealTime) de cada cola.
# Este sobrante de caudal se reparte entonces entre las colas, en función
# de su valor LinkShare. Por ejemplo, si se tienen dos colas con un 50% en
# LinkShare y se satura la conexión, ambas colas presentarán el mismo exceso
# de tráfico. Por contra, si una de las dos colas no necesita caudal sobrante,
# la otra lo cogerá todo.
#
# * sc ServiceCurve: Coloca en la misma curva, es decir con los mismos valores
# a ls y rt o LinkShare y RealTime, en vez de establecer los dos por separado
# pondremos sc para dejar los dos iguales.
#
# * m1: Caudal inicial a tener en d milisegundos.
#
# * d: Milisegundos que se tardará en tener el caudal m1.
#
# * m2: Caudal final a tener. Los parámetros m1, d y m2 modelan la curva
# (arranque) de la cola.
#
# Crearemos una cola qdisc raiz del tipo hfsc para el tráfico de subida,
# una hija llamada 1:1 del tipo hfsc donde estableceremos límites máximos de
# subida y 5 hijas de 1:1 del tipo hfsc donde iremos mandando el trafico
# según deseemos:
#
# 1: Qdisc raiz del tipo hfsc, el trafico por defecto ira a 5
# |
# 1:1 Clase hija hfsc, establece limite máximo de subida (ul)
# _______|_______
# / / |
# / / |
# / / |
# / / | Clases terminales hfsc donde encolaremos
# 1:2 1:3 1:4 1:5 1:6 el trafico de esta forma:
#
#
# 1:2 Interactiva (SSH, DNS, ACK), pequeños paquetes pero que deben ser muy rapidos
# 1:3 Baja latencia (VoIP), Paquetes que deben salir rapido
# 1:4 Tráfico Web (HTTP, HTTPs) Queremos poder navegar si alguien abusa
# 1:5 Prioridad noramal, el tráfico normal, cola por defecto
# 1:6 Baja prioridad (p2p, pop3, smtp) Debe ir lo último y solo si hay ancho de banda
#
# Crearemos también una cola de bajada o cola ingress para intentar "controlar" el
# tráfico de bajada del ISP apoyandonos en que los inicios de conexiones tcp
# comienzan lentos y se regulan al medida que pasa el tiempo, si obligamos a
# nuestro router a descartar paquetes nuestro ISP regulará a una velocidad algo
# menor a la que tenemos pudiendo de esa forma dejar un poquito de ancho de banda
# para no machacar nuestra latencia.
#
#
# Especificaremos los parametros de nuestro Conexión a Internet en kilobits
# Pondremos algo menos, por ejmeplo a mi en www.tesdevelocidadad.es me da de media
# BAJADA= 9378 y SUBIDA=795 y utilizaré 8700 y 700
#
############################################
# Variable de configuración
############################################
BAJADA=8700
SUBIDA=700
# Estableceremos la interfaz que conecta a internet al llamar al script.
INTERFAZ=$1
# Si necesitasemos establecer el servidor asterisk o el telefono VoIP
# Si no queremos establecer uno en especial lo dejeremos vacio, IPSVOIP=""
IPSVOIP=""
# Para establecer los puertos que utilizaremos en iptables para meter el
# trafico en las distintas colas colas seguiremos esta nomenclatura:
# 53-udp-s
# 53 para el puerto, udp para el protocolo y s para indicar que es source port
# Algunos ejemplos:
# 10001:20000-udp-sd
# Rango de puerto del 10000 al 20000 protocolo udp y ambos sentidos.
# 80-tcp-d
# Puerto de destino 80 protocolo tcp
# Puertos a utilizar para la Cola 1:2 o de trafico interactivo,
PUERTOSINTERACTIVOS="53-udp-sd 22-tcp-d "
# Puertos utilizar en la cola de Baja latencia o 1:3
PUERTOSBAJALATENCIA="5060-udp-sd 10001:20000-udp-sd"
# Puertos que iran a parar a la cola de trafico web
PUERTOSWEB="80-tcp-d 443-tcp-d"
# Los puertos con menor prioridad
PUERTOSBAJAPRIORIDAD="110-tcp-d 25-tcp-d 21-tcp-d 143-tcp-d 445-tcp-d 137:139-tcp-d 4662-tcp-d 4664-tcp-d 6881:6999-tcp-d"
####################################################
# Función clasifica_por_pueto
####################################################
# Esta función la utilizaremos más adelante para mandar cada puerto a su cola.
clasifica_por_pueto() {
PUERTO=`echo $1|cut -d"-" -f1`
PROTOCOLO=`echo $1|cut -d"-" -f2`
DIRECCION=`echo $1|cut -d"-" -f3`
CLASE=$2
case "$DIRECCION" in
d)
iptables -t mangle -A QOS -p $PROTOCOLO –dport $PUERTO -j CLASSIFY –set-class $CLASE
;;
s)
iptables -t mangle -A QOS -p $PROTOCOLO –sport $PUERTO -j CLASSIFY –set-class $CLASE
;;
ds|sd)
iptables -t mangle -A QOS -p $PROTOCOLO –dport $PUERTO -j CLASSIFY –set-class $CLASE
iptables -t mangle -A QOS -p $PROTOCOLO –sport $PUERTO -j CLASSIFY –set-class $CLASE
;;
*)
echo "******** Error en la definición de algún puerto"
exit
;;
esac
}
#######################################################
# Función para_qos
#######################################################
function para_qos() {
# Eliminamos colas de la interfaz
tc qdisc del dev $INTERFAZ root > /dev/null 2>&1
tc qdisc del dev $INTERFAZ ingress > /dev/null 2>&1
# Eliminamos de iptables las reglas creadas para marcar los paquetes
iptables -t mangle –delete POSTROUTING -o $INTERFAZ -j QOS > /dev/null 2>&1
iptables -t mangle –flush QOS 2> /dev/null > /dev/null
iptables -t mangle –delete-chain QOS 2> /dev/null > /dev/null
echo "Colas y reglas iptables eliminadas de $INTERFAZ."
}
######################################################
# Función inicia_qos
######################################################
function inicia_qos() {
# Añadimos la qdisc raiz del tipo HFSC, el tráfico que no venga marcado se ira
# a la cola 5, por eso escribimos default 5
echo " Creando qdisc raiz"
tc qdisc add dev $INTERFAZ root handle 1: hfsc default 5
# Añadimos la clase hija 1:1 donde estableceremos limites de subida, tendremos un
# máximo de subida ul y con sc establecemos el caudal minimo para esta cola (rt)
# y compartiremos entre todas las colas el ancho de banda sobrante (ls), recordad
# que sc establece rt y ls con los mismo valores.
echo " Creando qdisc 1:1"
tc class add dev $INTERFAZ parent 1: classid 1:1 hfsc sc rate ${SUBIDA}kbit ul rate ${SUBIDA}kbit
# Crearemos la cola para el tráfico interactivo, el que necesita salir más rapido.
# Inicialmente le daremos todo el ancho de subida (m1) en 50ms (d) muy baja latencia,
# para que al final acabe quedandose con un caudal minimo (parte rt) de 5/10 y
# comparta si no lo usa (parte ls) 7/10 del ancho de banda de su cola con las demás,
# además establecemos como caudal máximo toda nuestra subida con ul.
echo " Creando qdisc 1:2"
tc class add dev $INTERFAZ parent 1:1 classid 1:2 hfsc
rt m1 ${SUBIDA}kbit d 50ms m2 $((5*$SUBIDA/10))kbit
ls m1 ${SUBIDA}kbit d 50ms m2 $((7*$SUBIDA/10))kbit
ul rate ${SUBIDA}kbit
# Crearemos la cola para el tráfico de baja latencia, donde primeramente iran
# nuestro paquetes con TOS de baja latencia (marcaremos con iptables), paquetes
# paquetes VoIP….
# estableceremos con sc los caudales minimos y la comparticion del ancho de
# banda con otras colas a 3/10. Como caudal inical tendremos para esta cola
# todo el ancho de subida y se lo daremos en 200 ms. Además estableceremos con
# ul el caudal máximo que podrá tener esta cola, es decir todo. Recordad que sc
# establece rt y ls.
echo " Creando qdisc 1:3"
tc class add dev $INTERFAZ parent 1:1 classid 1:3 hfsc
sc m1 ${SUBIDA}kbit d 200ms m2 $((3*$SUBIDA/10))kbit
ul rate ${SUBIDA}kbit
# Para el trafico Web no garantizaremos nada (m1) hasta el primer segundo, no significa
# que no naveguemos rapido, sino que si hay otro trafico antes, retardaremos su
# salida, priorizando asi el trafico que necesitamos. A partir de ese segundo esta cola
# tendrá como minimo 1/10 del caudal total (m2), con un máximo de caudal del total
# de la conexión (ul). Recordad que con sc establecemos el valor ls que lo que hace
# es compartir el ancho de banda de la cola, que es lo que deseamos.
echo " Creando qdisc 1:4"
tc class add dev $INTERFAZ parent 1:1 classid 1:4 hfsc
sc m1 0 d 1s m2 $((1*$SUBIDA/10))kbit
ul rate ${SUBIDA}kbit
# Para el trafico que no marcamos, no garantizaremos nada (m1) hasta el 2º segundo (d)
# y a partir de ese momento le garantizaremos 1/20 del caudal total (m2) contando
# siempre que este disponible con el maximo de la linea (ul). Recordad que con sc
# establecemos el valor ls que lo que hace es compartir el ancho de banda de la cola.
echo " Creando qdisc 1:5"
tc class add dev $INTERFAZ parent 1:1 classid 1:5 hfsc
sc m1 0 d 2s m2 $((1*$SUBIDA/20))kbit
ul rate ${SUBIDA}kbit
# Para el trafico de Baja Prioridad, por ejemplo P2P o SMTP, no garantiremos nada (m1)
# los 10 primeros segundos (d) y aprtir de ahí le garantizaremos 1/20 del caudal (m2)
# Si la conexion esta libre, esta cola podrá utilizar todo el ancho de banda (ul).
# Recordad que sc establece tambien ls.
echo " Creando qdisc 1:6"
tc class add dev $INTERFAZ parent 1:1 classid 1:6 hfsc
sc m1 0 d 10s m2 $((1*$SUBIDA/20))kbit
ul rate ${SUBIDA}kbit
# Crearemos la nueva cadena donde llamada QOS donde iremos enviando el trafico para
# marcarlo según nuestras necesidades.
echo " Creando cadena QOS de iptables"
iptables -t mangle -N QOS
# Paquetes con banderas TCP especiales y menores de 64 los mandamos a 1:2 Trafico Interactivo
iptables -t mangle -A QOS -p tcp -m tcp –tcp-flags FIN,SYN,RST,ACK ACK -m length –length :64 -j CLASSIFY –set-class 1:2
# El trafico ICMP superior a 512 lo mnadamos a la cola de trafico web o cola 1:4
iptables -t mangle -A QOS -p icmp -m length –length 512: -j CLASSIFY –set-class 1:4
# El resto de tráfico ICMP lo mandamos a la cola 1:2 de Trafico Interactivo
iptables -t mangle -A QOS -p icmp -m length –length :512 -j CLASSIFY –set-class 1:2
# Con la ayuda de la función clasifica_por_puerto marcaremos los paquetes segun
# sea nuestra necesidad. A esta función debemos pasarle el puerto y la cola:
for puerto in $PUERTOSINTERACTIVOS; do clasifica_por_pueto $puerto 1:2; done
for puerto in $PUERTOSBAJALATENCIA; do clasifica_por_pueto $puerto 1:3; done
for puerto in $PUERTOSWEB; do clasifica_por_pueto $puerto 1:4; done
for puerto in $PUERTOSBAJAPRIORIDAD; do clasifica_por_pueto $puerto 1:6; done
# Marcaremos el trafico proveniente de las IPS de los telefonos o del servidor
# asterisk si lo hemos configurado arriba.
for ipsvoip in $IPSVOIP
do
iptables -t mangle -A QOS –src $ipsvoip -j CLASSIFY –set-class 1:2
iptables -t mangle -A QOS –dst $ipsvoip -j CLASSIFY –set-class 1:2
done
# Marcamos el trafico con TOS especiales para mandarlos a las colas necesarias
# A mi no me hace falta porque lo hago conla definicion de puertos.
#
# Si tuviesemos l7 para marcar paquetes P2P aqui podriamos utilizarlo, para
# mandarlos a la cola de baja prioridad o 1:6
#
# Por ejemplo los de trafico interactivo a la cola 1:2 y los de baja latencia
# a la cola 1:3, los paquetes de mi servidor asterisk vendran marcados,
# siguiendo los pasos de /usr/src/asterisk-es-rsp/asterisk/1.4.24/doc/ip-tos.txt:
# Marcados con DSCP http://www.linuxtopia.org/Linux_Firewall_iptables/x4172.html
#
# tos_sip = cs3
# tos_audio = ef
# tos_iax = ef
# tos iaxprov = ef
#
#iptables -t mangle -A QOS -m tos –tos 0x10 -j CLASSIFY –set-class 1:2
#iptables -t mangle -A QOS -m tos –tos 0x8 -j CLASSIFY –set-class 1:4
#iptables -t mangle -A QOS -m dscp –dscp-class EF -j CLASSIFY –set-class 1:2
#iptables -t mangle -A QOS -m dscp –dscp-class CS3 -j CLASSIFY –set-class 1:4
# Con esta regla mandaremos el tráfico par que se marque si es necesario.
# Todo el trafico despues de ser enrutado pasará por nuestra nueva cadedna QOS
# para ser marcado si es ncesario.
echo " Redirigiendo todo el trafico para que sea marcado si es necesario"
iptables -t mangle -A POSTROUTING -o $INTERFAZ -j QOS
# Crearemos ahora la cola de bajada o ingress, en esta solo realentizaremos un
# poco el trafico de bajada para que asi nuestro ISP deje algo de caudal libre
# intentando que el ISP deje de mandar paquetes, acordaros que TCP es orientado
# a conexion y tarda un tiempo en establecer la velocidad, si descartamos paquetes
# nuestro peticion tcp no nos mandará mas dejando de esa forma algo de caudal sin
# usar.
# Crearemos la cola con nombre ffff del tipo ingress
echo " Creando la cola ingress para tráfico de bajada"
tc qdisc add dev $INTERFAZ handle ffff: ingress
# Filtraremos todos los paquetes y les reduciremos la velocidad a la que marcamos
# en la configuracion de las variables, que si se hizo lo que dije, debe estar
# un poquito por debajo de la realidad.
tc filter add dev $INTERFAZ parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${BAJADA}kbit burst 10k drop flowid :1
}
case "$2" in
stop)
para_qos
exit 1
;;
status)
echo "****** [qdisc] ******"
tc -s qdisc show dev $INTERFAZ
echo ""
echo "****** [class] ******"
tc -s class show dev $INTERFAZ
echo ""
echo "****** [filter] ******"
tc -s filter show dev $INTERFAZ
echo ""
echo "****** [iptables] ******"
iptables -t mangle -L QOS -v -n -x 2> /dev/null
exit
;;
monitor)
watch tc -s class ls dev $INTERFAZ
exit 1
;;
start|restart|reload)
echo "Parando QOS en la interfaz $INTERFAZ. "
para_qos
echo "Iniciando el servicio QOS en la interfaz $INTERFAZ. "
inicia_qos
echo "HECHO"
exit 1
;;
*)
echo "Modo de uso: $0 [intefaz] [] (start|stop|status|monitor|restart|reload)"
exit 1
;;
esac
Monitorización
Para poder ver el tráfico basta con llamar al script en modo monitor, aun asi existe una aplicación llamada tc-viewer que nos enseñará de forma más bonita como se va agregando y a que cola, los paquetes que mandamos a nuestro router. Para instalar tc-viewer simplemente debemos seguir estos pasos:
* Descargar el script tc-viewer de aquí o de aquí
* Descargar el archvio de configuración en la carpeta /etc/ de aquí, este archivo es perfecto para el sistema QOS que hemos creado.
* Copiaremos el script a /usr/sbin
* Le daremos permisos de escritura con chmod a x /usr/sbin/tc-viewer
* Modificaremos el archivo de configuración /etc/tc-viewer.conf
* Ahora ya solo quedaría lanzarlo para ver como actua, para ello pondremos el siguiente comando en nuestro router: tc-viewer –conf=/etc/tc-viewer.conf
Pruebas
Las pruebas realizadas han sido concluyentes en tipos de paquetes que nos dan la medida de tiempo, por ejemplo ping, con la voz solo he podido hacer pruebas contra un proveerdor y no han sido tan tajantes como con el ping, no por que se escuchase mal la voz, sino al contrario, que con tráfico en mi liena adsl la conversación era satisfactoria.
Pruebas sin el script QOS:
Sin tráfico | Tráfico de Subida | Tráfico de Bajada | Ambos | |
Ping 64 bytes | 32,9 | 212,7 | 45,6 | 197,3 |
Ping 458 bytes | 37,8 | 272,4 | 58,8 | 405 |
Cortes de voz | 0 | 1 | 3 | 3 |
Calidad Llamada | Ok | Ok | Ok | Ok |
Latencia con *43 | Inperceptible | 1 sg. aprox. | Inperceptible | 1 sg. aprox. |
Pruebas con el script QOS:
Sin tráfico | Tráfico de Subida | Tráfico de Bajada | Ambos | |
Ping 64 bytes | 33,1 | 37,8 | 34,5 | 39,4 |
Ping 458 bytes | 38,4 | 40,37 | 40,7 | 43,1 |
Cortes de voz | 0 | 1 | 1 | 2 |
Calidad Llamada | Ok | Ok | Ok | Ok |
Latencia con *43 | Inperceptible | Inperceptible | Inperceptible | Inperceptible |
A la espera de poder hacer más pruebas con las llamadas de voz, los resultados son buenos. Si se os ocurre algún tipo de prueba que pueda hacer gritad 😉
Gracias a la gente de Asterisk-ES y automatthias pude leer un script suyo que me ayudo mucho. Espero que os valga.
Warning: Use of undefined constant type - assumed 'type' (this will throw an Error in a future version of PHP) in /home/improvisa_com/web/improvisa.com/public_html/wp-content/themes/grassland/comments.php on line 38
Antes que nada gracias Juanmi por responder tan pronto pues te comento que soy nuevo en esto de linux, hace poco implementé htb-gen para mi red y alguna vez escuché algo de dar prioridad a los paquetes de voz, espero poderme explicar tengo un servidor centos 5.0, 512 kbps simétricos, tengo un rango de ips desde la 192.168.0.1 hasta 192.168.0.21 para navegar en internet y a la ip 192.168.0.33 tengo un linksys pap2 para las llamadas, cuando alguien hace llamadas aplico la segmentación con el htb-gen y cuando alguien termina le quito la segmentación para que todo el ancho de banda sea usado para mi lan interna, estoy buscando para crear subredes y de esa forma ser un poco mas ordenado, ahora tengo algunas interrogantes:
Desde ya muchas gracias por el tiempo que se dignen dar a estas inquietudes.
saludos
Fhernando
Hola Fhernando, como va eso? Lo primero bienvenido a Improvisa, un placer ayudarte.
La forma en la que lo haces ahora mismo es un poco extraña, o no te has explicado bien.
Necesitaría
saber como sales a internet, hablas de la conexion pero no hablas de si
tienes un router en monopuesto (solo funciona como modem) o en
multipuesto (haces nat) o lo tienes en una dmz (hace un nat entero a
una ip interna).
Para poder utilizar el script es necesario tener
el router con el centos, es decir una tarjeta de red para la local y
otra tarjeta de red para internet, de esa forma todos los ususarios de
tu red tendrán configurado como puerta de enlace el centos.
Dónde instalo el script que has puesto mas arriba y cómo lo ejecuto?,
se que esto es molestoso en especial para los que ya tienen
conocimientos, pero los que estamos empezando es bien dificil por eso
de antemano pido mil disculpas.
Tienes
que instalarlo en el centos donde tendras las dos tarjetas de red, los
valores a configurar son los de la tarjeta de internet. Para instalarlo
lo creas por ejemplo en /usr/bin/local/qos y le das permisos de ejecucion con chmod a x /usr/bin/local/qos una vez hecho esto solo tienes que llamarlo de esta forma qos eth2 start, donde eth2 es la tarjeta que te da acceso a internet. Si tienes alguna pregunta de como hacer el router en tu centos pregunta.
Cuando terminan de hacer las llamadas es necesario parar la prioridad
de voz o no afecta en nada con la navegación y cómo lo hago?.
No,
eso es lo bueno del script, si no se están realizando llamadas, los
paquetes fluyen con el máximo ancho de banda existente en tu red, los
512 simetricos. Si en mitad de una transferencia, por ejemplo una
descarga del cd de centos, alguien realiza una llamada, en la cola de
salida de paquetes se pondran primero los de la llamada, o los que
tengas configurados en la cola 1:2, máxima prioridad y los de la
descarga se marcharan a la cola 1:4. Segun tengas configurado los
paquetes se situaran en una u otra posicion dentro de la cola de
salida.
Es decir el script no influirá en tu navegación, no
notarás nada en tu navegacion pero si en tus llamadas ya que has
eliminado de un plumazo toda la latencia y algún que otro corte de voz.
Este script de alguna forma ayuda a mejorar el sonido cuando hacen
videoconferencia por messenger, skype o cualquier otro programa de
mensajería instantánea, o es solo para llamadas internacionales.
Claro
que ayuda, lo soluciona siempre y cuando tengas el ancho de banda
suficiente para realizar la llamada, calcula que para el codec g729
necesitarás 75 kb de las de tu red, es decir por mucho que le pidas al
script no podras realizar 10 llamadas.
Sobre los que va a una
cola u otra lo defines en el propio script, es decir que si quieres que
lo primero que salga en tu red es el emule, es tan simple como
agregarlo a la cola 1:2, pero normalmente eso no se hace, en la cola
1:2 se ponen los paquetes que necesitan ir en tiempo real, es decir
Voip, videoconferencia. Para poner el skype es tan facil como saber
porque puerto va la voz de skype (con netstat en medio de una llamada
podras) y simplemente lo añades en la confiuración del scrip, de esa
forma todos los paquetes dirigidos al puerto de voz de skype pasaran a
la cola 1:2, la de baja latencia o máxima prioridad.
Saludos y bienvenido de nuevo 🙂
Hola Juanmi
muy intereaante el post, te cuento que lo instale un un server con fedora y funciona ok, lo unico que no he lograda hacer es monitorear el trafico con el tc-viewer, descargue el scrip y uno de configuracion que encontre en la web ya que el enlace del tuyo no funciona, pero me ha sido imposible hacerlo funcionar, no me muestra ningun trafico esta es la salida en pantalla
vie oct 2 13:56:54 2009
Mode: HTB ^C to Quit
No transfers……
alguna idea..
saludos
Hola German, bienvenido, gracias por avisar, efectivamente los links no funcionaban, ya los he arregaldo, te dejo la configuracion de mi tc-viewer aqui escrita ;-):
improvisa:~# vi /etc/tc-viewer/tc-viewer.conf
show only X leaf classes; default show all classes
#$top = "";
# how many refreshes before exit; default no auto quit
#$counter = "";
# delay between checking speeds in seconds; default 2
#$timer = "2";
# sort leaf classes by speed (0|1); default 0=no
#$sort = "0";
# show classes with 0 speed (0|1); default 0=no
$zero = "1";
# what type of classes we use (0|1); default 0=htb not hfsc
$hfsc = "1";
# what units to use when showing speeds (bit|kbit|B|kB); default bit
$unit = "kB";
# interface to list classes; must be specified here or as parameter in command line
# command line parameter overwrites this one
$iface = "eth2";
# enable colors (0|1); default 0=disabled
$colors="1";
#colors to use
#’RST’ – reset
#’RED’ – red
#’GRE’ – green
#’YEL’ – yellow
#’BLU’ – blue
#’PIN’ – pink
#’LBL’ – light blue
#’BRED’ – bold red
#’BGRE’ – bold green
#’BYEL’ – bold yellow
#’BBLU’ – bold blue
#’BPIN’ – bold pink
#’BLBL’ – bold light blue
#%color_set = (
# ‘Name’ => ‘GRE’, # class names/numbers color; default GRE
# ‘Speed’ => ‘RED’, # speeds color; default RED
# ‘Range’ => ‘YEL’, # speed range color; default YEL
# ‘Neutral’ => ‘BPIN’, # delimiters, settings names color; default BPIN
#);
# class names to use
%names = (
‘1:1’ => ‘Global’,
‘1:2’ => ‘Interactivo’,
‘1:3’ => ‘Baja Latencia’,
‘1:4’ => ‘Trafico Web’,
‘1:5’ => ‘Trafico Normal’,
‘1:6’ => ‘P2P’,
);
Saludos y espero volverte a ver aqui 😉
Buenas noches muchas gracias por responder y mil disculpas por la demora, en cuanto a mi salida por internet de la antena baja el cable a mi servidor linux que esta configurado con Centos la eth0 se conecta la antena y la eth1 sale al switch que se encarga de distribuir internet a mi lan interna.
Voy a poner en práctica lo que me explicas ahora ya me quedó un poco mas claro el panorama y pues ahi en la práctica va a tocar ver en que estoy fallando y de ser el caso solicitar ayuda.
Algo mas me gustaría pedir permiso para poder publicar el artículo sobre el script para dar prioridad a los paquetes de voz, de seguro mas de uno quedarán eternamente agradecidos aca en Ecuador .
Desde ya muchas gracias y les contaré como van las cosas, si en algo puedo ayudar y está en mis manos será un placer.
Exitos totales
Hola de nuevo Fhernando, me alegro de verte por aqui de nuevo, ya pensaba que no volvias :-, suele pasar, la gente viene pregunta y no vuelve.
Con las premisas que te he dado deberias intentarlo, seguro que te sale y si no, pues pregutna, encantado en ayudarte.
Sobre si puedes publicar el script, haz lo que quieras con el, pero si puedes cita a la página de donde lo has sacado 😉
Saludos.
Gracias mi estimado amigo Juanmi, pues con el permiso de todos uds les invito a que visiten la siguiente direcciòn web
http://ecuafree.wordpress.com/
Yo me pongo manos a la obra esta semana con el script y les comento como van las cosas.
Gracias y una excelente semana
Igualmente Fhernand, pasa una buena semana, y cuando tengas el link del script en la página mandanoslo y hacemos un feedback 😉 y suerte con el scripot aqui estamos para lo que necesites 😉
Saludos a todos, quería consultarte si este script se puede aplicar en un firewall ubuntu con iptables, el cual cuenta con una interfaz de red de 1 gbps. Osea la comunicación entre los asterisk y los softphones se hace en una LAN y a través de una sola interfaz de red, la cual cuenta con varias interfaces vlan (1 para sopfhones y otra para servidores asterisk). En este caso todo lo que es voip no se va a internet sino que pasa de una vlan a otra. Espero haberme explicado muchas gracias.
Hola aaronsthioul, bienvenido a Improvisa.
El
script está orientado a una sola tarjeta, yo creo distintos scripts
para las distintas tarjetas que tengo, ya sean virtuales o físicas.Es
decir la respuesta a tu pregunta es si, puedes aplicarlo a las vlans que
quierasy a los puertos que quieras ya sean de source o destination (observa en el script la nomenclatura para definir el puerto).
Yo tengo 4 tarjetas físicas en mi router y en cada una de ellas tengo un script el cual llamo desde el script donde genero el firewall con iptables, algo así como:
qos_eth1.sh eth1 start
qos_eth2.sh eth2 start
qos_eth3.sh eth2 start
Y de esa forma creo que lo puertos según me convenga.
Espero haberte ayudado 😉
Gracias Juanmi por la minidocumentacion del HSFC en tu script, la info base no habla mucho al respecto =)
Muchas gracias por tu ayuda Juanmi y disculpa por responderte tan tarde
Ejecute el script con distintos nombres y para distintas interfaces vlan
pero me arroja un mensaje que dice "la cadena ya esta creada" cuando ejecuto el script para otra interfaz vlan.
Por ultimo si tengo una tarjeta de red de mi firewall de 1 gbps cuales serian mis valores de bajada y subida osea tengo
interfaz vlan101
interfaz vlan102
en la misma tarjeta de red de 1 gbps.
espero haber sido claro gracias de nuevo. Saludos Aarón.
Efectivamente te dira que existen un par de reglas creadas ya que las volvemos a añadir, pero no tienen inportancia, son las de definicion de la nueva cadena QOS:
iptables -t mangle -N QOS
Sobre las velocidades no te bases en lo que tiene tu tarjeta sino donde tengas el enbudo, es decir el menor ancho de banda, si por ejemplo lo vas a utilizar contra internet, debes saber a que velocidad va tu conexión, yo ejecuto este test de velocidad:
http://www.testdevelocidad.es/
Si lo vas a utilizar en una conexión de area local intenta pasar archivos de un lado a otro y medir velocidades (wget te da tiempos) además puedes utilizar en tu linux alguna de estas aplicaciones:
nttcp o iperf
Saludos y espero haberte ayudado 😉
OK Juanmi muchas gracias por tu ayuda, me ha servido de mucho
Estoy en estos instantes probando el script, note que algunos paquetes
en la cola de baja latencia voip han sido "dropped" ¿esto es muy malo?
Gracias de nuevo.
Hola Juanmi te agradezco la ayuda me ha servido de mucho.
Solo me queda una duda, puedo utilizar el marcado de paquetes y al
mismo tiempo la definición de puertos.
Los paquetes que vienen del asterisk vienen marcados con el valor EF
Y los paquetes que vienen de los sofphones también, espero ser claro y una vez te agradezco la ayuda. Saludos Aarón.
Puedes poner las reglas que quieras en el iptables y encolar como quieras los paquetes, no hay problema.
Saludos!
Saludos Amigo.
tengo un Canal de 4000 K. tengo aproximadamente 120 usuarios. En las horas de la noche se veulve relento mi canal. Veo su script como una solucion adecuada para lo que busco, ya que el trafico p2p y las descargas de megaupload y rapidshare me estan volviendo loco el canal.
Queria preguntar si el canal se reparte equitativamente entre todos los usuarios que lo esten usando apesar que alguno de ellos haya iniciado a hacer las descargas antes que los otros usuarios?
Saludos amigo
Te dejo Mis inquietudes
1. el trafico de p2p que lo encapsulan por el puerto 80 se puede controlar o como se limita?.
2. Por Ejemplo Juanitoe sta descargando archivos normales, y pepito descarga archivos de p2p encapsulados. Compartiran de igual manera el canal, el que haya tomado el canla primero lo consumira todo?
3. La cola 6 deberia tener consumo pero siempre esta en cero. Estoy haciendo algo mal o sera que todo el trafico p2p lo estan mandando por puerto80. Para probar instale Ares con las configuracion por defecto y lastimosamente todo el trafico se esta llendo porla cola de trafico normal.
4. Todo el trafico no catalogado va a una cola especial?
Hola tarapuez, pues efectivamente la velocidad de descarga se reparte equitativamente entre todos los usuarios que están utilizando ese canal en ese momento, siempre hay tiempos de desajustes pero lo normal es que se reparta entre todos.
Lo que te hace el script es guardar una pizca de ancho de banda para que el tráfico interactivo pueda serlo y aunque esos 120 usuarios ocupen todo el ancho de banda permitido, los paquetes de las colas interactivas salgan sin ningún problema.
Te cuento:
1.-) El script que hice en su día solo gestiona las colas por puertos, es decir no se diferencia si por el puerto 80 viaja P2P o trafico web, solo que viene por el puerto 80. Con Megaupload y vainas de estas tienes un problemilla ya que viaja por el 80, asi que tienes dos soluciones, o poner el puerto 80 como P2P, o configurar megaupload para que descargue en otro puerto, que sepas que esto último se puede hacer sin problemas con jdownloader y en tu cuenta de usuario de megaupload.
2.-) Juanitoe empezará a descargar y ocupará todo el canal mientras pueda, en el momento en el que pepito empieza su descarga p2p, el tráfico se reparte entre los dos, puedes modificar esto para quitarle ancho de banda al tráfico de la cola P2P, en el script actual todos pueden utilizar el máximo ancho de banda, siempre repartido equitativamente. Lo único que diferencia a Pepito y a Juanito es el tiempo de acceso al primer paquete y lo que le garantizamos de tráfico.
3.-) Depende de los puertos por los que salga tu tráfico P2P, vigila por que puertos sale con tcpdump o iptraf y luego añades esos puerto a la cola 6, verás como se te va por esa cola.
4.-) El tráfico no catalogado se va a la cola 5, fijate en el script que dice:
# Añadimos la qdisc raiz del tipo HFSC, el tráfico que no venga marcado se ira a la cola 5, por eso escribimos default 5
Ojala te ayude, cuentanos a ver que tal 😉
Viejo mil Gracias por la respuesta.
Te cuento que no he podido hacerlo trabajar.No se por que razon el trafico de VOIP nunca se ve reflejado en la cola que tengo dispuesto para ello.
Mi escenario es el sgte :
Asterisk – Fw linux – internet – Fw linux – red interna – ata pap2
Tengo una vpn con openvpn . pero lastimosamente el trafico de del asterisk y del ata pap2 nunca pasa por lacola. Tengo corriendo el Qos en ambos firewall
Gracias por toda tu ayuda.
Hola de nuevo, mi escenario es parecido y creo que olvidas una cosa 😉
El tráfico VoIP va encapsulado en el tráfico VPN, es decir tu tráfico VoIP no es el de los puertos normales, es de los puertos de tu VPN, es decir por el firewall no atraviesa nada por los puertos sip 5060 ni por los del voz 10000:20000, va todo por el puerto de tu vpn.
Cuentanos a ver que ha pasado 😉
Hola Juan
Muchas gracias por tus buenas intenciones
Te cuento que se me habia pasado ese dato y otro adicional. Mira que los usaurios se conectan por vpn de una sede a la otra . La vpn es con openvpn y la comunicacion al programa contable de la otra sede la hace usando SSH(putty). El canal es de mas o menos de un 1 Megabyte. (2gb con reuso). Son mas o menos unos 10 usuarios conectados por ssh a la aplicacion. me imgino que esto intefiere poor lo del ack. Se le podria dar prioridad de alguna manera a la llmada de VOIP?
Si todo el tráfico pasa por la VPN, es decir las descargas el programa contable y la VoIP, puedes hacer dos cosaso poner el QOS antes de encapsular el tráfico por la VPN o pasar el trafico VoIP por otra VPN, por ejemplo con vtun de esa forma ya puedes filtrar por puerto.
Un saludo!
Gracias Juan por insistir..
Pregunta como se pone el qos antes de encapsualr el trafico?
Nucna he revisado vtun pero ya mismo me pongo a btrabjar en ello. Cual de las opciones me recoemindas mas?
Para encapsular el tráfico antes del tunel este debería ser marcado antes de entrar en el tunel, es decir existe un debian actuando como router entre el tunel y tu red, otra máquina vamos y en esa máquina es donde plantas QOS, la siguiente máquina la que realiza el tunel ya le da igual como llegue, lo hará por el orden que le vayan llegando.
Vtun es mucho más fácil de configurar que OpenVPN, con lo cual te aconsejo la opción de vtun.
¡Saludos!
Hola Juan..ya tengo andandon vtun.
IPSVOIP no deberia poner nada?
En la configuracion del script modifico y queda asi
# Puertos utilizar en la cola de Baja latencia o 1:3
PUERTOSBAJALATENCIA="5000-tcp-sd"
Para compartir la conexion a internet lo hago asi:
iptables -t nat -A POSTROUTING -o eth2 -j SNAT –to-source XX.XX.XX.XX
Con la vpn andando ya deberia ver trafico por la cola 3?
Sigo sin ver trafico en la cola 3 🙁
Saludos Juan,
Muchas gracias por tu ayuda. Ya el vtun quedo establecido y funcionado ok. Ya puedo monitorear el trafico que pasa por la cola 3 y tengo en PUERTOSBAJALATENCIA="5000-tcp-sd" qeu es el trafico del vtun.
Debo esperar a mañana para ver como se comporta el canal y como veo la comunicacion.
Tengo Dos preguntas finales
1 Yo normalmente comparto el canal de internet con masquerade pero tengo entendido que si voy a usar Qos no puedo hacerlo asi y debo usar SNAT. Es esto cierto?
2. Puedo colocar a la vpn que tengo con Openvpn en PUERTOSBAJAPRIORIDAD (recuerdas que la aplicacion contable es atraves de ssh, o que deberia hacer para que caundo no hayan comunicaciones de voz el trafico de estas aplicaciones sea bueno, pero cuando se levante una llamada la calidad de la vos sea buena.)?
De antemano Juan Muchas Gracias por toda tu ayuda, la verdad no hubiese sido capaz de hacerlo sin tu valiosa colaboracion. Un saludo desde Colombia y me pongo a tu disposicion para cualquier cosa que necesites.
Hola Juan.
Te cuento que el dia de hoy pude hacer pruebas con trafico. SI coloco las comunicaciones de PUERTOSBAJALATENCIA="5000-tcp-sd" La comunicacion no es buena pero si coloco PUERTOSINTERACTIVOS="5000-tcp-sd" (el puerto de vtun es el 5000) la calidad de voz mejora mucho.
Voys a seguir afinando mi script y te contare los resultados.
Pues a la primera pregunta no te puedo contestar con seguridad, lo que si te puedo decir es que yo hago SNAT, no se si es cierto que con masquerade no funciona 🙁
A la segunda pregunta es lo que te contaba, la calidad de la voz debe estar en una cola rápida para que no existan delays en las comunicaciones. Por lo demás si colocas en la misma cola las conexiones ssh y estas llevan mucho tráfico, las calidad de la voz va a disminuir, colocalo en una cola algo más lenta. Recuerda que cundo digo lenta o rápida es a la hora de responder los primeros paquetes, si en la linea no hay tráfico todos los paquetes, da igual en la cola que estén, saldrán igual de rápidos. La calidad de servicio se aplica cuando existe mucho tráfico y lo que hacemos es ordenar su salida 😉
Un placer estar ayudandote 😉
Perfecto, lo mejor es hacer pruebas para dejar listo el script, me alegro que te esté funcionando 😉
Cuéntanos que tal te quedó al final.