Общие положения
Шейпирование это ограничение полосы пропускания для абонентов сети передачи данных.
По характеру ограничения оно может быть:
- статическим (постоянным, т.е. зависящим только от тарифного плана);
- динамическим (меняющимся в зависимости от объёмов израсходованного трафика, а также от времени суток).
Биллинговая система, такая как UTM5, предоставляет возможность настроить для отдельных видов трафика, услуг и тарифов
как статическое, так и динамическое шейпирование.
Регулировка полосы пропускания фактически происходит на маршрутизаторах
трафика. В качестве таких устройств могут выступать PC-маршрутизаторы,
маршрутизаторы Cisco, управляемые коммутаторы и т.п. Взаимодействие
биллингового ПО с этими устройствами может происходить следующим образом:
- Средствами внешних скриптов. По некоторому событию
(например, при расходовании определённого количества трафика) биллинговая система
запускает внешний скрипт управления шейпером, который меняет полосу
пропускания (или, возможно, разрывает соединение).
В параметрах скрипту обычно передаётся IP-адрес пользователя
и новое значение установленной для него полосы пропускания.
Скрипт вызывает внешние утилиты управления трафиком (например,
tc из пакета iproute2 в случае Linux и
ipfw в случае FreeBSD со включённой функциональностью dummynet).
Для использования данных утилит может требоваться
предварительная настройка операционной системы или стороннего ПО.
- При помощи RADIUS-атрибутов (в случае услуг VPN и Dial-UP).
В ответе на запрос аутентификации RADIUS-сервер может отсылать
атрибут или набор атрибутов, определённый для данного абонента и данного NAS, и содержащий
в себе инструкции по управлению пропускной способностью устанавливаемого соединения.
В данном случае необходима поддержка этой возможности программным
обеспечением со стороны NAS. Такой поддержкой обладают, в частности, маршрутизаторы Cisco.
При данном способе управления полоса пропускания устанавливается
в момент установления соединения, и её корректировка в зависимости от
израсходованного трафика происходит не мгновенно при достижении определённого значения,
а только при следующем соединении.
Описанные способы регулировки полосы пропускания могут применяться как
порознь, так и одновременно.
Реализация в UTM5
Система UTM5 предлагает следующий подход к шейпированию:
- В случае шейпирования с помощью внешних скриптов,
передаваемые скрипту параметры настраиваются на странице
Правила firewall (в группе Настройки).
Каждое правило ассоциировано с одним или несколькими событиями, при наступлении которых
выполняется внешний скрипт с заданными параметрами.
Путь к скрипту указывает переменная firewall_path в конфигурационном файле utm5_rfw.cfg.
Среди параметров скрипта можно указывать переменные, выбирая их из выпадающего списка.
При вызове скрипта вместо переменных подставляются их значения: IP-адрес пользователя,
текущее значение полосы пропускания и т.д.
- Статическое шейпирование можно реализовать с помощью правил,
выполняемых, например, при наступлении события Включение Интернета.
- Динамическое шейпирование (возможно при наличии модуля динамического шейпирования)
осуществляется правилами, выполняемыми при наступлении событий Установление ширины,
Изменение ширины и Снятие ограничений
входящего (исходящего) канала. События первых двух типов происходят в тот момент, когда
суммарное количество трафика за отчётный период переходит через границы, заданные на странице
Динамическое шейпирование, а
событие Снятие ограничений при закрытии отчётного
периода или при удалении сервисной связки. Если настроены разные границы для разных
временных диапазонов, события любого типа могут также происходить при наступлении
времени начала/окончания диапазона.
 |
