Si algunos de nuestros foros, manuales, ALDOS, paquetería o proyectos te han resultado de ayuda, apreciaremos mucho nos apoyes con un donativo.

Receta simple para gestión de ancho de banda con Shorewall.

Quienes utilicen Shorewall pueden realizar un control de ancho de banda relativamente simple, definiendo unas pocas líneas en tres archivos de configuración. A continuación doy una explicación rápida para lograr una configuración totalmente funcional para el control de ancho de banda, definiendo tres clases para prioridades.

Lo primero, a fin de verificar que Shorewall tiene habilitado el soporte, se debe editar el archivo /etc/shorewall/shorewall.conf y cerciorarse que la opción TC_ENABLED tenga el valor Internal:

TC_ENABLED=Internal

Para permitir el marcaje de paquetes, es importante también habilitar las siguientes opciones.

MARK_IN_FORWARD_CHAIN=Yes
FASTACCEPT=Yes
OPTIMIZE=1

El siguiente paso es editar el archivo /etc/shorewall/tcdevices y definir el dispositivo sobre el cual se quiere ejercer un control de ancho de banda. Se define el nombre del dispositivo a utilizar (eth0 o ppp0) y los límites de ancho de banda de entrada y salida. En el siguiente ejemplo, basado sobre un enlace ADSL típico de 2 Mbps de Prodigy Infinitum, se define a la interfaz eth0, con 2048 kbps de ancho de banda de entrada (bajada) y 385 kbps para el ancho de banda de salida (subida):

#INTERFACE	IN-BANDWITH	OUT-BANDWIDTH
eth0 2048kbps 384kbps
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Es importante tomar en cuenta que todos los paquetes que sobrepasen la cantidad definida serán descartados. Pueden definirse límites ligeramente superiores para evitar perder paquetes. Los límites de ancho de banda se pueden definir en kbps (kilobits por segundo) mbps (megabytes por segundo), kbit (kilobits por segundo) mbit (megabits por segundo) y bps (bits por segundo).

A continuación se definen las clases, que corresponden a las prioridades que se asignarán a cierto tipo de tráfico en el archivo /etc/shorewall/tcclasses. Se define el nombre de la interfaz, que debe corresponder con la definida en el archivo /etc/shorewall/tcdevices, la marca que se utilizará en la reglas que se configurarán posteriormente, los anchos de banda para el tráfico de entrada (bajada) y el tráfico de salida (subida), la prioridad que recibirán las clases al momento de repartir el ancho de banda y las opciones. En el siguiente ejemplo se definen las clases 1, 2 y 3, donde:

  • La clase con la marca 1 tendrá disponible hasta 5/10 (50%) del ancho de banda total disponible cuando se eleve el tráfico de red, tendrá disponible todo el ancho de banda cuando la red tenga poca o mínima actividad, será la clase con mayor prioridad (1) al momento de repartir el ancho de banda y utilizará las opciones tcp-ack (todos los paquetes de menos de 64 bytes entran esta clase) y tos-minimize-delay (ToS con mínima demora)

  • La clase con la marca 2 tendrá disponible hasta 3/10 (30%) del ancho de banda total disponible cuando se eleve el tráfico de red, tendrá disponible 9/10 (90%) del ancho de banda cuando la red tenga poca o mínima actividad, será la clase con segunda mayor prioridad (2) al momento de repartir el ancho de banda y utilizará las opción default (predeterminado) para indicar que será la clase predeterminada.

  • La clase con la marca 3 tendrá disponible hasta 2/10 (20%) del ancho de banda total disponible cuando se eleve el tráfico de red, tendrá disponible 8/10 (80%) del ancho de banda cuando la red tenga poca actividad y será la clase con menor prioridad (3) al momento de repartir el ancho de banda.

#INTERFACE	MARK	RATE		CEIL		PRIORITY	OPTIONS
eth0 1 full*5/10 full 1 tcp-ack,tos-minimize-delay
eth0 2 full*3/10 full*9/10 2 default
eth0 3 full*2/10 full*8/10 3
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Para los valores de RATE (límite del ancho de banda disponible cuando se eleve el tráfico de red) y CEIL (límite del ancho de banda cuando la red tenga poca o mínima actividad), se pueden definir los límites en unidades de kbps (kilobits por segundo) mbps (megabits por segundo), kbit (kilobits por segundo) mbit (megabits por segundo) y bps (bits por segundo) o bien en proporciones, como las que se muestras como ejemplo a continuación:

  • full/4 = 1/4 (25%) del ancho de banda disponible.

  • full/3 = 1/3 (33%) del ancho de banda disponible.

  • full/2 = 1/2 (50%) del ancho de banda disponible.

  • full*2/10 = 2/10 (20%) del ancho de banda disponible.

  • full*3/10 = 3/10 (30%) del ancho de banda disponible.

  • full*5/10 = 5/10 (50%) del ancho de banda disponible.

