[Sysadmins] tc

Dmytro O. Redchuk =?iso-8859-1?q?dor_=CE=C1_ldc=2Enet?=
Чт Авг 23 12:46:22 MSD 2007


On Thu, Aug 23, 2007 at 10:58:09AM +0400, Anton Gorlov wrote:
> Dmytro O. Redchuk пишет:
> 
> >Я бы "забил скриптом" хэш и в каждую 
> >ячейку tc filter на класс... Это
> >тоже, конечно, ручная работа, но такое 
> >скриптуется приятнее и работает
> >быстрее. Особенно "если клиентов от 1К и 
> >более".
> >Но это не то, о чём вы 
> >говорите/спрашиваете.
> то есть скриптмо в цикле генерить 
> ипишники  клиентов и с каждым ипишником 
> увеличивать на шаг
> сlassid 1:x и соответственно flowid 1:х?

Ну примерно, только...

Я имел в виду хеши самого tc (пример тут:
http://lartc.org/howto/lartc.adv-filter.hashing.html)

Я выгрызу кой-чего из своих скриптов, постараюсь покоцать и прокомментировать
"более-менее". Но сначала прочитайте (если ещё не...) по той ссылке, чтобы
было понятнее.

Идея такая -- создаём на интерфейсе таблицу (хэш) фильтров на нужное
количество сетей /24, каждая ячейка таблицы будет содержать "линк"
(перебрасывающий фильтр) на другую таблицу. Эта другая таблица будет
размером 256 ячеек, то есть на всю определённую сеть /24, каждая ячейка
будет содержать фильтр, перебрасывающий на нужный класс (для этого
айпишника/клиента).

##########################################################################

### Сначала создаём корневую дисциплину:

#
#
# root HTB:
echo -e "\n\n#\n# Root qdisc and class:\n#\n"
$tc qdisc add dev $DEV root handle 1: htb default 90
 
# root class:
$tc class add dev $DEV parent 1:0 classid 1:1 htb rate 100Mbit


### создаём хеш на две сети /24 (скажем, 192.168.1.0 и 192.168.2.0):

# root filter:
$tc filter add dev $DEV parent 1:1 prio 10 protocol ip u32

### divisor 2 -- хеш на две ячейки:
$tc filter add dev $DEV parent 1:1 protocol ip prio 10 handle 8: u32 divisor 2

### создаём два хеша -- для каждой сети /24:
## для 192.168.1.0:
$tc filter add dev $DEV parent 1:1 prio 10 handle 1: protocol ip u32 divisor 256
## для 192.168.2.0:
$tc filter add dev $DEV parent 1:1 prio 10 handle 2: protocol ip u32 divisor 256

/***

Для каждого клиента (не обязательно это делать для каждого айпишника,
можно для групп айпишников) нужно создать класс. В каждую ячейку этих двух
хешей нужно вписать фильтр, перебрасывающий в этот класс.

***/

### В конце-концов, нужно в "верхний" хеш на две ячейки записать фильтры,
### перебрасывающие пакет сразу в нужную ячейку нужной сети:

$tc filter add dev $DEV parent 1:1 protocol ip prio 10 \
                u32 ht 8:0: \
                match ip dst 192.168.1.0/24 \
                hashkey mask 0x000000ff at 16 \
                link 1:

$tc filter add dev $DEV parent 1:1 protocol ip prio 10 \
                u32 ht 8:1: \
                match ip dst 192.168.2.0/24 \
                hashkey mask 0x000000ff at 16 \
                link 2:


##########################################################################

:-) Где-то так.

Всё это кажется сложным, возможно.

У меня всё это работает уже для 13-ти сетей /24 -- кучка скриптов, "базка" с
соответствием классов айпишникам, параметры этих классов... Фактически,
нужно где-то указать, в какой класс кидать данный айпишник -- а если
каждому айпишнику давать свой класс, то задача упрощается. Возможно :-)

Да, сложновато, это ж только "направление"  -- но масштабируется
замечательно (в плане быстродействия).



PS. Интересно, кто как иначе крутится с такими вещами...

-- 
  _,-=._              /|_/|
  `-.}   `=._,.-=-._.,  @ @._,
     `._ _,-.   )      _,.-'
        `    G.m-"^m`m'        Dmytro O. Redchuk




Подробная информация о списке рассылки Sysadmins