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