Справочник Cisco-ISG сервисов

Материал из BiTel WiKi

Перейти к: навигация, поиск

Содержание

Описание задачи

Схемы с использованием Cisco ISG обычно предполагают использование отдельного радиус-сервера для выдачи параметров сервисов ISG. Для этого часто используется тот же радиус, но удобнее выносить эту логику отдельно. Тем более, что одновременно может быть реализовано несколько разных схем подключения, использующих ISG.

В данной статье справочник ISG-сервисов поднимается в виде отдельного экземпляра модуля Inet c одним Access-сервером для выдачи атрибутов и без Accounting-серверов.

Описанное решение настраивалось на версии 5.2

Настройка

Установка модуля

  • Устанавливаем модуль Inet, если ещё не установлен.
  • В клиенте биллинга: Модули -> Редактор модулей и услуг: добавляем новый экземпляр модуля Inet с названием "ISG-справочник", запоминаем Id модуля (в нашем случае=31), добавляем услугу "Время".

Файл:inet-isg-module.png

  • Типы трафика и привязки типов трафиков не добавляем
  • Конфигурацию модуля не добавляем (если вам не нужно)
  • Добавляем тип устройства ISG - для роутеров с ISG. В конфиге этого типа устройства позже будем прописывать радиус-атрибуты наших сервисов

Файл:inet-isg-device-type.png

  • Добавляем тип устройства Access - ProcessGroup для сервера BGInetAccess, конфиг и обработчики - пустые

Файл:inet-isg-device-type-root.png

  • Получили типы устройств:

Файл:inet-isg-device-types.png

  • Накидываем дерево устройств:

Файл:inet-isg-device-tree.png

  • Заводим тип сервиса:

Файл:inet-isg-service-type.png

Установка Access-сервера

  • Устанавливаем Access-сервер по мануалу
  • Переименовываем в Access-ISG имя директории: /usr/local/BGInetAccess-ISG
  • В access.sh: "-Dapp.name=BGInetAccess-ISG":
#!/bin/sh
 
