Инструкция по настройке дисциплины обработки трафика TBF (Token Bucket Filter) на виртуальных серверах под управлением операционных систем семейства Linux.
Что это такое?
Для управления трафиком можно использовать не только сетевое оборудование, но и возможности ядра Linux. Основным механизмом управления трафиком является применение дисциплин обслуживания, например: бесклассовые - fifo, fifo_fast, TBF, классовые - HTB, CBQ, PRIO.
Что такое TBF?
Token Bucket Filter - это бесклассовая дисциплина обслуживания, доступная для управления трафиком с помощью команды tc. Дисциплина tbf пропускает только пакеты, которые не превышают некоторую установленную скорость, но с возможностью разрешить короткие всплески, превышающие эту скорость.
Реализация TBF состоит из буфера (bucket), постоянно заполненного некоторыми виртуальными фрагментами информации, называемыми токенами, с определенной скоростью (rate). Самым важным параметром буфера является его размер, то есть количество токенов, которые он может хранить. Также есть очередь поступающих данных.
Каждый прибывающий токен берет один входящий пакет данных из очереди данных и затем удаляется из ведра. Этот алгоритм дает три возможных сценария:
- Данные поступают в очередь со скоростью, равной скорости входящих токенов. В этом случае каждый входящий пакет имеет свой токен и передача данных происходит без задержки.
- Данные поступают в очередь со скоростью, меньшей, чем скорость токенов. Каждый входящий пакет имеет свой токен, но при этом они накапливаются, вплоть до размера ведра. Затем эти токены могут использоваться для отправки данных со скоростью, превышающей стандартную скорость токена, в случае возникновения коротких пакетов данных.
- Данные поступают в очередь со скоростью, большей, чем скорость токенов. Для поступающих пакетов данных не будет хватать токенов, что приведет к задержке отправления на некоторое время. Это называется «чрезмерной ситуацией». Если доступный объем очереди будет заполнен, поступающие пакеты будут отбрасываться.
Настройка TBF
Настройка дисциплины tbf выполняется с помощью утилиты tc, в общем виде команда выглядит так:
tc qdisc add dev <интерфейс> root tbf rate <скорость> latency <время> burst <размер ведра>
Параметр | Значение |
qdisc | дисциплина обслуживания для интерфейса |
latency | максимальное время, которое может провести поступивший пакет данных в очереди |
burst | размер ведра в байтах |
rate | уровень скорости поступления токенов |
Пример:
tc qdisc add dev ens160 root tbf rate 2mbit latency 50ms burst 1540
Проверка настроек TBF
Для начала на сервере настроим Firewall:
iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
iptables -A INPUT -p tcp --sport 8000 -j ACCEPT
iptables-save
Проверить настройки шейпера tbf можно с помощью утилиты iperf3. Скачать ее на Windows можно с официального сайта. Она будет доступна для работы в командной строке cmd. Для установки на Linux выполните следующие команды:
sudo apt-get install iperf3
Также установку необходимо произвести на сервере.
На сервере выполните команду, которая будет прослушивать порт 8000:
sudo iperf3 -s -p 8000
На клиенте выполним команду генерации исходящего трафика:
iperf3 -c <ip-адрес> -p 8000 -i 5 -R
Примечание: при использовании ключа -R сервер работает в режиме reverse, в этом случае сервер генерирует пакеты, а клиент получает, таким образом мы можем проверить ширину канала на сервере.
Вывод на сервере:
-----------------------------------------------------------
Server listening on 8000
-----------------------------------------------------------
Accepted connection from X.X.X.X, port 32926
[ 5] local X.X.X.X port 8000 connected to X.X.X.X port 33822
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 5] 0.00-1.00 sec 305 KBytes 2.50 Mbits/sec 0 15.7 KBytes
[ 5] 1.00-2.00 sec 237 KBytes 1.94 Mbits/sec 0 15.7 KBytes
[ 5] 2.00-3.00 sec 231 KBytes 1.89 Mbits/sec 0 18.5 KBytes
[ 5] 3.00-4.00 sec 262 KBytes 2.15 Mbits/sec 0 18.5 KBytes
[ 5] 4.00-5.00 sec 268 KBytes 2.20 Mbits/sec 0 29.9 KBytes
[ 5] 5.00-6.00 sec 251 KBytes 2.06 Mbits/sec 0 29.9 KBytes
[ 5] 6.00-7.00 sec 251 KBytes 2.06 Mbits/sec 0 29.9 KBytes
[ 5] 7.00-8.00 sec 251 KBytes 2.06 Mbits/sec 0 29.9 KBytes
[ 5] 8.00-9.00 sec 188 KBytes 1.54 Mbits/sec 0 29.9 KBytes
[ 5] 9.00-10.00 sec 251 KBytes 2.06 Mbits/sec 0 29.9 KBytes
[ 5] 10.00-10.04 sec 0.00 Bytes 0.00 bits/sec 0 29.9 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 5] 0.00-10.04 sec 2.44 MBytes 2.04 Mbits/sec 0 sender
[ 5] 0.00-10.04 sec 2.43 MBytes 2.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 58151 connected to X.X.X.X port 8000 [ ID] Interval Transfer Bandwidth [ 4] 0.00-5.00 sec 1.15 MBytes 1.94 Mbits/sec [ 4] 5.00-10.00 sec 1.15 MBytes 1.93 Mbits/sec - - - - - - - - - - - - - - - - - - - - - - - - - [ ID] Interval Transfer Bandwidth Retr [ 4] 0.00-10.00 sec 2.44 MBytes 2.04 Mbits/sec 0 sender [ 4] 0.00-10.00 sec 2.43 MBytes 2.04 Mbits/sec receiver iperf Done.