Ограничение пропускной способности канала с помощью CBQ

Автор - Byte ()
Версия - 0.2 (последняя редакция от 15.11.2002)

1.Введение

Как правило, при использовании одного канала в интернет для нескольких машин приходится ограничивать пропускную скорость канала. Зачастую для этих целей используют возможности прокси-серверов. Однако, таким образом не удается ограничить весь траффик. Одним из механизмов, позволяющих ограничивать траффик
полностью является CBQ (Class Based Queueing ).

2. Что откуда брать и термины

Шейпер - логические устройства, управляющие траффиком в физическом интерфейсе.
Скачиваем последнюю версию файла cbq.init с https://sourceforge.net/projects/cbqinit
Скачиваем последню версию утилит ip-routing2 с ftp://ftp.inr.ac.ru/ip-routing/
На самом деле можно ограничится только ip-routing2 и задавать правила, используя утилиту tc, однако
это громоздко и в данном документе не рассматривается.

3. Описание и настройка

Создаем (если еще не создан) /etc/sysconfig/cbq

При настройке CBQ оперируют понятиями классов трафика.
Имеется возможность классифицировать пользовательский траффик и управлять им, присваивая конкретному классу различные характеристики, такие как пропускная способность, приоритет, способ взаимодействия с другими классами.
Каждый класс трафика должен быть описан файлом в $CBQ_PATH каталоге (/etc/sysconfig/cbq по умолчанию) - один файл на класс.
Имена файлов конфигурации должны иметь следующий формат: cbq-<clsid>.<name>,
где <clsid> - двух-байтовый шестнадцатеричный номер в диапазоне <0002-FFFF> (который фактически является CBQ идентификатором класса) и <name> - название(имя) класса - любое имя, чтобы помочь Вам отличить файлы конфигурации. Для маленького количества классов возможно (и удобно) выбирать <clsid> так, чтобы напоминать о ширине полосы пропускания класса.
Пример допустимого имени конфигурации: cbq-1280.My_first_shaper
Файл конфигурации может содержать следующие параметры:

Параметры устройства:
DEVICE=<ifname>,<bandwidth>[,<weight>] - обязательные
К примеру
DEVICE=eth0,10Mbit,1Mbit
<ifname> - имя интерфейса, на котором Вы хотите контролировать траффик, к примеру eth0<bandwidth> - физичесая полоса пропускания устройства, например для сети стандарта Ethernet 10Mbit или 100Mbit, для arcnet 2Mbit.
<weight> - подстраиваемый параметр, который должен быфть пропорционален <bandwidth>. Как правило:
<weight> = <bandwidth> / 10

Если для одного интерфейса имеется большое количество классов, достаточно определить <bandwidth> [и <weight>] только однажды. Поэтому в других файлах достаточно определить DEVICE=<ifname>.

Параметры класса

RATE=<speed> - обязательный
К примеру
RATE=5Mbit

Полоса пропускания, определенная для класса (пропускная способность, определенная для данного класса). Можно
использовать Kbit, Mbit или bps, Kbps и Mbps в качестве суффиксов разрядности. Если разрядность не определена, по умолчанию используются bits/sec. Также обратите внимание, что bps означает байты в секунду, не биты.

WEIGHT=<speed> - обязательный
К примеру
WEIGHT=500Kbit Настраиваемый параметр, который должен быть прпорционален RATE. Как правило, WEIGHT ~= RATE / 10.


PRIO=<1-8> необязательный, по умолчанию 5. 1 - высший приоритет.
К примеру
PRIO=5

Приоритет трафика для класса. Чем выше номер, тем меньше приоритет. Приоритет 5 наилучший.

PARENT=<clsid> необязательный, по умолчанию не заданый
PARENT=1280

Определяет идентификатор родительского класса к которому Вы хотите чтобы принадлежал данный класс. Вы можете использовать LEAF=NONE для родительского класса как показано ниже. Используя этот параметр и тщательно структурируя файлы конфигурации, можно создать простые иерархические структуры классов CBQ. Упорядочивание важно в том плане, что родительские классы должны быть созданы до дочерних записей.

LEAF=none|tbf|sfq необязательный, по умолчанию "tbf"

Указывает скрипту прикреплять указанную структуру к CBQ классу. По умолчанию используется TBF. Обратите внимание, что прикрепляя TBF к CBQ классу формируется трафик, соотвествующий параметрам TBF и предотвращает занимание классом полосы пропускания родительского класса даже если BOUNDED установлено как "no".
Чтобы позволить классу заимствовать полосу попускания (не обеспечивает ограничение), необходимо установить LEAF как "none" или "sfq".
Если Вы хотите гарантировать (приблизительно) справедливое совместное использование полосы пропускания среди нескольких основных компьютеров в том же самом классе, то можно определить LEAF=SFQ чтобы установить SFQ струтуру в том же классе.

