Рубрики
*NIX информация

tc / traffic control

Вводная инфа:

Управление трафиком
Traffic Control, tc, Шейпинг, управление трафиком, HTB
Разделение, ограничение и управление трафиком - актуальная и сложная задача,
которую обычно возлагают на дорогостоящее специальное сетевое оборудование. 
Но решить ее можно и с помощью подсистемы Linux-ядра Traffic Control (tc входит в пакет iproute2)

Ограничение без потерь возможно только в отношении исходящего трафика. 
Стек протоколов TCP/IP не предусматривает возможности заставить удаленную сторону слать пакеты медленнее (и это правильно).

Shaping. 
Шейпинг - ограничение трафика, задержка пакетов с целью создания желаемой скорости передачи. 
Может использоваться не только для "сужения" исходящего канала, но и для сглаживания бросков во время пиковых нагрузок.

Scheduling. 
Планирование – упорядочивание типов трафика в канале. 
Позволяет избегать задержек для критичных типов трафика (QoS).

Policing. 
Политика входящего трафика. 
Позволяет ограничить входящий трафик путем уничтожения превысивших лимит пакетов. 
Помогает бороться с DDoS.

Основные параметры:
Дисциплина обработки пакетов (qdisc) - очередь пакетов и закрепленный за ней алгоритм обработки.
Класс (class) - логический контейнер, который может содержать несколько подклассов или дисциплину.
Фильтр (filter) - механизм классификации трафика.

Формат указания скорости в утилите tc
mbps = 1024 kbps = 1024 * 1024 bps => Байт/с
mbit = 1024 kbit => Кбит/с
mb = 1024 kb = 1024 * 1024 b => Байт


Наиболее используемые дисциплины
pfifo - Простейшая очередь FIFO (первым пришел, первым ушел).
        Размер буфера задается в пакетах.
bfifo - Аналог pfifo с буфером, размер которого задается в байтах.
pfifo_fast - Реализует простую очередь FIFO с тремя полосами.
             Используется по умолчанию в качестве корневой и не принимает аргументов.
tbf - Token Bucket Filter (TBF). 
      Передает поступающие пакеты со скоростью, не превышающей заданный порог. 
      Простая и точная реализация делает ее идеальным решением для ограничения полосы пропускания всего интерфейса.
sfq - Stochastic Fairness Queueing (SFQ). 
       (одна из лучших)Реализация алгоритма справедливой очереди. 
       Поровну разделяет полосу пропускания между несколькими соединениями. 
       Эффективно работает только на загруженном интерфейсе.
red - Random Early Detection (RED). 
      Симуляция затора. 
      Отбрасывает пакеты случайным образом при достижении заданной полосы пропускания. 
      Хорошо подходит для ограничения прожорливых в плане трафика приложений.
prio - Разделяет трафик по приоритетам (поле TOS). 
       По умолчанию создает три класса, в первый из которых попадают пакеты с большим приоритетом, а в третий - с наименьшим.
cbq - Class Based Queueing (CBQ). 
      Классовая дисциплина, предназначенная для создания сложных систем управления трафиком. 
      Поддерживает ограничения и приоритеты.
htb - Hierarchical Token Bucket (HTB). 
       (хорошо умеет работать с ip, во всех руководствах по шейпингу вы ее обязательно встретите)
       Предназначена для разделения полосы пропускания между различными видами трафика на полосы заданной ширины, с возможностью заимствования. 
       Поддерживает приоритеты.

Синтаксис tc:

Usage:  tc [ OPTIONS ] OBJECT { COMMAND | help }
        tc [-force] -batch filename
where  OBJECT := { qdisc | class | filter | chain |
                    action | monitor | exec }
       OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[aw] |
                    -o[neline] | -j[son] | -p[retty] | -c[olor]
                    -b[atch] [filename] | -n[etns] name | -N[umeric] |
                     -nm | -nam[es] | { -cf | -conf } path
                     -br[ief] }


tc qdisc - покажет состояние шейпинга в данный момент для всех интерфейсов.

Смотрим статистику прохождения пакетов:
tc -s -d qdisc show dev eth0
tc -s -d class show dev eth0
tc -s -d filter show dev eth0

Быстро удалить все классы, фильтры и вернуть root qdisc интерфейса в первоначальное состояние можно командой:
 tc qdisc del dev eth0 root

Это самый простой без классовый пример:

