Инструкция по настройке дисциплины обработки трафика HTB (Hierarchical Token Bucket) на виртуальных серверах под управлением операционных систем семейства Linux.
Что это такое?
Для управления трафиком можно использовать не только сетевое оборудование, но и возможности ядра Linux. Основным механизмом управления трафиком является применение дисциплин обслуживания, например: бесклассовые - fifo, fifo_fast, TBF, классовые - HTB, CBQ, PRIO.
Что такое HTB?
Дисциплина обслуживания HTB один из нескольких способов реализации QoS в Linux, помогает контролировать использование исходящей полосы пропускания на линии. Т.е. вы можете самостоятельно контролировать скорость исходящего от вас трафика. Позволяет использовать один физический канал для имитации нескольких более медленных виртуальных каналов и для отправки различных видов трафика. Вы указываете, как разделить физический канал на виртуальные и какой именно канал использовать для конкретного пакета.
HTB формирует объем информации на основе алгоритма Token Bucket Filter, который не зависит от характеристик интерфейса, поэтому значение основной полосы пропускания не важно.
Лучшее объяснение работы дисциплины HTB, которое можно привести, - представить себе ведро фиксированного размера, в которое поступают потоки трафика (пакеты). Это ведро может выпускать сетевой трафик с заданной скоростью. Каждый пакет проверяется на соответствие определенному классу иерархии, и соответственно настроенным правилам выпускается из ведра.
Настройка HTB
Настройка HTB имеет 3 основных этапа:
- Изменение очереди интерфейса на HTB;
- Определение классов трафика;
- Настройка фильтров для сопоставления трафика с его классом.
Настройка дисциплины выполняется с помощью утилиты tc, в общем виде команда выглядит так:
tc qdisc add dev <интерфейс> root handle x:y htb
Параметр | Значение |
qdisc | Дисциплина обслуживания для интерфейса (htb, tbf) |
handle | Набор дескрипторов x:, где x - целое число, идентифицирующее дисциплину обслуживания |
Настроим интерфейс ens160 на использование очереди HTB:
tc qdisc add dev ens160 root handle 1: htb
В общем виде команда настройки класса выглядит так:
tc class add dev <интерфейс> parent x:y classid x:y htb rate <скорость>
Параметр | Значение |
class | Определение класса трафика |
parent | Набор дескрипторов x:y, где x - целое число, идентифицирующее дисциплину обслуживания, a y - целое число, идентифицирующее родительский класс |
classid | Набор дескрипторов x:y, где x - целое число, идентифицирующее дисциплину обслуживания, a y - целое число, идентифицирующее новый класс |
rate | Уровень скорости поступления токенов |
Определим класс трафика, который будет иметь скорость передачи до 1 Мбит:
tc class add dev ens160 parent 1: classid 1:8000 htb rate 1Mbit
В общем виде команда настройки фильтра выглядит так:
tc filter add dev <интерфейс> protocol <протокол> parent x:y prio <классификатор> match ip dport <порт> 0xffff flowid x:y
Параметр | Значение |
filter | Определение фильтра |
protocol | Имя протокола |
parent | Набор дескрипторов x:y, где x - целое число, идентифицирующее дисциплину обслуживания, a y - целое число, идентифицирующее родительский класс |
prio | Номер приоритета и имя классификатора (например, u32) |
dport | Номер порта |
flowid | Набор дескрипторов x:y, где x - целое число, идентифицирующее дисциплину обслуживания, a y - целое число, идентифицирующее класс, с которым соотнести пакет. |
Создадим фильтры для трафика, который имеет порт 8000 в качестве исходного или целевого:
Проверка настроек
Для начала на сервере настроим Firewall:
Проверить настройки htb шейпера можно с помощью утилиты iperf3. Скачать ее на Windows можно с официального сайта. Она будет доступна для работы в командной строке cmd. Для установки на Linux выполните следующие команды:
sudo apt-get install iperf3
Также установку необходимо произвести на сервере.
На сервере выполните команду, которая будет прослушивать порт 8000:
sudo iperf3 -s -p 8000
На клиенте выполним команду генерации исходящего объема информации htb:
iperf3 -c <ip-адрес сервера> -p 8000 -i 5 -R
Примечание: при использовании ключа -R сервер работает в режиме reverse, в этом случае сервер генерирует пакеты, а клиент получает, таким образом мы можем проверить ширину канала на сервере.