Opciones para la gestión del ancho de banda en una conexión a internet compartida

13

La premisa:

Ubicación rural, no hay muchas opciones para conexiones a Internet de gran ancho de banda. El más rápido es Internet satelital, pero es costoso (tanto el equipo como el costo mensual, y tiene inconvenientes de latencia), por lo que a varios hogares les gustaría compartirlo.

Esto es sencillo en sí mismo: configure un enrutador con una subred para cada hogar (VLAN o puertos físicos), bloquee el tráfico entre ellos y configure el módem para enrutar a esas subredes o configure NAT doble.

El problema:

La forma en que normalmente funciona TCP significa que cada conexión TCP obtendrá más o menos 1 / n del ancho de banda disponible, donde n es el número de conexiones. Entonces, si un hogar / usuario crea muchas conexiones, obtendrán una mayor parte de la conexión general. Esto no es particularmente justo: con un enlace saturado, cada hogar debería tener una participación igual. Por otro lado, cuando nadie más está usando la conexión, debería ser posible usar todo el ancho de banda.

Por ejemplo, supongamos que hay 4 hogares que comparten una conexión inactiva de 12Mbit / s. Si uno de ellos está descargando / transmitiendo / lo que sea, deberían poder usar los 12Mbit / s completos (o lo suficientemente cerca). Si 2 hogares están utilizando la conexión, deberían obtener 6 Mbit / s cada uno, independientemente de si un hogar está descargando 1 archivo y el otro 11. (sin ninguna administración de ancho de banda, cada archivo se descargaría aproximadamente a 1 Mbit / s en ese caso) 3 hogares obtener 4Mbit / s cada uno y así sucesivamente.

Lo que he resuelto hasta ahora:

La mejor ubicación para implementar una política como esta (para aguas abajo) sería en el otro extremo de la tubería estrecha, es decir, en el ISP. Obviamente, eso no es posible en este caso, por lo que sería bueno poder aproximarlo de alguna manera. ¿Pero cómo? ¿Hay enrutadores estándar que admitan algo como esto? ¿Puedo configurar un cuadro de Linux o BSD para hacerlo? No tiene que ser a prueba de balas: un servidor TCP que se comporta mal o un servicio UDP agresivo podría eludir cualquier cosa que pueda hacer al final, pero debería funcionar para el caso común de la mayoría del tráfico que consiste en una gran cantidad de RFC Conexiones TCP.

Para que quede claro, estoy no hablando de dar prioridad a aplicaciones específicas, pero el tráfico en vez agregada a / desde dispositivos Ethernet particulares o rangos de direcciones IP. Darle una prioridad más alta a cierto tráfico que a otro tráfico parece estar bien soportado, pero la situación es menos clara cuando se trata de asignar igualmente el ancho de banda a las clases de tráfico.

Hay una gran cantidad de información mal escrita / irreflexivamente regurgitada / de otra manera desinformada sobre la conformación del tráfico en la web. La documentación sobre el hardware del enrutador es terriblemente inespecífica, por lo que parece estar dando vueltas en círculos.

Según tengo entendido, la forma de hacer que TCP se comporte de esta manera es, en efecto, simular una tubería un poco más estrecha de la que realmente está disponible y descartar artificialmente los paquetes para que retroceda. Así que creo que sería bastante sencillo darles a todos exactamente 3Mbit / s en el ejemplo anterior al descartar artificialmente cualquier paquete adicional. Esto realmente no usa la conexión de manera eficiente ya que la mayoría de las veces hay capacidad libre.

¿Hay alguna manera de hacer lo que te pido? ¿Estoy yendo mal? Estoy (o más bien los hogares en cuestión están) dispuestos a gastar dinero en esto, ya sea un enrutador / dispositivo comercial de precio moderado o una caja genérica para ejecutar una distribución Linux o BSD.

pmdj
fuente

Respuestas:

4

Si tuviera que construir algo para resolver este problema, configuraría esto:

