Yvision.kz
kk
1
09:09, 11 августа 2015

Шейпер трафика на CentOS 7 — лимитируем скорость канала (QOS)!

Blog post image

В этой записке собраны примеры контроля скорости трафика на ОС Linux - CentOS. Эти примеры помогут контролировать скорость входящего (исходящего) канала, чтобы он полностью не забивался не нужным трафиком, например от torrent.

Когда много пользователей сидят на одном интернете, возникает проблема, в виде нехватки скорости соединения, это заметно в браузере - он начинает тормозит. В такой ситуации юзеры жалуются и гневно зовут админа :). И бывает даже такое, когда их жалобы доходят до самого директора - проверено!

В общем, можно положить любой канал (возможно роутер) через обычный торрент клиент, ведь известно, что торрент клиент закачивает данные на максимальной скорости, при этом еще умудряется создать кучу соединений с другими участниками торрент сети, которые уже закачали аналогичный файл и теперь уже раздают его.

Бывают и такие случаи, когда некоторые юзеры смотрят онлайн видео, и тем самым используют большую часть канала, что в итоге сказывается на других безобидных пользователей, которым нужно работать. В такой ситуации, одни смотрят фильмы, а другие страдают. У страдальцев попросту перестают открываться сайты, возникают проблемы с получением/отправкой электронной почты. Когда другие юзеры смотрят очередной турецкий сериал, хорошо проводя время на работе. Мы должны понимать что такое может произойти, заведомо включая шейпер трафика на шлюзе. Желательно эту операцию проводить до ввода в эксплуатацию шлюза, чтобы не слышать лишних слов со стороны пользователей.

Чтобы не происходило полного забивания канала одним или более участниками, его делят по частям между компьютерами локальной сети, давая каждому ПК кусочик от общего канала. Возможен и другой сценарий, как вариант можно лимитировать снижать скорость всех портов за исключением Web (80) и SMTP/POP3 (25,110), что даст нам шустрого открытия веб страниц и без проблемной работы электронной почты.

Инструмент по управлению пропускной способностью канала называют - шейпер трафика. Актуальность шейпера особенно велика при использовании низко скоростного интернета. В сети на одном форуме есть пример, когда организация имеет интернет канал на скорости - 4Мбит, при этом количество пользователей 500 человек (завод). И вот эти 500 человек большого завода, умудряются более менее сидеть в Интернете при помощи шейпера на малюсеньком интернете! Теперь представьте какую большую роль играет шейпер трафика в каждой сети, это один из важных элементов шлюза.

Обычно в локальной сети офиса интернет канал просаживается из за следующего:

1. Онлайн видео - сюда можно отнести интернет кинотеатры и youtube

2. Торрент закачки с большим количеством соединений

3. Файлообменники

Хотя на самом деле можно загрузить канал чем угодно, используя нестандартные порты/протоколы, чтобы бороться с этим, приходиться обычно ставить отдельное правило для такого трафика. Вообще, тема "нарезки" трафика очень большая и по ней много документации. В силу своих малых познаний, попытаюсь описать уже опубликованные примеры по распределению трафика применительно к шлюзу (прокси серверу). Пишу для себя, но конструктивная критика не помешает :)

Записку буду корректировать и возможно добавлять новые настройки контроля трафика.

Краткое содержание записки:

1. Проверка скорости через утилиту speedtest-cli

2. Пример с использованием скрипта CBQ.Init для шлюза

3. Пример с использованием скрипта HTB.INIT для шлюза

4. Пример с использованием скрипта Wondershaper для одиночного Linux компьютера с одной сетевой платой

5. Пример с использованием виртуального интерфейса ifb и дисциплины htb для одиночного ПК

6. Пример с использованием дисциплины HTB и виртуального интерфейса IFB для шлюза

7. Пример с использованием маркировки трафика в iptables

8. Пример простого шейпера для шлюза

9. Пример простого шейпера на Shaper Control Tool

10. Дополнительные команды tc

11. Алгоритм составления правил для нарезки канала

Скрипты облегчающие составления правил ограничения трафика:

  • cbq.init - скрипт для составления правил ограничения трафика на основе tc и cbq.
  • htb.init - скрипт для составления правил ограничения трафика на основе tc и htb.
  • wondershaper - аналогичный скрипт как и cbq.init, но только для одиночного Linux ПК.

Чтобы продемонстрировать как работает шейпер, возьмем типичную задачу когда у системного администратора есть компьютер с двумя сетевыми картами, который выступает в роли шлюза. А также, будут показаны примеры контроля скорости трафика на одиночном компьютере Linux.

