dm765 Опубликовано 27 июля, 2011 · Жалоба Здравствуйте! Система крутится такая 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 810124c5snpwalk: -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr Returning 0 (login ok) Что надо донастроить, чтобы пользователя test можно было ограничить только одной сессией? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
andriko Опубликовано 28 июля, 2011 · Жалоба и что выдает snpwalk -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr в етот момент? checkrad в выводе ищет строку IF-MIB::ifDescr.79129, если она есть - значит дибликат, если не - все ок, там в самом скрипте кстати коммент есть Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 28 июля, 2011 (изменено) · Жалоба Первая сессия пользователя 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) Изменено 28 июля, 2011 пользователем dm765 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 28 июля, 2011 (изменено) · Жалоба Третья сессия пользователя 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) Изменено 28 июля, 2011 пользователем dm765 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
andriko Опубликовано 29 июля, 2011 · Жалоба а если руками запускаете /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++; } } Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 29 июля, 2011 · Жалоба Вывод при запуске вручную /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) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
voron Опубликовано 29 июля, 2011 · Жалоба http://wiki.sirmax.noname.com.ua/index.php/Simult_Chek не поможет? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 1 августа, 2011 · Жалоба to voron спасибо, интересная статья, но у меня пользователи хранятся в файле Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
andriko Опубликовано 1 августа, 2011 · Жалоба У Вас в выводе snmpwalk есть сторчка IF-MIB::ifDescr.87134 = STRING: <pptp-test> и при етом не срабатывает чек if( $line =~ /<.*-$ARGV[3]>/ ) { Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 1 августа, 2011 (изменено) · Жалоба Сорри, не вставил принт из 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; } } Изменено 1 августа, 2011 пользователем dm765 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 2 августа, 2011 · Жалоба На Микротике ставил доступ RO / RW не помогло.. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
adron2 Опубликовано 2 августа, 2011 · Жалоба На Микротике ставил доступ RO / RW не помогло.. Попробуйте заменить на if( $line =~ /.*-$ARGV[3]/ ) { Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 2 августа, 2011 · Жалоба Попробуйте заменить на if( $line =~ /.*-$ARGV[3]/ ) { Не помогло, второе подключение проходит Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
adron2 Опубликовано 2 августа, 2011 · Жалоба Попробуйте заменить на 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; } } Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
andriko Опубликовано 2 августа, 2011 (изменено) · Жалоба на самом деле надо править в коде 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; } Изменено 2 августа, 2011 пользователем andriko Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 3 августа, 2011 · Жалоба Поправьте код чтобы было вот так и покажите после выполнения /tmp/debug.txt test сделайте так Сделал, второе подключение проходит.. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
adron2 Опубликовано 3 августа, 2011 · Жалоба Поправьте код чтобы было вот так и покажите после выполнения /tmp/debug.txt test Ну это говорит о том что @output = snmpwalk_prog($ARGV[1], $password, "$oid"); не возвращает ничего. А должно возвращать список интерфейсов на сколько я понял. Покажите код функции snmpwalk_prog Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
andriko Опубликовано 3 августа, 2011 · Жалоба а где, собсно $line? добавляте тогда после @output = snmpwalk_prog($ARGV[1], $password, "$oid"); system("echo \"@output\" > /tmp/debug.txt"); ну а так целом Вы уже должны догадаться, что поставляемый checkrad ето пример, не обязательно рабочий, по нему и надо писать под свою конфигурацию, если не сильны в перле, то можно в чем угодно, лишь бы работало. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
adron2 Опубликовано 3 августа, 2011 · Жалоба а где, собсно $line? добавляте тогда после @output = snmpwalk_prog($ARGV[1], $password, "$oid"); system("echo \"@output\" > /tmp/debug.txt"); ну а так целом Вы уже должны догадаться, что поставляемый checkrad ето пример, не обязательно рабочий, по нему и надо писать под свою конфигурацию, если не сильны в перле, то можно в чем угодно, лишь бы работало. Там же такой код: foreach $line ( @output ) { .... } Вот $line это каждая строчка массива @output. Если foreach $line ( @output ) вообще не выполняется значит @output пустой. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 3 августа, 2011 · Жалоба 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; } Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 3 августа, 2011 · Жалоба ну а так целом Вы уже должны догадаться, что поставляемый checkrad ето пример, не обязательно рабочий, по нему и надо писать под свою конфигурацию, если не сильны в перле, то можно в чем угодно, лишь бы работало. Был уверен, что поставляемый checkrad рабочий, в котором надо только сделать минимальные настройки, типа подредактировать пароли, адреса, возможно каталоги ... Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
adron2 Опубликовано 3 августа, 2011 · Жалоба 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 или ..) не определена. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
dm765 Опубликовано 3 августа, 2011 · Жалоба При создании второго подключения создается запись -r 1 -t 5 -v1 -c 'boroda' 172.16.0.2 ifDescr Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
adron2 Опубликовано 3 августа, 2011 · Жалоба При создании второго подключения создается запись -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"; Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
andriko Опубликовано 3 августа, 2011 · Жалоба хмм в начале файла $snmpwalk = "/usr/local/bin/snmpwalk"; а у Вас? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...