Google
 
Web avtobazar.com.ua

Использование CBQ для ограничения трафика в Linux


   CBQ  представляет  собой  систему ограничения трафика по скорости. Это
   наиболее  распространенный  вариант  шейпера  (в  RedHat вроде бы даже
   включен   в  дистрибутив).  К  сожалению,  может  ограничивать  только
   исходящий трафик с компьютера, на котором установлен.

   Данное   описание   составлено   на  основе  перевода  оригинальной
   документации  с  английского  языка.  Переводил  его я в меру своих
   способностей. Может где и ошибся.

   Итак начнем.


Для самых маленьких

   Для  начала рассмотрим простейший случай настройки. По личному опыту -
   обычно больше и не надо.

   Сама  по  себе  система  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>.<name>
   
   
   , где:

   "cbq-"    - эта часть имени обязательна.

   <cbq_id>  - номер шейпера в системе. Это должно быть шестнадцатеричное 
               число в диапазоне 2-FFFF (номера 0 и 1 зарезервированы).

   <name> - название шейпера. На ваше усмотрение.

   Примеры: 
   
           cbq-20.director-internet
           Cbq-FE03.godzilla


   Каждый файл должен содержать строки:

           DEVICE=<if-name>,<bandwidth>{Mbit|Kbit|bps}
           RATE=<speed>{Mbit|Kbit|bps}
           WEIGHT=<weigth>{Mbit|Kbit|bps}
           RULE=[from_addr[/mask][:port],][to_addr[/mask][:port]]
           ...


   DEVICE  - описание интерфейса

   <if-name>  - наименование интерфейса. В Linux'е обычно eth0,
       eth1, eth2... или ppp0, ppp1...

   <bandwidth> - скорость интерфейса
       Есть одна тонкость - шейпер может ограничивать только трафик исходящий
       с  указанного  интерфейса.  Если  надо  ограничить  входящий  трафик -
       напишите  еще  один  файл  с  другим интерфейсом. И еще - если в одном
       файле  указали  "DEVICE=eth0,10Mbit",  то в остальных файлах для этого
       интерфейса можно писать просто "DEVICE=eth0".

   RULE и WEIGHT -  параметры шейпера.

   <speed>  - лимит скорости

   <weigth>  - погрешность лимита. То есть ограничиваемая скорость будет максимум 
      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=<if-name>,<bandwidth>[,<weight>] - описание устройства, параметр обязательный

   <if-name>  - наименование интерфейса. В Linux'е обычно eth0, eth1, eth2... или ppp0, ppp1...

   <bandwidth> - скорость интерфейса (10Mbit, 56Kbit, 2Mbit ...)

   <weigth>  - вес интерфейса (обычно 10% от <bandwidth>)

   Примечание:  -  если в одном файле указали "DEVICE=eth0,10Mbit,1Mbit",
   то  в  остальных  файлах  для  этого  интерфейса  можно  писать просто
   "DEVICE=eth0"

   Еще  раз  напомню,  что шейпер ограничивает только трафик, исходящий с
   данного интерфейса.



Общие параметры для всех классов очередей

   RATE=<speed>{Mbit|Kbit|bps} - скорость выдачи данных с очереди, параметр обязательный

   Примеры:

           RATE=10Mbit (10 Мбит/с)
           RATE=128Kbit (123 Кбит/с)
           RATE=3600bps (3600 байт/с) ********** Не бит/с **********


   ----------
   WEIGHT=<speed>{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=[<dow>,<dow>, ...,<dow>/]<from>-<till>;<rate>/<weight>[/<peak>]

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

   <dow>  - дни недели (0-7, 0=воскресение). Если лимит
        действует для нескольких дней, перечислите их
        через запятую. Если не указано, то лимит  действует на все дни.

   <from-till> - интервал времени в формате ЧЧ:MM-ЧЧ:MM. Указывать обязательно.

   <rate>  - лимит скорости для данного периода (Mbit|Kbit|bps). См. RATE. Указывать обязательно.

   <weight> - вес лимита для данного периода (Mbit|Kbit|bps). См. WEIGHT. Указывать обязательно.

   <rate>  - пик скорости для данного периода (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=<mark> - управляет т.н. "fw filter rules". Параметр необязательный.

   <mark> - десятичное число - тег для пакетов.

   Пример:

           MARK=15


   Примечание: В одном файле может быть несколько строк MARK.


   ----------
   PRIO=<1-8> - приоритет шейпера (1-8). 1- максимальный
      приоритет. Необязательный параметр. Если не
      указать - по умолчанию 5.

   Пример:

           PRIO=3


   ----------
   PARENT=<2-FFFF> - номер родительской очереди. Необязательный
        параметр. Если не указать - данные берутся
        напрямую с очереди типа 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=<bytes>[{Mb|Kb}] - длина очереди в мегабайтах (Mb),
        килобайтах (Kb) или в байтах, если не указана единица.
        Указывать необязательно, по умолчанию 15Kb.

   Примеры:

           LIMIT=10Kb
           LIMIT=1Mb
           LIMIT=65535


   ----------
   PEAK=<speed>{Mbit|Kbit|bps} - максимальная пиковая скорость выдачи информации 
        из очереди. Только на короткое время. Параметр необязателен.

   Примеры:

           PEAK=10Mbit (10 Мбит/с)
           PEAK=128Kbit (123 Кбит/с)
           PEAK=3600bps (3600 байт/с) ********** Не бит/с **********


   ----------
   MTU=<bytes> - размер выходного пакета, исходящего из очереди.
      Необязательный параметр, если не указать, то такой, как MTU на интерфейсе
      (для Ethernet -  1500). Имеет смысл указывать, когда задан параметр PEAK.

   Пример:

           MTU=1024


   ----------
   BUFFER=<depth>[{Mb|Kb}][/<interval>] - размер буфера.

   <depth> - Это максимальное число байт (Кбайт, Мбайт), которое
       может быть выдано из очереди за один раз.

   <interval> - я не понял. В оригинале - parameter is used to
       determine the Length of intervals in packet sizes,
       for which the transmission times are kept.

   Параметр указывать необязательно, по умолчанию 10Kb/8.


Параметры для очередей класса SFQ

   QUANTUM=<bytes> - значение не может быть меньше MTU. Что означает - не знаю.
      В оригинале тоже ничего не сказано. Это необязательный параметр.

   Пример:

           QUANTUM=1514


   ----------
   PERTURB=<seconds> - период пертурбации hash-функции в секундах. 
      По умолчанию 10. Если не указать, пертурбация никогда не происходит. 
      Назначение непонятно.

   Пример:

           PERTURB=15


   Еще  раз  хочу напомнить, что настройки каждого файла действуют только
   на трафик, исходящий с интерфейса, описанного в параметре DEVICE.