URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 64085
[ Назад ]

Исходное сообщение
"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."

Отправлено Andre.S , 13-Фев-06 05:29 
Уже имею 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

Подскажите мне пожалуйста как можно решить мой вопрос.
Кто то делал уже подобное ? как делали ?
заранее спасибо


Содержание

Сообщения в этом обсуждении
"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Den , 13-Фев-06 13:54 
в 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


"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Den , 13-Фев-06 13:57 
коменарий к скрипту:
у меня vpn сеть 192.168.x.x но только 192.168.6.x шейпится по скорости, поэтому и идет проверка 3 октета на соответствие "6".

"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Andre.S , 13-Фев-06 21:48 
>коменарий к скрипту:
>у меня 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 сюда или в мыло мне (пожалуйста)


"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Jastis , 24-Фев-06 23:47 
>>коменарий к скрипту:
>>у меня 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
??????????????????????????????
Конфигрь юзера как хочешь независимо какая у тебя авторизация радиус или еще что-то


"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Andre.S , 25-Фев-06 04:41 
>Я бы сделал так:
>
>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 - юзеры хранятся только в мускле - и нет надобности создавать каждого юзера в СИСТЕМЕ.
- Ваши скрипты можно приспобить для такой технологии ?


"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Skif , 25-Фев-06 11:36 
Den скорее всего имел ввиду FreeNibs - прикрутите себе - во многом облегчит вам жизнь

"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Andre.S , 25-Фев-06 22:33 
>Den скорее всего имел ввиду FreeNibs - прикрутите себе - во многом
>облегчит вам жизнь

Да, поискав в гуугле - я понял о чем речь,
только все же предпочитаю для своих нужд свой софт.
Спасибо


"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Jastis , 25-Фев-06 12:20 
>насколько я понимаю для скрипта - нужно каждому юзеру иметь свой =<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" воткнуть файл которые будет экспортировать переменные


"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Andre.S , 26-Фев-06 07:43 
а как можно проверить что shaper поднялся нормально
я пробовал всякие комбинации с /sbin/tc для ppp0
но мне выводило ошибку всякий раз

"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено major1986 , 20-Фев-07 10:12 
>в 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" заменил скрипты на те что тут, но всеравно не шейпится! скорость как была на максимуме, так и есть, помогите, по данному вопросу!


"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено satelit , 26-Фев-06 09:36 
Народ, а подскажите как реализовать такой же шейпинг, но в зависимости от того, сколько юзер уже скачал?, т.е. первые 10 метров в сутки на максимум, а все что свыше 10 метров в этот же день на 32 kbps.

"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено Andre.S , 27-Фев-06 04:42 
>Народ, а подскажите как реализовать такой же шейпинг, но в зависимости от
>того, сколько юзер уже скачал?, т.е. первые 10 метров в сутки
>на максимум, а все что свыше 10 метров в этот же
>день на 32 kbps.
Самое первое что мне лезет в голову - это :
/etc/ppp/ip-up полностью делаешь на PERL-e
берешь часть из примера выше,
в проверках - лазишь в БАЗУ за статистикой - в зависимости от трафика - даешь челу то что тебе нужно ему выдать.

А как еще по другому ?



"Traffic Control (shaper) - как сделать ? PPPoE+FreeRADIUS+My..."
Отправлено satelit , 27-Фев-06 09:29 
В принципе я так и думал, просто было интересно что думают другие, но тут придется писать отдельного демона, который будет периодически опрашивать интерфейсы, и выставлять квоты.

Есть еще один вариант, но там надо заставить radius выполнять какой-либо скрипт при каждом приходе alive пакета, а вот как это сделать, я не знаю, може кто подскажет?