Перейти к содержимому
Калькуляторы

Вопрос по работе checkrad Не работает ограничение количества сессий

Здравствуйте!

Система крутится такая FreeBSD 7.0 , Freeradius и сервер доступа на Mikrotik с авторизацией на этом радиусе.

Задача - чтобы одну учетную запись ограничить одним подключением по PPtP

Сделано следующее

1. В файле clients.conf на радиусе прописано так, где 172.16.0.2 ИП адрес микротика

client 172.16.0.2 {
       secret          = whoiswho
       shortname       = 172.16.0.2
       nastype         = mikrotik_snmp
}

2. Пользователь на радиусе в файле заведен так

test  Cleartext-Password := "zz", Simultaneous-Use := 1, Pool-Name := "private_ip_pool"

3. В checkrad и на mikrotik настроено SNMP. Команды которые я подаю в ручном режиме с радиуса на микротик отрабатываются без ошибок

4. Если открыть вторую сессию под пользователем test , то в файле /var/log/checkrad.log появится такая запись

Wed Jul 27 09:08:46 2011 checkrad mikrotik_snmp 172.16.0.2 79129 test 810124c5

snpwalk: -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr

Returning 0 (login ok)

Что надо донастроить, чтобы пользователя test можно было ограничить только одной сессией?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

и что выдает

snpwalk -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr

в етот момент?

 

checkrad в выводе ищет строку IF-MIB::ifDescr.79129, если она есть - значит дибликат, если не - все ок, там в самом скрипте кстати коммент есть

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Первая сессия пользователя test

./snmpwalk -r 1 -t 5 -v 1 -c boroda 172.16.0.2 ifDescr | grep test
IF-MIB::ifDescr.87134 = STRING: <pptp-test>

 

Вторая сессия пользователя test

./snmpwalk -r 1 -t 5 -v 1 -c boroda 172.16.0.2 ifDescr | grep test
IF-MIB::ifDescr.87134 = STRING: <pptp-test>
IF-MIB::ifDescr.87186 = STRING: <pptp-test-1>

 

Запись в /var/log/checkrad.log

Thu Jul 28 14:57:46 2011 checkrad mikrotik_snmp 172.16.0.2 87134 test 81014094
snpwalk:  -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr
 Returning 0 (login ok)

Изменено пользователем dm765

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Третья сессия пользователя test , хотя для этого пользователя разрешена только одна сессия Simultaneous-Use := 1

./snmpwalk -r 1 -t 5 -v 1 -c boroda 172.16.0.2 ifDescr | grep test
IF-MIB::ifDescr.87134 = STRING: <pptp-test>
IF-MIB::ifDescr.87186 = STRING: <pptp-test-1>
IF-MIB::ifDescr.87304 = STRING: <pptp-test-2>

 

В /var/log/radcheck.log добавилась запись

Thu Jul 28 15:35:42 2011 checkrad mikrotik_snmp 172.16.0.2 87134 test 81014112
snpwalk:  -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr
 Returning 0 (login ok)

Изменено пользователем dm765

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а если руками запускаете /usr/local/sbin/checkrad -d mikrotik_snmp 172.16.0.2 87134 test 81014112 ?

 

checkrad - перл скрипт, можете принт вставить

 

  foreach $line ( @output ) {
   #remove newline
   chomp $line;
   #remove trailing whitespace
   ($line = $line) =~ s/\s+$//;
   if( $line =~ /<.*-$ARGV[3]>/ ) {
     $username_seen++;
   }
 }

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вывод при запуске вручную

/usr/local/sbin/checkrad -d mikrotik_snmp 172.16.0.2 87134 test 81014112
snpwalk:  -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr
 Returning 0 (login ok)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

to voron

спасибо, интересная статья, но у меня пользователи хранятся в файле

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У Вас в выводе snmpwalk есть сторчка

IF-MIB::ifDescr.87134 = STRING: <pptp-test>

и при етом не срабатывает чек