Aquí vamos a tomar su ejemplo de 4 computadoras que comparten un enlace. La red tendría la siguiente forma:

{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops

Digamos que usa direccionamiento IP estático en LAN2:

Linux Box 192.168.1.1
Home 1    192.168.1.11
Home 2    192.168.1.12
Home 3    192.168.1.13
Home 4    192.168.1.14

Primero escribiría un pequeño script para detectar qué clientes están activos haciendo ping y escribiendo el resultado en alguna parte. "Esto se deja como un ejercicio para el lector" Calcular el número total de hosts conectados (1-4)

Asegúrese de manejar el caso de que no haya hosts en línea.

Divida el ancho de banda total pero el número de hosts conectados. (12Mb para 1, 6Mb para 2, 4Mb para 3, 3Mb para 4)

Luego use tc con el algoritmo HTB para limitar el ancho de banda de cada dirección en el dispositivo del lado WAN. Primero, cree la clase raíz:

DEV="eth0"
TC="/sbin/tc"
TOT_BW=12
$TC qdisc add dev $DEV root handle 1: htb default 99

Luego, agregue una clase para cada "cliente" (Aquí, por ejemplo, 3 clientes)

NB_CLT=3
CLT_BW=$(($TOT_BW/$NB_CLT))mbit
for i in seq $NB_CLT
do
    $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500
    $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \
     match ip dst 192.168.1.1$i/32 \
     match ip src [Router IP in LAN1]/32
done

(el script anterior no se ha probado y NO está libre de errores de escritura)

Ahora todavía tiene que escribir correctamente ese script para que se ejecute cada minuto y renovar cubos / filtros cada vez que un nuevo host sube o baja.

Espero que te oriente en la dirección correcta, buena suerte.

Solución alternativa

Instale un software QoS local en todos los hosts para restringir su ancho de banda. Yo personalmente uso NetLimiter (no libre)

mveroone
fuente
El problema con mi enfoque es que cada host reduce el ancho de banda del otro, incluso si no usan todo su recurso compartido. Pero diseñar algo que obliga a compartir solo cuando la demanda es alta ... es difícil.
mveroone
2

OpenWRT parece admitirlo, aunque nunca lo he usado yo mismo. Puede echar un vistazo a la página de Control de tráfico de red en su sitio web, y especialmente al segundo ejemplo: uso compartido de ancho de banda simple (también conocido como modelado de tráfico) con HTB . Esto implica llamadas simples a qdisc, por lo que cualquier caja de Linux podría hacerlo.

usuario2313067
fuente
Noté que ese ejemplo es para el lado de carga . Actualmente estoy leyendo mi camino a través del COMO de control avanzado de enrutamiento y tráfico de Linux, que parece algo prometedor y espero que me permita entender todas estas tcreglas. El moderador de tráfico de Linux ciertamente parece prometedor.
pmdj
0

La configuración descrita en /superuser//a/1210164/257859 hace exactamente eso:

[...] las colas distribuyen ese BW limitado de manera uniforme entre todos los clientes LAN (IP de LAN para ser precisos).

ndemou
fuente
1
No publique la misma respuesta a varias preguntas. Si la misma información realmente responde ambas preguntas, entonces una pregunta (generalmente la más nueva) debería cerrarse como un duplicado de la otra. Puede indicar esto votando para cerrarlo como un duplicado o, si no tiene suficiente reputación para eso, levante una bandera para indicar que es un duplicado. De lo contrario, adapte su respuesta a esta pregunta y no solo pegue la misma respuesta en varios lugares.
DavidPostill
@DavidPostill Pensé en votar para cerrar como un duplicado, pero dudé porque esta es una pregunta de 3 años. Incluso busqué meta.superuser y encontré una pregunta relevante en meta.superuser.com/questions/3524/… . Después de leer el meta, creo que la situación es complicada (tengo una respuesta para dos preguntas antiguas con suficiente discusión en cada una) y dejar una respuesta breve de puntero parece al menos "no está mal". Aunque estoy abierto a escuchar tus pensamientos.
ndemou