Дублирование сессии
Дублирование сессии
Не могу победить дублирование сессий. Периодически (системы пока не заметил) появляются дублированные сессии. С одного и того же IP один и тот же пользователь, но порты подключения разные. Alive пакеты идут по обеим интерфейсам, по этому ни один не уходит в Zap. Приходится отслеживать по какому нет трафика и Zap-ить руками. Что это может быть и как такое чинить?
check_ppp
Воюю с дублированием сессий. Вот подправил функцию check_ppp в billd под Linux. Как я понял она изначально написана для FreeFSD. Может не все красиво, но работает.
По ходу дела возникает вопрос к автору. Проверяется ли CID, который был при открытии сесии и его изменение в течение сессии? Если да, то как включить эту проверку. Похоже, что у меня она не выполняется. Если нет, то неплохо было бы это реализовать - отпала бы проблема с подвисанием сессий, когда Один клиент отвалился, в продолжении текущего Alive интервала подключается другой, ему выдается тот же Framed-Ip на том же порту, а биллинг считает, что сессия продолжается. Хорошо если у клиеннтов безлим. Им все равно сколько им трафика намотали. А если повремянка или по трафику, то крутит счетчики не тем.
Прошу прощения, если я что-то не так понял или не досмотрел. Если так, то куда смотреть хотя бы?
Код: Выделить всё
#**********************************************************
# 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;
}
Прошу прощения, если я что-то не так понял или не досмотрел. Если так, то куда смотреть хотя бы?
-
- Site Admin
- Сообщения: 5746
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
Re: Дублирование сессии
Так все же что может быть причиной этого? Обратил внимание, что на "висячих" сессиях капает только исходящий трафик. Причем изменение счетчика совпадает по величине с изменением на нормальной, живой сессии. Из-за этой проблемы пока пришлось отказаться от ограничения числа активных сессий на клиента. А очень нужно.ppe писал(а):Не могу победить дублирование сессий. Периодически (системы пока не заметил) появляются дублированные сессии. С одного и того же IP один и тот же пользователь, но порты подключения разные. Alive пакеты идут по обеим интерфейсам, по этому ни один не уходит в Zap. Приходится отслеживать по какому нет трафика и Zap-ить руками. Что это может быть и как такое чинить?
-
- Site Admin
- Сообщения: 5746
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
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";
#
#*************************************
# 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";
Я может непонятно изложил свою проблему, но она заключается в другом. У меня нет дублированных адресов, выданных биллингом.
В моем случае возникает ситуация, как буд-то пользователь выполняет несколько подключений одновременно, с одним логином и с одного компьютера. Висят несколько ppp-интерфейсов, framed-ip у них разный, со всех идут alive пакеты, на "неживых" увеличиваются счетчики исходящих пакетов, на живом - оба. Параметр idle не помогает, так как трафик на этих "неживых" присутствует, хотя только в одну сторону.
Приходится отслеживать вручную по монитору соединений у какого из них время соединения больше, то и разрывать.
Воюю уже месяц с этим...
В моем случае возникает ситуация, как буд-то пользователь выполняет несколько подключений одновременно, с одним логином и с одного компьютера. Висят несколько ppp-интерфейсов, framed-ip у них разный, со всех идут alive пакеты, на "неживых" увеличиваются счетчики исходящих пакетов, на живом - оба. Параметр idle не помогает, так как трафик на этих "неживых" присутствует, хотя только в одну сторону.
Приходится отслеживать вручную по монитору соединений у какого из них время соединения больше, то и разрывать.
Воюю уже месяц с этим...
-
- Site Admin
- Сообщения: 5746
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
В процессе эксплуатации выяснил, что для линукса kill -9 не совсем подходит. Лучше использовать kill -2 (kill -INT). Иначе не отрабатывает скрипт ppp-down. А еще лучше и корректнее работает, если использовать ifconfig ppp$iface down.~AsmodeuS~ писал(а):спасибо добавили
/usr/abills/libexec/billd checkpppd
-
- Site Admin
- Сообщения: 5746
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация: