Jump to content
Калькуляторы

Mikrotik + FreeRadius rlm_perl

Пытаюсь решить следующую задачку.

Есть mikrotik с поднятым pptp сервером и стоит проверка через радиус.

Необходимо чтобы любой пользователь с любым паролем проходил проверку на Радиус сервере.

Пытался реализовать через rlm_perl, но вылазит ошибка rlm_perl: ERROR: Failed to create pair Event-Timestamp = ▒?о▒? 17 2011 10:33:02 MSK

на стадии accounting через перл скрипт.

 

use vars qw(%RAD_REQUEST %RAD_REPLY %RAD_CHECK
);
use Data::Dumper;

# This is hash wich hold original request from radius
my %RAD_REQUEST;
# In this hash you add values that will be returned to NAS.
my %RAD_REPLY;
#This is for check items
my %RAD_CHECK;

   use constant    RLM_MODULE_REJECT=>    0;#  /* immediately reject the request */
   use constant    RLM_MODULE_FAIL=>      1;#  /* module failed, don't reply */
   use constant    RLM_MODULE_OK=>        2;#  /* the module is OK, continue */
   use constant    RLM_MODULE_HANDLED=>   3;#  /* the module handled the request, so stop. */
   use constant    RLM_MODULE_INVALID=>   4;#  /* the module considers the request invalid. */
   use constant    RLM_MODULE_USERLOCK=>  5;#  /* reject the request (user is locked out) */
   use constant    RLM_MODULE_NOTFOUND=>  6;#  /* user not found */
   use constant    RLM_MODULE_NOOP=>      7;#  /* module succeeded without doing anything */
   use constant    RLM_MODULE_UPDATED=>   8;#  /* OK (pairs modified) */
   use constant    RLM_MODULE_NUMCODES=>  9;#  /* How many return codes there are */

sub authorize {
   # For debugging purposes only
#       &log_request_attributes;

   # Here's where your authorization code comes
   # You can call another function from here:
   #&test_call;

   return RLM_MODULE_OK;
}

sub authenticate {
   # For debugging purposes only
      &log_request_attributes;

   if ($RAD_REQUEST{'User-Name'} =~ /^no/i) {
           # Reject user and tell him why
           $RAD_REPLY{'Reply-Message'} = "Denied access by rlm_perl function";
           return RLM_MODULE_REJECT;
   } else {
           # Accept user and set some attribute
           $RAD_REPLY{'Packet-Type'} = "Access-Accept";
           $RAD_REPLY{'Framed-IP-Address'} = "10.225.245.125";
           $RAD_REPLY{'Framed-Protocol'} = "ppp";
           return RLM_MODULE_OK;
   }
}

sub accounting {
   return RLM_MODULE_OK;
}

 

 

FreeRadius -x

 

rad_recv: Accounting-Request packet from host 172.27.65.70 port 49361, id=108, length=183
       Service-Type = Framed-User
       Framed-Protocol = PPP
       NAS-Port = 38
       NAS-Port-Type = Virtual
       User-Name = "test"
       Calling-Station-Id = "172.27.65.210"
       Called-Station-Id = "172.27.65.70"
       Acct-Session-Id = "81800020"
       Framed-IP-Address = 0.0.0.0
       Acct-Authentic = RADIUS
       Event-Timestamp = "Ноя 17 2011 10:33:02 MSK"
       Acct-Session-Time = 0
       Acct-Input-Octets = 0
       Acct-Input-Gigawords = 0
       Acct-Input-Packets = 0
       Acct-Output-Octets = 10
       Acct-Output-Gigawords = 0
       Acct-Output-Packets = 1
       Acct-Status-Type = Stop
       Acct-Terminate-Cause = User-Request
       NAS-Identifier = "MikroTik"
       NAS-IP-Address = 172.27.65.70
       Acct-Delay-Time = 0
