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

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

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

спросил 2013-11-07 04:49:10 +0400

bolshoy_plohish Gravatar bolshoy_plohish
1358 21 16 37

обновил 2013-11-09 18:39:52 +0400

Comments

1

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

switch ( 2013-11-07 09:54:16 +0400 )редактировать

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

meral ( 2013-11-07 10:47:09 +0400 )редактировать

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

bolshoy_plohish ( 2013-11-07 11:10:34 +0400 )редактировать

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

borispr ( 2013-11-07 13:01:44 +0400 )редактировать

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

meral ( 2013-11-09 15:30:48 +0400 )редактировать

2 Ответа

0

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

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

ответил 2013-11-07 13:20:17 +0400

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

Comments

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

bolshoy_plohish ( 2013-11-07 13:34:38 +0400 )редактировать

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

svoy ( 2013-11-07 19:12:02 +0400 )редактировать

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

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

bolshoy_plohish ( 2013-11-08 01:43:55 +0400 )редактировать

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

svoy ( 2013-11-08 13:12:57 +0400 )редактировать
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
ссылка удалить спам редактировать

ответил 2013-11-21 18:00:21 +0400

awsswa Gravatar awsswa flag of Russian Federation
456 5 2 7

Ваш ответ

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 ленту новостей

Статистика

Задан: 2013-11-07 04:49:10 +0400

Просмотрен: 753 раз

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

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