Opções para gerenciamento de largura de banda em uma conexão de internet compartilhada

13

A premissa:

Localização rural, não muitas opções para conexões de internet de alta largura de banda. O mais rápido, de longe, é a internet via satélite, mas é cara (tanto equipamento quanto custo mensal, e tem desvantagens de latência), então várias residências gostariam de compartilhá-la.

Isso é simples - configure um roteador com uma sub-rede para cada residência (VLANs ou portas físicas), bloqueie o tráfego entre eles e configure o modem para rotear essas sub-redes ou configure o NAT duplo.

O problema:

O modo 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 uma família / usuário criar muitas conexões, elas terão uma participação maior na conexão geral. Isto não é particularmente justo - com um link saturado, cada agregado familiar deve receber uma parte igual. Por outro lado, quando ninguém mais está usando a conexão, deve ser possível usar toda a largura de banda.

Por exemplo, digamos que há 4 residências compartilhando uma conexão inativa de 12Mbit / s. Se um deles estiver fazendo o download / streaming / qualquer coisa, eles devem ser capazes de usar o total de 12Mbit / s (ou próximo o suficiente). Se 2 domicílios estão usando a conexão, eles devem obter 6Mbit / s cada, independentemente de uma família estar baixando 1 arquivo e os outros 11. (sem qualquer gerenciamento de banda, cada arquivo seria baixado em 1Mbit / s nesse caso) 3 domicílios obter 4Mbit / s cada e assim por diante.

O que eu trabalhei até agora:

O melhor local para implementar uma política como esta (para a jusante) seria na outra extremidade do tubo estreito, ou seja, no ISP. Obviamente, isso não é possível neste caso, então seria bom poder aproximá-lo de alguma forma. Mas como? Existem roteadores prontos 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 comporta mal ou um serviço UDP agressivo poderia contornar qualquer coisa que eu possa fazer no meu final - mas deve funcionar para o caso comum da maioria do tráfego que consiste em muitos compatíveis com RFC Conexões TCP.

Para ser claro, não estou falando sobre como priorizar aplicativos específicos, mas sim agregar tráfego para / de determinados dispositivos ethernet ou intervalos de endereços IP. Dar a um tráfego uma prioridade mais alta do que o outro tráfego parece ser bem suportado, mas a situação é menos clara ao tentar alocar igualmente largura de banda para classes de tráfego.

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

Pelo que entendi, a maneira de fazer com que o TCP se comporte dessa maneira é simular um pipe um pouco mais estreito do que o que está realmente disponível e, artificialmente, descartar pacotes para fazê-lo recuar. Então eu acho que seria bastante simples dar a todos exatamente 3Mbit / s no exemplo acima, derrubando artificialmente qualquer pacote extra. Isso realmente não usa a conexão com eficiência, já que na maioria das vezes há capacidade extra.

Existe uma maneira de fazer o que eu estou pedindo? Eu estou indo errado? Eu sou (ou melhor, as famílias em questões) dispostas a gastar dinheiro com isso - seja um roteador / appliance de preço moderado ou uma caixa genérica para executar uma distribuição Linux ou BSD.

    
por pmdj 22.07.2013 / 12:23

3 respostas

4

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

Vamos pegar 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 o 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, escrevo um pequeno script para detectar quais clientes estão fazendo o ping e gravando o resultado em algum lugar. "Isso é deixado como um exercício para o leitor" Calcular o número total de hosts conectados (1-4)

Certifique-se de lidar com o caso de nenhum host on-line.

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 está livre de erros de digitação)

Agora, você ainda precisa criar um script adequado para ser executado a cada minuto e renovar blocos / filtros sempre que um novo host for ativado ou desativado.

Espero que você esteja na direção certa, boa sorte.

Solução alternativa

Instale um software de QoS local em todos os hosts para restringir sua largura de banda. Eu uso o NetLimiter (não-livre)

    
por 24.07.2013 / 16:13
2

O OpenWRT parece apoiá-lo, embora eu nunca tenha usado isso sozinho. Você pode dar uma olhada na página Controle de tráfego da rede em seu site e especialmente o segundo exemplo: simples compartilhamento de largura de banda simples (também conhecido como traffic shaping) com HTB . Isso envolve chamadas simples para o qdisc, então qualquer caixa do Linux pode fazer isso.

    
por 22.07.2013 / 23:46
0

A configuração descrita no link faz exatamente isso:

[...] the queues distribute that limited BW evenly between all the LAN clients (LAN IPs to be precise).

    
por 07.06.2017 / 11:00