cd ${0%${0##*/}}.
 
. ./setenv.sh
 
APP_HOME=.
CLASSPATH=$APP_HOME:$APP_HOME/lib/ext/bgcommon-boot.jar
COMMON_PARAMS="-Dnetworkaddress.cache.ttl=3600 -Djava.net.preferIPv4Stack=true -Dboot.info=1 -Dapp.name=BGInetAccess-ISG -Djava.endorsed.dirs=${BGBILLING_SERVER_DIR}/lib/endorsed:${JAVA_HOME}/lib/endorsed"
LOG_PARAMS="-Dlog.dir.path=log/ -Dlog4j.configuration=log4j-access.xml"
NAME=inet-access
NAME_SHORT=access
ADMIN_PORT=3951
MEMORY=-Xmx256m
 
if [ "$1" = "start" ]; then
        nohup  ${JAVA_HOME}|>/bin/java ${COMMON_PARAMS}|> ${LOG_PARAMS}|> ${MEMORY}|> -Dadmin.port=$ADMIN_PORT -cp ${CLASSPATH}|> ru.bitel.common.bootstrap.Boot ru.bitel.bgbilling.kernel.application.server.Application ${NAME}|> > ./log/${NAME_SHORT}|>.out 2>&1 & echo $! > .run/${NAME_SHORT}|>.pid &
else
        if [ "$1" = "debug" ]; then
                #starting in debug mode
            nohup  ${JAVA_HOME}|>/bin/java ${COMMON_PARAMS}|> ${MEMORY}|> -Dadmin.port=$ADMIN_PORT -cp ${CLASSPATH}|> -enableassertions -Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=5589,server=y,suspend=n ru.bitel.common.bootstrap.Boot ru.bitel.bgbilling.kernel.application.server.Application ${NAME}|> > ./log/${NAME_SHORT}|>.out 2>&1 & echo $! > .run/${NAME_SHORT}|>.pid
        else
                #execute command
                ${JAVA_HOME}|>/bin/java ${COMMON_PARAMS}|> -Dadmin.port=$ADMIN_PORT -cp ${CLASSPATH}|> ru.bitel.common.bootstrap.Boot ru.bitel.bgbilling.kernel.application.server.Application ${NAME}|> $1 $2 $3 $4 $5 $6
        fi
fi
  • В inet-access.xml указываем:
    • app.name=BGInetAccess-ISG
    • app.id - какой у вас свободен (1, если нет других Access/Accounting-серверов)
    • Параметры подключения к базам
    • moduleId - id нашего экземпляра модуля Inet (у меня = 31)
    • rootDeviceId - id корневого устройства типа Access из дерева устройств (у меня = 1)
    • accounting.deviceTypeIds - типы устройств-NAS-ов (у меня = 2)
    • host/port для access-request-ов
  • Для более актуальной настройки inet-access.xml рекомендую свериться с документацией вашей версии.
  • Мой текущий inet-access.xml:
<?xml version="1.0" encoding="UTF-8"?>
<application context="access">
        <!-- Уникальное имя приложения -->
        <param name="app.name" value="BGInetAccess-ISG"/>
        <!-- Уникальный числовой id приложения -->
        <param name="app.id" value="2"/>
 
        <!-- Параметры подключения к БД -->
        <param name="db.driver" value="com.mysql.jdbc.Driver"/>
        <param name="db.url" value="jdbc:mysql://127.0.0.1/bgbilling?useUnicode=true&amp;characterEncoding=Cp1251&amp;allowUrlInLocalInfile=true&amp;zeroDateTimeBehavior=convertToNull&amp;jdbcCompliantTruncation=false&amp;queryTimeoutKillsConnection=true&amp;connectTimeout=1000"/>
        <param name="db.user" value="bill"/>
        <param name="db.pswd" value="bill"/>
        <param name="db.maxIdle" value="10"/>
        <param name="db.validationTimeout" value="10"/>
 
        <!-- Параметры подключения к slave БД -->
        <param name="db.slave.1.url" value="jdbc:mysql://192.168.10.10:3306/bgbilling?useUnicode=true&amp;characterEncoding=Cp1251&amp;allowUrlInLocalInfile=true&amp;zeroDateTimeBehavior=convertToNull&amp;jdbcCompliantTruncation=false&amp;elideSetAutoCommits=true&amp;useCursorFetch=true&amp;queryTimeoutKillsConnection=true&amp;connectTimeout=1000"/>
        <param name="db.slave.1.user" value="bill"/>
        <param name="db.slave.1.pswd" value="bill"/>
        <param name="db.slave.1.maxIdle" value="10"/>
        <param name="db.slave.1.maxActive" value="100"/>
        <param name="slave.alarm.second.behind.master" value="400"/>
        <param name="slave.disable.second.behind.master" value="390"/>
 
        <!-- Параметры подключения к MQ -->
        <param name="mq.url" value="failover:(tcp://127.0.0.1:61616)"/>
        <param name="mq.user" value="bill"/>
        <param name="mq.pswd" value="bgbilling"/>
 
        <!-- id модуля -->
        <param name="moduleId" value="31"/>
        <!-- id корневого устройства -->
        <param name="rootDeviceId" value="1"/>
        <!-- Типы фейковых устройств, являющихся аккаунтинг серверами -->
        <param name="accounting.deviceTypeIds" value="2"/>
 
        <!-- Внутренняя переменная приложения, не изменять -->
        <param name="commonIdentifierName" value="rootDeviceId"/>
 
        <!-- Параметры сохранения логов данных -->
        <!-- Директория, в которую сохранять radius логи -->
        <param name="datalog.radius.dir" value="data/radius" />
        <!-- Размер блока данных в файле лога, также размер буфера на лог файл -->
        <param name="datalog.radius.chunk.size" value="262144" />
        <!-- Сжимать radius логи: 0 - не сжимать, 1 - zlib -->
        <param name="datalog.radius.compression.type" value="1" />
        <!-- Директория, в которую сохранять flow логи -->
        <param name="datalog.dhcp.dir" value="data/dhcp" />
        <!-- Размер блока данных в файле лога, также размер буфера на лог файл -->
        <param name="datalog.dhcp.chunk.size" value="131072" />
        <!-- Сжимать flow логи: 0 - не сжимать, 1 - zlib -->
        <param name="datalog.dhcp.compression.type" value="1" />
 
 
        <!-- Создание Access -->
        <bean name="access" class="ru.bitel.bgbilling.modules.inet.access.Access" />
 
        <context name="radius">
                <!-- Cоздание процессора radius-пакетов -->
                <bean name="radiusProcessor" class="ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor"/>
 
                <!-- Служебный ScheduledExecutorService, необходимый для dataLogger -->
                <scheduledExecutorService name="hrlydtlggr" corePoolSize="1" />
 
                <!-- Cоздание dataLogger, сохраняющего radius-пакеты на диск (только один экземпляр) -->
                <bean name="radiusDataLogger" class="ru.bitel.bgbilling.modules.inet.radius.RadiusHourlyDataLogger">
                        <param name="scheduledExecutor">hrlydtlggr</param>
                </bean>
 
                <!-- Cоздание слушателя radius-пакетов на порту с передачей ему процессора и dataLogger -->
                <bean name="radiusListener" class="ru.bitel.bgbilling.modules.inet.radius.InetRadiusListener">
                        <constructor>
                                <!-- Хост (интерфейс), на котором будет открыт сокет. Если пусто - на всех -->
                                <param name="host" value=""/>
                                <!-- Порт, на котором будет открыт сокет -->
                                <param name="port" value="3912"/>
                                <!-- Размер буфера приема слушателя -->
                                <param name="recvBufferSize">512 * 1024</param>
                                <!-- Рекомендуемый SO_RCVBUF сокета -->
                                <param name="soRCVBUF"></param>
                                <!-- Количество потоков-обработчиков -->
                                <param name="threadCount">10</param>
                                <!-- Максимальное количество пакетов в очереди на обработку -->
                                <param name="maxQueueSize">200</param>
                                <!-- Передача процессора -->
                                <param name="processor">radiusProcessor</param>
                                <!-- Режим работы, RadiusListener.Mode.authentication -->
                                <param name="mode">RadiusListener.Mode.authentication</param>
                                <!-- Передача dataLogger -->
                                <param name="dataLogger">radiusDataLogger</param>
                        </constructor>
                </bean>
        </context>
 
</application>
  • Запускаем BGInetAccess-ISG, убеждаемся, что он запустился, смотрим логи на предмет ошибок

Настройка сервисов ISG

Каждому сервису ISG у нас будет соответствовать пара: сервис модуля "ISG-справочник" на договоре + опция модуля "ISG-справочник". Например: заводим опцию модуля INET1000 -> заводим сервис договора с логином "INET1000" -> вешаем на сервис опцию -> перечитываем конфигурацию -> авторизуемся.

Опции модуля

  • Заводим дерево опций:

Файл:inet-isg-options.png

  • Опции в дереве группируем по типам, чтобы было удобнее настраивать шаблоны атрибутов в конфиге типа устройства ISG

Для примера, добавим 2 ISG-сервиса INET1000 и INET448:

  • Прописываем для группы опций INET (id=7) шаблон атрибутов в конфиге типа устройства "ISG":
    radius.inetOption.7.template=cisco-avpair=ip:traffic-class=in access-group name internet priority 90;cisco-avpair=ip:traffic-class=in default drop;cisco-avpair=ip:traffic-class=out access-group name internet priority 90;cisco-avpair=ip:traffic-class=out default drop;cisco-avpair=subscriber:accounting-list=ISG-SERVICE;cisco-avpair=subscriber:policy-directive=authenticate aaa list ISG-SERVICE;Acct-Interim-Interval=$acctInterval;cisco-SSG-Service-Info=I$optionTitle;cisco-SSG-Service-Info=QU;;$speed;;D;;$speed;

Файл:inet-isg-options-inet-template.png

  • В шаблоне 3 параметра:
    • $optionTitle - имя опции в дереве опций, подставляется по-умолчанию, определять явно не нужно
    • $acctInterval - интервал отсылки аккаунтинга по ISG-сессии в секундах
    • $speed - скорость для сервиса
  • Пропишем $acctInterval для всех опций типа INET по-умолчанию:

Файл:inet-isg-options-inet.png

  • Добавляем опцию INET1000 в дерево опций:

Файл:inet-isg-option-inet1000.png

  • Добавляем опцию INET448 с Acct-Interim-Interval=300 (для примера):

Файл:inet-isg-option-inet448.png

Т.о. мы в конфиге опции INET448 переопределили $acctInterval=300, который по-умолчанию определён для всех опций INET =900

Сервисы модуля

  • Заводим служебный договор для авторизации сервисов. Необходимо, чтобы у него всегда был неотрицательный баланс/лимит, активный статус и т.п. Не лишним будет ограничить к нему доступ и пометить как "Скрытый".
  • Вешаем на него простейший тариф (персональный или глобальный):

Файл:inet-isg-tariff.png

  • Добавляем модуль "ISG-справочник" и заводим на нём сервисы INET1000 и INET448 с нашим типом сервиса "ISG":

Файл:inet-isg-service-inet1000.png

  • Не забываем привязать к сервису соответствующую ему опцию!

Выдача атрибутов

Проверяем, что у нас получилось: Устройства -> Перечитать конфигурацию на серверах

Авторизуем сервис со стороны циски, смотрим логи:

07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] RadiusListenerWorker - REQUEST:
Packet type: Access-Request
Identifier: 175
Authenticator: {2C F0 1A 41 27 AB F1 05 BF CD 9E 56 B1 49 44 9C}
Attributes:
  User-Name=INET1000
  User-Password=cisco
  NAS-IP-Address=10.10.10.10
  Service-Type=5
 
radius 07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] InetNas - Search by username=INET1000
radius 07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] InetRadiusProcessor - [username=INET1000] Authenticated as inetServId:150
radius 07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] InetApplication - inetServ[id=150] balance ok: 0.00 [-99999999.99]
radius 07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] InetApplication - TariffOptionMap: {}
radius 07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] InetApplication - OptionSet: [228]
radius 07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] InetRadiusProcessor - Return code=0
radius 07-01/06:25:32  INFO [rdsLstnr-p-9-t-4] InetRadiusProcessor - RESPONSE_BEFORE_POSTPROCESS:
Packet type: Access-Accept
Identifier: 175
Authenticator: {}
Attributes:
  Acct-Interim-Interval=900
  cisco-avpair=ip:traffic-class=in access-group name internet priority 90
  cisco-avpair=ip:traffic-class=in default drop
  cisco-avpair=ip:traffic-class=out access-group name internet priority 90
  cisco-avpair=ip:traffic-class=out default drop
  cisco-avpair=subscriber:accounting-list=ISG-SERVICE
  cisco-avpair=subscriber:policy-directive=authenticate aaa list ISG-SERVICE
  cisco-SSG-Service-Info=IINET13000
  cisco-SSG-Service-Info=QU;1000000;D;1000000
 