# Executing section preacct from file /etc/freeradius/radiusd.conf
+- entering group preacct {...}
++[preprocess] returns ok
# Executing section accounting from file /etc/freeradius/radiusd.conf
+- entering group accounting {...}
[acct_unique] Hashing 'NAS-Port = 38,Client-IP-Address = 172.27.65.70,NAS-IP-Address = 172.27.65.70,Acct-Session-Id = "81800020",User-Name = "test"'
[acct_unique] Acct-Unique-Session-ID = "307a9a7007fe51de".
++[acct_unique] returns ok
rlm_perl: Added pair Acct-Input-Octets = 0
rlm_perl: Added pair NAS-Port-Type = Virtual
rlm_perl: Added pair Acct-Session-Id = 81800020
rlm_perl: Added pair Acct-Output-Gigawords = 0
rlm_perl: Added pair Service-Type = Framed-User
rlm_perl: Added pair Acct-Unique-Session-Id = 307a9a7007fe51de
rlm_perl: Added pair Called-Station-Id = 172.27.65.70
rlm_perl: Added pair Acct-Authentic = RADIUS
rlm_perl: Added pair Acct-Status-Type = Stop
rlm_perl: Added pair Acct-Output-Packets = 1
rlm_perl: Added pair NAS-IP-Address = 172.27.65.70
rlm_perl: Added pair Acct-Output-Octets = 10
rlm_perl: Added pair Acct-Terminate-Cause = User-Request
rlm_perl: Added pair Acct-Session-Time = 0
rlm_perl: Added pair Calling-Station-Id = 172.27.65.210
rlm_perl: Added pair Framed-Protocol = PPP
rlm_perl: Added pair User-Name = test
rlm_perl: Added pair NAS-Identifier = MikroTik
rlm_perl: ERROR: Failed to create pair Event-Timestamp = ▒?о▒? 17 2011 10:33:02 MSK
rlm_perl: Added pair Acct-Input-Gigawords = 0
rlm_perl: Added pair Framed-IP-Address = 0.0.0.0
rlm_perl: Added pair Acct-Input-Packets = 0
rlm_perl: Added pair NAS-Port = 38
rlm_perl: Added pair Acct-Delay-Time = 0
++[perl] returns ok
[detail]        expand: /var/log/radius/radacct/%{Client-IP-Address}/detail-%Y%m%d -> /var/log/radius/radacct/172.27.65.70/detail-20111117
[detail] /var/log/radius/radacct/%{Client-IP-Address}/detail-%Y%m%d expands to /var/log/radius/radacct/172.27.65.70/detail-20111117
[detail]        expand: %t -> Thu Nov 17 10:34:22 2011
++[detail] returns ok
Sending Accounting-Response of id 108 to 172.27.65.70 port 49361
Finished request 2.
Cleaning up request 2 ID 108 with timestamp +6
Going to the next request
Waking up in 4.9 seconds.
Cleaning up request 0 ID 106 with timestamp +6
Ready to process requests.

 

Пример отсюда http://wiki.freeradius.org/Rlm_perl

 

Может можно без Rlm_perl поставленную задачу - опыта работы с этим модулем никакого.

Edited by pik

Share this post


Link to post
Share on other sites

Читайте документацию, смотрите примеры, в сайтесаваибл и в модулях - там всё просто и понятно, для вашего случая.

 

должны сделать control: accept и в reply что то добавить (ип адрес и что то ещё), никакой перл тут не нужен.

 

 

Share this post


Link to post
Share on other sites

Читайте документацию, смотрите примеры, в сайтесаваибл и в модулях - там всё просто и понятно, для вашего случая.

 

должны сделать control: accept и в reply что то добавить (ип адрес и что то ещё), никакой перл тут не нужен.

Оно конечно просто и понятно задним числом.

Это как поставить ocfs2 drbd heartbeat stonith.

Когда настроил, то конешно все уже ясно, но не в начале )))

Share this post


Link to post
Share on other sites

Если всё разжевать - в голове ничего не осядет. Ну и решение простое, я думаю вам будет обидно самому его не найти :)

 

Основной нюанс в том что Accept в Control блоке, а всё остальное в Update Reply....

 

 

Share this post


Link to post
Share on other sites

У меня виртуальный сервер с динамическими клиентами из базы (там пример есть), потому здесь листен и ещё некоторые части опущены.

 

Ещё можете погулить на тему авторизации в свичах через радиус, я от туда брал некоторые вещи когда то.

 