Lo que viene a continuación es definir las reglas en el archivo /etc/shorewall/tcrules. Básicamente se indica que ciertos servicios o redes o direcciones IP estarán sujetas a los límites de una clase en particular.

La sintaxis básica de una regla va del siguiente modo:

[marca de clase[:tipo de paquete]] [origen] [destino] [protocolo] [puertos de destino]

En donde:

  • marca de clase corresponde al número de marca de la clase definida en tcclasses. Opcionalmente se puede definir el tipo de paquete, que puede ser :F (FORWARD), :P (PRETROUTING) y :T (POSTROUTING). Para efectos prácticos y en la mayoría de los casos, :F (FORWARD) es la opción más adecuada, pues define el tipo de paquetes utilizados en un NAT.

  • origen corresponde a la red o dirección IP de origen a la cual se quiere aplicar la clase.

  • destino corresponde a la red o dirección IP de destino. Para fines prácticos, si se define 0.0.0.0/0, se estará definiendo todas las redes y direcciones IP.

  • protocolo se utiliza para definir si el protocolo de comunicación será TCP (tcp), UDP (udp) o ICMP (icmp).

  • puertos de destino se refiere a los nombres o números de los servicios que se desea controlar. Si se define all como valor, se estará refiriendo a todos los puertos disponibles.

En el siguiente ejemplo, se define que las peticiones icmp para echo-request y echo-reply (los pings), desde cualquier origen, hacia cualquier destino, se les aplicará la clase marcada como 1 como se definió en el archivo tcclasses, para todo el tráfico cuya cadena sea FORWARD:

#MARK   SOURCE          DEST            PROTO   DEST	SOURCE  USER    TEST    LENGTH  TOS
1:F 0.0.0.0/0 0.0.0.0/0 icmp echo-request
1:F 0.0.0.0/0 0.0.0.0/0 icmp echo-reply
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

En el siguiente ejemplo, se define que las peticiones tcp para el puerto 22 (conexiones por SSH), desde 192.168.1.0/24, hacia cualquier destino, se les aplicará la clase marcada como 1 como se definió en el archivo tcclasses, para todo el tráfico cuya cadena sea FORWARD:

#MARK   SOURCE          DEST            PROTO   DEST	SOURCE  USER    TEST    LENGTH  TOS
1:F 192.168.1.0/24 0.0.0.0/0 tcp 22
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

En el siguiente ejemplo, se define que las peticiones para todos los puertos, desde 192.168.1.253 y 192.168.1.252, hacia cualquier destino, se les aplicará la clase marcada como 1 como se definió en el archivo tcclasses, para todo el tráfico cuya cadena sea FORWARD:

1:F	192.168.1.253	0.0.0.0/0	all
1:F 192.168.1.252 0.0.0.0/0 all
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

En el siguiente ejemplo, se define que las peticiones para todos los puertos, desde 192.168.1.250 y 192.168.1.251, hacia cualquier destino, se les aplicará la clase marcada como 2 como se definió en el archivo tcclasses, para todo el tráfico cuya cadena sea FORWARD:

2:F	192.168.1.251	0.0.0.0/0	all
2:F 192.168.1.250 0.0.0.0/0 all
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

En el siguiente ejemplo, se define que las peticiones para todos los puertos, desde 192.168.1.0/24, hacia cualquier destino, se les aplicará la clase marcada como 3 como se definió en el archivo tcclasses, para todo el tráfico cuya cadena sea FORWARD:

3:F	192.168.1.0/24	0.0.0.0/0	all
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Combinando todo lo anterior, el archivo /etc/shorewall/tcrules quedaría de la siguiente forma:

#MARK   SOURCE          DEST            PROTO   DEST	SOURCE  USER    TEST    LENGTH  TOS
# PORT(S) PORT(S)
# Dar alta prioridad a los pings para fines diagnósticos
1:F 0.0.0.0/0 0.0.0.0/0 icmp echo-request
1:F 0.0.0.0/0 0.0.0.0/0 icmp echo-reply
# Dar alta prioridad a las conexiones por SSH
1:F 192.168.1.0/24 0.0.0.0/0 tcp 22
# Equipos con alta prioridad en el uso de ancho de banda
1:F 192.168.1.253 0.0.0.0/0 all
1:F 192.168.1.252 0.0.0.0/0 all
# Equipos con prioridad normal en el uso del ancho de banda
2:F 192.168.1.250 0.0.0.0/0 all
2:F 192.168.1.251 0.0.0.0/0 all
# Equipos con baja prioridad en el uso del ancho de banda
3:F 192.168.1.0/24 0.0.0.0/0 all
#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Para aplicar los cambios, que, por precaución, recomiendo realizar solamente de manera local, solo se requiere reiniciar el servicio shorewall.

