Шейпер трафика: режем скорость.


htb.init - это скрипт, который с помощью утилит ip, tc настраивает пропускную способность канала.
Адрес проекта HTB.init http://sourceforge.net/projects/htbinit/

Немного теории:



Шейпер может ограничивать только ИСХОДЯЩИЙ трафик, распределяя его по разным очередям.
Пакеты, не помещающиеся в очередь, отбрасываются. Данные из очереди выдаются на сетевой интерфейс и далее к клиенту.

Каждый конфигурационный файл описывает очередь, это заложено в самом названии файла, который имеет формат:
$HTB_PATH/<ifname>-<clsid>(:<clsid>).<description>
или если "по-русски":
$HTB_PATH/<Имя интерфейса>-<Номер класса>(:<Номер дочернего класса>).<Комментарий>

clsid - задается цифровыми значениями от 0x2 до 0xFFFF (записывается без приставки 0x)
Сам интерфейс описывается файлом только с именем ifname. Например:
eth0 имеет идентификатор класса clsid=0.
eth0-2 - основной (корневой) класс с clsid=2
eth0-2:3 - класс очереди clsid=3, унаследует ограничения от родительского clsid=2
eth0-2:3:4 - класс очередь clsid=4, унаследует ограничения от родительского clsid=3 и 2, т.е. накладываются еще более жесткие ограничения.
 

Параметры



- DEFAULT=30 : указывает номер класса, куда попадает трафик не попавший ни под одно правило.
R2Q=10 : точность шейпера.
RATE=5Mbit : выделенная (гарантированная) пропускная способность очереди, задается в Kbit, Mbit или bps (bytes per second)
CEIL=6MBit : максимальная пропускная способность очереди. если не указывать, то по умолчанию CEIL=RATE
BURST=<bytes> : количество байт без ограничения скорости
PRIO=<number> : приоритет трафика очереди к другим очередям в классе. Чем меньше число, тем выше приоритет. По умолчанию 0
LEAF=<параметр> правило распределения внутри самой очереди. default "none". LEAF=sfq - равномерное распределение между участниками очереди.
RULE= : правило, определяющее трафик, который должен проходить через данную очередь. В одном файле могут присутствовать сразу несколько правил.
RULE=[[source_addr][:port[/mask]],][destination_addr][:port[/mask]]
Если трафик попадает по условиям в очередь -2:10 (например где правило задано по маске), то дальше он уже не будет проверять условия в -2:20 (где допустим будет описано правило с конкретно этим ip), -2:30
MARK=<метка> : трафик имеющий метку. Например если надо ограничить исходящий трафик от клиента в лок. сети, находящегося за NATом, RULE не прокатит, нужно использовать MARK, и метить нужные пакеты в фаерволе примерно так:
iptables -t mangle -A PREROUTING -s 192.168.0.1 -j MARK –set-mark 101
TIME : временные параметры. TIME=18:00-06:00;256Kbit

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



Установка htb.init



Качаем скрипт htb.init который будет генерировать вам правила шейпера согласно созданным вами файлам конфигурации. Сайт проекта http://sourceforge.net/projects/htbinit/ .
Переименуем покороче скачанный скрипт, назовем например просто htb и поместим в директорию /usr/sbin. Разрешим выполнение этого скрипта:

chmod +x /usr/sbin/htb

По желанию можно добавить скрипт в автозагрузку системы, например добавив в rc.local строку
/usr/sbin/htb start

Теперь надо создать директории и файлы необходимые для правильной работы скрипта.

mkdir /etc/sysconfig
mkdir /etc/sysconfig/htb
touch /var/cache/htb.init


Теперь можно приступать к написанию конфигурационных файлов нашего шейпера.
cd /etc/sysconfig/htb

На сервере имеется локалка на интерфейсе eth0, интернет на eth1. Используется NAT. Скорость интернет-канала 30Мбит\с. Необходимо обеспечить гарантированную скорость доступа по rdp (на сервере проброшены порты к некоторым компам) и ограничить скорость интернет для некоторых компьютеров в сети, при этом не ограничивая скорость в локалке (на сервере еще файлопомойка).


Создаем конфигурационные файлы:


 
Для входящего трафика:

sudo touch eth0 # Описываем интерфейс eth0
sudo nano eth0

DEFAULT=10 # метка на файл, создаваемый ниже, eth0-2:10.dfl
R2Q=100 # точность ограничений

sudo touch eth0-2.root # корневой класс
sudo nano eth0-2.root