Сперва начнем со скриптов, так как именно они помогают быстро настроить контроль трафика на Linux машине даже не зная основ.

Основная цель: Ограничить полосу пропускания трафика локальной сети в Интернет. Разделить канал поровну между компьютерами, чтобы каждый мог комфортно выходить в глобальную сеть. Трафик компьютеров локальной сети будет идти через шлюз на котором будут прописаны правила нарезки канала.

Blog post image

А вот более наглядная схема:

Blog post image

Здесь из рисунка видно, что мы можем контролировать только исходящий трафик с физического интерфейса. Исходящий трафик с внутренней сетевой платы enp0s8 будет входящим для компьютеров локальной сети. И наоборот, исходящий трафик с внешнего адаптера enp0s3 - будет исходящим для компьютеров локальной сети за шлюзом. Так как шлюз имеет две сетевые карты, нам доступен контроль как входящего, так и исходящего трафика. Обычно с помощью шейпера можно контролировать скорость только исходящего трафика. Если у вас всего один компьютер на Linux, вы можете ограничивать канал через скрипт Wondershaper или свой ручной скрипт в котором используется виртуальный интерфейс ifb (imq).

Для замера скорости интернета был использован сайт speedtest.com. Сайт speedtest.com использовался для замера скорость интернета на компьютере за шлюзом. Исходящий трафик со шлюза до компьютера замерялся с помощью программы fastcopy. Можно была использовать утилиту iperf - да, она хороша, но для наглядности выше описанный сайт и fastcopy - подходят лучше, так как есть графические скрины (имхо). Для замера скорости одиночного Linux ПК использовалась утилита speedtest-cli, внизу написана инструкция по ее установке.

Если в правилах шейпера пишется kbps - значить это килобайты, если видите kbit - значить это килобиты.

1. Проверка скорости через утилиту speedtest-cli

Есть очень замечательный скрипт написанный на Phyton от популярного сайта www.speedtest.net

С помощью него замер скорости делается за 5 секунд, измеряется скорость входящего и исходящего потока.

Установка скрипта:

# wget https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py

# chmod a+rx speedtest_cli.py

# mv speedtest_cli.py /usr/local/bin/speedtest-cli

# chown root:root /usr/local/bin/speedtest-cli

Запуск скрипта:

# speedtest-cli

Полученная информация:

Blog post image

2. Пример с использованием скрипта CBQ.Init для шлюза

Шейпер трафика: скрипт cbq.init
Входящий трафик, скорость: 5Мбит
Исходящий трафик, скорость: 5Мбит
Названия сетевых адаптеров: enp0s3 - внешний, enp0s8 - внутренний

Допустим шлюз имеет скорости интернет 5-мбит на входящий поток и 5 мбит исходящий. Как обычно сервер в роли шлюза должен иметь два интерфейса, первый enp0s3 - внешний и enp0s8 - внутренний. В этом случае компьютеры локальной сети получают интернет по технологии NAT. Входящий и исходящий трафик лимитируем через через скрипт CBQ.init, в CentOS он просто называется коротко "cbq", как и дисциплина cbq. Не путайте дисциплину cbq и скрипт cbq.init. Скрипт cbq.init создает правила шейпирования трафика на основе дисциплины cbq.

Создадим 3 файла в каталоге /etc/sysconfig/cbq:

- cbq-5000.internet-out

- cbq-5000.internet-in

- cbq-40.router_to_network

Сперва лимитируем исходящий трафик в Интернет

Про маркируем исходящий трафик через iptables, чтобы потом им управлять через cbq:

iptables -t mangle -A PREROUTING -s 10.168.50.0.0/24 -j MARK --set-mark 6

Заходим в каталог где должны быть файлы описывающие скорость:

# cd /etc/sysconfig/cbq

Создаем файл cbq-5000.internet-out:

# vi cbq-5000.internet-out

# Исходящая скорость в Интернет - скорость 5 Мбит
DEVICE=enp0s3,100Mbit,10Mbit
RATE=5Mbit
WEIGHT=500Kbit
LEAF=sfq
PRIO=6
MARK=6
RULE=10.168.50.0/24,

Теперь пришла очередь входящего трафика

Создаем файл cbq-9.router_to_network:

# vi cbq-9.router_to_network

# Входящая скорость для локальной сети 40 Мбит
DEVICE=enp0s8
RATE=40Mbit
WEIGHT=5Mbit
LEAF=sfq
PRIO=8
RULE=10.168.50.2,

Создаем файл cbq-900.internet-in:

# vi cbq-900.internet-in

