#!/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
Безусловно мегаплюс за мегапост, но я все-таки рекомендовал бы использовать правильное оборудование ;). Даже самая нищая контора может позволить себе микротик за полторы тыщи рублей ;)
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 )редактировать