Задача то решена, но через... вобщем не устраивает меня такое решение. Использую htb.init, определил сервисный локальный трафик, выделив ему обширную полосу пропускания, а весь остальной шейпю как интернет-трафик. Т.е. есть pptp сервер с некоторыми сервисами в локальной сети, не относящимися конкретно к pptp. Казалось бы можно распределять инет-трафик на ppp+ интерфейсы, но тогда исключается возможность использовать свободную ширину канала при отсутствии активности одного из клиентов, а хочется! Потому что нету корневого класса для сразу всех ppp+, в котором можно было бы задать общее ограничение скорости. По-этому и шейпятся GRE пакеты через eth0, но вот проблема - для них нельзя задать правила явно!
Проблема бы элегантно испарилась, если бы шейпинг не был привязан к конкретному интерфейсу... а может я чего-то не знаю, и такие шейперы есть? Или какие другие решения для шейпинга ppp+? Подскажите пожалуйста уважаемые форумчане?
Шейпинг по протоколу GRE (или как шейпить PPTP)
Модераторы: SLEDopit, Модераторы разделов
-
0xFF
- Сообщения: 267
- ОС: Gentoo
Re: Шейпинг по протоколу GRE
Нашёл решение вот тут, правда голый TC 
Код: Выделить всё
#!/bin/sh
IPTABLES=/sbin/iptables
TC=/sbin/tc
DEV_IN=eth0
#actually 256
#для того, чтобы реально управлять с приоритетом пришлось резать канал примерно на 25%
RATE_IN=192
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:1 classid 1:10 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/2]kbit prio 0
$TC class add dev $DEV_IN parent 1:1 classid 1:25 htb rate $[$RATE_IN/8]kbit ceil $[$RATE_IN/2]kbit prio 1
$TC class add dev $DEV_IN parent 1:1 classid 1:50 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 2
$TC class add dev $DEV_IN parent 1:1 classid 1:75 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 3
$TC class add dev $DEV_IN parent 1:1 classid 1:99 htb rate $[$RATE_IN/4]kbit ceil ${RATE_IN}kbit prio 4
$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
# порт ftp-data, низкий приоритет
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 20 -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
#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) - высокий приоритет,
# будем удивлять друзей
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
#тут ускрил шефа Smile
iptables -t mangle -A MYSHAPER-IN -d 10.1.1.7 -j MARK --set-mark 10
# избыточно - смаркировать все неотмаркированые пакеты как 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 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