Jump to content

Recommended Posts

Posted

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

Система крутится такая 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 можно было ограничить только одной сессией?

Posted

и что выдает

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

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

 

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

Posted (edited)

Первая сессия пользователя 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)

Edited by dm765
Posted (edited)

Третья сессия пользователя 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)

Edited by dm765
Posted

а если руками запускаете /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++;
   }
 }

Posted

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

/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)

Posted (edited)

Сорри, не вставил принт из 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;
 }
}

Edited by dm765
Posted

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

 

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;
 }
}

Posted (edited)

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

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;
}

Edited by andriko
Posted

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

 

test

 

сделайте так

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

Posted

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

 

test

 

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

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

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

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

Posted

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

 

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

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

 

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

 

 

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

Posted

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

 

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

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

 

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

 

 

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

 

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

foreach $line ( @output ) {

....

}

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

Posted
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;
}

Posted

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

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

Posted

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 или ..) не определена.

Posted

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

-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";

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.