MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Вопросы и пожелания
Ответить
MaKi
Сообщения: 15
Зарегистрирован: Ср дек 03, 2008 6:21 pm
Откуда: Україна, Калуш
Контактная информация:

MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение MaKi »

У меня стоит FreeBSD 7.1-RELEASE-p5.
связка mpd5+dummynet за несколько часов работы трапает сервер.

Я задался целью отказаться от думинета и использовать ng_car.
Через радиус атрибуты в тарифном плане - не красиво. Пришлось немного поработать над биллингом.
Прошу оценить мои наработки.

в mpd.conf закомментируйте строки
set iface up-script "/usr/abills/libexec/linkupdown mpd up"
set iface down-script "/usr/abills/libexec/linkupdown mpd down"

Версия Abills у меня
=====0.42=====
27.05.2009\\

Изменения в файле abills/Abills/mysql/Auth.pm

Код: Выделить всё

488,489d487
<
<
565a564,666
> #MaK 29.05.2009 ng_car Shaper
> #=comment
> elsif ($NAS->{NAS_TYPE} eq 'mpd5') {
>   #$traf_tarif
>   my $EX_PARAMS = $self->ex_traffic_params( {
>                                               traf_limit => $traf_limit,
>                                             deposit    => $self->{DEPOSIT},
>                                             MAX_SESSION_TRAFFIC => $MAX_SESSION_TRAFFIC });
>
> #=comment
>     my $net_id = 0;
>     my @net_list = ();
>     my $flt_num  = 1;
>     my $lim_num_in  = 1;
>     my $lim_num_out = 1;
>
>     my $flt_in = "";
>     my $flt_out = "";
>     my $limit_in = "";
>     my $limit_out = "";
>     my $speed_in = 0;
>     my $speed_out = 0;
>
>     my $is_first = 1;
>     my $is_filter = 0;
>     my $burst = 0;
>
>     #Last ID of traff_tariff
>     $net_id = $EX_PARAMS->{id};
>     for(my $i=$net_id; $i>=0; $i--) {
>       if (defined($EX_PARAMS->{net_list}->{$i})) {
>         @net_list = split(/\n|\r|;/, $EX_PARAMS->{net_list}->{$i});
>         $is_first = 1;
>
>       #Generate match rules for mpd
>         foreach my $line (@net_list) {
>           if (length($line) >= 8) {
>             if ($is_first == 1)
>             {
>               $flt_in = $flt_num . "#1=match ";
>               $limit_in = "in#" . $lim_num_in++ . "#Traf" . $i . "=flt" . $flt_num++;
>
>               $flt_out = $flt_num . "#1=match ";
>               $limit_out = "out#" . $lim_num_out++ . "#Traf" . $i . "=flt" . $flt_num++;
>
>               $is_first = 0;
>             }
>             else
>             {
>               $flt_in  .= " or ";
>               $flt_out .= " or ";
>             }
>             $flt_out .= "src net " . $line;
>             $flt_in  .= "dst net " . $line;
>           }
>         }
>         if ($is_first == 1) { # Якщо мережі не прописані, значить лімітувати весь трафік
>           $limit_in  = "in#"  . $lim_num_in++  . "#Traf" . $i . "=all ";
>           $limit_out = "out#" . $lim_num_out++ . "#Traf" . $i . "=all ";
>         }
>         else { #закидуємо в параметри фільтри
>           push @{ $RAD_PAIRS->{'mpd-filter'} }, $flt_in;
>           push @{ $RAD_PAIRS->{'mpd-filter'} }, $flt_out;
>         }
>
>         if ($i == 0 && $self->{USER_SPEED} > 0)
>         {
>           $speed_in = int($self->{USER_SPEED}) * $CONF->{KBYTE_SIZE};
>           $speed_out = $speed_in;
>         }
>         else {
>           $speed_in = int($EX_PARAMS->{speed}->{$i}->{IN}) * $CONF->{KBYTE_SIZE};
>           $speed_out = int($EX_PARAMS->{speed}->{$i}->{OUT}) * $CONF->{KBYTE_SIZE};
>         }
>
>         if ($speed_in > 0) {
>           $burst = $speed_in * 3 / 16;
>             if ($speed_in <= 2097152) {
>               $limit_in  .= " shape " . $speed_in . " $burst";
>             }
>             else {
>               $limit_in .= " rate-limit " . $speed_in . " $burst " . $burst*2;
>             }
>         }
>         if ($speed_out > 0) {
>           $burst = $speed_out * 3 / 16;
>             if ($speed_out <= 2097152) {
>               $limit_out  .= " shape " . $speed_out . " $burst";
>             }
>             else {
>               $limit_out .= " rate-limit " . $speed_out . " $burst " . $burst*2;
>             }
>         }
>         $limit_in .= " pass";
>         $limit_out .= " pass";
>         push @{ $RAD_PAIRS->{'mpd-limit'} }, $limit_in;
>         push @{ $RAD_PAIRS->{'mpd-limit'} }, $limit_out;
>       }
>     }
>     #трафік, який буде передаватись стандартними атрибутами радіуса
>     $RAD_PAIRS->{'mpd-input-acct'} = "Traf0";
>     $RAD_PAIRS->{'mpd-output-acct'}= "Traf0";
> }
1064,1065c1165,1166
<
<    $self->query($db, "SELECT id, in_price, out_price, prepaid, in_speed, out_speed, LENGTH(nets), expression
---
> #MaK 29.05.2009 Added field nets and ORDER BY. This changes related to mpd-limit
>    $self->query($db, "SELECT id, in_price, out_price, prepaid, in_speed, out_speed, LENGTH(nets), expression, nets
1067c1168,1169
<              WHERE interval_id='$self->{TT_INTERVAL}';");
---
>              WHERE interval_id='$self->{TT_INTERVAL}'
>            ORDER BY id DESC;");
1075c1177
<
---
>    my $max_id = 0;
1077a1180,1186
> #MaK 29.05.2009 This changes related to mpd-limit
>      if ($max_id == 0) {
>        $max_id=int($line->[0]);
>        $EX_PARAMS{id}=$max_id;
>      }
>      $EX_PARAMS{net_list}{$line->[0]}=$line->[8];
>


Если скорость меньше 2 Мбит/с используется shape
Больше - rate-limit
Если 0 - ограничение снимается
Меня интерисует, правильно ли я выбрал условия использования шейпа и рейтлимита. И правильно ли я расчитываю бурст.

В этом коде уже реализовано Typed Accounting Update http://mpd.sourceforge.net/doc5/mpd36.html#36. Тоесть мпд уже отдаёт на радиус объёмы трафика по зонах такими атрибутами как mpd-input-packets = Local:213213 . При этом глобальный трафик отдаётся, кроме того, стандартными атрибутами. Пока что абилс не учитывает дополнительные атрибуты. Я планирую оценить возможность доработки по учету трафика по зонам.

Ну и вообще, если есть замечания по коду - пишите.

~AsmodeuS~
Site Admin
Сообщения: 5746
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение ~AsmodeuS~ »

посмотрю чуть попозже думаю в ключу в код


интересный момент был бы работы с ng_car через linkupdown

kirill.ru
Сообщения: 40
Зарегистрирован: Вт май 26, 2009 11:12 pm

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение kirill.ru »

хм...странно...что то не завелось. Выполнил всё по инструкции...подключаюсь "ошибка 691"...
Что ещё нужно добавить? Это ведь не полная информация.

~AsmodeuS~
Site Admin
Сообщения: 5746
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение ~AsmodeuS~ »

деление трафика на зоны в MPD5 уже риализированно в ABillS 0.5

MaKi
Сообщения: 15
Зарегистрирован: Ср дек 03, 2008 6:21 pm
Откуда: Україна, Калуш
Контактная информация:

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение MaKi »

kirill.ru писал(а):хм...странно...что то не завелось. Выполнил всё по инструкции...подключаюсь "ошибка 691"...
Что ещё нужно добавить? Это ведь не полная информация.
В моём куске кода нет принятия решения по удачной или неудачной авторизации.
Скорее всего какая то ошибка при включении в свой код.

Зоны в интервалах должны быть прописаны как в в примере - через ";".

Я могу скинуть свой Auth.pm, а ты дай мне свой - я посмотрю.

MaKi
Сообщения: 15
Зарегистрирован: Ср дек 03, 2008 6:21 pm
Откуда: Україна, Калуш
Контактная информация:

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение MaKi »

~AsmodeuS~ писал(а):деление трафика на зоны в MPD5 уже риализированно в ABillS 0.5
А в ABillS 0.5 есть уже учёт трафика по зонам?

kirill.ru
Сообщения: 40
Зарегистрирован: Вт май 26, 2009 11:12 pm

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение kirill.ru »

MaKi> отправил в личку..., но в исходящих оно там висит уже ~20 минут

kirill.ru
Сообщения: 40
Зарегистрирован: Вт май 26, 2009 11:12 pm

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение kirill.ru »

деление трафика на зоны в MPD5 уже риализированно в ABillS 0.5
Поконкретне расскажите пожалуйста, что означает деление трафика на зоны?

~AsmodeuS~
Site Admin
Сообщения: 5746
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение ~AsmodeuS~ »

MaKi писал(а):
~AsmodeuS~ писал(а):деление трафика на зоны в MPD5 уже риализированно в ABillS 0.5
А в ABillS 0.5 есть уже учёт трафика по зонам?

да
но пока это бета

kirill.ru
Сообщения: 40
Зарегистрирован: Вт май 26, 2009 11:12 pm

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение kirill.ru »

Через радиус атрибуты в тарифном плане - не красиво.
MaKi, какие атрибуты ты передавал????

MaKi
Сообщения: 15
Зарегистрирован: Ср дек 03, 2008 6:21 pm
Откуда: Україна, Калуш
Контактная информация:

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение MaKi »

Так и передавал, как указано в доке Абилса для MPD

mpd-limit+=in#1=all shape 128000 4000,
mpd-limit+=out#1=all shape 128000 4000

Заметь - без пробелов и без кавычек.

kirill.ru
Сообщения: 40
Зарегистрирован: Вт май 26, 2009 11:12 pm

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение kirill.ru »

Перекомпилировал ядро с поддержкой ng, установил ng_car из портов, перекомпилировал mpd5 с поддержкой NG_CAR и NG_IPACCT, в радиус добавил словари согласно http://abills.net.ua/wiki/doku.php?id=a ... ocs:mpd:ru.

mpd-limit+=in#1=all shape 128000 4000,
mpd-limit+=out#1=all shape 128000 4000

Не хочит скорость резать...что не так?

MaKi
Сообщения: 15
Зарегистрирован: Ср дек 03, 2008 6:21 pm
Откуда: Україна, Калуш
Контактная информация:

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение MaKi »

Какая у тебя версия системы?
В FreeBSD 7 ng_car идёт в ядре
options NETGRAPH_CAR


Включи в радиусе детализацию reply detail
будут вестись логи ответов радиуса НАСу в файл reply-detail-ДАТА.log
Приблизительно так
Packet-Type = Access-Accept
Fri Jun 26 00:17:59 2009
Session-Timeout = 430921
mpd-limit += "in#1#Traf0=all shape 1048576 196608 pass"
mpd-limit += "out#1#Traf0=all shape 1048576 196608 pass"
Acct-Interim-Interval = 60
mpd-output-acct = "Traf0"
Framed-IP-Address = ###.###.###.###
Framed-IP-Netmask = 255.255.255.255
mpd-input-acct = "Traf0"

newnix
Сообщения: 8
Зарегистрирован: Сб окт 14, 2006 5:01 pm

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение newnix »

freeradius 2.1.6
abills 0.42b
perl 5.10.0

Пары, указанные в тарифном плане не отдаются:

cat /var/log/radacct/127.0.0.1/reply-detail-20090924
Thu Sep 24 17:04:01 2009
Packet-Type = Access-Accept
Session-Timeout = 543359
Framed-IP-Address = 192.168.36.73
Framed-IP-Netmask = 255.255.255.255
MS-CHAP2-Success = 0x01533d36383139443746374435344636454637324246453435353835353546343631314238354633363234

Там указано:

Код: Выделить всё

mpd-limit+=in#1=all rate-limit 256000 48000 96000,
mpd-limit+=out#1=all rate-limit 1024000 192000 384000
Что с кавычками, что без - разницы никакой. В логах абиллса (abills.log):

Код: Выделить всё

2009-09-24 19:10:36 LOG_WARNING: ACCT [-] NAS: 0 Not specified NAS server
2009-09-24 19:10:49 LOG_INFO: AUTH [newnix] NAS: 1 (127.0.0.1)  GT: 0.01630
- варнинг пропадает если в мпд заменить set radius server 127.0.0.1 radsecret 1812 1813 на set radius config /etc/radius.conf, но параметры всё равно не передаются.

sopov
Сообщения: 610
Зарегистрирован: Вс апр 02, 2006 7:13 pm

Re: MPD5 ограничение скорости с помощью ng_car + зоны.Решение!!!

Сообщение sopov »

Словари mpd в радиусе прописаны? Модуль ng_car в ядро загружен? MPD пересобрана после загрузки модуля ng_car?

Ответить