зарезать скорость канала на пользователя
Добавлено: Ср фев 06, 2008 6:25 am
Какой самый простой способ в Linux ?
ABillS - ~AsmodeuS~ Billing System
http://abills.net.ua/forum/
Код: Выделить всё
#!/bin/bash
TC=/usr/sbin/tc
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`
FILTERS=`/usr/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`
test -n "$FILTERS" && /sbin/ip ru add from $5 iif $1 table $FILTERS >/dev/null 2>&1
$TC qdisc del dev $1 root > /dev/null
$TC qdisc del dev $1 ingress > /dev/null
##### speed server->client
if [ "$UPSPEED" != "0" ] ;
then
$TC qdisc add dev $1 root tbf rate $(( $UPSPEED * 1024 ))bit burst 1540 limit 20kb
fi
##### speed client->server
if [ "$DOWNSPEED" != "0" ] ;
then
$TC qdisc add dev $1 handle ffff: ingress
$TC filter add dev $1 parent ffff: protocol ip \
prio 50 u32 match ip src 0.0.0.0/0 police rate $((DOWNSPEED * 1024))bit \
burst 12k drop flowid :1
fi
fi
аха... если это на уровне ядра делается... tc - это усеринтерфейс для управления трафиком, которое делается ядром, которое и собрано к тому же должно быть не кривоchtito писал(а):А разве в сам Abills не интегрирована подобная резка?
Это я понял, но в веб-админке Абиллса же есть поля куда вводится скорость. Это что, просто так? Не шейпится потом средствами пакета биллинга? Я просто не знаю.ran писал(а):аха... если это на уровне ядра делается... tc - это усеринтерфейс для управления трафиком, которое делается ядром, которое и собрано к тому же должно быть не кривоchtito писал(а):А разве в сам Abills не интегрирована подобная резка?![]()
![]()
Не просто так... Это возможность держать в базе параметры шейпера и передать их скрипту, который и пропишет правила шейпера... по-идее это должен делать libexec/linkupdown... и под фрёй он наверное и делает это более-менее нормально (не знаю)... правила, написанные там для линуха работать не будут. Пример рабочих правил (для линуха в линкапдаун) я приводил где-то в форуме. Ваще такие вещи как шейпинг - это... ммм... дело ну очень тонкое и чего-либо универсального, да ещё под разные оси Автору сделать сложно (да наверное и невозможно). А по семуchtito писал(а):Это я понял, но в веб-админке Абиллса же есть поля куда вводится скорость. Это что, просто так?
ran писал(а):а если хочешь по-серьёзному то без внимательного изучения хотя бы вот этого http://megalib.com/books/1346/lartc.html там делать нечего. а ещё лучше в оригинале - ссылка там есть... ну и маны по тс не помешают
Для чистого ипн правила шейпера надо на изернеты вешать. Входящий (на клиента) трафик на изернет, смотрящий в локалку, исходящий (от клиента - на изернет, смотрящий в инет. Ну или на IFB/IMQ... и не забывать удалять при отключенииAven писал(а):Спасибо за скрипт, только я забыл уточнить что у меня чистый ipn ')
а что здесь имеется в виду?ran писал(а):и не забывать удалять при отключении
А разве не надо сразу отсекать трафик пришетщий от клиента на интерфейсе смотрящем в сеть?и точно так же трафик пришедщий из интернета - отсекать на интерфейсе смотрящем в интернет?!ran писал(а):Для чистого ипн правила шейпера надо на изернеты вешать. Входящий (на клиента) трафик на изернет, смотрящий в локалку, исходящий (от клиента - на изернет, смотрящий в инет. Ну или на IFB/IMQ... и не забывать удалять при отключении
Фух вродебы разобрался...но теперь стал вопрос использования циклов...А с циклом нужно сделать следуещее:ran писал(а):мдя... ну и каша у тебя в голове... так и в психушку попасть недолго
1. Внимательно изучи принципы управления трафиком в линухе. В инете инфы валом
2. Определись с выбором дисциплин и классов обслуживания
3. Внимательно их изучи
4. Экспериментируй
Я писать под тебя скрипты небуду, уж извини...А примеры рабочих скриптов я привёл
Код: Выделить всё
#!/bin/sh
IPTABLES=/sbin/iptables
#TC=/sbin/tc
DEV_IN=eth0
RATE=10000
RATES_INS=1024
case "$1" in
start)
########################## IN #############################
tc qdisc add dev $DEV_IN root handle 1:0 htb default 333
tc class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${RATE}kbit ceil ${RATE}kbit
tc class add dev $DEV_IN parent 1:1 classid 1:2 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:7 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:30 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:67 htb rate $[$RATES_INS/2]kbit ceil ${RATES_INS}kbit
#....
tc class add dev $DEV_IN parent 1:1 classid 1:333 htb rate $[$RATES_INS/8]kbit ceil ${$RATES_INS/4]kbit #для особо умных,и тех кого я еще не добавил...
# И ТАК НА КАЖДОГО ПОЛЬЗОВАТЕЛЯ
tc qdisc add dev $DEV_IN parent 1:2 handle 2: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:7 handle 7: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:30 handle 30: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:67 handle 67: sfq perturb 10
tc qdisc add dev $DEV_IN parent 1:333 handle 333: sfq perturb 10
# И ТАК НА КАЖДОГО ПОЛЬЗОВАТЕЛЯ
#### Маркировка пакетов
# добавить цепочку MYSHAPER-IN в таблицу mangle - сейчас мы настроим таблицу,которую будем
# использовать для фильтрациии установки fwmark
iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -I POSTROUTING -o $DEV_IN -j MYSHAPER-IN
#ТЕПЕРЬ ПЕРЕБЕРАЕМ ВСЕ IP!!!ЖЕСТЬ....
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.2 -j MARK --set-mark 2
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.7 -j MARK --set-mark 7
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.30 -j MARK --set-mark 30
iptables -t mangle -A MYSHAPER-IN -d 192.168.0.67 -j MARK --set-mark 67
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 2 fw flowid 1:2
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 7 fw flowid 1:7
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 30 fw flowid 1:30
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 67 fw flowid 1:67
tc filter add dev $DEV_IN parent 1:0 protocol ip handle 333 fw flowid 1:333
# И ТАК НА КАЖДОГО ПОЛЬЗОВАТЕЛЯ
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