Настройка дисциплины обслуживания трафика HTB (Hierarchical Token Bucket) на Linux

Инструкция по настройке дисциплины обработки трафика 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 основных этапа:

  1. Изменение очереди интерфейса на HTB;
  2. Определение классов трафика;
  3. Настройка фильтров для сопоставления трафика с его классом.

Настройка дисциплины выполняется с помощью утилиты 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 в качестве исходного или целевого:

tc filter add dev ens160 protocol ip parent 1: prio 1 u32 match ip dport 8000 0xffff flowid 1:8000
tc filter add dev ens160 protocol ip parent 1: prio 1 u32 match ip sport 8000 0xffff flowid 1:8000

Проверка настроек

Для начала на сервере настроим Firewall:

iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
iptables -A INPUT -p tcp --sport 8000 -j ACCEPT
iptables-save

Проверить настройки 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, в этом случае сервер генерирует пакеты, а клиент получает, таким образом мы можем проверить ширину канала на сервере.

Вывод на сервере:

-----------------------------------------------------------
Server listening on 8000
-----------------------------------------------------------
Accepted connection from X.X.X.X, port 46790
[  5] local X.X.X.X port 8000 connected to X.X.X.X port 16411
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  5]   0.00-1.00   sec   208 KBytes  1.70 Mbits/sec    0   22.8 KBytes
[  5]   1.00-2.00   sec   125 KBytes  1.03 Mbits/sec    0   22.8 KBytes
[  5]   2.00-3.00   sec   125 KBytes  1.03 Mbits/sec    0   22.8 KBytes
[  5]   3.00-4.00   sec   125 KBytes  1.03 Mbits/sec    0   22.8 KBytes
[  5]   4.00-5.00   sec   125 KBytes  1.03 Mbits/sec    0   22.8 KBytes
[  5]   5.00-6.00   sec   125 KBytes  1.03 Mbits/sec    0   22.8 KBytes
[  5]   6.00-7.00   sec   125 KBytes  1.03 Mbits/sec    0   22.8 KBytes
[  5]   7.00-8.00   sec   125 KBytes  1.03 Mbits/sec    2   15.7 KBytes
[  5]   8.00-9.00   sec  62.7 KBytes   514 Kbits/sec    0   15.7 KBytes
[  5]   9.00-10.00  sec   125 KBytes  1.03 Mbits/sec    0   15.7 KBytes
[  5]  10.00-10.11  sec  0.00 Bytes  0.00 bits/sec    0   15.7 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  5]   0.00-10.11  sec  1.24 MBytes  1.03 Mbits/sec    2             sender
[  5]   0.00-10.11  sec  1.24 MBytes  1.03 Mbits/sec                  receiver

Вывод на клиенте:

Connecting to host X.X.X.X, port 8000
Reverse mode, remote host X.X.X.X is sending
[  4] local X.X.X.X port 65214 connected to X.X.X.X port 8000
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-5.00   sec   605 KBytes   990 Kbits/sec
[  4]   5.00-10.00  sec   585 KBytes   958 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  1.24 MBytes  1.04 Mbits/sec    2             sender
[  4]   0.00-10.00  sec  1.24 MBytes  1.04 Mbits/sec                  receiver

iperf Done.



Средняя оценка: 5,0, всего оценок: 1