BOUNDED=yes|no - необязательный, по умолчанию "yes"

Если установлено "yes", то классу не позволяется заимствовать полосу пропускания у родительского класса в ситуации исчерпания лимита. Если установлено "no", то классу позволяется заимствовать полосу пропускания у родительского класса.

Примечание: Не забывайте установить LEAF в "none" или "sfq", в противном случае класс будет TBF, и не сможет
заимствовать неиспользуемую полосу пропускания у родительского класса.

ISOLATED=yes|no
необязательный, по умолчанию "no"

Если установлено в "yes", класс не будет предоставлять неиспользованную полосу пропускания дочерним классам.

TBF qdisc параметры

BUFFER=<bytes>[/<bytes>] необязательный, по умолчанию "10Kb/8"

Этот параметр управляет глубиной эстафетной области памяти. Другими словами - это максимальный размер пакета, который класс может послать. Дополнительная часть параметра используется для определения длины интервалов в размерах пакета, для которых сохраняется время передачи.

LIMIT=<bytes> - необязательный, по умолчанию "15Kb"

Этот параметр определяет максимальную длину раздела. Если очередь содержит большее количество данных, чем указано в LIMIT, прибывающие пакеты отбрасываются. Длина раздела определяет время ожидания очереди в случае перегрузки.

PEAK=<speed> - необязательный, по умолчанию не задано

Максимальная пиковая скорость для краткосрочного пакета в трафике. Позволяет вам контролировать абсолютную пиковую скорость
которую может послать класс, так как одиночный TBF, который пропускает 256Kbit/s, разрешил бы скорость 512Kbit в течении половины секунды или 1Mbit в чтечении четверти секунды.

MTU=<bytes> необязательный, по умолчанию "1500"

Максимальное количество байт, которые могут быть посланы сразу по физическому каналу. Этот параметр требуется если Вы определили параметр PEAK. Значение по умолчанию - для ethernet, для других типов может потребоваться изменение этого параметра.
Прмечание: Установка TBF как qdisc эффективно для предотвращения от заимствования классом полосы пропускания у родительского класса, потому что, даже если класс позволяет проходить большому количеству данных, тогда он будет иметь форму, соответствующую TBF.

SFQ qdisc параметры

SFQ правила организации очереди - простой способ для эффективного совместного использования полосы пропускания класса
для основных компьютеров. Поскольку зависимость стохастическая, то справедливость распределение только приблизительная, но будет
работать в большинстве случаев. Если Вы хотите "более справедливое" распределение (точное), то необходимо использовать
WRR (взвешенное коллективное письмо) или WFQ правила организации очереди. Обратите внимание, что SFQ не формирует любой трафик, а формирует траффик для CBQ класса, к которому прикреплен SFQ.

UANTUM=<bytes> - необязательный, по умолчанию не задан

Этот параметр должен быть установлен ниже чем MTU, для ethernet это 1500b, или (с MAC заголовком) 1514b - значение, которое используется в примерах Алексея Кузнецова.

PERTURB=<seconds> - необязательный, по умолчанию "10"

Период выполнения хеш-функции. Если неустановлен, никогда не будет производится реконфигурация мусора, что, верояно, Вы не хотите. Значение по умолчанию 10 секунд вероятно оптимальное.

Параметры фильтрации

RULE=[[saddr[/prefix]][:port[/mask]],][daddr[/prefix]][:port [/mask]]

Эти параметры составляют правила фильтрации "u32" трафика для каждого из классов. Вы можете использовать множественные поля RULE в конфигурации. Дополнительная маска порта должна использоваться опытными полдьзователями, которые понимают как как работает u32 фильтрация.

Примеры

RULE=10.1.1.0/24:80
определяет трафик для порта 80 в сети 10.1.1.0

RULE=10.2.2.5
определяет трафик для любого порта для одного компьютера 10.2.2.5

RULE=10.2.2.5:20/0xfffe
определяет трафик для портов 20 и 21 для хоста 10.2.2.5

RULE=:25,10.2.2.128/25:5000
весь траффик с порта 25 с адресом назначения 10.2.2.128-10.2.2.255 и портом назначения
5000 будет ограничен пропускной способностью шейпера.


RULE=10.5.5.5:80,
определяет трафик идущий с порта 80 на один компьютер 10.5.5.5