# Входящая скорость Интернета для локальной сети 5 Мбит
DEVICE=enp0s8,100Mbit,90Mbit
RATE=5Mbit
WEIGHT=800Kbit
LEAF=sfq
PRIO=1
RULE=10.168.50.0/24

Замеряем скорость, качаем файл с сервера локальной сети из любого компьютера:

Blog post image

Видим что здесь есть наши 40 Мбит.

Проверяем входящею и исходящею скорость в Интернет:

Blog post image

Замеряем скорость интернета с машины локальной сети, как видим входящая/исходящая скорость в 5 Мбит.

Ставим шейпер в автозагрузку, добавляем строку:

# vi /etc/rc.d/rc.local

/usr/sbin/cbq start

3. Пример с использованием скрипта HTB.INIT для шлюза

Шейпер трафика: скрипт htb.init
Входящий трафик, скорость: 8Мбит
Исходящий трафик, скорость: 1Мбит
Названия сетевых адаптеров: enp0s3 - внешний, enp0s8 - внутренний

Входящая и исходящая скорость для клиентов локальной сети, будет регулироваться настройками "HTB.init" скрипта для адаптера локальной сети, а исходящая скорость будет зависеть от настроек внешнего адаптера шлюза.

Интернет в данном примере будет поступать от ADSL модема, в котором скорость исходящего трафика меньше входящего.

Задача шейпера: разделение входящей и исходящей скорости канала поровну между машинами локальной сети

Установим зависимость:

# yum install iproute -y

Скачайте скрипт htb.init с сайта sourceforge.

# wget http://sourceforge.net/projects/htbinit/files/HTB.init/0.8.5/htb.init-v0.8.5/download -O htb.init-v0.8.5

# mv htb.init-v0.8.5 /etc/init.d/htb

# chmod 755 /etc/init.d/htb

Поставьте его в автозагрузку:

# chkconfig htb on

Создайте каталог для конфигурации:

# mkdir -p /etc/sysconfig/htb

Перейдите в каталог конфигурации htb.init:

# cd /etc/sysconfig/htb

Сперва настроим входящею скорость для компьютеров локальной сети - трогаем настройки внутреннего адаптера enp0s8.

Создадим корневой файл enp0s8:

# vi enp0s8

В нем впишем текст:

DEFAULT=20

Здесь строчка DEFAULT=20 задает параметр по которому будет учитываться трафик не попадающий ни под одно правило шейпера.

# vi enp0s8-2.root

Впишем в него:

RATE=100Mbit

Здесь мы указали скорость нашего адаптера локальной сети.

# vi enp0s8-2:20.default

RATE=92Mbit
PRIO=5
LEAF=sfq

# vi enp0s8-2:4.from_router_to_network

RATE=99Mbit
PRIO=4
LEAF=sfq
RULE=10.168.50.0/24,

Здесь запятая говорит нам, что нужно шейпить исходящею скорость (исходящий порт). Без запятой, шейпится входящая скорость.

# vi enp0s8-2:5.to_network

RATE=8Mbit
PRIO=5

# vi enp0s8-2:5:1025

CEIL=8Mbit
RATE=2Mbit
PRIO=5
LEAF=sfq
RULE=10.168.50.0/24

ИТОГО: Входящая скорость 8Мбит будет распределятся поровну между компьютерами локальной сети 10.168.50.0/24. Если канал не занят, одному компьютеру дается 8Мбит во время закачки, в противном случае скорость делится между качающимися.

Скриншот c сайта speedtest.net, тест запускался на машине c Windows XP в локальной сети:

Blog post image

Как видно из картинки, скорость почти соответствует нашим настройкам.

Теперь скрин из Download Master:

Blog post image

Здесь у нас почти 8Мбит = 940Кбайт

Теперь надо порезать исходящею скорость

Создадим корневой файл enp0s3:

# vi enp0s3

В нем впишем текст:

DEFAULT=20

# vi enp0s3-2.root

RATE=1Mbit

# vi enp0s3-2:20.default

CEIL=1Mbit
RATE=1Mbit
PRIO=5
LEAF=sfq

ИТОГО: Мы дали компьютерам локальной сети 10.168.50.0/24 исходящею скорость в 1Мбит, скорость эта делиться поровну между компьютерами локальной сети, если качает только один ПК, ему дается весь 1Мбит.

Blog post image

Как видно из скриншота, исходящий трафик всего 0,96 Мбит. Как мы и задали!

При этом мы не трогаем входящею и исходящею скорость самого интернет шлюза в локальную сеть и обратно. Смысла резать локальную скорость - нет.

Последний шаг - запуск системы контроля трафика с помощью следующей команды:

