Перейти до

Linux шейпер гарантированная полоса (динамически)


Рекомендованные сообщения

Итак.

 

Внешний интерфейс eth2

Внутренний интерфейс eth1

Общая скорость канала 100M

Виртуальный интерфейс для шейпера ifb0

 

Пакеты метятся с помощью iptables mark / ipset

1 - OUT_WORLD

2 - IN_WORLD

3 - OUT_LOCAL

4 - IN_LOCAL

5 - OUT_UAIX

6 - IN_UAIX

 

 

Задача:

 

Рядовые клиенты (для всех выделяется часть общей полосы +то, что недоиспользуется бизнес-абонентами через ceil - все это делится между всеми клиентами с ограничением максимума):

Каждому из клиентов(определяется по одному или нескольким IP адресам) ограничить полосу доступа к ресурсам мира и украины, скорости могут быть разными. Кроме того если задано ограничение т.н. "локальное" - тогда оно имеет приоритет и отдельные ограничения для ураины и мира не работают.

Пример:

клиент 1 - заданы ограничения мир-1Мб, Украина-5Мб - клиент получает заявленные скорости.

клиент 2 - задано ограничение "локальное"-1Мб - клиент получает максимальную скорость 1Мб не зависимо от типа трафика, даже если например у него стоит ограничение мир-512Кб - это не будет иметь значения, т.к. тип ограничения "локальный" является более приоритетным вне зависимости от того увеличивает он скорость клиенту или уменьшает ее по отношения к возможно установленным ограничениям для украины и мира. Надеюсь понятно. :)

 

Бизнес-абоненты (гарантировано выделяется часть общей полосы и так же гарантировано делится между абонентами согласно их пакетов. Рядовые клиенты не могут отобрать траффик у бизнес-абонентов, ровно как и бизнес абоненты друг у друга. Если бизнес-абоненты недоиспользуют полосу - излишек уходит на нужды рядовых клиентов через ceil):

Эта часть пока не реализована в деталях. С этим нужна помощь.

 

Я остановился на моменте, когда не могу выделить гарантированную полосу для бизнес абонентов в целом. Для теста я ставил рядовым клиентам ограничение(общее для всех) к примеру 1Мб и ceil 1mbit - но клиенты все равно получали всю полосу... т.е. где-то закралась ошибка и мне пока так и не удалось ее найти.

 

Теперь подробности реализации:

 

Ниже приведен скрипт иннициализации шейпера, правила по которым будут строится ограничения для клиентов приведу чуть ниже на примере.

----------------------------------------------- Скрипт иннициализации шейпера -------------------------------------

INT_I="eth1" # Внутренний интерфейс

NAT_I="eth2" # Внешний интерфейс

FULL_CAPACITY="100mbit" # Общая пропускная способность внешнего канала

DEFAULT_L="4kbit" # Полоса для траффика по-умолчанию, на самом деле такого быть в общем-то не должно, так это это скорее заглушка такая себе

GARANTED="100mbit" # Полоса для гарантированного трафика, т.е. для бизнес-абонентов. Сейчас установлена в максимум, потому как не пока не работает

STANDARD="100mbit" # Выделенная полоса для обычных клиентов, установлена в максимум потому что пока не работает ограничение

STANDARD_CEIL="100mbit" # Дополнительный трафик для обычных клиентов, если есть - то отбирается свободных у бизнес-абонентов

LOW_SPEED="100mbit" # Полоса для клиентов, у которых действует "локальное ограничение", т.е. приоритетное ограничение

LOW_SPEED_CEIL="100mbit" # Дополнительная полоса для клиентов, у которых действует "локальное ограничение", т.е. приоритетное ограничение

 

UAIX=$STANDARD # Полоса для клиентов с ограничением скорости украинского трафика

UAIX_CEIL=$STANDARD_CEIL # Дополнительная полоса для клиентов с ограничением скорости украинского трафика

WORLD=$STANDARD # Полоса для клиентов с ограничением скорости мирового трафика

WORLD_CEIL=$STANDARD_CEIL # Дополнительная полоса для клиентов с ограничением скорости мирового трафика

 

