forum.bitel.ru
http://forum.bitel.ru/

Рестарт Inet-сессии
http://forum.bitel.ru/viewtopic.php?f=19&t=12638
Страница 1 из 1

Автор:  a.vo [ 25 сен 2017, 17:27 ]
Заголовок сообщения:  Рестарт Inet-сессии

Добрый день,
для абонентов СКД (через портал BGInetWiFiAgent) количество сессий в модуле Inet = 1.
Это правильно, но в случае когда абонент, не закрыв сессию, пытается вводить логин/пароль с другого устройства или через другую точку доступа, то соответственно получает отлуп и авторизация не проходит, приходится ждать пока она по таймауту отвалится сама.

Нужно, чтобы, в таких случаях, активная сессия обрывалась и стартовала новая, как это можно реализовать?
Вероятно в WiFiServiceActivator нужно как-то такое поведение обрабатывать?

Спасибо

Автор:  skyb [ 26 сен 2017, 06:56 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

https://docs.bitel.ru/pages/diffpagesby ... Versions=6

Автор:  a.vo [ 26 сен 2017, 12:39 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

Спасибо, подскажите точнее, если не сложно.
У нас версия сервера 7.0.1267
В приимере конфигурации устройства (https://docs.bitel.ru/pages/viewpage.ac ... getreemode) сказано:
Код:
# Проверка на повторную аутентификацию при Access-Request. Бывает нужна в случаях, когда NAS сбрасывает (теряет) сессию, но
# Stop-пакет не присылает и клиент пытается подключиться повторно, но у него стоит ограничение на максимум одну сессию. При совпадении
# callingStationId с одной из активных сессий и установленным параметром: 1 - осуществляется попытка закрытия старой сессии (connectionClose),
# 2 - попытка закрытия сессии (connectionClose) и завершение ее в базе, не дожидаясь стоп пакета, 3 - завершение в базе.
#radius.connection.checkDuplicate=0

т.е. я ставлю radius.connection.checkDuplicate=2, чтобы был безусловный разрыв сессии, так?

Но вот здесь сказано:
Код:
Без атрибута Calling-Station-Id в Access-Request-пакете данная функция работать не будет. При невозможности присылать Calling-Station-Id в Access-Request можно настроить подмену в обработчике процессора протокола (в предобработке RADIUS-запросов).


Вот пример моего Access-Request, там нет Calling-Station-Id:
Код:
Time: 26.09.2017 01:15:17
Packet type: Access-Request
Identifier: 4
Authenticator: {A2 E8 B0 AA 38 B3 D2 38 63 C1 58 DB 59 AF E0 CD}
Attributes:
  NAS-Identifier=Multiple_access_portal
  User-Name=id1000000
  User-Password=0000000
  NAS-Port=167772167
  Framed-IP-Address=10.0.0.7
  Acct-Session-Id=10.0.0.7_1506377717357

Time: 26.09.2017 01:15:17
Packet type: Access-Accept
Identifier: 4
Authenticator: {A7 B7 F7 E7 D2 29 AF 5A 9D 3D F7 47 90 6E 6B FA}
Attributes:

Process time auth: 0


Time: 26.09.2017 01:15:17
Packet type: Accounting-Request
Identifier: 5
Authenticator: {BB 75 D2 73 71 C7 50 E0 79 07 51 5C 45 AD 4D DE}
Attributes:
  NAS-Identifier=Multiple_access_portal
  User-Name=id1000000
  NAS-Port=167772167
  Framed-IP-Address=10.0.0.7
  Acct-Status-Type=1
  Acct-Session-Id=10.0.0.7_1506377717357


обязательно нужно подменять Calling-Station-Id в Access-Request можно настроить подмену в обработчике процессора протокола (в предобработке RADIUS-запросов)?

Автор:  skyb [ 26 сен 2017, 13:23 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

Код:
radius.connection.checkDuplicate=898

Код:
package ru.skyb.modules.inet.dyn.device;

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

import ru.bitel.bgbilling.kernel.container.managed.ServerContext;
import ru.bitel.bgbilling.kernel.network.radius.RadiusAttribute;
import ru.bitel.bgbilling.kernel.network.radius.RadiusAttributeSet;
import ru.bitel.bgbilling.kernel.network.radius.RadiusAttributeSetRealmMap;
import ru.bitel.bgbilling.kernel.network.radius.RadiusDictionary;
import ru.bitel.bgbilling.kernel.network.radius.RadiusPacket;
import ru.bitel.bgbilling.kernel.network.radius.RadiusProtocolHandler;
import ru.bitel.bgbilling.modules.inet.access.sa.ProtocolHandlerAdapter;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServType;
import ru.bitel.bgbilling.modules.inet.api.server.InetUtils;
import ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor;
import ru.bitel.bgbilling.modules.inet.radius.RadiusAccessRequestHandler;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.Utils;
import ru.bitel.common.inet.IpAddress;
import ru.bitel.common.inet.IpNet;
import ru.bitel.common.sql.ConnectionSet;

public class EricssonRadiusProtocolHandler extends ru.bitel.bgbilling.modules.inet.dyn.device.radius.AbstractRadiusProtocolHandler
{
    @Override
    public void setMacAddress(final RadiusPacket request)
    {
        String macAddress = request.getStringAttribute(2352, 145, null);
        if(macAddress != null)
        {
            String callingStationId = macAddress.replaceAll("\\-", "");
            request.setStringAttribute(-1, 31, callingStationId);
        }
    }
}

Автор:  a.vo [ 26 сен 2017, 14:53 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

К сожалению, не работает.
Выставляю в конфигурации устройства radius.connection.checkDuplicate=898, задаю обработчик процессора протокола в "Типах устройств", но переопределение MAC-адреса не отрабатывает почему-то, и в лог ничего не пишет.
Подскажите на что еще обратить внимание? Может какой-то связаный параметр в конфигурации пропущен?

Автор:  a.vo [ 26 сен 2017, 17:42 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

Обработчик процессора протокола в типе устройства не удается переопределить, почему-то.
Еще один вопрос, Calling-Station-Id обязательно должен быть MAC-адресом или я могу User-Name туда подставить если разберусь с обработчиком?

Спасибо

Автор:  skyb [ 26 сен 2017, 18:23 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

да что угодно можно туда, главное чтобы уникальное, не работает потому что нету Calling-Station-Id
можно на nas атрибут туда подставить, я так и не увидел что в качестве nas у вас, этот пример с redback'a

Автор:  stark [ 26 сен 2017, 18:31 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

Если что checkDuplicate подробно описан на этой странице :
https://docs.bitel.ru/pages/viewpage.ac ... d=73597961

Автор:  a.vo [ 26 сен 2017, 18:38 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

stark писал(а):
Если что checkDuplicate подробно описан на этой странице :
https://docs.bitel.ru/pages/viewpage.ac ... d=73597961


да, спасибо, что в нужную сторону направили, как раз читаю.
От конечных абонентов MAC-адреса не приходят, попробую переопределить обработчик протокола, только его неудобно отлаживать конечно, каждый раз bgbilling перезапускать приходится.
Можно как-то без перезагрузки инициировать изменения в этом классе?

Автор:  stark [ 26 сен 2017, 18:46 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

a.vo писал(а):
От конечных абонентов MAC-адреса не приходят, попробую переопределить обработчик протокола, только его неудобно отлаживать конечно, каждый раз bgbilling перезапускать приходится.
Можно как-то без перезагрузки инициировать изменения в этом классе?

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

Автор:  a.vo [ 28 сен 2017, 16:46 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

stark писал(а):
Надо нажать "перечитать конфигурацию на серверах " в дереве устройств. Там ошибка была- не перечитывало, и это недавно относительно исправляли, может быть у вас старая версия.

Спасибо, все перечитывается, но никак не удается переопределить Calling-Station-Id
Код:
public class InetRadiusProtocolProcessor
   extends ru.bitel.bgbilling.modules.inet.dyn.device.radius.AbstractRadiusProtocolHandler {
   
    @Override
    public void setMacAddress(final RadiusPacket request)
    {
    }

    @Override
    public void setCallingStationId(final RadiusPacket request)
    {
        String userName = request.getStringAttribute(-1, RadiusStandartAttributes.User_Name, null);
        String userPassword = request.getStringAttribute(-1, RadiusStandartAttributes.User_Password, null);
        if (userName != null && userPassword != null)
        {
         String callingStationId = userName + userPassword;
           request.setStringAttribute( -1, RadiusDictionary.Calling_Station_Id, callingStationId);
        }
    }
}


пробую через request.setOption( InetRadiusProcessor.MAC_ADDRESS, (String) callingStationId );, тоже тишина, там где не было атрибута в request-пакете там и дальше пусто, там где был остается прежний.

Куда копать?

Автор:  a.vo [ 28 сен 2017, 17:56 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

в самой функции предобработки Calling-Station-Id проставляется, а в мониторе Inet я потом этого атрибута не вижу.

Код:
preprocessAccessRequest responce: Packet type: Access-Request
Identifier: 117
Authenticator: {89 DB D2 17 52 22 E4 FC D7 45 22 8A 86 02 17 08}
Attributes:
  NAS-Identifier=Multiple_access_portal
  User-Name=id14005
  User-Password=5cBP
  NAS-Port=180880739
  Framed-IP-Address=10.200.5.99
  Acct-Session-Id=10.200.5.99_1506599683764
  Calling-Station-Id=id140055cBP

Автор:  skyb [ 29 сен 2017, 06:58 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

ну дайте скрин этой сессии полностью в мониторе

Автор:  a.vo [ 29 сен 2017, 11:07 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

Приветствую!
Вот RadiusPacket, которые формируется в предообработке:
Код:
Packet type: Access-Request
Identifier: 96
Authenticator: {95 02 3B 87 3A 9E D9 79 2B 4C 70 C4 47 03 DE 5B}
Attributes:
  NAS-Identifier=Multiple_access_portal
  User-Name=id8544
  User-Password=XhCpe5
  NAS-Port=167839254
  Framed-IP-Address=10.1.6.22
  Acct-Session-Id=10.1.6.22_1506661290287
  Calling-Station-Id=id8544XhCpe5
Вот что вижу в мониторе:
Код:
Time: 29.09.2017 08:01:30
Packet type: Access-Request
Identifier: 96
Authenticator: {95 02 3B 87 3A 9E D9 79 2B 4C 70 C4 47 03 DE 5B}
Attributes:
  NAS-Identifier=Multiple_access_portal
  User-Name=id8544
  User-Password=XhCpe5
  NAS-Port=167839254
  Framed-IP-Address=10.1.6.22
  Acct-Session-Id=10.1.6.22_1506661290287

Time: 29.09.2017 08:01:30
Packet type: Access-Accept
Identifier: 96
Authenticator: {A0 EE 97 35 B1 5B 90 71 A4 3D 5A E8 36 8F AC 5D}
Attributes:

Process time auth: 0

Time: 29.09.2017 08:01:30
Packet type: Accounting-Request
Identifier: 97
Authenticator: {43 D6 53 16 98 B5 55 93 89 94 0D C9 2C B6 02 0F}
Attributes:
  NAS-Identifier=Multiple_access_portal
  User-Name=id8544
  NAS-Port=167839254
  Framed-IP-Address=10.1.6.22
  Acct-Status-Type=1
  Acct-Session-Id=10.1.6.22_1506661290287
Самое интересное, что рестарт сессии в случае даблирования работает, но почему монитор не показывает подмену? Он раньше предобработки забирает данные?

Автор:  skyb [ 29 сен 2017, 11:20 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

я просил скрин, а не вывод лога

Автор:  a.vo [ 29 сен 2017, 11:31 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

skyb писал(а):
я просил скрин, а не вывод лога

пожалуйста, а в чем разница?

Вложения:
inet_monitor.PNG
inet_monitor.PNG [ 18.36 КБ | Просмотров: 9508 ]

Автор:  skyb [ 29 сен 2017, 13:28 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

a.vo писал(а):
skyb писал(а):
я просил скрин, а не вывод лога

пожалуйста, а в чем разница?

ну тут видно что действительно нет мака в нужных полях

Автор:  a.vo [ 29 сен 2017, 13:44 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

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

Автор:  Amir [ 29 сен 2017, 16:41 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

В мониторе не отображается, потому что у вас не сохраняется информация о выданном Access-Accept.
connection.start.fromAccept=1
И потому что в Accounting-пакетах нет User-Password, соответственно (userName != null && userPassword != null) будет false, соответственно при старте сессии туда уже ничего не подставляется.

Должно быть достаточно добавить
connection.start.fromAccept=1

Автор:  a.vo [ 29 сен 2017, 16:50 ]
Заголовок сообщения:  Re: Рестарт Inet-сессии

Amir писал(а):
Должно быть достаточно добавить
connection.start.fromAccept=1


Отлично, теперь все отображается.
Спасибо!

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/