Управление скоростью и приоритетом трафика с помощью iproute2
Введение
Данная статья по большому счету является вольным изложением ссылок, приведенных в конце этого документа. Однако она отличается более простым (я надеюсь) изложением материала и направлена прежде всего на практическое применение изложенных в ней истин. В этой статье не будет длинного объяснения теории и всех возможных способов применения утилиты tc. В ней будет краткое описание происходящего процесса и несколько примеров, которые можно сразу использовать в работе.
Любые изменения, дополнения и исправления ошибок в настоящей статье приветствуются. Только большая просьба — поменьше теории и больше практики :) Лично я считаю правильной ту документацию, которую можно сразу применить, а уж потом разбираться, как оно работает. Именно это и сподвигло меня на написание данного документа.
Что нам понадобится
Linux система :)
установленный пакет iproute2 и (для пользователей ALT Linux) пакет iproute2-htb (вопрос: является ли htb частью iproute2 или это самостоятельный модуль?)
Наиболее типичной схемой Linux маршрутизатора является машина с двумя интерфейсами, смотрящими в интернет (определим его как eth0/192.168.1.1) и во внутреннюю сеть (eth1/192.168.2.1). В качестве интернет-интерфейса используется aсинхронный DSL, что опзволит нам более детально показать принципы управления трафиком в боевых условиях. Ну и потому, что имеется наиболее толковая инструкция :)
Нашей задачей является контроль над трафиком в обеих направлениях. И если мы можем спокойно управлять очередью исходящих пакетов, поскольку те формируются (либо проходят) на нашем маршрутизаторе, то управлять очередью входящих пакетов мы можем лишь косвенно, например отбрасывая заведомо корректные tcp-пакеты. Устройство TCP таково, что при пересылке данных протокол шлет пакеты, пока они не начнут теряться. Этот момент определяется и тогда уменьшается окно протокола TCP — такое поведение длится на протяжении всей передачи данных, чтобы максимально использовать доступную полосу пропускания. Вообще насчет контроля входящей полосы пропускания у меня есть некоторые сомнения, будет ли способ работать достаточно хорошо для нужд интерактивных сервисов.
Также можно манипулировать извещениями о размере окна: при передаче по протоколу TCP получатель шлет отправителю поток пакетов-подтверждений (ACK). В такой ACK-пакет включается информация о размере окна, то есть о максимальном разрешенном количестве неподтвержденных пакетов. Управляя этим значением мы можем принудительно понизить скорость передачи источника. На данный момент не существует (свободной) Linux-реализации управления потоком такого типа.1непотвержденная информация
Контроль исходящего трафика
Реализация==
Создание корневой обработки очереди
Здесь и далее подразумеваются консольные команды. Для более простой настройки целесообразно создать скрипт, который выполнит все действия за раз. Итак, выполним команду вида:
Комментарии: qdisc – собственно обработка; add – команда создания. Также можно использовать del, show, change, replace и другие команды. Думаю, подробного описания не требуется; dev eth0 – указание, на каком устройстве мы будем использовать очередь; root – означает, что это корневая дисциплина обработки. Можно использовать и дочерние, но это выходим за рамки «простого» руководства; handle 1:0 – идентификатор обработки. Его младший номер всегда должен равняться нулю, поскольку это «ветка» в дереве классов и обработок, которая «растет» прямо от родительского ствола. htb – тип обработки. Их существует немало, но на описание их всех у меня просто не хватит образованности. Да, для обработки типа HTB могут существовать только HTB классы. default 11 – означает, что весь трафик, не попадающий ни под один фильтр, будет направлять в класс с указанным идентификатором. Как создавать классы и фильтры, будет рассмотрено ниже.