# DELETE OLD QUEUES - удаляем все старые настройки

$TC qdisc del dev ifb0 root handle 1:

$TC qdisc del dev $NAT_I root handle 1:

$TC qdisc del dev $INT_I root handle 1:

 

 

# создаем корневую дисциплину для виртуального интерфейса с указанием дефолтного класса

$TC qdisc add dev ifb0 root handle 1: htb default 25

 

#

# Full interface capacity - создаем глобальное ограничение полосы в соответствии с данными внешнего канала

#

$TC class add dev ifb0 parent 1: classid 1:1 htb rate $FULL_CAPACITY ceil $FULL_CAPACITY burst 15k

$TC qdisc add dev ifb0 parent 1:1 handle 2: sfq limit 1024 perturb 15

 

# DEFAULT - скорость по-умолчанию, для всего неправильно типизированного траффика

$TC class add dev ifb0 parent 1:1 classid 1:25 htb rate $DEFAULT_L burst 1k

#$TC qdisc add dev ifb0 parent 1:25 handle 25: sfq perturb 10

 

# GARANTED SHELF - полоса для бизнес абонентов с гарантированными параметрами и повышенным приоритетом (на само деле здесь пока трафика нет)

$TC class add dev ifb0 parent 1:1 classid 1:30 htb rate $GARANTED ceil $GARANTED burst 15k prio 1

$TC qdisc add dev ifb0 parent 1:30 handle 30: sfq limit 128 perturb 15

 

# STANDART SHELF - полоса для обычных клиентов с ограничениями мира и украины (здесь сейчас практически весь трафик, эта полосам должна отбирать дополнительную часть у гарантированных абонентов, если есть недоиспользованный трафик)

$TC class add dev ifb0 parent 1:1 classid 1:35 htb rate $STANDARD ceil $STANDARD_CEIL burst 15k prio 2

$TC qdisc add dev ifb0 parent 1:35 handle 35: sfq limit 128 perturb 15

 

# LOW SPEED - полоса для обычных клиентов с приоритетными "локальными" ограничениями

$TC class add dev ifb0 parent 1:1 classid 1:20 htb rate $LOW_SPEED ceil $LOW_SPEED_CEIL burst 15k prio 3

$TC qdisc add dev ifb0 parent 1:20 handle 20: sfq limit 128 perturb 15

 

#

# All UAIX - сюда попадает весь трафик украины

#

$TC class add dev ifb0 parent 1:35 classid 1:45 htb rate $UAIX ceil $UAIX_CEIL burst 15k prio 3

$TC qdisc add dev ifb0 parent 1:45 handle 45: sfq limit 128 perturb 15

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 5 fw flowid 1:45 # UAIX OUT

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 6 fw flowid 1:45 # UAIX IN

 

 

#

# All WORLD - сюда попадает весь трафик мира

#

$TC class add dev ifb0 parent 1:35 classid 1:55 htb rate $WORLD ceil $WORLD_CEIL burst 15k prio 3

$TC qdisc add dev ifb0 parent 1:55 handle 55: sfq limit 128 perturb 15

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 1 fw flowid 1:55 # WORLD OUT

$TC filter add dev ifb0 protocol all prio 10 parent 1:0 handle 2 fw flowid 1:55 # WORLD IN

 

 

 

 

 

#

# Redirection to IFB0

#

 

# OUT to EXTERNAL - перенаправляем исходящий трафик мир и Украина на виртуальный интерфейс шейпера

$TC qdisc add dev $NAT_I root handle 1: htb

$TC filter add dev $NAT_I parent 1: protocol all prio 1 handle 1 fw flowid 1: action mirred egress redirect dev ifb0 # WORLD

$TC filter add dev $NAT_I parent 1: protocol all prio 1 handle 5 fw flowid 1: action mirred egress redirect dev ifb0 # UAIX

 

# OUT to INTERNAL - перенаправляем входящий трафик мир и Украина на виртуальный интерфейс шейпера

$TC qdisc add dev $INT_I root handle 1: htb

