У мене є сумніви щодо структури HTB, яку я використовую.
Моя мета - обмежити швидкість завантаження та завантаження користувачів у локальній мережі. Кожен користувач мережі має особистий список доменів зі зниженою швидкістю для домену, який він не може перевищувати.
Це означає, що користувач1 може мати доступ до сайту slashdot.org до 8 КБ при завантаженні та 3 КБ для завантаження, а користувач2 може мати на slashdot.org обмежений доступ на 4 КБ вниз та на 1 КБ вище.
Наразі я встановлюю пару iptables / tc, яка чудово працює, але в дуже малому масштабі, використовуючи одночасно 2 або 3 віртуальних хоста (на жаль, я не можу виконати тест на реальний розмір).
Ось моя поточна структура (я покажу лише ту, що виходить з локальної мережі, а для завантаження - просто "копію" цієї)
HTB qdisc (ручка 2 :), що додається в інтерфейс, класом трафіку за замовчуванням є клас FFFF.
Кореневий клас 2: 1 безпосередньо під HTB qdisc, що має для швидкості та стелі потужність DOWNLINK.
Клас 2 за замовчуванням: FFFF як дитина 2: 1, зі швидкістю 1 кбіт / с та величиною потужності DOWNLINK.
Потім, динамічно додаються інші класи, коли є нове обмеження для користувача з певного домену, додається новий клас tc для управління швидкістю завантаження з його домену.
Поки що ось що я зробив:
Створіть новий клас tc з унікальним ідентифікатором (взято з бази даних, не суть тут), як батько класу 2: 1, значення швидкості 1bps, значення ceil встановлюється на обмежену швидкість завантаження.
Ось команди 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 --------------
Весь звичайний трафік (без обмеження швидкості) повинен переходити до класу за замовчуванням, а обмежений слід надсилати до відповідного класу tc.
Точка, в якій я серйозно сумніваюся, - це використання мінімальної швидкості швидкості 1bps для класу за замовчуванням та класу з обмеженням. Я не можу контролювати кількість обмежених класів, які будуть створені, і я не хочу, щоб загальна швидкість обмеженого класу була над рівнем кореневого класу.
Ще один момент, я додав за замовчуванням prio prio 0, а обмежений клас prio 1, тому у випадку, коли клас за замовчуванням повинен запозичити (майже завжди відповідно до його дуже повільної швидкості), цей клас подаватиметься перед іншим доменом з обмеженням. Але чи не будуть голодувати ці домени, якщо я зберігаю стелю класу за замовчуванням як клас кореневого класу?
Як я можу дозволити користувачам зберігати гідну інтерактивність та пропускну здатність для не обмеженого використання, обмежуючи швидкість для кількох пар доменів / користувача?
Мені також цікаво, чи корисний тут клас за замовчуванням, оскільки, якщо я не вказую; t вказує клас за замовчуванням для htb qdisc, пакети, що не відповідають фільтрам, будуть зняті з апаратної швидкості. (але тут знову, коли змушують голосувати обмежений клас?)
Я дійсно новачок у tc та мережевих QoS, тому будь-які поради, критики (конструктивні;)) будуть вітатися.
Вінсент.