Уже имею PPPoE+FreeRADIUS+MySQL -
настроил не без помощи данного сайта - все работает нормально.
Возникла надобность поднимать для разных юзеров соединения с РАЗНЫМИ полосами пропускания (например для юзера ВАСЯ=32кбита/сек, для ПЕТИ=64, для КОЛИ=128kbps )У меня LINUX DEBIAN,
# uname -a
Linux router 2.6.14.3-1 #5 Sat Dec 31 06:53:28 MSK 2005 i686 GNU/LinuxПодскажите мне пожалуйста как можно решить мой вопрос.
Кто то делал уже подобное ? как делали ?
заранее спасибо
в nibs в таблице users добавляешь столбец rate
Потом заменяешь /etc/ppp/ip-up на аналогичный но на перле
и через DBI вытягиваешь из базы нужный rate и шейпишь с поиощью htb#!/usr/bin/perl
$interface = $ARGV[0];
$tty = $ARGV[1];
$speed = $ARGV[2];
$localip = $ARGV[3];
$remoteip = $ARGV[4];
$ipparam = $ARGV[5];my $rate = "64kbit";
my $burst = "4kb";($a1, $a2, $a3, $a4) = split(/\./, $remoteip);
if($a3 eq "6") {
if(($a4 >= 1) && ($a4 <= 62)) {
$rate = "64kbit";
$burst = "4kb";
}
if(($a4 >= 65) && ($a4 <= 126)) {
$rate = "128kbit";
$burst = "6kb";
}
if(($a4 >= 129) && ($a4 <= 190)) {
$rate = "256kbit";
$burst = "8kb";
}
if(($a4 >= 193) && ($a4 <= 254)) {
$rate = "512kbit";
$burst = "16kb";
}
system("/sbin/tc qdisc add dev $interface root handle 1: htb");
system("/sbin/tc class add dev $interface parent 1: classid 1:10 htb rate $rate ceil $rate burst $burst");
system("/sbin/tc qdisc add dev $interface parent 1:10 handle 10:0 sfq perturb 10");
system("/sbin/tc filter add dev $interface parent 1:0 protocol ip prio 5 u32 match ip dst $remoteip flowid 1:10");
}У меня вариант без DBI так как я freenibs не использую, но дописывается за минут 5.
ip-down выглядит так:#!/bin/sh
# this is a script which is executed after disconnecting the ppp interface.
# look at man pppd for details# the followings parameters are available:
interface=$1
# $2 = tty-device
# $3 = speed
# $4 = local-IP-address
# $5 = remote-IP-address
# $6 = ipparam/sbin/tc qdisc del dev $interface root
коменарий к скрипту:
у меня vpn сеть 192.168.x.x но только 192.168.6.x шейпится по скорости, поэтому и идет проверка 3 октета на соответствие "6".
>коменарий к скрипту:
>у меня vpn сеть 192.168.x.x но только 192.168.6.x шейпится по скорости, поэтому
>и идет проверка 3 октета на соответствие "6".DEN! Спасибо.
Твою идею я понял (про раздачу определенных IP клиентам в зависимости от полосы).
Про то что изменить ip-up тоже понятно.Расскажи мне пожалуйста что значит :
1) "в nibs в таблице users добавляешь столбец rate "
у меня нет nibs у меня есть FreeRADIUS - в нем есть таблиы проверок и ответов в pppd при коннекте клиента
как то :home_net Framed-Protocol := PPP 0
home_net Service-Type := Framed-User 0
home_net Framed-Compression := Van-Jacobsen-TCP-IP 0
home_net Auth-Type := local 0
home_net Acct-Interim-Interval := 180 20И что такое freenibs ? нечто типа FreeRADIUS ?
2) ПРО htb я вычитал и нашел его скрипт SourceForge
тока еще не запускал его. Вроде бы как я понял - нужно сделать классы для каждой полосы ?
Можешь поделиться скриптом htb сюда или в мыло мне (пожалуйста)
>>коменарий к скрипту:
>>у меня vpn сеть 192.168.x.x но только 192.168.6.x шейпится по скорости, поэтому
>>и идет проверка 3 октета на соответствие "6".
>
>DEN! Спасибо.
>Твою идею я понял (про раздачу определенных IP клиентам в зависимости от
>полосы).
>Про то что изменить ip-up тоже понятно.
>
>Расскажи мне пожалуйста что значит :
>1) "в nibs в таблице users добавляешь столбец rate "
>у меня нет nibs у меня есть FreeRADIUS - в нем есть
>таблиы проверок и ответов в pppd при коннекте клиента
>как то :
>
>home_net Framed-Protocol := PPP
>0
>home_net Service-Type := Framed-User 0
>home_net Framed-Compression := Van-Jacobsen-TCP-IP 0
>home_net Auth-Type := local 0
>home_net Acct-Interim-Interval := 180 20
>
>И что такое freenibs ? нечто типа FreeRADIUS ?
>
>2) ПРО htb я вычитал и нашел его скрипт SourceForge
>тока еще не запускал его. Вроде бы как я понял - нужно
>сделать классы для каждой полосы ?
>Можешь поделиться скриптом htb сюда или в мыло мне (пожалуйста)Я бы сделал так:
file [ip-up]:
#!/bin/bash
USERS_PATH=<cfg-users-dir>
[-f $USERS_PATH/$PEERNAME/config.cfg ] && /<CFG_PATH>/user.sh start
exit
-------------------------------------------
file [ip-down]:
#!/bin/bash
USERS_PATH=<cfg-users-dir>
CFG_PATH=<cfg-dir>
[-f $USERS_PATH/$PEERNAME/config.cfg ] && /<CFG_PATH>/user.sh stop
exit
-------------------------------------------
file [user.sh]:
$!/bin/bash
. $USERS_PATH/$PEERNAME/config.cfg
case "$1" in
start)
/sbin/iptables -A users-acl -s $IPREMOTE -j MARK --to $QOS_ID
/sbin/iptables -A users-acl -d $IPREMOTE -j MARK --to $QOS_ID
/sbin/tc class add <dev-out> $PARENTID classid $MAJORE:$QOS_ID htb rate $MINRATEOUT ceil $MAXRATEOUT $ADDONEOUT
/sbin/tc class add <dev-in> $PARENTID classid $MAJORE:$QOS_ID htb rate $MINRATEOUT ceil $MAXRATEOUT $ADDONEOUT
;;
stop)
/sbin/iptables -D users-acl -s $IPREMOTE -j MARK --to $QOS_ID
/sbin/iptables -D users-acl -d $IPREMOTE -j MARK --to $QOS_ID
/sbin/tc class del <dev-out> classid $MAJORE:$QOS_ID
/sbin/tc class add <dev-in> classid $MAJORE:$QOS_ID
;;
esac
??????????????????????????????
Конфигрь юзера как хочешь независимо какая у тебя авторизация радиус или еще что-то
>Я бы сделал так:
>
>file [ip-up]:
>#!/bin/bash
>USERS_PATH=<cfg-users-dir>
>[-f $USERS_PATH/$PEERNAME/config.cfg ] && /<CFG_PATH>/user.sh start
>exit>-------------------------------------------
>file [ip-down]:
>#!/bin/bash
>USERS_PATH=<cfg-users-dir>
>CFG_PATH=<cfg-dir>
>[-f $USERS_PATH/$PEERNAME/config.cfg ] && /<CFG_PATH>/user.sh stop
>exit>-------------------------------------------
>file [user.sh]:
>$!/bin/bash
>. $USERS_PATH/$PEERNAME/config.cfg
>case "$1" in
> start)
> /sbin/iptables -A users-acl -s $IPREMOTE -j MARK --to $QOS_ID
> /sbin/iptables -A users-acl -d $IPREMOTE -j MARK --to $QOS_ID
> /sbin/tc class add <dev-out> $PARENTID classid $MAJORE:$QOS_ID htb rate $MINRATEOUT ceil $MAXRATEOUT $ADDONEOUT
> /sbin/tc class add <dev-in> $PARENTID classid $MAJORE:$QOS_ID htb rate $MINRATEOUT ceil $MAXRATEOUT $ADDONEOUT
> ;;
>
> stop)
> /sbin/iptables -D users-acl -s $IPREMOTE -j MARK --to $QOS_ID
> /sbin/iptables -D users-acl -d $IPREMOTE -j MARK --to $QOS_ID
> /sbin/tc class del <dev-out> classid $MAJORE:$QOS_ID
> /sbin/tc class add <dev-in> classid $MAJORE:$QOS_ID
> ;;
>
>esac
>??????????????????????????????
>Конфигрь юзера как хочешь независимо какая у тебя авторизация радиус или еще
>что-тонасколько я понимаю для скрипта - нужно каждому юзеру иметь свой =<cfg-users-dir> ?
- можно получить немного комментариев по поводу переменных в скрипте ( $PEERNAME, USERS_PATH=<cfg-users-dir>, /<CFG_PATH>/, $IPREMOTE , $QOS_ID .... и др , откуда они беруться ? )- у меня авторизацию в FreeRADIUS-e - юзеры хранятся только в мускле - и нет надобности создавать каждого юзера в СИСТЕМЕ.
- Ваши скрипты можно приспобить для такой технологии ?
Den скорее всего имел ввиду FreeNibs - прикрутите себе - во многом облегчит вам жизнь
>Den скорее всего имел ввиду FreeNibs - прикрутите себе - во многом
>облегчит вам жизньДа, поискав в гуугле - я понял о чем речь,
только все же предпочитаю для своих нужд свой софт.
Спасибо
>насколько я понимаю для скрипта - нужно каждому юзеру иметь свой =<cfg-users-dir> ?
>- можно получить немного комментариев по поводу переменных в скрипте ( $PEERNAME, USERS_PATH=<cfg-users-dir>, /<CFG_PATH>/, $IPREMOTE , $QOS_ID .... и др , откуда они беруться ? )USERS_PATH - Путь к директории пользователей
CFG_PATH - Путь к конфигурационным файлам
PEERNAME - переменная от pppd
IPREMOTE - переменная от pppd
$MAJORE & $QOS_ID & $MINRATEOUT & $MAXRATEOUT из config.
$ADDONEOUT из config для добовления атрибутов htb если нужно
$USERS_PATH/$PEERNAME/config.cfg>- у меня авторизацию в FreeRADIUS-e - юзеры хранятся только в мускле
>- и нет надобности создавать каждого юзера в СИСТЕМЕ.
>- Ваши скрипты можно приспобить для такой технологии ?
можно только при этом нужно будет делать запрос к базе вместо считывания из конфигурационног файла
Вместо ". $USERS_PATH/$PEERNAME/config.cfg" воткнуть файл которые будет экспортировать переменные
а как можно проверить что shaper поднялся нормально
я пробовал всякие комбинации с /sbin/tc для ppp0
но мне выводило ошибку всякий раз
>в nibs в таблице users добавляешь столбец rate
>Потом заменяешь /etc/ppp/ip-up на аналогичный но на перле
>и через DBI вытягиваешь из базы нужный rate и шейпишь с поиощью
>htb
>
>#!/usr/bin/perl
>
>$interface = $ARGV[0];
>$tty = $ARGV[1];
>$speed = $ARGV[2];
>$localip = $ARGV[3];
>$remoteip = $ARGV[4];
>$ipparam = $ARGV[5];
>
>my $rate = "64kbit";
>my $burst = "4kb";
>
>($a1, $a2, $a3, $a4) = split(/\./, $remoteip);
>
>if($a3 eq "6") {
> if(($a4 >= 1) && ($a4 <= 62)) {
> $rate = "64kbit";
> $burst = "4kb";
> }
> if(($a4 >= 65) && ($a4 <= 126)) {
> $rate = "128kbit";
> $burst = "6kb";
> }
> if(($a4 >= 129) && ($a4 <= 190)) {
> $rate = "256kbit";
> $burst = "8kb";
> }
> if(($a4 >= 193) && ($a4 <= 254)) {
> $rate = "512kbit";
> $burst = "16kb";
> }
> system("/sbin/tc qdisc add dev $interface root handle 1:
>htb");
> system("/sbin/tc class add dev $interface parent 1: classid
>1:10 htb rate $rate ceil $rate burst $burst");
> system("/sbin/tc qdisc add dev $interface parent 1:10 handle
>10:0 sfq perturb 10");
> system("/sbin/tc filter add dev $interface parent 1:0 protocol
>ip prio 5 u32 match ip dst $remoteip flowid 1:10");
>
>}
>
>У меня вариант без DBI так как я freenibs не использую, но
>дописывается за минут 5.
>
>
>ip-down выглядит так:
>
>#!/bin/sh
>
># this is a script which is executed after disconnecting the ppp
>interface.
># look at man pppd for details
>
># the followings parameters are available:
>interface=$1
># $2 = tty-device
># $3 = speed
># $4 = local-IP-address
># $5 = remote-IP-address
># $6 = ipparam
>
>/sbin/tc qdisc del dev $interface root
Пользуюсь freenibs, сделал, как написано, довавил таблицу "rate" заменил скрипты на те что тут, но всеравно не шейпится! скорость как была на максимуме, так и есть, помогите, по данному вопросу!
Народ, а подскажите как реализовать такой же шейпинг, но в зависимости от того, сколько юзер уже скачал?, т.е. первые 10 метров в сутки на максимум, а все что свыше 10 метров в этот же день на 32 kbps.
>Народ, а подскажите как реализовать такой же шейпинг, но в зависимости от
>того, сколько юзер уже скачал?, т.е. первые 10 метров в сутки
>на максимум, а все что свыше 10 метров в этот же
>день на 32 kbps.
Самое первое что мне лезет в голову - это :
/etc/ppp/ip-up полностью делаешь на PERL-e
берешь часть из примера выше,
в проверках - лазишь в БАЗУ за статистикой - в зависимости от трафика - даешь челу то что тебе нужно ему выдать.А как еще по другому ?
В принципе я так и думал, просто было интересно что думают другие, но тут придется писать отдельного демона, который будет периодически опрашивать интерфейсы, и выставлять квоты.Есть еще один вариант, но там надо заставить radius выполнять какой-либо скрипт при каждом приходе alive пакета, а вот как это сделать, я не знаю, може кто подскажет?