First time here? Check out the FAQ!

Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

Traffic Control. Шейпинг с помощью классификатора u32 в Linux

4

Traffic Control. Шейпинг с помощью классификатора u32 в Linux

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


#!/bin/bash

DEV=eth2

<= 90-95% от полосы

RATEUP=700 #лимит скорости отдачи
RATEDN
=3000 # лимит скорости закачки

СБРОС ПРАВИЛ

tc qdisc del dev $DEV root
#tc qdisc del dev $DEV ingress
#tc qdisc del dev $DEV egress

tc qdisc del dev ifb0 root
#tc qdisc del dev ifb0 ingress

#Подключаем модуль ядра для ifb:
/sbin/modprobe ifb

#Поднимаем интерфейс ifb0:
/sbin/ip link set dev ifb0 up

#Создаем корневую дисциплину для входящего траффика
tc qdisc add dev $DEV ingress

#Заворачиваем траффик на с интерфейса на интерфейс ifb0
tc filter add dev $DEV parent ffff
: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

#Указываем размер очереди
ip link
set dev ifb0 qlen 30

#Создаем корневую дисциплину для ifb0
tc qdisc add dev ifb0 root handle
1: htb default 26

добавить общее ограничение скорости по классу

tc class add dev ifb0 parent 1: classid 1:1 htb rate ${RATEDN}kbit

добавляем подклассы - мы гарантируем каждаму классу МИНИМУМ "честную часть" полосы пропускания.

Этим способом мы избегаем возможности "голодания" классов. Каждому классу

разрешается занимать всю полосу пропускания, если другие классы не

используются.

tc class add dev ifb0 parent 1:1 classid 1:20 htb rate $[$RATEDN/12]kbit ceil ${RATEDN}kbit prio 0
tc
class add dev ifb0 parent 1:1 classid 1:21 htb rate $[$RATEDN/12]kbit ceil ${RATEDN}kbit prio 1
tc
class add dev ifb0 parent 1:1 classid 1:22 htb rate $[$RATEDN/12]kbit ceil ${RATEDN}kbit prio 2
tc
class add dev ifb0 parent 1:1 classid 1:23 htb rate $[$RATEDN/12]kbit ceil ${RATEDN}kbit prio 3
tc
class add dev ifb0 parent 1:1 classid 1:24 htb rate $[$RATEDN/6]kbit ceil ${RATEDN}kbit prio 4
tc
class add dev ifb0 parent 1:1 classid 1:25 htb rate $[$RATEDN/12]kbit ceil ${RATEDN}kbit prio 5
tc
class add dev ifb0 parent 1:1 classid 1:26 htb rate $[$RATEDN/12]kbit ceil ${RATEDN}kbit prio 6

подключаем дисциплины обработки очереди к подклассам - здесь мы используем SFQ для каждого класса.

SFQ обеспечит почти честное деление полосы пропусканиямежду соединениями

внутри каждого класса.

tc qdisc add dev ifb0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev ifb0 parent
1:21 handle 21: sfq perturb 10
tc qdisc add dev ifb0 parent
1:22 handle 22: sfq perturb 10
tc qdisc add dev ifb0 parent
1:23 handle 23: sfq perturb 10
tc qdisc add dev ifb0 parent
1:24 handle 24: sfq perturb 10
tc qdisc add dev ifb0 parent
1:25 handle 25: sfq perturb 10
tc qdisc add dev ifb0 parent
1:26 handle 26: sfq perturb 10

направляем трафик в классы

icmp траффик в высокоприритетный класс

tc filter add dev ifb0 protocol ip parent 1:0 prio 0 u32 match ip protocol 1 0xff flowid 1:20

UDP траффик в класс 1:21

tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip protocol 17 0xff flowid 1:21

DNS запросы в класс 1:21

tc filter add dev ifb0 protocol ip  parent 1:0 prio 1 u32 match ip protocol 17 0xff match ip sport 53 0xffff flowid 1:21
tc filter add dev ifb0 protocol ip  parent
1:0 prio 1 u32 match ip protocol 17 0xff match ip dport 53 0xffff flowid 1:21

tc filter add dev ifb0 protocol ip  parent 1:0 prio 1 u32 match ip protocol 6 0xff match ip sport 53 0xffff flowid 1:21
tc filter add dev ifb0 protocol ip  parent
1:0 prio 1 u32 match ip protocol 6 0xff match ip dport 53 0xffff flowid 1:21

SSH трафиик в класс 1:22

tc filter add dev ifb0 protocol ip  parent 1:0 prio 2 u32 match ip protocol 6 0xff match ip dport 22 0xffff flowid 1:22
tc filter add dev ifb0 protocol ip  parent
1:0 prio 2 u32 match ip protocol 6 0xff match ip sport 22 0xffff flowid 1:22

OpenVPN траффик в класс 1:23

tc filter add dev ifb0 protocol ip  parent 1:0 prio 3 u32 match ip protocol 6 0xff match ip sport 5001 0xffff flowid 1:23
tc filter add dev ifb0 protocol ip  parent
1:0 prio 3 u32 match ip protocol 6 0xff match ip dport 5001 0xffff flowid 1:23

