The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Способы шейпирования трафика. RADIUS-атрибуты для Cisco и внешние скрипты под Linux и FreeBSD (cisco linux freebsd bandwidth limit shaper)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: cisco, linux, freebsd, bandwidth, limit, shaper,  (найти похожие документы)
From: NetUP Team <info@netup.ru.> Newsgroups: email Date: Mon, 30 Jun 2009 17:02:14 +0000 (UTC) Subject: Способы шейпирования трафика. RADIUS-атрибуты для Cisco и внешние скрипты под Linux и FreeBSD Общие положения Шейпирование - это ограничение полосы пропускания для абонентов сети передачи данных. По характеру ограничения оно может быть:
  • статическим (постоянным, т.е. зависящим только от тарифного плана);
  • динамическим (меняющимся в зависимости от объёмов израсходованного трафика, а также от времени суток). Регулировка полосы пропускания фактически происходит на маршрутизаторах трафика. В качестве таких устройств могут выступать PC-маршрутизаторы, маршрутизаторы Cisco, управляемые коммутаторы и т.п. Взаимодействие биллингового ПО с этими устройствами может происходить следующим образом: 1. Средствами внешних скриптов. По некоторому событию (например, при расходовании определённого количества трафика) биллинговая система запускает внешний скрипт управления шейпером, который меняет полосу пропускания (или, возможно, разрывает соединение). В параметрах скрипту обычно передаётся IP-адрес пользователя и новое значение установленной для него полосы пропускания. Скрипт вызывает внешние утилиты управления трафиком (например, tc из пакета iproute2 в случае Linux и ipfw в случае FreeBSD со включённой функциональностью dummynet). Для использования данных утилит может требоваться предварительная настройка операционной системы или стороннего ПО. 2. При помощи RADIUS-атрибутов (в случае услуг VPN и Dial-UP). В ответе на запрос аутентификации RADIUS-сервер может отсылать атрибут или набор атрибутов, определённый для данного абонента и данного NAS, и содержащий в себе инструкции по управлению пропускной способностью устанавливаемого соединения. В данном случае необходима поддержка этой возможности программным обеспечением со стороны NAS. Такой поддержкой обладают, в частности, маршрутизаторы Cisco. При данном способе управления полоса пропускания устанавливается в момент установления соединения, и её корректировка в зависимости от израсходованного трафика происходит не мгновенно при достижении определённого значения, а только при следующем соединении. Описанные способы регулировки полосы пропускания могут применяться как порознь, так и одновременно. Реализация в UTM5 Биллинговая система UTM5 предлагает следующий подход к шейпированию: 1. В случае шейпирования с помощью внешних скриптов, передаваемые скрипту параметры настраиваются на странице Правила firewall (в группе Настройки). Каждое правило ассоциировано с одним или несколькими событиями, при наступлении которых выполняется внешний скрипт с заданными параметрами. Путь к скрипту указывает переменная firewall_path в конфигурационном файле utm5_rfw.cfg. Среди параметров скрипта можно указывать переменные, выбирая их из выпадающего списка. При вызове скрипта вместо переменных подставляются их значения: IP-адрес пользователя, текущее значение полосы пропускания и т.д.
  • Статическое шейпирование можно реализовать с помощью правил, выполняемых, например, при наступлении события Включение Интернета.
  • Динамическое шейпирование (возможно при наличии модуля динамического шейпирования) осуществляется правилами, выполняемыми при наступлении событий Установление ширины, Изменение ширины и Снятие ограничений входящего (исходящего) канала. События первых двух типов происходят в тот момент, когда суммарное количество трафика за отчётный период переходит через границы, заданные на странице Динамическое шейпирование, а событие Снятие ограничений - при закрытии отчётного периода или при удалении сервисной связки. Если настроены разные границы для разных временных диапазонов, события любого типа могут также происходить при наступлении времени начала/окончания диапазона. 2. С помощью 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 IP UBITS UMASK BANDWIDTH [0|1|2] Первые пять параметров представляют собой переменные. При вызове скрипта они будут заменены своими значениями: UID - идентификатор пользователя IP - адрес пользователя; 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 IP 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 Источник: http://www.netup.ru/articles.php?n=40

  • << Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

    Обсуждение [ RSS ]
  • 1, madbug (?), 12:28, 17/02/2010 [ответить]  
  • +/
    UID IP UBITS UMASK BANDWIDTH [0|1|2] - не работает.
    Будет работать только
    UID UIP UBITS UMASK BANDWIDTH [0|1|2]
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру