Taxa mínima e problema de classe padrão para HTB

29

Tenho algumas dúvidas sobre uma estrutura HTB que estou usando.

Meu objetivo é limitar a velocidade de download e upload de usuários em uma rede local. Cada usuário da rede possui uma lista pessoal de domínios com uma velocidade para cima e para baixo para o domínio que ele não pode exceder.

Isso significa que o usuário1 pode ter seus acessos no slashdot.org restritos a 8KB no download e 3KB para upload, e o usuário2 pode ter no slashdot.org um acesso restrito de 4KB para baixo e 1KB para cima.

Por enquanto, eu configuro um casal iptables / tc que funciona muito bem, mas em uma escala muito pequena, usando 2 ou 3 hosts virtuais ao mesmo tempo (infelizmente, não consigo realizar testes de tamanho real).

Aqui está minha estrutura atual (mostrarei apenas a saída do LAN, a do upload sendo simplesmente uma "cópia" desta)

Um qdisc HTB (identificador 2 :) anexado à interface, a classe de tráfego padrão é a classe FFFF.

A classe raiz 2: 1 diretamente no qdisc HTB possui, para taxa e teto, a capacidade DOWNLINK.

A classe padrão 2: FFFF como filho de 2: 1, com uma taxa de 1kbsp e um teto de capacidade DOWNLINK.

Em seguida, há outras classes adicionadas dinamicamente quando há uma nova restrição para um usuário de um determinado domínio, uma nova classe tc é adicionada para controlar a velocidade de download de seu domínio.

Por enquanto, aqui está o que eu fiz:

Crie uma nova classe tc com um ID exclusivo (extraído de um banco de dados, não o ponto aqui), como pai da classe 2: 1, o valor da taxa é 1bps, o valor do teto é definido para a velocidade de download limitada.

Aqui estão os comandos tc:

-------------- BEGIN SCRIPT --------------
DOWNLINK=800

## Setting up the static tc qdisc and class

$tc qdisc add dev $LAN_IFACE root handle 2: htb default 0xFFFF

# Main class so the default class can borrow bandwith from the others
$tc class replace dev $LAN_IFACE parent 0x2: classid 0x2:0x1 htb rate $DOWNLINK ceil $DOWNLINKkbps

# add the default class of class id 2:a under the main class of classid 2:1
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0xFFFF htb rate 1kbps ceil $DOWNLINKkbps prio 0

# add to the leaf class 2:10 for default traffic a sfq qdisc
$tc qdisc add dev $LAN_IFACE parent 0x2:0xFFFF handle 0xFFFF: sfq perturb 10

## The dynamic part called each time a new restriction for a couple domain/user is added
$tc class replace dev $LAN_IFACE parent 0x2:0x1 classid 0x2:0x$idHex htb rate 1bps ceil $speedDownkbps prio 1

# Add the sfq at the leaf class 2:1$id
$tc qdisc add dev $LAN_IFACE parent 0x2:0x$idHex handle 0x$idHex: sfq perturb 10

# $id is the mark added by iptables for this couple domain/user
$tc filter replace dev $LAN_IFACE parent 0x2:0 protocol ip prio 3 handle 0x$id fw flowid 0x2:0x$idHex
-------------- END SCRIPT --------------

Todo o tráfego normal (sem restrição de velocidade) deve ir para a classe padrão e o tráfego restrito deve ser enviado para a classe tc correspondente.

O ponto que duvido seriamente é o uso da taxa de velocidade mínima de 1bps para a classe padrão e a classe restrita. Não posso controlar o número de classes restritas que serão criadas e não quero que a taxa total da classe restrita seja superior à da classe raiz.

Outro ponto, eu adicionei o padrão prio 0 e a classe restrita prio 1; portanto, caso a classe padrão deva emprestar (quase sempre de acordo com sua taxa muito lenta), essa classe será atendida antes do outro domínio restrito. Mas esses domínios não morrerão de fome se eu mantiver o teto da classe padrão como o da classe raiz?

Como posso ter sucesso para permitir que os usuários mantenham uma interatividade e largura de banda decentes para um uso não restrito, limitando a velocidade de vários domínios / usuários?

Também estou me perguntando se a classe padrão aqui é útil, pois se eu não especificar uma classe padrão para o htb qdisc, os pacotes que não corresponderem aos filtros serão desenfileirados na velocidade do hardware. (mas aqui novamente com a fome da classe restrita?)

Eu sou realmente novo no tc e na rede QoS, portanto, qualquer conselho, crítica (construtivo;)) será bem-vindo.

Vincent.

Mulot
fonte

Respostas:

2

Como você não incluiu os classificadores, é difícil deduzir o tráfego exatamente em cada classe. Por exemplo, o tráfego http ou ssh de saída é muito importante para a interatividade, o http de entrada nem tanto.

Eu garantiria certa largura de banda para cada serviço dizendo: Eu tenho x kbps para o tráfego httpd recebido e ele é dividido igualmente entre os usuários. Se você tem 10 ou 100 usuários, é justo. "Se você possui usuários de alta prioridade ou de baixa prioridade em cada um desses serviços, precisa ter classes e classificadores adicionais para eles.

(Também espero que você saiba que você só pode moldar o tráfego de saída de uma interface, NÃO da entrada. Isso significa que, se você quiser limitar o uplink, precisará trabalhar com a interface de saída na Internet ou usar o Dispositivo de Enfileiramento Intermediário . O guia lartc.org é um recurso muito bom.)

AndreasM
fonte