# service htb compile

# service htb start

При запуске скрипта HTB.init выйдет окошко с ошибкой:

find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.

Так как ошибка не критичная, и не влияет на работу скрипт, на нее можно не обращать внимания.

Если вы еще не поставили демон в автозагрузку:

# chkconfig htb on

Иногда нужно чистить кэш HTB.Init:

# rm /var/cache/htb.init

4. Пример с использованием скрипта Wondershaper для одиночного Linux компьютера с одной сетевой платой

Шейпер трафика: скрипт wondershaper
Входящий трафик, скорость: 5Мбит
Исходящий трафик, скорость: 10Мбит
Названия сетевых адаптеров: enp0s3 - один внешний

Скрипт wondershaper использует дисциплину CBQ для ограничения скорости.

Устанавливаем wondershaper:

# yum install wondershaper -y

Синтаксис скрипта шейпера:

wondershaper [интерфейс] [download, kbits] [upload, kbits]

Например:

wondershaper enp0s3 50000 10000 - здесь 5Мбит входящая скорость и 1Мбит исходящая скорость

Blog post image

Проверка через wget - закачка ISO образа.

Здесь из скриншота видно, что входящая скорость равна 417Кбайтам, то есть наши 5Мбит.

Скрипт работает очень странно, смотрите скриншоты внизу:

3 mb_out / 5 mb_in

Blog post image

3 mb_out / 8 mb_in

Blog post image

4 mb_out / 8 mb_in

Blog post image

Дополнительные команды:

wondershaper [интерфейс] - показывает состояние шейпера для интерфейса

wondershaper [clear] - стирает правила которые были заданы

Сам скрипт находиться здесь /sbin/wondershaper

5. Пример с использованием виртуального интерфейса ifb и дисциплины htb для одиночного ПК

Шейпер трафика: ручной скрипт
Входящий трафик, скорость: 8Мбит
Исходящий трафик, скорость: 4Мбит
Названия сетевых адаптеров: enp0s3 - один внешний

Создаем простой скрипт /etc/sysconfig/shaper.sh

# vi /etc/sysconfig/shaper.sh

### Скорость входящего трафика ###
# Активируем виртуальный интерфейс ifb0 и перенаправляем входящий трафик с адаптера enp0s3 на активированный интерфейс ifb0
# Здесь egress - означает входящий трафик, соответственно ingress - исходящий трафик
modprobe ifb
ip link set ifb0 up
# Удаляем правила
tc qdisc del dev enp0s3 root 2> /dev/null > /dev/null
tc qdisc del dev enp0s3 ingress 2> /dev/null > /dev/null
tc qdisc del dev ifb0 root 2> /dev/null > /dev/null
tc qdisc del dev ifb0 ingress 2> /dev/null > /dev/null
#Перенаправляем трафик на виртуальный интерфейс
tc qdisc add dev enp0s3 handle ffff: ingress
tc filter add dev enp0s3 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
# Указываем использование дисциплины HTB на виртуальном интерфейсе ifb0 и дефолтный класс 11,
# куда будет попадать трафик не подходящий ни под одно правило шейпера
tc qdisc add dev ifb0 root handle 1:0 htb default 11
# Указываем гарантированную полосу пропускания (rate) и максимально возможную скорость (ceil) - корневой класс 1:1
tc class add dev ifb0 parent 1:0 classid 1:1 htb rate 1024kbps
# Указываем rate - 30Kbyte/s и ceil - 300Kbyte/s для очереди по умолчанию 1:11, имеющей меньший приоритет (5)
tc class add dev ifb0 parent 1:1 classid 1:11 htb rate 30kbps ceil 300kbps prio 5
tc qdisc add dev ifb0 parent 1:11 handle 11: sfq perturb 10
# Указываем rate 100Kbyte/s и ceil 1000Kbyte/s для очереди 1:10, имеющей наивысший приоритет (0)
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 100kbps ceil 1024kbps prio 0
tc qdisc add dev ifb0 parent 1:10 handle 10: sfq perturb 10
# Фильтруем в очередь 1:10 ssh и www трафик
tc filter add dev ifb0 parent 1:0 protocol ip prio 0 u32 match ip sport 22 0xffff flowid 1:10
tc filter add dev ifb0 parent 1:0 protocol ip prio 0 u32 match ip sport 80 0xffff flowid 1:10
### Скорость исходящего трафика ###
# Указание к использованию дисциплины очереди HTB на интерфейсе, класс 11 - класс по умолчанию
tc qdisc add dev enp0s3 root handle 1:0 htb default 20
# Указание ширины гарантированной полосы (rate) - 512Kbyte/s и максимально возможной (ceil) - 512Kbyte/s для корневого класса 1:1
tc class add dev enp0s3 parent 1:0 classid 1:1 htb rate 512kbps ceil 512kbps
# Указание rate - 64Kbyte/s и ceil 512Kbyte/s для очереди 1:10, имеющей наивысший приоритет (0)
tc class add dev enp0s3 parent 1:1 classid 1:10 htb rate 64kbps ceil 512kbps prio 1
tc qdisc add dev enp0s3 parent 1:10 handle 10: sfq perturb 10
# Указание rate - 512Kbyte/s и ceil - 1Kbyte/s для очереди 1:11, используемой по умолчанию и имеющей меньший приоритет (5)
tc class add dev enp0s3 parent 1:1 classid 1:20 htb rate 1kbps ceil 512kbps prio 5
tc qdisc add dev enp0s3 parent 1:20 handle 20: sfq perturb 10
# Фильтруем очередь 1:10, трафик ssh и www
tc filter add dev enp0s3 parent 1:1 protocol ip prio 0 u32 match ip dport 22 0xffff flowid 1:10
tc filter add dev enp0s3 parent 1:1 protocol ip prio 0 u32 match ip dport 80 0xffff flowid 1:10

