Дублирование сессии

Ответить
ppe
Сообщения: 50
Зарегистрирован: Чт авг 09, 2007 11:35 am

Дублирование сессии

Сообщение ppe »

Не могу победить дублирование сессий. Периодически (системы пока не заметил) появляются дублированные сессии. С одного и того же IP один и тот же пользователь, но порты подключения разные. Alive пакеты идут по обеим интерфейсам, по этому ни один не уходит в Zap. Приходится отслеживать по какому нет трафика и Zap-ить руками. Что это может быть и как такое чинить?

ppe
Сообщения: 50
Зарегистрирован: Чт авг 09, 2007 11:35 am

check_ppp

Сообщение ppe »

Воюю с дублированием сессий. Вот подправил функцию check_ppp в billd под Linux. Как я понял она изначально написана для FreeFSD. Может не все красиво, но работает.

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

#**********************************************************
# Get tun interface info
#**********************************************************
sub get_if_info {
 my $res = '';
 my $count = 0;
 my $ifconfig = '';

 my %ip_pid_hash = ();

 open (IFC, "/sbin/ip addr list |") || die "Can't open file '/sbin/ip addr list' $!";
    while (my $l = <IFC>)
    {
	if($l =~ /inet (\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}) peer (\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\/\d+ scope global ppp(\d+)$/gi)
	{
	
    	    my $tunnum = $3;

            my $pid    = 0;
            my $addr   = $2;

            $pid = `cat /var/run/ppp$3.pid`;
	    chomp($pid);

            print "$tunnum $addr $pid\n" if ($debug == 1);
            $ip_pid_hash{"$addr"}="$pid:$tunnum";
	}
    }
 close(IFC);

  return \%ip_pid_hash;
}
По ходу дела возникает вопрос к автору. Проверяется ли CID, который был при открытии сесии и его изменение в течение сессии? Если да, то как включить эту проверку. Похоже, что у меня она не выполняется. Если нет, то неплохо было бы это реализовать - отпала бы проблема с подвисанием сессий, когда Один клиент отвалился, в продолжении текущего Alive интервала подключается другой, ему выдается тот же Framed-Ip на том же порту, а биллинг считает, что сессия продолжается. Хорошо если у клиеннтов безлим. Им все равно сколько им трафика намотали. А если повремянка или по трафику, то крутит счетчики не тем.

Прошу прощения, если я что-то не так понял или не досмотрел. Если так, то куда смотреть хотя бы?

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

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

система смотрит на Session_id

ppe
Сообщения: 50
Зарегистрирован: Чт авг 09, 2007 11:35 am

Re: Дублирование сессии

Сообщение ppe »

ppe писал(а):Не могу победить дублирование сессий. Периодически (системы пока не заметил) появляются дублированные сессии. С одного и того же IP один и тот же пользователь, но порты подключения разные. Alive пакеты идут по обеим интерфейсам, по этому ни один не уходит в Zap. Приходится отслеживать по какому нет трафика и Zap-ить руками. Что это может быть и как такое чинить?
Так все же что может быть причиной этого? Обратил внимание, что на "висячих" сессиях капает только исходящий трафик. Причем изменение счетчика совпадает по величине с изменением на нормальной, живой сессии. Из-за этой проблемы пока пришлось отказаться от ограничения числа активных сессий на клиента. А очень нужно.

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

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

Мы обязательно внесём Ваши правки в систему.

Даблирование ИП адресов это скорее проблема сомой ОС чем биллинга.

Илия
Сообщения: 16
Зарегистрирован: Сб апр 15, 2006 9:45 am
Откуда: Bulgaria
Контактная информация:

Eta moi skript, na kajdai 3min primerna v cron-a postavil

Сообщение Илия »

#!/usr/bin/perl -w
#
#*************************************
# kill pppd with ip dub
#*************************************
#Linux pppd module
#(from Niagolov)
#
#
use strict;
use DBI;
use warnings;

my $dbh = DBI->connect( 'DBI:mysql:abills', 'abills', 'password',{'RaiseError' => 1}) || die "Database connection not made: $DBI::errstr";
my $sth = $dbh->prepare("SELECT INET_NTOA(framed_ip_address),nas_port_id FROM dv_calls");$sth->execute();

my @dvip;
my @dvses;
while (my $row_ref=$sth->fetchrow_arrayref) {
my $dvipi = "@$row_ref[0]";
my $dvsesi = "@$row_ref[1]";

push (@dvip,$dvipi);
push (@dvses,$dvsesi);
}

$sth->finish();
$dbh->disconnect();

#print "######################################################################################### \n";
my $ipsa=0; my $ipsb=0; my $ipsc=0; my $ipsd; my $opsa;
foreach (@dvip) { $ipsa++; }
$ipsb=$ipsa;
#print "$ipsa \n";


while ($ipsb > 1) {
$ipsd = 0; $ipsb--; $ipsc = $ipsb - 1;
#print "$dvses[$ipsb] $dvip[$ipsb] -- ";# $ipsb \n";

while ($ipsc > -1) {
#print "$ipsb =? $ipsc ";
if ("$dvip[$ipsb] " =~ "$dvip[$ipsc] ") {
#print "$dvip[$ipsb] == $dvip[$ipsc] ";
$ipsd++;
}

$ipsc--;
}
if ($ipsd > 0) {
#print "kill ppp" . "$dvses[$ipsb]";
my $pppkil = "ppp$dvses[$ipsb]";
#print $pppkil;

open(SYS, "/bin/cat /var/run/$pppkil.pid |");
my $pid = <SYS>;
# print "$mac \n";
# print "$pid \n";
# print "$ipes \n";
kill 1, $pid;
close SYS;

}
#print " \n";
}
#print "######################################################################################### \n";

ppe
Сообщения: 50
Зарегистрирован: Чт авг 09, 2007 11:35 am

Сообщение ppe »

Я может непонятно изложил свою проблему, но она заключается в другом. У меня нет дублированных адресов, выданных биллингом.

В моем случае возникает ситуация, как буд-то пользователь выполняет несколько подключений одновременно, с одним логином и с одного компьютера. Висят несколько ppp-интерфейсов, framed-ip у них разный, со всех идут alive пакеты, на "неживых" увеличиваются счетчики исходящих пакетов, на живом - оба. Параметр idle не помогает, так как трафик на этих "неживых" присутствует, хотя только в одну сторону.

Приходится отслеживать вручную по монитору соединений у какого из них время соединения больше, то и разрывать.

Воюю уже месяц с этим... :evil:

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

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

спасибо добавили


/usr/abills/libexec/billd checkpppd

ppe
Сообщения: 50
Зарегистрирован: Чт авг 09, 2007 11:35 am

Сообщение ppe »

~AsmodeuS~ писал(а):спасибо добавили


/usr/abills/libexec/billd checkpppd
В процессе эксплуатации выяснил, что для линукса kill -9 не совсем подходит. Лучше использовать kill -2 (kill -INT). Иначе не отрабатывает скрипт ppp-down. А еще лучше и корректнее работает, если использовать ifconfig ppp$iface down.

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

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

если можно дайте точный данные для исправления

Ответить