#!/bin/sh
IPTABLES=/sbin/iptables
TC=/usr/sbin/tc
DEV_IN=br0
# входящая скорость из инета 512 кбит/с
# устанавливаем чуть меньше
RATE_IN=480
# задаём гарантированную полосу
RATE_IN1=10
# задаём максимальный обьём данных который может быть пропущен без переключения на другие классы
# высокопиоритетный троафик
BURST0=25600
# низкоприоритетный трафик
BURST1=256
case "$1" in
start)
########################## IN #############################
$TC qdisc add dev $DEV_IN root handle 1:0 htb default 99
echo "Корневой класс 1:1"
$TC class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE_IN}kbit ceil ${RATE_IN}kbit
echo "0"
$TC class add dev $DEV_IN parent 1:1 classid 1:10 htb rate 50kbit ceil ${RATE_IN}kbit prio 0 burst ${BURST0}
echo "1"
$TC class add dev $DEV_IN parent 1:1 classid 1:25 htb rate 400kbit ceil ${RATE_IN}kbit prio 1 burst ${BURST0}
echo "2"
$TC class add dev $DEV_IN parent 1:1 classid 1:50 htb rate ${RATE_IN1}kbit ceil ${RATE_IN}kbit prio 2 burst ${BURST1}
echo "3"
$TC class add dev $DEV_IN parent 1:1 classid 1:75 htb rate ${RATE_IN1}kbit ceil ${RATE_IN}kbit prio 3 burst ${BURST1}
echo "4"
$TC class add dev $DEV_IN parent 1:1 classid 1:99 htb rate ${RATE_IN1}kbit ceil ${RATE_IN}kbit prio 4 burst ${BURST1}
echo "qdisc"
$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
#### Маркировка пакетов
echo "Маркировка"
# добавить цепочку 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.
# Низкоприоритетный трафик
echo "Низкоприоритетный трафик"
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
# порт ftp-data, низкий приоритет
echo "FTP"
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 20 -j MARK --set-mark 50
# WebMoney Keeper
echo "WM"
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 2802 -j MARK --set-mark 75
# интернет-пейджер aol
echo "Аська"
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 5190 -j MARK --set-mark 50
# приёмка почты
echo "Почта POP3"
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 110 -j MARK --set-mark 75
# IRC
echo "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
#pptp
echo "PPTP"
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 1723 -j MARK --set-mark 75
iptables -t mangle -A MYSHAPER-IN -p gre -j MARK --set-mark 75
# ICMP (ping) - высокий приоритет,
# будем удивлять друзей
echo "Пинги"
iptables -t mangle -A MYSHAPER-IN -p icmp -j MARK --set-mark 10
# распознавание имен DNS (маленькие пакеты)
echo "DNS"
iptables -t mangle -A MYSHAPER-IN -p udp -j MARK --set-mark 25
# WWW
echo "HTTP и HTTPS трафик"
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 80 -j MARK --set-mark 25
# iptables -t mangle -A MYSHAPER-IN -p tcp --dport 80 -j MARK --set-mark 25
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 443 -j MARK --set-mark 25
# iptables -t mangle -A MYSHAPER-IN -p tcp --dport 443 -j MARK --set-mark 25
# secure shell
echo "SSH"
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...)
echo "Telnet"
iptables -t mangle -A MYSHAPER-IN -p tcp --dport 23 -j MARK --set-mark 10
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 23 -j MARK --set-mark 10
# маленькие пакеты, скорее всего ACK-пакеты
# echo "Маленькие пакеты"
# iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 25
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