Вводная инфа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
Управление трафиком 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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 |
Это самый простой без классовый пример:
1 2 3 4 5 6 7 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Создадим дисциплину: 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 |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 |
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 |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 |