Даем права на запуск скрипта:

# chmod +x /etc/sysconfig/shaper.sh

Запускаем скрипт:

# /etc/sysconfig/shaper.sh

И замеряем скорость:

# speedtest-cli

Blog post image

Здесь видно, что трафик 8Мбит на вход и 4Мбит на выходе.

6. Пример с использованием дисциплины HTB и виртуального интерфейса IFB для шлюза

Шейпер трафика: ручной скрипт
Входящий трафик, скорость: 4Мбит
Исходящий трафик, скорость: 512Кбит
Названия сетевых адаптеров: enp0s3 - один внешний, enp0s8 - внутренний

Этот пример хорош когда у вас подключено два и более провайдеров. Виртуальный интерфейс ifb, поможет лимитировать исходящий трафик.

Регулируем скорость входящего и исходящего трафика через виртуальный сетевой адаптер ifb0

Создаем файл скрипт для ограничения входящего и исходящего трафика:

# vi /etc/sysconfig/out_shaper.sh

# Исходящий трафик 512Кбит локальной сети 10.168.50.0/24
tc qdisc del dev enp0s8 root 2> /dev/null > /dev/null
tc qdisc del dev enp0s8 ingress 2> /dev/null > /dev/null
tc qdisc del dev ifb0 root 2> /dev/null > /dev/null
tc qdisc del dev ifb0 ingress 2> /dev/null > /dev/null
tc qdisc del dev enp0s3 root 2> /dev/null > /dev/null
tc qdisc del dev enp0s3 ingress 2> /dev/null > /dev/null
# Скорость исходящего трафика 512Кбит/s для локальной сети 10.168.50.0/24
modprobe ifb
ip link set dev ifb0 up
tc qdisc add dev enp0s8 ingress
tc filter add dev enp0s8 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
tc qdisc add dev ifb0 root handle 1: htb default 20
tc class add dev ifb0 parent 1: classid 1:1 htb rate 1024kbit
tc class add dev ifb0 parent 1:1 classid 1:100 htb rate 512Kbit ceil 512Kbit prio 2 quantum 15365
tc qdisc add dev ifb0 parent 1:100 handle 100: sfq perturb 10
tc filter add dev ifb0 protocol ip prio 2 u32 ht 800:: match ip src 10.168.50.0/24 flowid 1:100
tc class add dev ifb0 parent 1:1 classid 1:200 htb rate 512kbit ceil 512kbit prio 2 quantum 15365
tc qdisc add dev ifb0 parent 1:200 handle 200: sfq perturb 10
tc filter add dev ifb0 protocol ip prio 2 u32 ht 800:: match ip src 10.168.50.0/24 flowid 1:200
tc class add dev ifb0 parent 1:1 classid 1:20 htb rate 32kbit ceil 32kbit prio 2 quantum 15365
tc qdisc add dev ifb0 parent 1:20 handle 20: sfq perturb 10
# Скорость входящего трафика для локальной сети 4Мбит/s для локальной сети 10.168.50.0/24
tc qdisc add dev enp0s8 root handle 2: htb default 30
tc class add dev enp0s8 parent 2: classid 2:1 htb rate 5Mbit burst 15k
# PRIO 1 -> tcp sport 80 – WWW трафик из мира
tc class add dev enp0s8 parent 2:1 classid 2:101 htb rate 33kbit ceil 4Mbit prio 1
# PRIO 3 -> unclassified traffic – трафик, который не попал под условия, указанные в предыдущих классах
tc class add dev enp0s8 parent 2:1 classid 2:102 htb rate 33kbit ceil 4Mbit prio 3
# u32 классификаторы
tc filter add dev enp0s8 protocol ip parent 2:0 prio 1 u32 match ip dst 10.168.50.0/24 match ip protocol 6 0xff match ip sport 80 0xffff flowid 2:101
tc filter add dev enp0s8 protocol ip parent 2:0 prio 2 u32 match ip dst 10.168.50.0/24 flowid 1:102