SMTP траффик в класс 1:24

tc filter add dev ifb0 protocol ip parent 1:0 prio 4 u32 match ip protocol 6 0xff match ip sport 25 0xffff flowid 1:24
tc filter add dev ifb0 protocol ip parent
1:0 prio 4 u32 match ip protocol 6 0xff match ip dport 25 0xffff flowid 1:24

WEB траффик в класс 1:25

tc filter add dev ifb0 protocol ip parent 1:0 prio 5 u32 match ip protocol 6 0xff match ip sport 80 0xffff flowid 1:25
tc filter add dev ifb0 protocol ip parent
1:0 prio 5 u32 match ip protocol 6 0xff match ip dport 80 0xffff flowid 1:25

tc filter add dev ifb0 protocol ip parent 1:0 prio 5 u32 match ip protocol 6 0xff match ip sport 81 0xffff flowid 1:25
tc filter add dev ifb0 protocol ip parent
1:0 prio 5 u32 match ip protocol 6 0xff match ip dport 81 0xffff flowid 1:25

tc filter add dev ifb0 protocol ip parent 1:0 prio 5 u32 match ip protocol 6 0xff match ip sport 443 0xffff flowid 1:25
tc filter add dev ifb0 protocol ip parent
1:0 prio 5 u32 match ip protocol 6 0xff match ip dport 443 0xffff flowid 1:25

#Весь остальной трафик  отправить в низкоприоритетный класс
tc filter add dev ifb0 protocol ip parent
1:0 prio 6 u32 match ip protocol 6 0xff flowid 1:26

#Исходящий траффик

#Создаем корневую дисциплину для входящего траффика
#tc qdisc add dev $DEV egress

#Указываем размер очереди
ip link
set dev $DEV qlen 30

#Создаем корневую дисциплину для ifb0
tc qdisc add dev $DEV root handle
1: htb default 26

добавить общее ограничение скорости по классу

tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATEUP}kbit

добавляем подклассы - мы гарантируем каждаму классу МИНИМУМ "честную часть" полосы пропускания.

Этим способом мы избегаем возможности "голодания" классов. Каждому классу

разрешается занимать всю полосу пропускания, если другие классы не

используются.

tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[$RATEUP/12]kbit ceil ${RATEUP}kbit prio 0
tc
class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATEUP/12]kbit ceil ${RATEUP}kbit prio 1
tc
class add dev $DEV parent 1:1 classid 1:22 htb rate $[$RATEUP/12]kbit ceil ${RATEUP}kbit prio 2
tc
class add dev $DEV parent 1:1 classid 1:23 htb rate $[$RATEUP/12]kbit ceil ${RATEUP}kbit prio 3
tc
class add dev $DEV parent 1:1 classid 1:24 htb rate $[$RATEUP/6]kbit ceil ${RATEUP}kbit prio 4
tc
class add dev $DEV parent 1:1 classid 1:25 htb rate $[$RATEUP/12]kbit ceil ${RATEUP}kbit prio 5
tc
class add dev $DEV parent 1:1 classid 1:26 htb rate $[$RATEUP/12]kbit ceil ${RATEUP}kbit prio 6

#подключаем дисциплины обработки очереди к подклассам - здесь мы используем SFQ для каждого класса.

SFQ обеспечит почти честное деление полосы пропусканиямежду соединениями

внутри каждого класса.

tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent
1:21 handle 21: sfq perturb 10
tc qdisc add dev $DEV parent
1:22 handle 22: sfq perturb 10
tc qdisc add dev $DEV parent
1:23 handle 23: sfq perturb 10
tc qdisc add dev $DEV parent
1:24 handle 24: sfq perturb 10
tc qdisc add dev $DEV parent
1:25 handle 25: sfq perturb 10
tc qdisc add dev $DEV parent
1:26 handle 26: sfq perturb 10

направляем трафик в классы

icmp траффик в высокоприритетный класс

tc filter add dev $DEV protocol ip parent 1:0 prio 0 u32 match ip protocol 1 0xff flowid 1:20

UDP траффик в класс 1:21

tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip protocol 17 0xff flowid 1:21

DNS запросы в класс 1:21

tc filter add dev $DEV protocol ip  parent 1:0 prio 1 u32 match ip protocol 17 0xff match ip sport 53 0xffff flowid 1:21
tc filter add dev $DEV protocol ip  parent
1:0 prio 1 u32 match ip protocol 17 0xff match ip dport 53 0xffff flowid 1:21

tc filter add dev $DEV protocol ip  parent 1:0 prio 1 u32 match ip protocol 6 0xff match ip sport 53 0xffff flowid 1:21
tc filter add dev $DEV protocol ip  parent
1:0 prio 1 u32 match ip protocol 6 0xff match ip dport 53 0xffff flowid 1:21

SSH трафиик в класс 1:22

