Mam wątpliwości co do struktury HTB, której używam.
Moim celem jest ograniczenie prędkości pobierania i wysyłania użytkowników w sieci lokalnej. Każdy użytkownik sieci ma osobistą listę domen z prędkością rosnącą i malejącą dla domeny, której nie może przekroczyć.
Oznacza to, że użytkownik 1 może mieć ograniczony dostęp do slashdot.org do 8 KB przy pobieraniu i 3 KB do przesłania, a użytkownik 2 może mieć na slashdot.org ograniczony dostęp do 4KB w dół i 1KB w górę.
Na razie konfiguruję parę iptables / tc, która działa świetnie, ale na bardzo małą skalę, używając 2 lub 3 hostów wirtualnych jednocześnie (niestety nie mogę przeprowadzić testu rozmiaru rzeczywistego).
Oto moja obecna struktura (pokażę tylko tę na wyjściu z sieci LAN, ta dla przesłania jest po prostu „kopią” tej)
Qdisc HTB (uchwyt 2 :) dołączony do interfejsu, domyślną klasą ruchu jest klasa FFFF.
Klasa root 2: 1 bezpośrednio pod qdisc HTB posiadająca za szybkość i pułap pojemność DOWNLINK.
Domyślna klasa 2: FFFF jako dziecko 2: 1, ze stawką 1kbsp i pułapem pojemności DOWNLINK.
Następnie pojawiają się inne klasy dynamicznie dodawane, gdy istnieje nowe ograniczenie dla użytkownika z określonej domeny, dodawana jest nowa klasa tc, aby kontrolować prędkość pobierania z jego domeny.
Na razie oto co zrobiłem:
Utwórz nową klasę tc z unikalnym identyfikatorem (wziętym z bazy danych, nie o to tutaj), jako rodzic klasy 2: 1, wartość szybkości wynosi 1bps, wartość pułapu jest ustawiona na ograniczoną prędkość pobierania.
Oto polecenia 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 --------------
Cały normalny ruch (bez ograniczenia prędkości) powinien przejść do klasy domyślnej, a ta ograniczona powinna zostać wysłana do odpowiedniej klasy tc.
Wątpię poważnie w kwestię użycia minimalnej prędkości 1 bps dla klasy domyślnej i klasy ograniczonej. Nie mogę kontrolować liczby klas ograniczonych, które zostaną utworzone, i nie chcę, aby łączna szybkość klas ograniczonych była większa niż klasa główna.
Kolejny punkt, dodałem domyślną wartość prio 0, a klasę ograniczoną prio 1, więc w przypadku gdyby klasa domyślna pożyczyła (prawie zawsze zgodnie z jej bardzo wolnym tempem), klasa ta będzie obsługiwana przed inną domeną ograniczoną. Ale czy te domeny nie umrą z głodu, jeśli utrzymam pułap domyślnej klasy jako klasy głównej?
W jaki sposób mogę pozwolić użytkownikom zachować przyzwoitą interaktywność i przepustowość dla nieograniczonego użytkowania, ograniczając jednocześnie szybkość kilku domen / użytkowników?
Zastanawiam się także, czy klasa domyślna jest tu przydatna, ponieważ jeśli nie podam; t domyślnej klasy dla qdisc htb, pakiety nie pasujące do filtrów zostaną usunięte z kolejności sprzętowej. (ale tutaj znowu z głodowaniem ograniczonej klasy?)
Jestem naprawdę nowy w tc i sieci QoS, więc wszelkie porady, krytycy (konstruktywni;)) będą mile widziane.
Vincent.