# chmod 750 /etc/sysconfig/out_shaper.sh

Здесь мы дали 4Мбит/с входящего трафика и 512Кбит исходящего трафика для локальной сети 10.168.50.2/255.255.255.0

Чтобы запуск скрипта был при загрузке, поместите его в rc.local

# vi /etc/rc.local

/etc/sysconfig/out_shaper.sh

Скрин замера скорости с клиента Windows XP за шлюзом:

Blog post image

7. Пример с использованием маркировки трафика в iptables

Шейпер трафика: ручной скрипт htb/iptables
Входящий трафик, скорость: 1Мбит
Исходящий трафик, скорость: 3Мбит
Названия сетевых адаптеров: enp0s3 - внешний , enp0s8 - внутренний

Устанавливаем пакет iproute2:

# yum install iproute2

Создаем файл скрипт /etc/sysconfig/shaper.sh:

#!/bin/bash
start() {
DOWN=enp0s8
UP=enp0s3
# UPLOAD - создаем корневую дисциплину HTB для интерфейса enp0s3
tc qdisc del dev $UP root 2> /dev/null > /dev/null
tc qdisc del dev $UP ingress 2> /dev/null > /dev/null
tc qdisc add dev $UP root handle 1:0 htb default 10
tc class add dev $UP parent 1:0 classid 1:1 htb rate 1000mbit
# Создание классов для соответствующих протоколов
# default 10
tc class add dev $UP parent 1:1 classid 1:10 htb rate 2mbit ceil 3000kbit prio 0
# ICMP
tc class add dev $UP parent 1:1 classid 1:20 htb rate 4mbit ceil 7mbit prio 0
# HTTP/s TCP
tc class add dev $UP parent 1:1 classid 1:21 htb rate 2mbit ceil 3mbit prio 0
# HTTP/s UDP
tc class add dev $UP parent 1:1 classid 1:22 htb rate 800kbit ceil 1mbit prio 0
# POP / SMTP TCP
tc class add dev $UP parent 1:1 classid 1:23 htb rate 800kbit ceil 1mbit prio 0
# DNS
tc class add dev $UP parent 1:1 classid 1:24 htb rate 800kbit ceil 1mbit prio 0
# SSH
tc class add dev $UP parent 1:1 classid 1:25 htb rate 800kbit ceil 1mbit prio 0
# DOWNLOAD (Закачка) - используется для загрузки
tc qdisc del dev $DOWN root 2> /dev/null > /dev/null
tc qdisc del dev $DOWN ingress 2> /dev/null > /dev/null
tc qdisc add dev $DOWN root handle 1:0 htb default 10
tc class add dev $DOWN parent 1:0 classid 1:1 htb rate 1000mbit
# Создание классов для соответствующих протоколов
# default 10
tc class add dev $DOWN parent 1:1 classid 1:10 htb rate 700kbit ceil 1000kbit prio 0
# ICMP
tc class add dev $DOWN parent 1:1 classid 1:20 htb rate 4mbit ceil 7mbit prio 0
# HTTP/s TCP
tc class add dev $DOWN parent 1:1 classid 1:21 htb rate 2mbit ceil 3mbit prio 0
# HTTP/s UDP
tc class add dev $DOWN parent 1:1 classid 1:22 htb rate 800kbit ceil 1mbit prio 0
# POP / SMTP TCP
tc class add dev $DOWN parent 1:1 classid 1:23 htb rate 800kbit ceil 1mbit prio 0
# DNS
tc class add dev $DOWN parent 1:1 classid 1:24 htb rate 800kbit ceil 1mbit prio 0
# SSH
tc class add dev $DOWN parent 1:1 classid 1:25 htb rate 800kbit ceil 1mbit prio 0
################################################################
iptables -t mangle -F FORWARD
# UPLOAD управление - Сортировка пакетов для своих классах .
iptables -t mangle -A FORWARD -o $UP -p icmp -j CLASSIFY --set-class 1:20
iptables -t mangle -A FORWARD -o $UP -p tcp -m multiport --sports 80,443 -j CLASSIFY --set-class 1:21
iptables -t mangle -A FORWARD -o $UP -p udp -m multiport --sports 80,443 -j CLASSIFY --set-class 1:22
iptables -t mangle -A FORWARD -o $UP -p tcp -m multiport --sports 465,25,110 -j CLASSIFY --set-class 1:23
iptables -t mangle -A FORWARD -o $UP -p udp -m multiport --sports 53,953 -j CLASSIFY --set-class 1:24
iptables -t mangle -A FORWARD -o $UP -p tcp -m multiport --sports 22 -j CLASSIFY --set-class 1:25
# DOWNLOAD управление
iptables -t mangle -A FORWARD -o $DOWN -p icmp -j CLASSIFY --set-class 1:20
iptables -t mangle -A FORWARD -o $DOWN -p tcp -m multiport --dports 80,443 -j CLASSIFY --set-class 1:21
iptables -t mangle -A FORWARD -o $DOWN -p udp -m multiport --dports 80,443 -j CLASSIFY --set-class 1:22
iptables -t mangle -A FORWARD -o $DOWN -p tcp -m multiport --dports 465,25,110 -j CLASSIFY --set-class 1:23
iptables -t mangle -A FORWARD -o $DOWN -p udp -m multiport --dports 53,953 -j CLASSIFY --set-class 1:24
iptables -t mangle -A FORWARD -o $DOWN -p tcp -m multiport --dports 22 -j CLASSIFY --set-class 1:25
#конец начала функции
}
stop() {
DOWN=enp0s8
UP=enp0s3
# Очистка правил контроля трафика
tc qdisc del dev $UP root
tc qdisc del dev $DOWN root
iptables -t mangle -F FORWARD
}
case $1 in
start) start;
;;
stop) stop;
;;
restart)start ; stop ;
;;
*) echo "Enter command: [start|stop|restart]";
;;
esac

