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 ficheros 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 fichero /etc/shorewall/shorewall.conf, y cerciorarse que la opción TC_ENABLED tenga el valor Internal:

TC_ENABLED=Internal

El siguiente paso es editar el fichero /etc/shorewall/rules y definir el dispositivo sobre el cual se quiere ejercer un control de ancho de banda. Se define el no,bre 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	384kpbs
#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 kpbs (kilobytes por segundo) mbps (megabytes por segundo), kbit (kilobits por segundo) mbit (megabits por segundo) y bps (baudios 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 fichero /etc/shorewall/tcclasses. Se define el nombre de la interfaz, que debe corresponder con la definida en el fichero /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 kpbs (kilobytes por segundo) mbps (megabytes por segundo), kbit (kilobits por segundo) mbit (megabits por segundo) y bps (baudios por segundo), o bien en proporciones, como las que se muestras como ejemplo a continuación:

  • full/4 = 1/3 (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 fichero /etc/shorewall/rules. 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), 😛 (PRETROUTING) y :T (POSTROUTING). Para efectos prácticos, y en la mayoría de los casos, :F (POSTROUTING) 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 fichero 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 fichero 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 fichero 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 fichero 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 fichero 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 fichero /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.

Fuente

Dejar un comentario?

1 Comentarios.

  1. Saludos!!!

    Excelente aporte… una pregunta, este control lo está haciendo en la parte de download o upload de la conexión???

    En caso de querer controlar por ip de cada cliente para que no se sature el ancho de banda y no por servicio?

    Bye!!!

Deje un comentario


NOTA - Puede usar estosHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Translate »