tc filter add dev $DEV protocol ip  parent 1:0 prio 2 u32 match ip protocol 6 0xff match ip dport 22 0xffff flowid 1:22
tc filter add dev $DEV protocol ip  parent
1:0 prio 2 u32 match ip protocol 6 0xff match ip sport 22 0xffff flowid 1:22

OpenVPN траффик в класс 1:23

tc filter add dev $DEV protocol ip  parent 1:0 prio 3 u32 match ip protocol 6 0xff match ip sport 5001 0xffff flowid 1:23
tc filter add dev $DEV protocol ip  parent
1:0 prio 3 u32 match ip protocol 6 0xff match ip dport 5001 0xffff flowid 1:23

SMTP траффик в класс 1:24

tc filter add dev $DEV protocol ip parent 1:0 prio 4 u32 match ip protocol 6 0xff match ip sport 25 0xffff flowid 1:24
tc filter add dev $DEV protocol ip parent
1:0 prio 4 u32 match ip protocol 6 0xff match ip dport 25 0xffff flowid 1:24

WEB траффик в класс 1:25

tc filter add dev $DEV protocol ip parent 1:0 prio 5 u32 match ip protocol 6 0xff match ip sport 80 0xffff flowid 1:25
tc filter add dev $DEV protocol ip parent
1:0 prio 5 u32 match ip protocol 6 0xff match ip dport 80 0xffff flowid 1:25

tc filter add dev $DEV protocol ip parent 1:0 prio 5 u32 match ip protocol 6 0xff match ip sport 81 0xffff flowid 1:25
tc filter add dev $DEV protocol ip parent
1:0 prio 5 u32 match ip protocol 6 0xff match ip dport 81 0xffff flowid 1:25

tc filter add dev $DEV protocol ip parent 1:0 prio 5 u32 match ip protocol 6 0xff match ip sport 443 0xffff flowid 1:25
tc filter add dev $DEV protocol ip parent
1:0 prio 5 u32 match ip protocol 6 0xff match ip dport 443 0xffff flowid 1:25

#Весь остальной трафик  отправить в низкоприоритетный класс
tc filter add dev $DEV protocol ip parent
1:0 prio 6 u32 match ip protocol 6 0xff flowid 1:26

спросил Nov 7 '13

bolshoy_plohish Gravatar bolshoy_plohish
1388 25 20 38

обновил Nov 9 '13

Comments

1

Безусловно мегаплюс за мегапост, но я все-таки рекомендовал бы использовать правильное оборудование ;). Даже самая нищая контора может позволить себе микротик за полторы тыщи рублей ;)

switch (Nov 7 '13)edit

к сожалению это работает не совсем так как вы описали. но вам виднее наверно. 10 классов с ceil=bandwidth приводят к перекрытию. тут надо использовать 90% полосы. иначе вы получите overrun на интерфейсе adsl и дальше это все будет до лампочки.

meral (Nov 7 '13)edit

Скрипт рабочий, но дельные предложения по шейпингу принимаются. ;-)

bolshoy_plohish (Nov 7 '13)edit

а еще не помешает на сервере с астериском DSCP голосовым пакетам в EF выставить

borispr (Nov 7 '13)edit

90-95% от полосы должно быть. иначе когда происходит затык на адсл(потеря несущей временная или еще чего) вы получаете перегруженную очередь и она не разгружается

meral (Nov 9 '13)edit

2 Ответа

0

оптимизацию сети (пропускной способности) нужно делать в самой сети - на сетевом оборудовании. Если затык с внешним каналом, то для этого есть правильные маршрутизаторы: из бюджетных тот же микротик либо бесплатный pfsense.

ссылка удалить спам редактировать

ответил Nov 7 '13

svoy Gravatar svoy
1603 1 4 20
http://svoy.in.ua/

Comments

Mikrotīk не везде купить можно, а данный скрипт опробован на tp-link c openwrt на борту.;-)

bolshoy_plohish (Nov 7 '13)edit

а не есть ли тплинк слабым звеном здесь? начиналось все пафосно о предприятиях )))

svoy (Nov 7 '13)edit

Начиналось все с того, что большенство администраторов про шейпинг только слышали.

Tp-link аппаратно не хуже Mikrotīk, а MR3420 даже интереснее будет. :-)

bolshoy_plohish (Nov 7 '13)edit

может и не хуже, но требует прямых рук для установки опенврт, мне больше нравится pfsense на виртуалке ) Это более похоже на SOHO\SMB-решение

svoy (Nov 8 '13)edit
0

Показать скорость в текущий момент, по классу 21 с интерфейсов eth2 и ifb0

#!/bin/bash
export n=21
watch
-n1 '
tc -s class show dev eth2 classid 1:${n};
tc -s class show dev ifb0 classid 1:${n};
 '

unset n
ссылка удалить спам редактировать

ответил Nov 21 '13

awsswa Gravatar awsswa flag of Russian Federation
685 5 2 9

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку
1 закладка

подписаться на rss ленту новостей

Статистика

Задан: Nov 7 '13

Просмотрен: 1,731 раз

Обновлен: Nov 21 '13

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.