Запуск скрипта:

# chmod +x /etc/sysconfig/shaper.sh

# ./etc/sysconfig/shaper.sh start

Вот скрин замера скорсти с компьютера на Windows XP который находится в локальной сети:

Blog post image

8. Пример простого шейпера для шлюза

Шейпер трафика: ручной скрипт
Входящий трафик, скорость: Указывается как параметр скрипта
Исходящий трафик, скорость: Указывается как параметр скрипта
Названия сетевых адаптеров: enp0s8 - внутренний

Создаем простой скрипт:

# vi /sbin/shaper.sh

Cо следующим содержимым:

#!/bin/bash
speedUp=$1
speedDown=$2
# Удаление очередей
/sbin/tc qdisc del dev enp0s8 ingress
/sbin/tc qdisc del dev enp0s8 root handle 1:
# Ограничение скорости отдачи
/sbin/tc qdisc add dev enp0s8 root handle 1: htb default 10 r2q 1
/sbin/tc class add dev enp0s8 parent 1: classid 1:10 htb rate ${speedUp}kbit quantum 8000 burst 8k
# Ограничение скорости загрузки
/sbin/tc qdisc add dev enp0s8 handle ffff: ingress
/sbin/tc filter add dev enp0s8 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${speedDown}kbit burst 12k drop flowid :1

Запуск скрипта:

# /sbin/shaper.sh 5000 1000

В примере скорость скачивания лимитируется до 1000 кбит/с, а исходящего скорость трафика - до 5000 кбит/с

9. Пример простого шейпера на Shaper Control Tool

Шейпер трафика: ручной скрипт
Входящий трафик, скорость: Указывается как параметр скрипта
Исходящий трафик, скорость: Указывается как параметр скрипта
Названия сетевых адаптеров: eth0 - внешний, eth1 - внутрений

Устанавливаем SC (Shaper Control Tool)

Если у вас CentOS 6:

# rpm -Uvh http://rnd.rajven.net/centos/6.5/os/i386/files-repo-1.3-2.cnt6.noarch.rpm

# yum install sc -y

Если CentOS 7:

# yum install bzip2 iproute -y

# wget http://netassist.dl.sourceforge.net/project/sc-tool/sc-tool/sc-1.5.7.tar.bz2

# tar -xvf sc-1.5.7.tar.bz2

# cd sc-1.5.7

# make

Поправим файл /etc/sc/sc.conf чтобы он принял следующий вид:

