Opções para gerenciamento de largura de banda em uma conexão compartilhada com a Internet

13

A premissa:

Localização rural, poucas opções para conexões à Internet de alta largura de banda. De longe, a mais rápida é a Internet via satélite, mas é cara (tanto o equipamento quanto o custo mensal, e possui desvantagens de latência), portanto, várias famílias gostariam de compartilhá-la.

Isso é simples por si só - configure um roteador com uma sub-rede para cada família (VLANs ou portas físicas), bloqueie o tráfego entre elas e configure o modem para rotear para essas sub-redes ou configure o NAT duplo.

O problema:

A maneira como o TCP normalmente funciona significa que cada conexão TCP obterá mais ou menos 1 / n da largura de banda disponível, onde n é o número de conexões. Portanto, se um agregado familiar / usuário criar muitas conexões, ele terá uma parcela maior da conexão geral. Isso não é particularmente justo - com um link saturado, cada família deve receber uma parcela igual. Por outro lado, quando ninguém mais estiver usando a conexão, deve ser possível usar a largura de banda completa.

Por exemplo, digamos que há 4 famílias compartilhando uma conexão inativa de 12Mbit / s. Se um deles estiver baixando / transmitindo / seja o que for, eles deverão poder usar os 12Mbit / s completos (ou o suficiente). Se duas famílias estiverem usando a conexão, elas deverão obter 6Mbit / s cada, independentemente de uma família estar baixando 1 arquivo e a outra 11. (sem qualquer gerenciamento de largura de banda, cada arquivo baixaria aproximadamente 1Mbit / s nesse caso) 3 famílias obtenha 4Mbit / s cada e assim por diante.

O que eu descobri até agora:

O melhor local para implementar uma política como essa (para a jusante) seria na outra extremidade do canal estreito, ou seja, no ISP. Obviamente, isso não é possível neste caso, por isso seria bom poder aproximar-se de alguma forma. Mas como? Existem roteadores disponíveis no mercado que suportam algo assim? Posso configurar uma caixa Linux ou BSD para fazer isso? Ele não precisa ser à prova de balas - um servidor TCP que se comporte mal ou um serviço UDP agressivo poderia provavelmente contornar qualquer coisa que eu possa fazer no meu final - mas deve funcionar no caso comum da maior parte do tráfego que consiste em muitos padrões compatíveis com RFC Conexões TCP.

Para ser claro, eu estou não falar sobre priorizando aplicações específicas, mas o tráfego em vez de agregação de / para determinados dispositivos Ethernet ou intervalos de endereços IP. Dar a um tráfego uma prioridade mais alta do que outro tráfego parece ser bem suportado, mas a situação é menos clara ao tentar alocar igualmente a largura de banda para as classes de tráfego.

Há muitas informações mal escritas / irremediavelmente regurgitadas / desinformadas sobre modelagem de tráfego na Web. A documentação sobre o hardware do roteador é terrivelmente inespecífica, então eu pareço estar circulando em círculos.

Pelo que entendi, a maneira de fazer com que o TCP se comporte dessa maneira é simular um canal um pouco mais estreito do que o realmente disponível e soltar pacotes artificialmente para fazê-lo recuar. Então, acho que seria bastante simples fornecer a todos exatamente 3Mbit / s no exemplo acima, eliminando artificialmente quaisquer pacotes extras. Isso realmente não usa a conexão de maneira eficiente, pois na maioria das vezes há capacidade disponível.

Existe uma maneira de fazer o que estou pedindo? Estou fazendo errado? Estou (ou melhor, as famílias em questão estão) dispostas a gastar dinheiro com isso - seja um roteador / dispositivo de prateleira com preço moderado ou uma caixa genérica para executar uma distribuição Linux ou BSD.

pmdj
fonte

Respostas:

4

Se eu fosse criar algo para resolver esse problema, eu configuraria isso:

Aqui vamos dar o seu exemplo de 4 computadores compartilhando um link. A rede teria a seguinte forma:

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

Digamos que você use endereçamento IP estático na 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

Primeiro, eu escreveria um pequeno script para detectar quais clientes estão executando o ping e a gravação do resultado em algum lugar. "Isso é deixado como um exercício para o leitor" Calcule o número total de hosts conectados (1-4)

Certifique-se de lidar com o caso de nenhum host online.

Divida a largura de banda total, mas o número de hosts conectados. (12Mb para 1, 6Mb para 2, 4Mb para 3, 3Mb para 4)

Em seguida, use tc com o algoritmo HTB para limitar a largura de banda de cada endereço no dispositivo do lado da WAN. Primeiro, crie a classe raiz:

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

Em seguida, adicione uma classe para cada "cliente" (aqui, por exemplo, 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

(o script acima é totalmente não testado e NÃO digita sem erros)

Agora você ainda precisa criar um script adequado para ser executado a cada minuto e renovar os buckets / filtros toda vez que um novo host for ativado ou desativado.

Espero que você aponte a direção certa, boa sorte.

Solução alternativa

Instale um software de QoS local em todos os hosts para restringir sua largura de banda. Pessoalmente, uso o NetLimiter (não gratuito)

mveroone
fonte
O problema com minha abordagem é que cada host reduz a largura de banda do outro, mesmo que não use toda a sua parte. Mas projetar algo que reforça o compartilhamento somente quando a demanda é alta ... é difícil.
mveroone
2

O OpenWRT parece suportá-lo, embora eu nunca o tenha usado. Você pode dar uma olhada na página Controle de tráfego de rede no site deles, e especialmente no segundo exemplo: compartilhamento de largura de banda simples (também conhecido como modelagem de tráfego) com HTB . Isso envolve chamadas simples para o qdisc, para que qualquer caixa do Linux possa fazer isso.

user2313067
fonte
Percebo que esse exemplo é para o lado do upload . Atualmente, estou lendo o meu HOWTO do Linux Advanced Routing & Traffic Control HOWTO, que parece um tanto promissor e espero que me permita entender todas essas tcregras. O modelador de tráfego do Linux certamente parece promissor.
Pmdj 23/07
0

A configuração descrita em /superuser//a/1210164/257859 faz exatamente isso:

[...] as filas distribuem esse BW limitado igualmente entre todos os clientes da LAN (IPs da LAN para ser preciso).

ndemou
fonte
1
Não poste a mesma resposta em várias perguntas. Se a mesma informação realmente responder a ambas as perguntas, uma pergunta (geralmente a mais recente) deve ser fechada como uma duplicata da outra. Você pode indicar isso votando para fechá-lo como duplicado ou, se você não tiver reputação suficiente para isso, levante uma bandeira para indicar que é uma duplicata. Caso contrário, adapte sua resposta a esta pergunta e não cole a mesma em vários lugares.
DavidPostill
@ DavidPostill Pensei em votar para fechar como duplicado, mas hesitei, porque esta é uma pergunta de 3 anos. Até procurei meta.superuser e encontrei uma pergunta relevante em meta.superuser.com/questions/3524/… . Depois de ler a meta, acho que a situação é complicada (tenho uma resposta para duas perguntas antigas com bastante discussão em cada uma) e deixar uma resposta curta parece pelo menos "não é ruim". Estou aberto a ouvir seus pensamentos embora.
Ndemou 7/06