Назад | Перейти на главную страницу

Проблема с минимальной скоростью и классом по умолчанию для HTB

У меня есть некоторые сомнения относительно структуры HTB, которую я использую.

Моя цель - ограничить скорость загрузки и выгрузки пользователей в локальной сети. У каждого пользователя сети есть персональный список доменов с понижающей и восходящей скоростью для домена, который он не может превышать.

Это означает, что доступ пользователя user1 к slashdot.org может быть ограничен 8 КБ при загрузке и 3 КБ для загрузки, а user2 может иметь ограниченный доступ к 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, значение скорости составляет 1 бит / с, значение 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.

То, в чем я серьезно сомневаюсь, - это использование минимальной скорости 1 бит / с для класса по умолчанию и класса с ограничениями. Я не могу контролировать количество создаваемых ограниченных классов, и я не хочу, чтобы общая скорость ограниченного класса была выше, чем у корневого класса.

Еще один момент: я добавил по умолчанию prio 0, а ограниченный класс - prio 1, поэтому в случае, если класс по умолчанию должен заимствовать (почти всегда в соответствии с его очень низкой скоростью), этот класс будет обслуживаться до другого ограниченного домена. Но разве эти домены не будут голодать, если я сохраню верхний предел класса по умолчанию в качестве одного из корневых классов?

Как я могу позволить пользователям сохранять приличную интерактивность и пропускную способность для неограниченного использования, ограничивая скорость для нескольких пар доменов на пользователя?

Мне также интересно, полезен ли здесь класс по умолчанию, поскольку, если я не укажу класс по умолчанию для htb qdisc, пакеты, не соответствующие фильтрам, будут исключены из очереди с аппаратной скоростью. (но здесь снова с голоданием ограниченного класса?)

Я новичок в tc и QoS в сети, поэтому любые советы, критика (конструктивная;)) будут приветствоваться.

Винсент.

Поскольку вы не включили классификаторы, трудно определить, какой именно трафик вы имеете в виду в каждом классе. Например, исходящий трафик http или ssh очень важен для интерактивности, а входящий - не так.

Я гарантирую определенную пропускную способность для каждого служба сказав: у меня есть x кбит / с для входящего трафика httpd, и он делится поровну между пользователями. Если у вас 10 или 100 пользователей, это справедливо ». Если у вас есть пользователи с высоким или низким приоритетом в каждой из этих служб, вам необходимо иметь для них дополнительные классы и классификаторы.

(Также я надеюсь, что вы знаете, что вы можете формировать только исходящий трафик из интерфейса, а НЕ входящий. Это означает, что если вы хотите ограничить исходящий канал, вы должны работать либо с исходящим интерфейсом в Интернет, либо использовать Устройство промежуточной очереди. Руководство lartc.org - очень хороший ресурс.)