if( $line =~ /<.*-$ARGV[3]>/ ) {

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сорри, не вставил принт из checkrad

Вот вывод всей секции по SNMP

sub mikrotik_snmp {

 # Set SNMP version
 # MikroTik only supports version 1
 $snmp_version = "1";

 # Look up community string in naspasswd file.
 ($login, $password) = naspasswd($ARGV[1], 1);
 if ($login && $login ne 'SNMP') {
   if($debug) {
     print LOG "Error: Need SNMP community string for $ARGV[1]\n";
   }
   return 2;
 } else {
 # If password is defined in naspasswd file, use it as community,
 # otherwise use $cmmty_string
   if ($password eq '') {
     $password = "$cmmty_string";
   }
 }

 # We want interface descriptions
 $oid = "ifDescr";

 # Mikrotik doesnt give port IDs correctly to RADIUS :(     
 # practically this would limit us to a simple only-one user limit for
 # this script to work properly.
 @output = snmpwalk_prog($ARGV[1], $password, "$oid");

 foreach $line ( @output ) {
   #remove newline
   chomp $line;
   #remove trailing whitespace
   ($line = $line) =~ s/\s+$//;
   if( $line =~ /<.*-$ARGV[3]>/ ) {
     $username_seen++;
   }
 }

 #lets return something
 if ($username_seen > 0) {
   return 1;
 } else {
   return 0;
 }
}

Изменено пользователем dm765

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На Микротике ставил доступ RO / RW не помогло..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На Микротике ставил доступ RO / RW не помогло..

 

Попробуйте заменить на

 

if( $line =~ /.*-$ARGV[3]/ ) {

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробуйте заменить на

 

if( $line =~ /.*-$ARGV[3]/ ) {

 

Не помогло, второе подключение проходит

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробуйте заменить на

 

if( $line =~ /.*-$ARGV[3]/ ) {

 

Не помогло, второе подключение проходит

 

Поправьте код чтобы было вот так и покажите после выполнения /tmp/debug.txt

sub mikrotik_snmp {

 # Set SNMP version
 # MikroTik only supports version 1
 $snmp_version = "1";

 # Look up community string in naspasswd file.
 ($login, $password) = naspasswd($ARGV[1], 1);
 if ($login && $login ne 'SNMP') {
   if($debug) {
     print LOG "Error: Need SNMP community string for $ARGV[1]\n";
   }
   return 2;
 } else {
 # If password is defined in naspasswd file, use it as community,
 # otherwise use $cmmty_string
   if ($password eq '') {
     $password = "$cmmty_string";
   }
 }

 # We want interface descriptions
 $oid = "ifDescr";

 # Mikrotik doesnt give port IDs correctly to RADIUS :(     
 # practically this would limit us to a simple only-one user limit for
 # this script to work properly.
 @output = snmpwalk_prog($ARGV[1], $password, "$oid");

 system("echo \"$ARGV[3]\" > /tmp/debug.txt");
 foreach $line ( @output ) {
   #remove newline
   chomp $line;
   #remove trailing whitespace
   system("echo \"$line\" >> /tmp/debug.txt");
   ($line = $line) =~ s/\s+$//;
   if( $line =~ /<.*-$ARGV[3]>/ ) {
     $username_seen++;
   }
 }

 #lets return something
 if ($username_seen > 0) {
   return 1;
 } else {
   return 0;
 }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

на самом деле надо править в коде

sub snmpwalk_prog {

 

в целом прикольный глюк поймали, что говорит про "массовость" использования :)

сделайте так

sub snmpwalk_prog {
       my ($host, $community, $oid) = @_;
       local @A;

       print LOG "snpwalk: $snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid\n";
       @A = `$snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid`;

       return @A;
}

Изменено пользователем andriko

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поправьте код чтобы было вот так и покажите после выполнения /tmp/debug.txt

 

test

 

сделайте так

Сделал, второе подключение проходит..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поправьте код чтобы было вот так и покажите после выполнения /tmp/debug.txt

 

test

 

Ну это говорит о том что

@output = snmpwalk_prog($ARGV[1], $password, "$oid");

не возвращает ничего. А должно возвращать список интерфейсов на сколько я понял.

Покажите код функции snmpwalk_prog

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а где, собсно $line?

 

добавляте тогда после

@output = snmpwalk_prog($ARGV[1], $password, "$oid");

 

system("echo \"@output\" > /tmp/debug.txt");

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а где, собсно $line?

 

добавляте тогда после

@output = snmpwalk_prog($ARGV[1], $password, "$oid");

 

system("echo \"@output\" > /tmp/debug.txt");

 

 

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

 

Там же такой код:

foreach $line ( @output ) {

....

}

Вот $line это каждая строчка массива @output. Если foreach $line ( @output ) вообще не выполняется значит @output пустой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

sub snmpwalk_prog {
       my ($host, $community, $oid) = @_;
       ##my ($host, $community, $oid) = @A;
       local $_;
       ##local @A;

       print LOG "snpwalk: $snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid\n";
       $_ = `$snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid`;
       ##@A = `$snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid`;

       return $_;
       ##return @A;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

sub snmpwalk_prog {
       my ($host, $community, $oid) = @_;
       ##my ($host, $community, $oid) = @A;
       local $_;
       ##local @A;

       print LOG "snpwalk: $snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid\n";
       $_ = `$snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid`;
       ##@A = `$snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid`;

       return $_;
       ##return @A;
}

 

Ну вставьте тогда после

`$snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid`;

 

system("echo \"$snmpwalk -r $snmp_retries -t $snmp_timeout -v$snmp_version -c '$community' $host $oid\" > /tmp/debug2.txt");

и покажите что в /tmp/debug2.txt образуется. Что то мне подсказывает что одна из переменных($snmwalk или host или oid или ..) не определена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

При создании второго подключения создается запись

-r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

При создании второго подключения создается запись

-r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr

 

ну вот как я и говорил. $snmpwalk пустой. А он видимо должен ссылкаться на бинарник /usr/bin/snmpwalk или где он у вас в системе лежит:

# whereis snmpwalk

snmpwalk: /usr/bin/snmpwalk

 

Ищите где оно вписывается. Или просто перед этой командой добавьте

$snmpwalk="/usr/bin/snmpwalk";

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

хмм в начале файла

$snmpwalk       = "/usr/local/bin/snmpwalk";

а у Вас?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.