Bienvenido(a) a Alcance Libre 05/09/2025, 19:48
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.
Esto es lo que otros tienen que decir acerca de 'Receta simple para gestión de ancho de banda con 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]
Los siguientes comentarios son de la persona que los haya enviado. Este sitio no se hace responsable de las opiniones expresadas por los participantes en los foros y secciones de comentarios, y el hecho de publicar las mismas no significa que esté de acuerdo con ellas.
Comments are closed and no new posts are allowed.
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.
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
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.
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.