authorize {

 

 

 

 

update control {

Auth-Type = Accept

}

ok

 

 

update reply {

NAS-IP-Address = "%{request:NAS-IP-Address}"

#NAS-IPv6-Address = "%{request:NAS-IPv6-Address}"

}

}

 

authenticate {

ok

}

 

# Post-Authentication

# Once we KNOW that the user has been authenticated, there are

# additional steps we can take.

post-auth {

ok

}

Share this post


Link to post
Share on other sites

Если всё разжевать - в голове ничего не осядет. Ну и решение простое, я думаю вам будет обидно самому его не найти :)

 

Основной нюанс в том что Accept в Control блоке, а всё остальное в Update Reply....

 

Ну шо делать, хочется таблетку и побольше.

А на счет головы... Думаю мне присниться сегодня Mikrotik насилующий Radius в самых извращенных формах )))

Спасибо!

Share this post


Link to post
Share on other sites

Если всё разжевать - в голове ничего не осядет. Ну и решение простое, я думаю вам будет обидно самому его не найти :)

 

Основной нюанс в том что Accept в Control блоке, а всё остальное в Update Reply....

 

Ну шо делать, хочется таблетку и побольше.

А на счет головы... Думаю мне присниться сегодня Mikrotik насилующий Radius в самых извращенных формах )))

Спасибо!

 

Знаете, что не понятно? Зачем в этой схеме вообще радиус? MT в этом случае сам себе может быть хозяином.

Share this post


Link to post
Share on other sites

Видимо однокурсник того студента с хотспотом, обоим фрирадиус нужно было освоить на зачёт.

Share this post


Link to post
Share on other sites

Знаете, что не понятно? Зачем в этой схеме вообще радиус? MT в этом случае сам себе может быть хозяином.

 

МТ умеет пускать пользователей с любым логином паролем?

Share this post


Link to post
Share on other sites

У меня виртуальный сервер с динамическими клиентами из базы (там пример есть), потому здесь листен и ещё некоторые части опущены.

 

Ещё можете погулить на тему авторизации в свичах через радиус, я от туда брал некоторые вещи когда то.

 

Аутентификация, авторизация проходит, в аккаунтинге засада.

Юзерь не коннектиться выпадает 778 ошибка - "Невозможно проверить идентичность сервера".

Почитал RADIUS Accounting покурил дебаги.... понял, что Accounting-Response возможно не все отдает.

Accounting-Request шлется второй раз после Accounting-Response потом статус Acct-Terminate-Cause = User-Request

Посему вопрос, в update reply кроме IP писать нужно ручками? Т.е всякие сессионные ключи, таймштампы и прочее?

 


update reply {
NAS-IP-Address = "%{request:NAS-IP-Address}"
}

 

При отсутствии секции accounting request шлеться 4 раза.

При наличии этой секции 2 раза.

При этом в лог reply падает только одна строка "Packet-Type = Access-Accept"

вместо:

     Packet-Type = Access-Accept
     Framed-IP-Address = 10.225.245.98
     Framed-Protocol = PPP
     Service-Type = Framed-User
     MS-CHAP2-Success = 0x01533d34413646323842333933383442424234384233333037423545444233354133353345323231384532

 

Какие идеи?

Edited by pik

Share this post


Link to post
Share on other sites
MS-CHAP2-Success

 

Почитайте про этот протокол :)

 

И замените его на что нибудь по проще.

 

 

Share this post


Link to post
Share on other sites
MS-CHAP2-Success

 

Почитайте про этот протокол :)

И замените его на что нибудь по проще.

 

Почитал ) Запустил на mschap успешно...

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

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

Чтобы в случае отказа оборудования, физики могли временно поработать по этой схеме.

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

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

Т.е заставить всех поменять во вкладке безопасность MSCHAP 2 на MSCHAP нереально )

Edited by pik

Share this post


Link to post
Share on other sites
Запустил на mschap успешно

 

Я вообще думал что выше PAP начинаются проблемы из за взаимной проверки правильности пароля.

 

Уходите на IPoE, в том или ином виде, там вообще, для настройки хватает одного нажатия на ресет на всяких роутерах типа дир 300/320/620 и пр.

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this