Долго искал но ничего не нашел.
Можно ли сделать учет трафика пользователя через radius accounting freeradius?
Freeradius accounting
У тебя классов трафика сколько?prx писал(а):Придумал как сделать, при каждом аккаунтинг стопе генерим netflow пакет с длиной данных и IP-адресом взятым из аккаунтинг-стоп пакета.
Теперь вопрос как сделать тоже самое только с interim-update'ом?
Ведь присылается количество данных всей сессии а нужно только после предыдущего апдейта.
-
- Сообщения: 1612
- Зарегистрирован: Пт ноя 10, 2006 15:23
Классов трафика 2 - incoming outgoing
Если считать разницу между текущим и предыдущим значит надо где-то предыдущий хранить (для каждой сесси).
А какие проблемы могут быть с gigawords?
Да и interim-update у меня 5 min стоит.
По поводу корявости решения - а netflow для клиентов ШПД не коряво?
UPDATE:
По поводу gigaword - NAS шлет
И freeradius принимает 
Если считать разницу между текущим и предыдущим значит надо где-то предыдущий хранить (для каждой сесси).
А какие проблемы могут быть с gigawords?
Да и interim-update у меня 5 min стоит.
По поводу корявости решения - а netflow для клиентов ШПД не коряво?
UPDATE:
По поводу gigaword - NAS шлет


Если кому надо - функция accounting для rlm_perl:
Генерит temp-файлы в /tmp/radflow
Использует utm5_flowgen из папки /usr/local/bin
Написана функция была сегодня, так что могут быть косяки
Генерит temp-файлы в /tmp/radflow
Использует utm5_flowgen из папки /usr/local/bin
Написана функция была сегодня, так что могут быть косяки
Код: Выделить всё
sub accounting {
my $b_in;
my $b_out;
my $b_in_tmp;
my $b_out_tmp;
my $file;
my @bytes;
my $ip;
$b_in = ((2 ** 32) * $RAD_REQUEST{'Acct-Input-Gigawords'}) + $RAD_REQUEST{'Acct-Input-Octets'};
$b_out = ((2 ** 32) * $RAD_REQUEST{'Acct-Output-Gigawords'}) + $RAD_REQUEST{'Acct-Output-Octets'};
$ip = $RAD_REQUEST{'Framed-IP-Address'};
$file = '/tmp/radflow/' . $RAD_REQUEST{'Acct-Unique-Session-Id'} . "_" . $RAD_REQUEST{'Framed-IP-Address'};
if ($RAD_REQUEST{'Acct-Status-Type'} =~ /Start/)
{
open (TMPFILE, ">".$file);
print TMPFILE $b_in."\n";
print TMPFILE $b_out."\n";
$b_in_tmp = $b_in;
$b_out_tmp = $b_out;
close(TMPFILE);
}
elsif ($RAD_REQUEST{'Acct-Status-Type'} =~ /Stop/)
{
if (-e $file) {
open (TMPFILE, $file);
@bytes = <TMPFILE>;
$b_in_tmp = $b_in - $bytes[0];
$b_out_tmp = $b_out - $bytes[1];
close(TMPFILE);
unlink($file);
}
}
elsif ($RAD_REQUEST{'Acct-Status-Type'} =~ /Interim-Update/)
{
if (-e $file) {
open (TMPFILE, $file);
@bytes = <TMPFILE>;
$b_in_tmp = $b_in - $bytes[0];
$b_out_tmp = $b_out - $bytes[1];
close(TMPFILE);
} else {
$b_in_tmp = $b_in;
$b_out_tmp = $b_out;
}
open (TMPFILE, ">".$file);
print TMPFILE $b_in."\n";
print TMPFILE $b_out."\n";
close(TMPFILE);
}
while ($b_in_tmp>0) {
if ($b_in_tmp>2000000000 ) {
$b_in_tmp = $b_in_tmp - 2000000000;
system "/usr/local/bin/utm5_flowgen -h billing -c 1 -b 2000000000 -s 1.2.3.4 -d ".$ip;
} else {
system "/usr/local/bin/utm5_flowgen -h billing -c 1 -b ".$b_in_tmp." -s 1.2.3.4 -d ".$ip;
$b_in_tmp=0;
}
}
while ($b_out_tmp>0) {
if ($b_out_tmp>2000000000 ) {
$b_out_tmp = $b_out_tmp - 2000000000;
system "/usr/local/bin/utm5_flowgen -h billing -c 1 -b 2000000000 -d 1.2.3.4 -s ".$ip;
} else {
system "/usr/local/bin/utm5_flowgen -h billing -c 1 -b ".$b_out_tmp." -d 1.2.3.4 -s ".$ip;
$b_out_tmp=0;
}
}
return RLM_MODULE_OK;
}