Process time auth: 20
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] RadiusListenerWorker - REQUEST:
Packet type: Access-Request
Identifier: 24
Authenticator: {81 97 43 38 1D B6 F2 0F B5 4C BF 2F 4D 84 89 2A}
Attributes:
  User-Name=INET448
  User-Password=cisco
  NAS-IP-Address=10.10.10.10
  Service-Type=5
 
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] InetNas - Search by username=INET448
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] InetRadiusProcessor - [username=INET448] Authenticated as inetServId:96
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] InetApplication - inetServ[id=96] balance ok: 0.00 [-99999999.99]
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] InetApplication - TariffOptionMap: {}
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] InetApplication - OptionSet: [241]
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] InetRadiusProcessor - Return code=0
radius 07-01/06:25:39  INFO [rdsLstnr-p-9-t-4] InetRadiusProcessor - RESPONSE_BEFORE_POSTPROCESS:
Packet type: Access-Accept
Identifier: 24
Authenticator: {}
Attributes:
  Acct-Interim-Interval=300
  cisco-avpair=ip:traffic-class=in access-group name internet priority 90
  cisco-avpair=ip:traffic-class=in default drop
  cisco-avpair=ip:traffic-class=out access-group name internet priority 90
  cisco-avpair=ip:traffic-class=out default drop
  cisco-avpair=subscriber:accounting-list=ISG-SERVICE
  cisco-avpair=subscriber:policy-directive=authenticate aaa list ISG-SERVICE
  cisco-SSG-Service-Info=IINET448
  cisco-SSG-Service-Info=QU;448500;224250;D;448500;224250

Нестандартные сервисы

Сервисы, которые не бьются по шаблонам, я объединил в группу MISC и прописываю индивидуально через radius.inetOption.x.attributes:

Общий HOWTO по добавлению новых сервисов

  • Добавляем опцию
  • Прописываем в опции параметры, если необходимо
  • Добавляем radius.inetOption.<x>.template или radius.inetOption.<x>.attributes, если необходимо
  • На вкладке «Устройства» жмём «Перечитать конфигурацию на серверах»
  • Заводим на служебном договоре сервис в модуле «ISG-справочник» с логином=именем опции, паролем «cisco» и одноимённой опцией на сервисе (в разделе «Опции» сервиса)
  • Проверяем, как выдаются атрибуты
Личные инструменты