Модуль динамического шейпирования требует отдельной лицензии. |
- С помощью RADIUS-атрибутов:
- Статическое шейпирование настраивается на вкладке RADIUS-параметры на странице
Услуга в группе Тарификация.
- Динамическое (возможно при наличии модуля динамического шейпирования)
настраивается на вкладке RADIUS-параметры на странице
Динамическое шейпирование в группе Настройки.
Для каждой услуги, наряду с границами потребления трафика, можно задать
RADIUS-атрибуты, устанавливающие ширину полосы пропускания.
Динамическое изменение атрибутов в зависимости от потреблённого трафика
обеспечивается использованием переменных (выбираемых из списка и вставляемых кнопкой Добавить).
Примеры
RADIUS-атрибуты
Пример RADIUS-атрибутов для динамического шейпирования в случае маршутизатора Cisco.
- ID вендора: 9;
- ID атрибута: 1;
- Тип атрибута: строка;
- Значение:
lcp:interface-config#1=rate-limit input IN_BANDWIDTH_BITS 8000 8000 conform-action transmit exceed-action drop
Перед отправкой данной строки на NAS система подставляет на место IN_BANDWIDTH_BITS
числовое значение полосы пропускания для пользователя (в бит/сек),
зависящее от потреблённого трафика и заданных границ.
Два следующие параметра (в данном примере оба равны 8000)
интерпретируются как burst_size и excess_burst_size.
burst_size количество байт, пересылаемых за один
всплеск (burst), т.е. за интервал времени,
равный отношению burst_size и указанной полосы пропускания.
excess_burst_size возможное количество байт сверх burst_size,
пересылаемое за один интервал при кратковременном повышении нагрузки. Будучи потрачено,
восполняется за счёт полосы пропускания в периоды, когда нагрузка ниже максимально разрешённой.
Последующие инструкции указывают, что трафик в пределах разрешённой полосы
с учётом допустимых превышений пропускается маршрутизатором (conform-action transmit),
а при превышении нагрузки и исчерпании excess_burst_size
приходящие пакеты данных сверх burst_size игнорируются (exceed-action drop).
Внешние скрипты
Ниже приведены примеры исполняемых файлов. Предполагается, что
созданы правила firewall для событий
Установление ширины,
Изменение ширины и
Снятие ограничений,
и для каждого из них заданы параметры скрипта в формате:
UID UIP UBITS UMASK BANDWIDTH [0|1|2]
Первые пять параметров представляют собой переменные. При вызове скрипта
они будут заменены своими значениями:
| UID | идентификатор пользователя |
| UIP | адрес пользователя; |
| UMASK | маска сети; |
| UBITS | количество бит в маске сети; |
| BANDWIDTH | текущая скорость соединения. |
В качестве последнего параметра надо указать значение 0, 1 или 2 в зависимости от типа события:
0 Снятие ограничений;
1 Установление ширины;
2 Изменение ширины.
Пример для программного шейпера iproute2 под ОС GNU/Linux.
Предполагается, что предварительно выполнены следующие команды:
tc qdisc add dev eth0 root handle 1: htb
создана очередь (
qdisc,
queueing discipline),
ассоциированная со входящим интерфейсом
eth0,
имеющая идентификатор
1. Для очереди выбран метод упорядочения
htb
(
Hierarchy Token Bucket), отличающийся простотой и высоким быстродействием.
tc class add dev eth0 parent 1: classid 1:1 htb rate 50mbit ceil 100mbit burst 200k
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit burst 20k
создан корневой класс очереди (
root class) с идентификатором
1:1,
имеющий гарантированную полосу пропускания 50 Мбит/сек (
rate 50mbit)
с возможностью повышения до 100 Мбит/сек при наличии незанятой пропускной способности
(
ceil 100mbit), пропускаемый всплесками размером по 200 Кб (
burst 200k).
Он будет использоваться как родительский для всех остальных классов и
распределять между ними полосу пропускания, предоставляя им возможность
занимать (
borrow) друг у друга неиспользуемую часть.
Также создан класс с идентификатором
1:10, имеющий полосу пропускания 1 Мбит/сек
без возможности превышения, и предназначенный для пропускания
трафика неопределённой принадлежности из очереди.
tc filter add dev eth0 parent 1: protocol ip prio 3 handle 1 fw classid 1:10
создан фильтр, направляющий неклассифицированные пакеты трафика из очереди
в класс с наименьшей пропускной способностью.
В дальнейшем при вызове скрипта по событию Установление ширины
происходит следующее:
- создаётся правило iptables, помечающее входящие пакеты трафика, направленные на данный IP-адрес
(исходящий трафик при необходимости шейпируется аналогично, для чего надо создать отдельное правило);
- создаётся новый фильтр, отправляющий помеченные таким образом пакеты в новый класс;
- создаётся новый класс с указанной пропускной способностью.
По событию
Изменение ширины происходит изменение пропускной способности класса,
а по событию
Снятие ограничений удаление самого класса, соответствующего
фильтра и правила
iptables.
Трафик, не подпадающий под фильтры (т.е. принадлежащий пользователям, для которых
шейпирование не настроено), не ставится в очередь, а пропускается непосредственно.
Содержимое исполняемого файла:
#!/bin/bash
if="eth0"
echo $*
echo "First create: tc qdisc add dev $if root handle 1: htb"
case "$6" in
0)
iptables -t mangle -D FORWARD -s 0/0 -d $2/$3 -j MARK --set-mark $1
tc filter del dev $if parent 1: protocol ip prio 3 handle $1 fw classid 1:$1
tc class del dev $if parent 1:1 classid 1:$1 htb rate $5kbit burst 20k
;;
1)
iptables -t mangle -A FORWARD -s 0/0 -d $2/$3 -j MARK --set-mark $1
tc filter add dev $if parent 1: protocol ip prio 3 handle $1 fw classid 1:$1
tc class add dev $if parent 1:1 classid 1:$1 htb rate $5kbit burst 20k
;;
2)
tc class change dev $if parent 1:1 classid 1:$1 htb rate $5kbit burst 20k
;;
*)
echo "Usage: `basename $0` {UID UIP UBITS UMASK BANDWIDTH [0|1|2]}" >&2
exit 64
;;
esac
Пример исполняемого файла для программного шейпера dummynet под ОС FreeBSD:
При вызове скрипта по событию Установление ширины
создаётся канал (pipe) с ограниченной пропускной способностью,
а также правило, которое направляет входящий трафик данного пользователя
на интерфейсе em0 в созданный канал.
По событию Изменение ширины изменяется пропускная способность канала,
а по событию Снятие ограничений удаляется канал и соответствующее правило.
Скрипт работает корректно при многопроходном режиме обработки правил
(команда sysctl net.inet.ip.fw.one_pass должна возвращать значение 0).
#!/bin/sh case "$6" in
0)
/sbin/ipfw delete $1
/sbin/ipfw pipe delete $1
;;
1)
/sbin/ipfw pipe $1 config bw $5Kbit/s
/sbin/ipfw add $1 pipe $1 ip from any to $2/$3 via em0
;;
2)
/sbin/ipfw pipe $1 config bw $5Kbit/s
;;
esac
Обсуждение статьи на форуме компании НетАП
Обсуждение статьи на форуме Nag.ru