REALM=[srealm,][drealm]

Эти параметры устанавливают правила фильтрации маршутиризации которые классифицируют трафик согласно областям источника/адреса пакета. Для информации об областях см. справку Алексея Кузнецова по IP коммандым. Этот сценарий не определяет любые области, формируется "tc фильтр" командами если Вы должны классифицировать трафик по пути.
Область - любое десятичное число или строка, обычно ссылающаяся на вход в /etc/iproute2/rt_realms.
Примеры:

REALM=russia,internet
выбор трафка, идущего из области "russia" в область "internet"

REALM=freenet,
выбор трафика идущего из области "freenet"

REALM=10
выбор трафика, идущего в область 10

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

Рассмотрим несколько примеров. Для простоты примем следующую конфигурацию:
интерфейс eth1;
внешний канал 10 Мб.

Пример 1.

Необходимо ограничить трафик из канала извне на определенную машину, а локальный трафик пропускать с максимальной скоростью. Для этого необходимо создать два файла в директории /etc/sysconfig/cbq :

cbq-W.out
cbq-S.out
Первый (с большим приоритетом) описывает правила для случая "локальная машина- локальная машина".
Вот его содержимое:
DEVICE=ethO, 10Mbit, 1Mbit
RATE=10Mbit
WEIGHT= 1Mbit
PRIO=5
RULE= 192.168.0.0./24,192.168.0.2/32

В RULE - правило описывающее, что ограничение действует для пакетов только с нашей локальной сети на конкретную машину.
Второй файл содержит описание правил для случая "внешний канал - локальная машина":

DEVICE=ethO, 10Mbit, 1Mbit
RATE=8Kbit
WEIGHT=800
PRIO=5
RULE=192.168.0.2/32

Здесь стоит ограничение на 8Kbit для всех пакетов, не подпавших под правило первого, более приоритетного шейпера. Как вы можете заметить - в строке RULE только один адрес.
Такая сокращенная запись равносильна "RULE=0.0.0.0/0,192.168.0.2/32".
Если вам понадобится в правиле указать "все пакеты которые идут от машины 192.168.0.2", то вам необходимо написать "RULE=192.168.0.2," (Обратите внимание на запятую).

Пример 2.

Необходимо ограничить исходящий трафик с машины для всех кроме указанных сетей.
cbq-IO.out:
DEVICE=ethO, 10Mbit, 1Mbit
RATE=10Mbit
WEIGHT=1Mbit
PRIO=5
RULE=81.25.223.78/32,200.65.159.3/32
RULE=81.25.223.78/32,200.168.223.72/28
RULE=81.25.223.78/32,172.103.218.0/24

Пояснение: все пакеты адреса 81.25.223.78 на вышеперечисленные подсети пропускать с максимальной скоростью.
cbq-128-out:

DEVICE=ethO, 10Mbit, 1Mbit
RATE=128Kbit
WEIGHT=10Kbit
PRIO=5
RULE=209.192.223.78/32,

Все остальные пакеты с адреса 81.25.223.78 ограничиваются скоростью 128Kbit/s.

Пример 3.

Шейпер работает только на исходящий траффик. Для того, чтобы
ограничить траффик в двух направлениях, необходимо создать аналогичный
шейпер на втором физическом интерфейсе. Для примера рассмотрим вариант,
когда нам необходимо ограничить траффик в сторону клиента до 28Kbit, а траффик от клиента - до 128Kbit:

................................---------..............192.1 68.1.0 ...
ВНЕШНИЙ КАНАЛ ----- eth1-| linux |-eth0------[локальная сеть]
................................---------................... ...... ...

cbq-28.client-out
DEVICE=eth0,10Mbit,1Mbit
RATE=28Kbit
WEIGHT=2Kbit
PRIO=5
RULE=192.168.1.0/24


cbq-128.client-in
DEVICE=eth1,10Mbit,1Mbit
RATE=128Kbit
WEIGHT=10Kbit
PRIO=5
RULE=192.168.1.0/24,


Запускается механизм ограничения запуском скрипта cbq.init.
# cbq.init start

Соотвественно, останавливается:

# cbq.init stop

Чтобы механизм стартовал при перезагрузках надо прописать в /etc/rc.d/rc.local строчки:

if [ -x /etc/rc.d/cbq.init ]; then
. /etc/rc.d/cbq.init
fi


4. Источники

1. cbq.init
2. Bandwidth-Limiting-HOWTO
3. readme.cbq.rus, входящего в дистрибутив Black Cat.

Источник

free-templates.ru