QOS para VoIP con HFSC

Improvisa :: Informática :: QOS para VoIP con HFSCDebido 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 prio­rizar el tráfico VoIP sobre otro tipo de paquetes.

Improvisa :: Informática :: QOS para VoIP con HFSCPara 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.
­

­

Comentarios

    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
  • nandopv dice:

    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:

     

    • 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. 
    •  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?.
    • 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.

    Desde ya muchas gracias por el tiempo que se dignen dar a estas inquietudes.

     

    saludos

     

    Fhernando

  • Juanmi dice:

    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 🙂

  • germanrm dice:

    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

  • Juanmi dice:

    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 😉

  • nandopv dice:

    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

  • Juanmi dice:

    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.

  • nandopv dice:

    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

     

     

  • Juanmi dice:

    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 😉

     

  • aaronsthioul dice:

    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.

  • Juanmi dice:

    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
    quieras
    y 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 😉

  • hannibal2012 dice:

    Gracias Juanmi por la minidocumentacion del HSFC en tu script, la info base no habla mucho al respecto =)

  • aaronsthioul dice:

    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.

  • Juanmi dice:

    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 😉

  • aaronsthioul dice:

    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.

  • aaronsthioul dice:

    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.

  • Juanmi dice:

    Puedes poner las reglas que quieras en el iptables y encolar como quieras los paquetes, no hay problema.

    Saludos!

  • tarapuez dice:

    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?

  • tarapuez dice:

    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?

  • Juanmi dice:

    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.

  • Juanmi dice:

    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 😉

  • tarapuez dice:

    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.

  • Juanmi dice:

    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 😉

  • tarapuez dice:

    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?

  • Juanmi dice:

    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!

  • tarapuez dice:

    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?

  • Juanmi dice:

    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!

  • tarapuez dice:

    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? 

     

  • tarapuez dice:

    Sigo sin ver trafico en la cola 3 🙁

     

  • tarapuez dice:

    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.

  • tarapuez dice:

    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.

  • Juanmi dice:

    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 😉

     

  • Juanmi dice:

    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.