RATE=100Mbit # гарантированная пропускная способность
CEIL=100Mbit # максимальная пропускная способность
BURST=15k # первые 15k без ограничений

sudo touch eth0-2:10.dfl # сюда попадает трафик, не попадающий ни в одно из правил ниже
sudo nano eth0-2:10.dfl

RATE=1024Kbit # гарантированная пропускная способность
CEIL=99Mbit # максимальная пропускная способность
LEAF=sfq # равномерное распределение между участниками очереди.

sudo touch eth0-2:20.rdp # гарантированный канал для rdp
sudo nano eth0-2:20.rdp

RATE=1Mbit # гарантированная пропускная способность
CEIL=2Mbit # максимальная пропускная способность
BURST=15k # первые 15k без ограничений
LEAF=sfq # равномерное распределение между участниками очереди.
RULE=*:3389, # Применять правило для трафика, у которого исходящий порт - rdp-порт

sudo touch eth0-2:30.87 # ограничиваем скорость для ip 10.10.10.87
sudo nano eth0-2:30.87

RATE=64Kbit # гарантированная пропускная способность
BURST=15k # максимальная пропускная способность
LEAF=sfq # равномерное распределение между участниками очереди.
MARK=87 # применять правило для пакетов, маркированных меткой 87

Для корректной работы надо добавить правило в фаервол:

sudo iptables -A FORWARD -d 10.10.10.87 -j MARK --set-mark 87
пакеты маркируются в цепочке форвард, поэтому на локалку это правило не действует.

sudo touch eth0-2:31.137 # ограничиваем скорость для ip 10.10.10.137
sudo nano eth0-2:31.137

RATE=64Kbit # гарантированная пропускная способность
BURST=15k # максимальная пропускная способность
LEAF=sfq # равномерное распределение между участниками очереди.
MARK=137 # применять правило для пакетов, маркированных меткой 137

Для корректной работы надо добавить правило в фаервол:

sudo iptables -A FORWARD -d 10.10.10.137 -j MARK --set-mark 137




Для исходящего трафика:

sudo touch eth1 # Описываем интерфейс eth1
sudo nano eth1

DEFAULT=10 # метка на файл, создаваемый ниже, eth1-2:10.dfl
R2Q=100 # точность ограничений

sudo touch eth1-2.root # корневой класс
sudo nano eth1-2.root

RATE=30Mbit
 # гарантированная пропускная способность
CEIL=30Mbit # максимальная пропускная способность
BURST=15k # первые 15k без ограничений

sudo touch eth1-2:10.dfl # сюда попадает трафик, не попадающий ни в одно из правил ниже
sudo nano eth1-2:10.dfl

RATE=256Kbit # гарантированная пропускная способность
CEIL=29Mbit # максимальная пропускная способность
LEAF=sfq # равномерное распределение между участниками очереди.

sudo touch eth1-2:20.rdp # гарантированный канал для rdp
sudo nano eth1-2:20.rdp

RATE=1Mbit # гарантированная пропускная способность
CEIL=2Mbit # максимальная пропускная способность
BURST=15k # первые 15k без ограничений
LEAF=sfq # равномерное распределение между участниками очереди.
RULE=*:3389 # Применять правило для трафика, у которого порт назначения - rdp-порт

sudo touch eth1-2:30.87 # ограничиваем скорость для ip 10.10.10.87
sudo nano eth1-2:30.87

RATE=64Kbit # гарантированная пропускная способность
BURST=15k # максимальная пропускная способность
LEAF=sfq # равномерное распределение между участниками очереди.
MARK=87 # применять правило для пакетов, маркированных меткой 87

Для корректной работы надо добавить правило в фаервол:
sudo iptables -t mangle -A PREROUTING -s 10.10.10.87 -j MARK --set-mark 87

sudo touch eth1-2:31.137 # ограничиваем скорость для ip 10.10.10.137
sudo nano eth1-2:31.137

RATE=64Kbit # гарантированная пропускная способность
BURST=15k # максимальная пропускная способность
LEAF=sfq # равномерное распределение между участниками очереди.
MARK=137 # применять правило для пакетов, маркированных меткой 137

Для корректной работы надо добавить правило в фаервол:
sudo iptables -t mangle -A PREROUTING -s 10.10.10.137 -j MARK --set-mark 137


Осталось запустить скрипт:



sudo htb compile # тест. можно посмотреть какие правила будут сформированы и ошибки, если есть.
sudo htb start # запуск
sudo htb stop # остановка
sudo htb restart # перезапуск после внесения изменений в файлы конфигурации

March 20, 2011