tc = /sbin/tc
out_if = eth0
in_if = eth1
filter_method = u32
limit_method = hybrid
debug = 0
verbose = 0
quiet = 0
colored = 1
joint = 0
network = 10.0.0.0/24
filter_network = 10.0.0.0/24
policer_burst_ratio = 0.3
quantum = 1500
rate_unit = kibit
rate_ratio = 1.0
leaf_qdisc = 'pfifo limit 50'
db_driver = SQLite
db_host = 127.0.0.1
db_name = /etc/sc/sc.db
db_user = username
db_pass = password
query_create = "CREATE TABLE rates (ip UNSIGNED INTEGER PRIMARY KEY, rate UNSIGNED INTEGER NOT NULL)"
query_load = "SELECT ip,rate FROM rates"
query_list = "SELECT ip,rate FROM rates WHERE ip=?"
query_add = "INSERT OR REPLACE INTO rates VALUES (?, ?)"
query_del = "DELETE FROM rates WHERE ip=?"
query_change = "REPLACE INTO rates VALUES (?, ?)"
syslog = 0

Инициализируем

# sc init

Создадим файл БД

# sc dbcreate

Добавим в него запись для IP нашего сервера

# sc dbadd 10.0.0.1 100Mbit

Добавим запись для тестового клиента допустим 10.0.0.2

# sc dbadd 10.0.0.1 1Mbit

Синхронизируем правила с БД

# sc sync

Собственно на этом вся настройка заканчивается.

Добавление нового клиента заключается в добавлении записи в БД + синхронизации правил с помощью sc sync

Для того чтобы правила стартовали после перезагрузки сервера необходимо внести sc в автозапуск

# chkconfig --add sc

# chkconfig --level 3 sc on

10. Дополнительные команды tc

При контроле трафика в Linux, используются следующие инструменты:

  • tc - утилита для контроля трафика tc (Traffic Control) через ядро Linux. Она идет в наборе программ пакета iproute2. Эта программа - сердце управления трафиком, с помощью нее производятся операции по лимитированию трафика.
  • imq - псевдо-интерфейс (виртуальная сетевая плата), специальное устройство к которому цепляются дисциплины управления очередью, такие как htb, cbq и tbf. Для его работы нужно патчить ядро. На данный момент устарел и не используется, так как есть аналог ifb.
  • ifb - это тоже виртуальное устройство как и imq
  • htb - дисциплина управления очередью которая на данный момент широко используется всеми.
  • cbq - дисциплина управления очередью
  • tbf - дисциплина управления очередью
  • red - дисциплина управления очередью
  • sfq - очередь равномерного случайного распределения пакетов

* Показать правила для интерфейса eth0:

tc -s qdisc show dev eth0;

* Отчистить правила для интерфейса eth0:

tc qdisc del dev eth0 root 2> /dev/null > /dev/null

tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null

11. Алгоритм составления правил для нарезки канала

Правила для фильтрации (нарезки) составляются по следующей последовательности

1. Создаем корневую дисциплину для интерфейса и указываем класс куда будет попадать не классифицированный трафик -

tc qdisc add dev eth0 root handle 1:0 htb default 10

2. Создаем корневой (иерархию классов) класс и определяем ширину канала -

tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1000mbit

3. Создаем дочерний класс для шейпирования абонента.

tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1000mbit

4. Создаем дисциплину шейпирования для класса абонента.

tc class add dev eth0 parent 1:1 classid 1:21 htb rate 2mbit ceil 3mbit prio 0

5. Создаем фильтра позволяющие классифицировать трафик абонента, например через iptables:

iptables -t mangle -A FORWARD -o eth0 -p tcp -m multiport --sports 80,443 -j CLASSIFY --set-class 1:21

или так для www трафика:

tc filter add dev eth0 parent 1:0 protocol ip prio 0 u32 match ip sport 80 0xffff flowid 1:10

или как вариант:

tc filter add dev ifb0 protocol ip prio 2 u32 ht 800:: match ip src 10.168.50.0/24 flowid 1:100

Полезные ссылки:

1. http://docstore.mik.ua/manuals/ru/adv_route_qos/index.html

2. http://www.opennet.ru/base/net/linux_traffic_qos.txt.html

3. http://www.opennet.ru/base/net/htb_manual.txt.html

4. http://unixforum.org/index.php?showtopic=123039

5. http://unixforum.org/index.php?showtopic=120023&st=0&p=1117510&#entry1117510

6. http://habrahabr.ru/post/119611/

7. http://asmodeus.com.ua/library/os/linux/shaper_tc.html

8. http://zooom.com.ua/linux/ustanovka-i-nastrojka/154--linux.html

9. LARTC в fb2 формате - http://coollib.com/b/106373

1
8658
3