tc qdisc add dev eth1 root tbf rate 256kbit  latency 50ms burst 1540
- qdisc add - добавляем новую дисциплину (для удаления используй del).
- dev eth1 - указываем устройство, к которому будет привязана дисциплина.
- root - наша дисциплина корневая (будет обрабатываться весь трафик).
- tbf - имя дисциплины.
- rate 256kbit latency 50ms burst 1540 - параметры, специфичные для данной дисциплины: rate - ограничение скорости, 
latency - максимальный "возраст" пакета в очереди, burst - размер буфера

Пример создание классовой очереди HTB

Создадим дисциплину:
tc qdisc add dev eth1 root handle 1: htb default 13
Опция "default 13" говорит о том, что весь не классифицированный фильтрами
трафик должен быть обработан с помощью дисциплин класса "1:13". 

Создадим класс под дисциплину:
tc class add dev eth1 parent 1: classid 1:1 htb rate 10mbps ceil 10mbps

Создадим в нем подклассы:
tc class add dev eth1 parent 1:1 classid 1:11 htb rate 5mbps ceil 10mbps
tc class add dev eth1 parent 1:1 classid 1:12 htb rate 2mbps
tc class add dev eth1 parent 1:1 classid 1:13 htb rate 1mbps


По умолчанию к вновь созданным классам подключены дисциплины, реализующие  очередь FIFO. 
Это нам не подходит. 
Чтобы канал равномерно распределялся между всеми участниками под сети, мы должны подключить к ним дисциплину sfq:
tc qdisc add dev eth1 parent 1:11 handle 10:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:12 handle 20:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:13 handle 30:0 sfq perturb 10

Теперь подключим фильтры, которые будут классифицировать трафик:
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip src 10.55.0.0/24 flowid 1:11
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip src 10.55.1.0/24 flowid 1:12

Для примера, установим ограничение в 256 Кбит/с для пользователя, находящегося в под сети "все остальные". 
Сначала добавим к "классу под сети" новый  "класс-пользователь":
tc class add dev eth1 parent 1:13 classid 1:150 htb rate 256kbps
А затем фильтр:
tc filter add dev eth1 protocol ip parent 1:13 prio 1 u32 match ip src 10.55.55.7 flowid 1:150


Пример:

tc qdisc add dev eth1 root handle 1: htb default 13
tc class add dev eth1 parent 1: classid 1:1 htb rate 256kbps ceil 6mbps
tc class add dev eth1  parent 1:1 classid 1:11 htb rate 3mbps 
tc class add dev eth1 parent 1:1 classid 1:12 htb rate 2mbps
tc class add dev eth1 parent 1:1 classid 1:13 htb rate 256kbps
tc qdisc add dev eth1  parent 1:11 handle 10:0 sfq perturb 10
tc qdisc add dev eth1  parent 1:12 handle 20:0 sfq perturb 10
tc qdisc add dev eth1  parent 1:13 handle 30:0 sfq perturb 10
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip src 10.55.55.0/24 flowid 1:11
tc filter add dev eth1 protocol ip parent 1:0 prio 1 u32 match ip src 10.66.66.0/24 flowid 1:12
tc class add dev eth1 parent 1:13 classid 1:150 htb rate 256kbps
tc filter add dev eth1 protocol ip parent 1:13 prio 1 u32 match ip src 10.55.55.7 flowid 1:150

Пример:

tc qdisc add dev eth0 root handle 1: htb default 15
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbps ceil 100mbps

tc class add dev eth0 parent 1:1 classid 1:11 htb rate 30mbps ceil 100mbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 20mbps
tc class add dev eth0 parent 1:1 classid 1:13 htb rate 10mbps
tc class add dev eth0 parent 1:1 classid 1:14 htb rate 5mbps
tc class add dev eth0 parent 1:1 classid 1:15 htb rate 40mbps

tc qdisc add dev eth0 parent 1:11 handle 10:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:12 handle 20:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:13 handle 30:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:14 handle 40:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:15 handle 50:0 sfq perturb 10

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 172.16.1.0/24 flowid 1:11
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 172.16.2.0/24 flowid 1:12
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 172.16.3.0/24 flowid 1:13
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 172.16.4.0/24 flowid 1:14

tc class add dev eth0 parent 1:15 classid 1:150 htb rate 256kbps
tc filter add dev eth0 protocol ip parent 1:15 prio 1 u32 match ip src 172.16.1.32 flowid 1:150