service shorewall restart

Más detalles y explicación más detallada en Shorewall.net.


Atención: Salvo que se indique lo contrario, la licencia del texto de este documento es Creative Commons Reconocimiento 2.5, mediante la cual usted tiene permitido copiar, modificar, comunicar y distribuir el contenido de este texto, de manera total o parcial, y publicarlo o difundirlo en cualquier otro sitio de Internet o medio de comunicaciòn, siempre y cuando incluya o cite (1)el nombre de este sitio de Internet, (2)enlace permanente de este documento, (3)nombre del autor y (4)la misma licencia de distribución.

Opciones: Imprimir | Recomendar | Enlace permanente

Twitter Facebook Google Bookmarks Bitacoras.com Wikio Menéame Technorati Bloglines Digg Yahoo Buzz

Seguimientos (Trackback)

URL de seguimiento para esta entrada:
http://www.alcancelibre.org/trackback.php/receta-simple-ancho-banda-shorewall

[...] el servicio shorewall. service shorewall restart Más detalles y explicación más detallada en Shorewall.net.FuenteSHARETHIS.addEntry({ title: "Receta simple para gestión de ancho de banda con Shorewall", url: [...] [leer más]

  • Receta simple para gestión de ancho de banda con Shorewall.
  • 4comentarios
  • Crea cuenta nueva
Agregar comentario

Los siguientes comentarios son de la persona que los haya enviado. Este sitio se deslinda de cualquier responsabilidad respecto de las opiniones expresadas por los participantes en nuestros foros y secciones de comentarios, y el hecho de publicar las mismas no significa que se esté de acuerdo con éstas.

  • Una aclaración y una duda
  • Escrito por:Ivan el  19/12/2009, 18:43

Buenas,
me parece correcto hacer una aclaración sobre las clases definidas en tcclasses, todo este manejo de colas y prioridades se realiza siempre sobre el outgoing traffic de la interfaz definida.
Si bien es lo deseado generalmente en un entorno de servidor atendiendo a clientes, algún usuario final que lea este claro how-to podría pensar erróneamente que esta aplicando QoS sobre el inbound traffic (trafico que ingresa de Internet) y no es así.

Excelente link para entender un poco el operar: http://shorewall.net/traffic_shaping.htm

Particularmente en este link pueden ver un ejemplo de como hacer QoS del tráfico entrante: http://shorewall.net/traffic_shaping.htm#Downloads

En cuanto a la duda, tengo un FW con shorewall en un escenario bastante complejo con 3 ISPs y unas cuantas LANs internas, por esto estoy usando el mark para guiar el tráfico (tcrules). ¿Estas marks de QoS no generaría conflictos con las marks que empleo para el policy routing? ya que habría matcheo de ambas en muchos casos.

  • Receta simple para gestión de ancho de banda con Shorewall.
  • Escrito por:mamancana el  22/03/2011, 12:38

Buen dia, yo estoy tratando de implementar este proceso la gestionar el ancho de banda en mi empresa, mi pregunta es si en esto influye la version del shorewall.  yo estoy usando la version shorewall-4.4.1-1

espero su ayuda gracias

  • Receta simple para gestión de ancho de banda con Shorewall.
  • Escrito por:Joel Barrios Dueñas el  22/03/2011, 16:58

No. No influye. Funciona igual en cualquier versión de Shorewall que sea superior a la 3.0.

---
--
Joel Barrios Dueñas.
Director General Alcance Libre
http://www.AlcanceLibre.org/
La libertad del conocimiento al alcance de quien la busca.

  • Receta simple para gestión de ancho de banda con Shorewall.
  • Escrito por:carlosgonzalca el  18/05/2011, 05:03

Muy buen aporte sobre tc en shorewall, sin embargo respetuosamente solicito se verifique las unidades en el archivo tcdevices ya que según la documentación si tengo un canal de 2Mbps (mega bits por segundo) en Download debería colocar el parámetro 2000Kbit y no 2000Kbps, por que Kbps es Kilobytes por segundo y en un canal seria la tasa de transferencia de 250 Kbytes/segundo. y Tambien tener mayor claridad sobre los archivos que se manejan.