TC shaper

Материал из Marchellys Wiki

Перейти к: навигация, поиск

Простой и удобный шейпер для Вашего офиса.

Создает приоритеты трафика, ограничивает скорости клиентам в интернет.

Базовая версия.

Описание и усовершенствование приветствуется. :)

Проверено и функционирует на базе Gentoo Linux

Включаем в ядре все что связано с Qos а точнее htb и cbq

Далее

Нам нужно 2 файла:

shaper в /etc/init.d/

и odessa.net в /etc в котором будет храниться список сетей которые считаются локальными и не имеют ограничений по скорости.

Значит по порядку: Сначала создаем файл со списком сетей которые будут считаться локальными:

 nano -w /etc/odessa.net

Далее создаем файл шейпера:

 nano -w /etc/init.d/shaper

Копируем туда содержимое скрипта

Делаем его исполняемым:

 chmod +x /etc/init.d/shaper

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

 rc-update add shaper default

Запускаем и проверяем работоспособность:

 /etc/init.d/shaper start
 /etc/init.d/shaper status

Сам скрипт:

#!/bin/sh

IPTABLES=/sbin/iptables
TC=/sbin/tc
DEV_IN=eth0
#256kbit
RATE_IN=360
#Unlimited local network 100mbit
RATE_UN=120
#512kbit
RATE_IN_512=720   



case "$1" in
start)
########################## IN #############################
$TC qdisc add dev $DEV_IN root handle 1:0 htb default 99  

#$TC class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE_IN}kbit ceil ${RATE_IN}kbit
$TC class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE_UN}mbit ceil ${RATE_UN}mbit

# Unlimited
$TC class add dev $DEV_IN parent 1:1 classid 1:5 htb rate $[$RATE_UN/1,1]mbit ceil $[RATE_UN]mbit prio 0
$TC class add dev $DEV_IN parent 1:1 classid 1:10 htb rate $[$RATE_IN/4]kbit ceil $[$RATE_IN/2]kbit prio 0
$TC class add dev $DEV_IN parent 1:1 classid 1:25 htb rate $[$RATE_IN/4]kbit ceil $[$RATE_IN/2]kbit prio 1
$TC class add dev $DEV_IN parent 1:1 classid 1:50 htb rate $[$RATE_IN/2]kbit ceil $[RATE_IN]kbit prio 2
$TC class add dev $DEV_IN parent 1:1 classid 1:75 htb rate $[$RATE_IN/2]kbit ceil $[RATE_IN]kbit prio 3
$TC class add dev $DEV_IN parent 1:1 classid 1:99 htb rate $[$RATE_IN/2]kbit ceil $[RATE_IN]kbit prio 4

$TC qdisc add dev $DEV_IN parent 1:5  handle 5:  pfifo limit 5
$TC qdisc add dev $DEV_IN parent 1:10 handle 10: pfifo limit 5
$TC qdisc add dev $DEV_IN parent 1:25 handle 25: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:50 handle 50: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:75 handle 75: sfq perturb 10
$TC qdisc add dev $DEV_IN parent 1:99 handle 99: sfq perturb 10


#### Маркировка пакетов

# добавить цепочку MYSHAPER-IN в таблицу mangle - сейчас мы настроим таблицу,которую будем
# использовать для фильтрациии установки fwmark
iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -I POSTROUTING -o $DEV_IN -j MYSHAPER-IN

# маркируем пакеты с помощью fwmark - устанавливаем значения 10-99 в зависимости от
# нужного класса. Высший приоритет - 10.
# Низкоприоритетный трафик
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 0:1024 -j MARK --set-mark 99
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 0:1024 -j MARK --set-mark 99

# интернет-пейджер aol
#iptables -t mangle -A MYSHAPER-IN -p tcp --sport 5190 -j MARK --set-mark 75
# irc
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 6667 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 9944 -j MARK --set-mark 75

# ICMP (ping) - высокий приоритет,
# будем удивлять друзей
iptables -t mangle -A MYSHAPER-IN -p icmp -j MARK --set-mark 25

# распознавание имен DNS (маленькие пакеты)
iptables -t mangle -A MYSHAPER-IN -p udp -j MARK --set-mark 25

# secure shell
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 22 -j MARK --set-mark 10
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 22 -j MARK --set-mark 10

# telnet (ew...)
#iptables -t mangle -A MYSHAPER-IN -p tcp --dport 23 -j MARK --set-mark 25
#iptables -t mangle -A MYSHAPER-IN -p tcp --sport 23 -j MARK --set-mark 25

# маленькие пакеты, скорее всего ACK-пакеты
iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 25

###########################################
#Локальные ресурсы самба и тп. пускаем всем на бОльшей скорости
iptables -t mangle -A MYSHAPER-IN -s 192.168.2.102 -j MARK --set-mark 5
iptables -t mangle -A MYSHAPER-IN -s 10.129.1.2 -j MARK --set-mark 5
iptables -t mangle -A MYSHAPER-IN -s 10.129.1.5 -j MARK --set-mark 5

#for i in `cat /etc/odessa.net`; do  iptables -t mangle -A MYSHAPER-IN -s $i -j MARK --set-mark 5; done; 

#Список Одесских сетей, которые надо пустить без ограничений
# В данном случае список берем из файла /etc/odessa.net который может содержать комментарии начнающиеся с #
for i in `grep -v "^#" /etc/odessa.net`; do iptables -t mangle -A MYSHAPER-IN -s $i -j MARK --set-mark 5; done; 

#Здесь добавляем себя любимого на максимальной скорости
iptables -t mangle -A MYSHAPER-IN -d 192.168.2.10 -j MARK --set-mark 5
# избыточно - смаркировать все неотмаркированые пакеты как 99 (низкий проиритет)
iptables -t mangle -A MYSHAPER-IN -m mark --mark 0 -j MARK --set-mark 99

$TC filter add dev $DEV_IN parent 1:0 prio 0 protocol ip handle 5  fw flowid 1:5
$TC filter add dev $DEV_IN parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
$TC filter add dev $DEV_IN parent 1:0 prio 1 protocol ip handle 25 fw flowid 1:25
$TC filter add dev $DEV_IN parent 1:0 prio 2 protocol ip handle 50 fw flowid 1:50
$TC filter add dev $DEV_IN parent 1:0 prio 3 protocol ip handle 75 fw flowid 1:75
$TC filter add dev $DEV_IN parent 1:0 prio 4 protocol ip handle 99 fw flowid 1:99

echo "Shaper on $DEV_IN started ($RATE_IN kbit/s)"
;;
stop)
tc qdisc del dev $DEV_IN root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT root 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_OUT -j MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-OUT 2> /dev/null > /dev/null
iptables -t mangle -D POSTROUTING -o $DEV_IN -j MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -F MYSHAPER-IN 2> /dev/null > /dev/null
iptables -t mangle -X MYSHAPER-IN 2> /dev/null > /dev/null

echo "Shaper removed"
;;
restart)
$0 stop
$0 start
;;
status)

echo "[qdisc IN]"
$TC -s qdisc show dev $DEV_IN
echo "[class IN]"
$TC -s class show dev $DEV_IN
echo "[filter IN]"
$TC -s filter show dev $DEV_IN
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac

exit 0


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

Источник — «http://marchelly.org.ua/wiki/TC_shaper»