CBQ представляет собой систему ограничения трафика по скорости. Это
распространенный шейпер для Linux систем.
Данное описание составлено на основе перевода оригинальной
документации с английского языка.
Простейший трафик шейпер
Для начала рассмотрим простейший случай настройки. По личному опыту —
обычно больше и не надо.
Сама по себе система CBQ представляет собой один исполняемый файл.
Обычно он называется cbq.init и расположен в папке /etc/rc.d. Запуск
осуществляется командой `/etc/rc.d/cbq.init start` а остановка
`/etc/rc.d/cbq.init stop`. Также можно ввести команду
`/etc/rc.d/cbq.init restart` для перезапуска.
Настройка CBQ производится с помощью написания файлов конфигурации
шейперов. Файлы эти обычно располагаются в папке /etc/sysconfig/cbq и
должны иметь имена следующего формата:
cbq-<cbq_id>.
, где:
«cbq-» — эта часть имени обязательна.
<cbq_id> — номер шейпера в системе. Это должно быть шестнадцатеричное
число в диапазоне 2-FFFF (номера 0 и 1 зарезервированы).
— название шейпера. На ваше усмотрение.
Примеры:
cbq-20.director-internet
Cbq-FE03.godzilla
Каждый файл должен содержать строки:
DEVICE=,{Mbit|Kbit|bps}
RATE={Mbit|Kbit|bps}
WEIGHT={Mbit|Kbit|bps}
RULE=[from_addr[/mask][:port],][to_addr[/mask][:port]]
…
DEVICE — описание интерфейса
— наименование интерфейса. В Linux’е обычно eth0,
eth1, eth2… или ppp0, ppp1…
— скорость интерфейса
Есть одна тонкость — шейпер может ограничивать только трафик исходящий
с указанного интерфейса. Если надо ограничить входящий трафик —
напишите еще один файл с другим интерфейсом. И еще — если в одном
файле указали «DEVICE=eth0,10Mbit», то в остальных файлах для этого
интерфейса можно писать просто «DEVICE=eth0».
RULE и WEIGHT — параметры шейпера.
— лимит скорости
— погрешность лимита. То есть ограничиваемая скорость будет максимум
RATE+WEIGHT, а как правило — не выше RATE. Обычно величина
WEIGHT принимается 1/10 от RATE.
RULE — это указание от кого к кому (имеются в виду IP-адреса и порты)
работает данное ограничение.
Проще всего понять на примерах:
RULE=192.168.1.0/24:80,81.95.224.64/26:80
ограничивает трафик от подсети 192.168.4.0/24 (адреса
192.168.4.1-192.168.4.254) до подсети 81.95.224.64/26 (адреса
81.95.224.64 — 81.95.224.126) по порту 80 (HTTP).
RULE=192.168.2.1:21,10.0.1.0/24:2021
ограничивает трафик, который идет с порта 21 адреса 192.168.2.1 на
порт 2021 до порта 2021 любого компьютера подсети 10.0.1.0/24 (адреса
10.0.1.1 — 10.0.1.254).
RULE=192.168.4.5:25,
ограничивает весь трафик идущий с адреса 192.168.4.5 по порту 25 куда
угодно (обратите внимание — запятая в конце обязательна).
RULE=192.168.5.0/25:110
ограничивает весь трафик идущий на компьютеры подсети 192.168.5.0/25
(адреса 192.168.5.1 — 192.168.5.126) по порту 110 откуда угодно
(обратите внимание — запятая в начале не нужна).
В файле может быть несколько параметров RULE. При этом ограничивается
трафик по всем RULE сразу, а не для каждого отдельно.
Примеры файлов конфигурации:
Пример 1.
DEVICE=eth0,10Mbit
RATE=64Kbit
WEIGHT=6Kbit
RULE=192.168.1.0/24:8080,10.10.10.0/28:8080
RULE=192.168.75.3,81.95.224.30
Пример 2.
DEVICE=ppp1,56Kbit
RATE=32Kbit
WEIGHT=3Kbit
RULE=192.168.2.2
Трафик, не попадающий ни под одно правило, описанное в файлах — не
ограничивается.
Немного теории
Шейпер работает так: все ИСХОДЯЩИЕ пакеты, т.е. предназначенные для
выдачи на любой интерфейс вместо того, чтобы быть отправляться
напрямую на интерфейс ставятся в разные очереди. Длина каждой очереди
настраивается. Настраиваются также: скорость выдачи данных из очереди
(это и есть собственно лимит), длина очереди (размер в байтах), размер
пакета, выходящего из очереди (может не совпадать с длиной поступающих
пакетов) и многое другое. Пакеты, не помещающиеся в очередь,
сбрасываются. Данные из очереди выдаются на интерфейс и далее — к
клиенту. Вот как раз каждый файл конфигурации и представляет собой
описание одной очереди.
CBQ позволяет также строить иерархические системы очередей. Каждая
очередь может брать данные из выхода другой очереди. Таким образом
очередь может быть дочерней для одной очереди и родительской для
многих других.
Для правильной работы очереди нужно знать следующие данные:
А) Какие пакеты направлять в очередь, а именно:
— пришедшие от каких адресов/портов;
— предназначенные для каких адресов/портов;
— предназначенные для выдачи на какой интерфейс.
Б) Параметры самой очереди, а именно:
— размер очереди в байтах;
— скорость выдачи данных из очереди;
— приоритет очереди;
— размер пакета, выдаваемого из очереди;
— и т.д.
Очереди бывают следующих классов:
— очереди без определенного класса (класс NONE). Если такая очередь
переполняется, то пакеты, не вмещающиеся в нее, остаются в
родительской очереди (если она есть), а если и она переполняется, то
данные, предназначенные для нее, остаются в ее родительской очереди, а
когда и та переполняется — в родительской очереди еще более высокого
уровня и т.д. И только если переполняется самая верхняя очередь
(класса CBQ), то пакет сбрасывается. Однако процесс можно регулировать
параметрами BOUNDED и ISOLATED.
— CBQ — это очереди самого верхнего уровня (они все имеют cbq_id,
равный 1). Их бывает по одной на каждый интерфейс. Создаются
автоматически. В каждую записываются пакеты, предназначенные для
данного интерфейса. Нельзя самому назначать параметры для таких
очередей.
— TBF — очереди со строгим ограничением (термин мой). Пакеты, не
помещающиеся в очередь, просто сбрасываются. Поведение очереди
определяется ее собственными [5]параметрами и от родительской никак не
зависит.
— SFQ — очереди со справедливым распределением (термин мой). В этом
типе очередей лимит родительской очереди распределяется среди дочерних
по особому математическому закону для более справедливого и
равномерного распределения.
Можно создать очередь, динамически меняющую скорость выдачи информации
в зависимости от дня недели и времени суток.
В общем это можно представить как водопроводную систему. На входе —
краны (очереди класса CBQ). Затем трубы разных диаметров и длины.
Длина трубы символизирует в нашем случае размер очереди, а ее диаметр
— скорость выдачи информации. На некоторых трубах есть клапаны на
входе или выходе (параметры BOUNDED/ISOLATED). На трубах также могут
быть вентили (с регулировкой в зависимости от времени суток и дня
недели)(параметры TIME).
Продвинутая настройка
Рассмотрим теперь подробно ВСЕ возможные параметры конфигурационных
файлов.
Интерфейс
DEVICE=,[,] — описание устройства, параметр обязательный
— наименование интерфейса. В Linux’е обычно eth0, eth1, eth2… или ppp0, ppp1…
— скорость интерфейса (10Mbit, 56Kbit, 2Mbit …)
— вес интерфейса (обычно 10% от )
Примечание: — если в одном файле указали «DEVICE=eth0,10Mbit,1Mbit»,
то в остальных файлах для этого интерфейса можно писать просто
«DEVICE=eth0»
Еще раз напомню, что шейпер ограничивает только трафик, исходящий с
данного интерфейса.
Общие параметры для всех классов очередей
RATE={Mbit|Kbit|bps} — скорость выдачи данных с очереди, параметр обязательный
Примеры:
RATE=10Mbit (10 Мбит/с)
RATE=128Kbit (123 Кбит/с)
RATE=3600bps (3600 байт/с) ********** Не бит/с **********
———-
WEIGHT={Mbit|Kbit|bps} — вес шейпера. Обычно 10% от RATE
Примеры:
WEIGHT=1Mbit (1 Мбит/с)
WEIGHT=12Kbit (12 Кбит/с)
WEIGHT=360bps (360 байт/с) ********** Не бит/с **********
RULE=[[saddr[/prefix]][:sport[/mask]],][daddr[/prefix]][:dport[/mask]]
Это фильтр, определяющий, для каких пакетов используется данная
очередь. Параметр обязательный. Он управляет т.н. «u32 filter rules».
saddr — адрес источника (IP).
prefix — маска подсети источника. Указывается не маска в формате
xxx.xxx.xxx.xxx, а число вкл. бит (32-1).
24 соответствует 255.255.255.0, 16 — 255.255.0.0 и т.д.
daddr/prefix — аналогично для адреса назначения.
sport — порт источника (0-65535).
mask — маска для порта (нужна, если надо указать не один порт
, а диапазон протов). Это шестнадцатеричное число формата
0x**** (например 0xfffe — маска на два порта, 0xff00 — на
256 портов). Вообще число портов подряд равно 0xffff минус mask.
dport/mask — аналогично для порта назначения.
Примеры:
RULE=10.1.1.0/24:80
RULE=10.2.2.5
RULE=10.2.2.5:20/0xfffe
RULE=10.5.5.5:80,
RULE=:25,10.2.2.128/26:5000
RULE=192.168.1.0/24:80,81.95.224.64/26:80
Примечание: В файле может быть несколько параметров RULE. При
этом ограничивается трафик по всем RULE сразу, а не для каждого отдельно.
———-
TIME=[,, …,/]-;/[/]
Эти параметры (их может быть несколько в одном файле) дают возможность
назначить разные лимиты скорости в зависимости от дня недели и времени
суток.
— дни недели (0-7, 0=воскресение). Если лимит
действует для нескольких дней, перечислите их
через запятую. Если не указано, то лимит действует на все дни.
— интервал времени в формате ЧЧ:MM-ЧЧ:MM. Указывать обязательно.
— лимит скорости для данного периода (Mbit|Kbit|bps). См. RATE. Указывать обязательно.
— вес лимита для данного периода (Mbit|Kbit|bps). См. WEIGHT. Указывать обязательно.
— пик скорости для данного периода (Mbit|Kbit|bps). См. PEAK. Указывать необязательно.
Примеры:
TIME=0,1,2,5/18:00-06:00;256Kbit/25Kbit
TIME=18:00-06:00;256Kbit/25Kbit
Примечания: 1. Если интервалы времени перекрываются, действует тот,
который описан последним.
2. Если текущее время не попадает ни под одну строку TIME,
используются глобальные параметры RATE, WEIGHT и PEAK
3. Для того, чтобы это все действовало необходимо выполнять команду
`/etc/rc.d/cbq.init timecheck` каждую минуту (если с точностью до минут
надо менять шейпер).
———-
REALM=[srealm,][drealm] — Параметр управляет т.н. «route filter rules».
Параметр необязательный.
srealm и drealm — это должны быть десятичные числа или соответствующие им
строковые значения из файла /etc/iproute2/rt_realms.
Примеры:
REALM=russia,internet от russia до internet
REALM=10 до 10 от всех
REALM=freenet, от freenet до всех
REALM=internet,5 ot internet до 5
———-
MARK= — управляет т.н. «fw filter rules». Параметр необязательный.
— десятичное число — тег для пакетов.
Пример:
MARK=15
Примечание: В одном файле может быть несколько строк MARK.
———-
PRIO= — приоритет шейпера (1-8). 1- максимальный
приоритет. Необязательный параметр. Если не
указать — по умолчанию 5.
Пример:
PRIO=3
———-
PARENT= — номер родительской очереди. Необязательный
параметр. Если не указать — данные берутся
напрямую с очереди типа CBQ соответствующего интерфейса.
Пример:
PARENT=3F00
Примечание: родительская очередь должна быть описана раньше, чем
дочерние. По видимому это означает, что номер ее должен быть меньше.
———-
LEAF=none|tbf|sfq — класс очереди. Можно создавать очереди
класса TBF или SFQ, а также очереди без
класса. Указывать необязательно, по умолчанию tbf.
Пример:
LEAF=sfq
———-
BOUNDED=yes|no — ограничение. Если поставить yes, то пакеты при переполнении
очереди не остаются в родительской, а сбрасываются. Указывать необязательно, по умолчанию yes
Пример:
BOUNDED=yes
Примечание: Для TBF — очередей всегда yes (даже если прямо указать no).
———-
ISOLATED=yes|no — изоляция. Если поставить yes на родительской очереди,
то все дочерние будут работать как будто у них BOUNDED=yes, то есть
без резервирования. Указывать необязательно, по умолчанию «no»
Пример:
ISOLATED=yes
Параметры для очередей класса TBF
LIMIT=[{Mb|Kb}] — длина очереди в мегабайтах (Mb),
килобайтах (Kb) или в байтах, если не указана единица.
Указывать необязательно, по умолчанию 15Kb.
Примеры:
LIMIT=10Kb
LIMIT=1Mb
LIMIT=65535
———-
PEAK={Mbit|Kbit|bps} — максимальная пиковая скорость выдачи информации
из очереди. Только на короткое время. Параметр необязателен.
Примеры:
PEAK=10Mbit (10 Мбит/с)
PEAK=128Kbit (123 Кбит/с)
PEAK=3600bps (3600 байт/с) ********** Не бит/с **********
———-
MTU= — размер выходного пакета, исходящего из очереди.
Необязательный параметр, если не указать, то такой, как MTU на интерфейсе
(для Ethernet — 1500). Имеет смысл указывать, когда задан параметр PEAK.
Пример:
MTU=1024
———-
BUFFER=[{Mb|Kb}][/] — размер буфера.
— Это максимальное число байт (Кбайт, Мбайт), которое
может быть выдано из очереди за один раз.
— я не понял. В оригинале — parameter is used to
determine the Length of intervals in packet sizes,
for which the transmission times are kept.
Параметр указывать необязательно, по умолчанию 10Kb/8.
Параметры для очередей класса SFQ
QUANTUM= — значение не может быть меньше MTU. Что означает — не знаю.
В оригинале тоже ничего не сказано. Это необязательный параметр.
Пример:
QUANTUM=1514
———-
PERTURB= — период пертурбации hash-функции в секундах.
По умолчанию 10. Если не указать, пертурбация никогда не происходит.
Назначение непонятно.
Пример:
PERTURB=15
Еще раз хочу напомнить, что настройки каждого файла действуют только
на трафик, исходящий с интерфейса, описанного в параметре DEVICE.