telephonist 0 Опубликовано: 2010-10-14 06:42:29 Share Опубликовано: 2010-10-14 06:42:29 Итак. Внешний интерфейс 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 - клиенты все равно кушают столько трафика, сколько им назначено, хотя должны не иметь возможности брать больше чем у родительского класса. Здесь я попал в тупик. Спасибо огромное! Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас