VoIP y QoS · 5 min read · Jan 22, 2026
QoS Y Modelado De Tráfico Para Usuarios De VoIP Usando iproute2 Y Asterisk
QoS Y Modelado De Tráfico Para Usuarios De VoIP Usando iproute2 Y Asterisk
La calidad de mis llamadas telefónicas VoIP sufría cada vez que estaba descargando o subiendo algo. Esto era irritante, especialmente para aquellos que me llamaban (los escuchaba mejor de lo que ellos me escuchaban a mí). Así que investigué Iproute2 y otros tutoriales, especialmente en lo que respecta al tráfico de VoIP, pero no pude encontrar nada que funcionara bien. Después de experimentar un poco, encontré configuraciones que eran adecuadas para mí: calidad de VoIP consistente, independientemente de cualquier actividad en la red.
Una nota sobre mi sistema VoIP: estoy usando Asterisk en una laptop de repuesto (IBM T20), y mi proveedor de VoIP es el excelente Unlimitel, en Canadá. Dado que alojo mi propia caja de Asterisk, puedo configurarla para hacer lo que quiera. También compré un teléfono duro IAX que reside en mi intranet.
Configuración
Asumo que ya tienes tu firewall de Linux en su lugar. Los paquetes de VoIP atraviesan tu firewall y tu NAT ya está configurado y funcionando. Ni siquiera tocaremos tu firewall con esta configuración. Todo lo que necesitas hacer es crear el qdisc, clases y filtros adecuados para priorizar tus paquetes de VoIP. El comando tc de Iproute2 está aquí para eso.
Supongamos que tu red es así:
Internet <------> Módem por cable <-------> Firewall de Linux <-----> Intranet <-----> Teléfono VoIPDado que estoy usando Asterisk con IAX, el puerto de interés es el puerto 4569. Si estás usando SIP, adapta el puerto en las siguientes líneas.
Alguna Información de Fondo
Los paquetes IP tienen un área donde puedes preestablecer QoS (calidad de servicio). Aunque tu ISP probablemente los ignorará, puedes utilizarlos en tu red local para algún modelado de tráfico. Los 4 bits de QoS son:
0x02: Minimizar Costo Monetario
0x04: Maximizar Fiabilidad
0x08: Maximizar Rendimiento
0x10: Minimizar Retraso
Oficialmente, se te permite activar como máximo uno de esos bits. Tu firewall puede entonces mirar los paquetes a medida que llegan y determinar cuáles enviar primero, generalmente Minimizar Retraso.
Oficialmente, puedes activar cualquiera de esos bits a la vez. Así que podrías tener un paquete con ambos Minimizar Retraso y Maximizar Rendimiento. Con esto en mente, veamos algunas de las características de Iproute2.
Iproute2 Y tc
Por defecto, los paquetes se envían Primero en Entrar, Primero en Salir. Con tc, puedes alterar eso drásticamente. Vamos a usar un sistema de colas muy simple: tengamos 3 “tuberías” (o colas) y asignémosles una prioridad. Es decir, mientras haya algo en la cola 1, no vaciamos (o desencolamos) la cola 2, y mientras haya algo en la cola 2, no desencolamos la cola 3.
Esto se hace con el siguiente comando (nota: eth1 es la interfaz externa):
tc qdisc add dev eth1 root handle 1: prio priomap 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 0Los 16 valores para priomap son importantes. Básicamente dice que la mayoría de los paquetes terminan en la 3ª cola (dado que comenzamos en cero, se llama “2”), excepto los paquetes con QoS Minimizar-Retraso, que se colocan en la 2ª cola, excepto los paquetes con todos los bits de QoS activados, que se colocan en la 1ª cola. (la disciplina de colas prio establece 3 colas por defecto)
Los 16 valores están en orden para el siguiente QoS:
1: 0x00: no se establece QoS -> a la 3ª cola (2)
2: 0x02: Minimizar Costo Monetario (MMC) (2)
3: 0x04: Maximizar Fiabilidad (MR) (2)
4: 0x06: MMC + MR (2)
5: 0x08: Maximizar Rendimiento (MT) (2)
6: 0x0a: MT + MMC (2)
7: 0x0c: MT + MR (2)
8: 0x0e: MT + MR + MMC (2)
9: 0x10: Minimizar Retraso (MD) (1)
10: 0x12: MD + MMC (1)
11: 0x14: MD + MR (1)
12: 0x16: MD + MMC + MR (1)
13: 0x18: MD + MT (1)
14: 0x1a: MD + MT + MMC (1)
15: 0x1c: MD + MT + MR (1)
16: 0x1e: MD + MT + MR + MMC (0)
Ese fue nuestro primer paso.
A continuación, ajustaremos cada cola para que ellas mismas tengan alguna disciplina de colas:
tc qdisc add dev eth1 parent 1:1 handle 10: sfq limit 3000tc qdisc add dev eth1 parent 1:2 handle 20: sfqtc qdisc add dev eth1 parent 1:3 handle 30: sfqEsto le da a la primera cola una capacidad supuesta de 3000 paquetes. En realidad, el tamaño será de 128 paquetes ya que está codificado en el programa tc como el tamaño máximo posible.
En este punto, la mayoría de los paquetes pasarán por la 3ª cola, excepto aquellos con el bit de QoS Minimizar-Retraso activado.
Si ajustas tu iax.conf en tu caja de Asterisk para decir lo siguiente, algunos paquetes pueden terminar en la primera cola:
tos=0x1e
Sin embargo, dado que esto no es una garantía, forzaremos a que vayan a la cola 1 usando otro truco en la manga de tc, filtros.
Recuerda, IAX usa el puerto 4569, así que forzaremos a que cualquier paquete hacia y desde este puerto pase por la primera cola:
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 4569 0xffff flowid 1:1tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 4569 0xffff flowid 1:1tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip tos 0x10 0xff flowid 1:2Técnicamente, la última línea no es necesaria, pero no está de más dejarla.
¡Y ahora, has terminado! Todos tus paquetes de VoIP se desencolan primero y ante todo. Incluso durante una descarga o subida pesada, no perderás interactividad para tus llamadas telefónicas.
Para ver algunas estadísticas, ejecuta el siguiente comando:
tc -s qdisc ls dev eth1Para eliminar tus colas y volver al estado normal, ejecuta:
tc qdisc del dev eth1 rootAhora depende de ti ejecutar automáticamente los comandos apropiados al inicio.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.