exn Банальная задача. допустим 100 клиентов на анлиме на eth1. VPN коннект к серверу на eth1(ppp0)
У каждого клиента в базе свои параметы
download (
rate и
ceil) И upload (
rate и
ceil)
Нужно общий канал резать между юзверями по их параметрам
rate и
ceil. у некоторых
ceil доходит до ширины общего канала. + преоретизация трафа ICMP, www, все остальное. + нужно чтобы трубы канала не были жестко ограничены а раздавались на соседние класcы + маршрутиация на внутренний сервак, без ограничения скорости.
Щас в общем все сделано, но упал сервак (стоявший на 7.10 бубунте) и поднять 7.10 не удается из-за отсутствия ПО.
шейпер на закрузгу такого рода. (на аплоад - аналогично)
вызывается при подключении клиента на pptpd. Правила очищаются при отключении. Авторизация и статистика сидит на радиусе первом.
Код
#!/bin/sh
# Интерфейс
IP=${5}
IPINTERNET="ч.ч.ч.ч"
DEVINTERNET="ppp0"
DEVDOWN="imq1"
DEVUP="imq0"
if [ -f /var/run/radattr.$1 ]
then
DOWNSPEED='/usr/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1'
UPSPEED='/usr/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1'
ID='/usr/bin/awk '/ID-User/ {print $2}' /var/run/radattr.$1'
iptables -t mangle -A POSTROUTING -o $1 -j IMQ --todev 1
iptables -t mangle -A PREROUTING -i $1 -j IMQ --todev 0
iptables -t nat -A POSTROUTING -s $IP --out-interface $DEVINTERNET -j SNAT --to-source $IPINTERNET
ICMP="match ip protocol 1 0xff"
TCP="match ip protocol 6 0xff"
UDP="match ip protocol 17 0xff"
DPORT="match ip dport"
SPORT="match ip sport"
SRC="match ip src"
DST="match ip dst"
U32="protocol ip u32"
#-------------------------------------------------------------------------------
# DOWNLOAD
#-------------------------------------------------------------------------------
# ping
tc class add dev $DEVDOWN parent 1:1 classid 1:1${ID}1 htb rate ${DOWNSPEED}kbit ceil 999kbit prio 1
# ssh
tc class add dev $DEVDOWN parent 1:1 classid 1:1${ID}2 htb rate ${DOWNSPEED}kbit ceil 500kbit prio 2
# www
tc class add dev $DEVDOWN parent 1:1 classid 1:1${ID}3 htb rate ${DOWNSPEED}kbit ceil 500kbit prio 3
# все остальное
tc class add dev $DEVDOWN parent 1:1 classid 1:1${ID}4 htb rate ${DOWNSPEED}kbit ceil 500kbit prio 4
tc qdisc add dev $DEVDOWN parent 1:1${ID}1 handle 1${ID}1: sfq perturb 10
tc qdisc add dev $DEVDOWN parent 1:1${ID}2 handle 1${ID}2: sfq perturb 10
tc qdisc add dev $DEVDOWN parent 1:1${ID}3 handle 1${ID}3: sfq perturb 10
tc qdisc add dev $DEVDOWN parent 1:1${ID}4 handle 1${ID}4: sfq perturb 10
tc filter add dev $DEVDOWN parent 1:0 prio 1 $U32 $ICMP $DST ${IP}/32 classid 1:1${ID}1
tc filter add dev $DEVDOWN parent 1:0 prio 2 $U32 $SPORT 22 0xffff $DST ${IP}/32 classid 1:1${ID}2
tc filter add dev $DEVDOWN parent 1:0 prio 3 $U32 $SPORT 80 0xffff $DST ${IP}/32 classid 1:1${ID}3
tc filter add dev $DEVDOWN parent 1:0 prio 4 $U32 $DST ${IP}/32 classid 1:1${ID}4
#-------------------------------------------------------------------------------
# UPLOAD
#-------------------------------------------------------------------------------
tc class add dev $DEVUP parent 1:1 classid 1:1${ID}1 htb rate ${UPSPEED}kbit ceil 999kbit prio 1
tc class add dev $DEVUP parent 1:1 classid 1:1${ID}2 htb rate ${UPSPEED}kbit ceil 500kbit prio 2
tc class add dev $DEVUP parent 1:1 classid 1:1${ID}3 htb rate ${UPSPEED}kbit ceil 500kbit prio 3
tc class add dev $DEVUP parent 1:1 classid 1:1${ID}4 htb rate ${UPSPEED}kbit ceil 500kbit prio 4
tc qdisc add dev $DEVUP parent 1:${ID}1 handle 1${ID}1: sfq perturb 10
tc qdisc add dev $DEVUP parent 1:${ID}2 handle 1${ID}2: sfq perturb 10
tc qdisc add dev $DEVUP parent 1:${ID}3 handle 1${ID}3: sfq perturb 10
tc qdisc add dev $DEVUP parent 1:${ID}4 handle 1${ID}4: sfq perturb 10
tc filter add dev $DEVUP parent 1:0 prio 1 $U32 $ICMP $SRC ${IP}/32 classid 1:1${ID}1
tc filter add dev $DEVDOWN parent 1:0 prio 2 $U32 $DPORT 22 0xffff $SRC ${IP}/32 classid 1:1${ID}2
tc filter add dev $DEVDOWN parent 1:0 prio 3 $U32 $DPORT 80 0xffff $SRC ${IP}/32 classid 1:1${ID}3
tc filter add dev $DEVUP parent 1:0 prio 1 $U32 $SRC ${IP}/32 classid 1:1${ID}4
fi
Пробовал на
ifb реализовать. так заданная ширина канала у меня почемуто не соответсвовала реальности (знаю про особенности
ifb и itables: было все учтено).
С удовольствием выслушаю альтернативные варианты без
IMQ. Очень хотелось бы отказаться от виртуалки, но вообще возможно ли это для исходящего трафа?????
Двое всегда договорятся, если хотя бы один из них не дурак.