LINUX.ORG.RU
ФорумAdmin

Дерево HTB

 


0

1

Привет всем! Подскажите где моя ошибка и как правильно строить дерево htb. Есть несколько потоков трафика от пользователей, промаркированны в iptables. Создаю корневую дисциплину

$TC qdisc add dev $imq_download root handle 1: htb
Создаю классы для потоков с маркерами
$TC class add dev $imq_download parent 1: classid 1:1 htb rate $rate_isp
$TC class add dev $imq_download parent 1: classid 1:2 htb rate $rate_isp
Фильтром подаю в нужный класс
$TC filter add dev $imq_download parent 1:0 protocol ip prio 1 handle 1 fw classid 1:1
$TC filter add dev $imq_download parent 1:0 protocol ip prio 1 handle 2 fw classid 1:2
Делаю
tc -s -d class show dev imq1
И вижу трафик побежал по классам.

Но задача в каждом из промаркированных потоков еще разбить трафик на три очереди для приоритетов. И тут как только добавляю дочерние классы к существующим чтобы в них разбить.

$TC class add dev $imq_download parent 1:1 classid 1:11 htb rate $rate_min ceil $rate_isp prio 1
$TC class add dev $imq_download parent 1:1 classid 1:12 htb rate $rate_min ceil $rate_isp prio 2
$TC class add dev $imq_download parent 1:1 classid 1:13 htb rate $rate_min ceil $rate_isp prio 3
Счетчики в родительском классе 1:1 по нулям, т.е. фильтры уже не срабатывают. Подскажите как правильно строить такие деревья, чтобы можно было оперировать трафиком по-классово.

Спасибо.


Классы ты создал, а дисциплины обслуживания очередей кто будет создавать ?

нафига маркировать пакеты для того, чтобы потом фильтр классифицировал пакет, когда можно сразу классифицировать через "-j CLASSIFY --set-class xx:yy" ?

Для таких простых задач htb.init в самый раз. Во что оно компилируется обычно можно посмотреть в кеше - /var/cache/htb.init

vel ★★★★★ ()
Ответ на: комментарий от vel

Подскажите в каких случаях создаются дисциплины, а в каких нет. В примерах вижу что всегда создаются только в краевых классах, а в промежуточных не всегда. Насколько я понимаю, если я хочу оперировать трафиком в классе, мне нужно создать для него дисциплину и в фильтрах указывать номер этой дисциплины.

В моем случае маркировка производится при балансировке пользователей средствами iptables по нескольким аплинкам, рандомно. Допустим 1 маркер это трафик пользователей в первом канале, 2 - это второй. И я хотел бы создать столько же «труб» и загонять туда трафик с маркером и потом его еще приоритезировать.

fet4 ()
Ответ на: комментарий от fet4

реально трафик обрабатывается только в конечных классах, а промежуточные классы используются только для расчетов.

vel ★★★★★ ()
Ответ на: комментарий от vel

Если я использую imq

$IPT -w -t mangle -A PREROUTING -i $clients_if -m set --match-set $access_list src -j IMQ --todev 0 
$IPT -w -t mangle -A POSTROUTING -o $clients_if -m set --match-set $access_list dst -j IMQ --todev 1
А CLASSIFY можно использовать только в POSTROUTING, FORWARD, OUTPUT. Будет ли классифицироваться на imq0?

fet4 ()
Ответ на: комментарий от fet4

увы, в prerouting его нельзя использовать. нужно использовать другие средства, хотя это ограничение надуманное.

ipset умеет ставить приоритет, а он доступен в любой таблице :)

А так ли нужно шейпить на входе ? Для транзитного трафика всегда есть устройство, через которое этот пакет будет передан дальше, вот на нем и шейпить.

vel ★★★★★ ()
Ответ на: комментарий от vel
$IPT -w -t mangle -N classify_isp1
$IPT -w -t mangle -A classify_isp1 -j CLASSIFY --set-class 1:13
$IPT -w -t mangle -A classify_isp1 -p icmp -j CLASSIFY --set-class 1:11
$IPT -w -t mangle -A classify_isp1 -p tcp -m multiport --sport 22,53,953 -j CLASSIFY --set-class 1:11
$IPT -w -t mangle -A classify_isp1 -p tcp -m multiport --dport 22,53,953 -j CLASSIFY --set-class 1:11
$IPT -w -t mangle -A classify_isp1 -p udp -m multiport --sport 22,53,953 -j CLASSIFY --set-class 1:11
$IPT -w -t mangle -A classify_isp1 -p udp -m multiport --dport 22,53,953 -j CLASSIFY --set-class 1:11
$IPT -w -t mangle -A classify_isp1 -p tcp -m multiport --sport 80,443,110,25,143,220 -j CLASSIFY --set-class 1:12
$IPT -w -t mangle -A classify_isp1 -p tcp -m multiport --dport 80,443,110,25,143,220 -j CLASSIFY --set-class 1:12
$IPT -w -t mangle -A classify_isp1 -p udp -m multiport --sport 80,443,110,25,143,220 -j CLASSIFY --set-class 1:12
$IPT -w -t mangle -A classify_isp1 -p udp -m multiport --dport 80,443,110,25,143,220 -j CLASSIFY --set-class 1:12
$IPT -w -t mangle -A FORWARD -i $isp1_if -o $clients_if -m set --match-set $nodeny_list dst -j classify_isp1

Сделал вот такую конструкцию, пакеты классифицируются. Второе правило отправляет некласиффицированные в последнюю очередь? Так можно?

Как быть если на двух интерфейсах одинаковые классы, мне ж нужно еще классифицировать еще на другом интерфейсе? Сделать разные классы просто? По «CLASSIFY» нашел только ключ "--set-class" может можно указать как-то устройство?

fet4 ()
Ответ на: комментарий от fet4

да, можно.

классифицируется пакет без привязки к интерфейсу.

vel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.