$TC filter add dev $INT_I parent 1: protocol all prio 1 handle 2 fw flowid 1: action mirred egress redirect dev ifb0 # WOLD

$TC filter add dev $INT_I parent 1: protocol all prio 1 handle 6 fw flowid 1: action mirred egress redirect dev ifb0 # UAIX

--------------------------------------------------------------------------------------------------------------------------------

 

 

Правила при добавлении клиента:

------------------------------------------------ Добавляем ограничение МИР=1Мб для клиента 10.10.10.5 ------------------

FPRIO="9"

CPRIO="5"

CPARENT ="1:55" - класс добавляем к полосе мира

FPARENT="1:55" - фильтр устанавливаем на уровне мирового подкласса

CLIENTNUM=34 - уникальный номер клиента, используется как индекс для управления списками

CLIENTIP=10.10.10.5 - адрес клиента, может быть несколько адресов - тогда последние две строчки повторяются для каждого из адресов клиента

$TC class add dev ifb0 parent $CPARENT classid 1:$CLIENTNUM htb rate 1mbit ceil 1mbit prio 5

$TC qdisc add dev ifb0 parent 1:$CLIENTNUM handle $CLIENTNUM: sfq perturb 10

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip src $CLIENTIP/32 flowid 1:$CLIENTNUM

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip dst $CLIENTIP/32 flowid 1:$CLIENTNUM

----------------------------------------------------------------------------------------------------------------------------------------------

 

 

------------------------------------------------ Добавляем ограничение УКРАИНА=5Мб для клиента 10.10.10.5 ------------

FPRIO="9"

CPRIO="5"

CPARENT ="1:45" - класс добавляем к полосе украины

FPARENT="1:45" - фильтр устанавливаем на уровне украинского подкласса

CLIENTNUM=34 - уникальный номер клиента, используется как индекс для управления списками

CLIENTIP=10.10.10.5 - адрес клиента, может быть несколько адресов - тогда последние две строчки повторяются для каждого из адресов клиента

$TC class add dev ifb0 parent $CPARENT classid 1:$CLIENTNUM htb rate 5mbit ceil 5mbit prio 5

$TC qdisc add dev ifb0 parent 1:$CLIENTNUM handle $CLIENTNUM: sfq perturb 10

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip src $CLIENTIP/32 flowid 1:$CLIENTNUM

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip dst $CLIENTIP/32 flowid 1:$CLIENTNUM

----------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

------------------------------------------------ Добавляем ограничение ОБЩЕЕ("локальное")=2Мб для клиента 10.10.10.10 ------------------

FPRIO="8"

CPRIO="6"

CPARENT ="1:20" - класс добавляем к полосе "локального" приоритетного ограничителя

FPARENT="1:" - фильтр устанавливаем на уровне корневого подкласса, тем самым устанавливая приоритет такого ограничения на украинским и мировым

CLIENTNUM=34 - уникальный номер клиента, используется как индекс для управления списками

CLIENTIP=10.10.10.10 - адрес клиента, может быть несколько адресов - тогда последние две строчки повторяются для каждого из адресов клиента

$TC class add dev ifb0 parent $CPARENT classid 1:$CLIENTNUM htb rate 2mbit ceil 2mbit prio 5

$TC qdisc add dev ifb0 parent 1:$CLIENTNUM handle $CLIENTNUM: sfq perturb 10

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip src $CLIENTIP/32 flowid 1:$CLIENTNUM

$TC filter add dev ifb0 parent $FPARENT protocol all prio $FPRIO u32 match ip dst $CLIENTIP/32 flowid 1:$CLIENTNUM

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

Я очень надеюсь, что объяснил достаточно подробно и понятно, что есть сейчас, прошу вас помочь решить поставленную задачу. ПО крайней мере у меня сейчас вопрос пока один основной - почему, когда я в головном скрипте иннициализации шейпера меняю STANDARD и STANDARD_CEIL к примеру на 1mbit - клиенты все равно кушают столько трафика, сколько им назначено, хотя должны не иметь возможности брать больше чем у родительского класса. Здесь я попал в тупик.

 

Спасибо огромное!

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.

×
×
  • Створити нове...