Справочник Cisco-ISG сервисов
Материал из BiTel WiKi
Версия от 05:24, 21 июля 2014; Cromeshnic (Обсуждение | вклад)
Содержание |
Описание задачи
Схемы с использованием Cisco ISG обычно предполагают использование отдельного радиус-сервера для выдачи параметров сервисов ISG. Для этого часто используется тот же радиус, но удобнее выносить эту логику отдельно. Тем более, что одновременно может быть реализовано несколько разных схем подключения, использующих ISG.
В данной статье справочник ISG-сервисов поднимается в виде отдельного экземпляра модуля Inet c одним Access-сервером для выдачи атрибутов и без Accounting-серверов.
Описанное решение настраивалось на версии 5.2
Настройка
Установка модуля
- Устанавливаем модуль Inet, если ещё не установлен.
- В клиенте биллинга: Модули -> Редактор модулей и услуг: добавляем новый экземпляр модуля Inet с названием "ISG-справочник", запоминаем Id модуля (в нашем случае=31), добавляем услугу "Время".
- Типы трафика и привязки типов трафиков не добавляем
- Конфигурацию модуля не добавляем (если вам не нужно)
- Добавляем тип устройства ISG - для роутеров с ISG. В конфиге этого типа устройства позже будем прописывать радиус-атрибуты наших сервисов
- Добавляем тип устройства Access - ProcessGroup для сервера BGInetAccess, конфиг и обработчики - пустые
- Получили типы устройств:
- Накидываем дерево устройств:
- Заводим тип сервиса:
Установка 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&characterEncoding=Cp1251&allowUrlInLocalInfile=true&zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false&queryTimeoutKillsConnection=true&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&characterEncoding=Cp1251&allowUrlInLocalInfile=true&zeroDateTimeBehavior=convertToNull&jdbcCompliantTruncation=false&elideSetAutoCommits=true&useCursorFetch=true&queryTimeoutKillsConnection=true&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-справочник".
Опции модуля
- Заводим дерево опций:
- Опции в дереве группируем по типам, чтобы было удобнее настраивать шаблоны атрибутов в конфиге типа устройства ISG
- Для примера, добавим ISG-сервис INET1000:
- Прописываем для группы опций 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;
- В шаблоне 3 параметра:
- $optionTitle - имя опции в дереве опций, подставляется по-умолчанию, определять явно не нужно
- $acctInterval - интервал отсылки аккаунтинга по ISG-сессии в секундах
- $speed - скорость для сервиса
- Пропишем $acctInterval для всех опций типа INET по-умолчанию:
- Добавляем опцию INET1000 в дерево опций
- Прописываем для группы опций INET (id=7) шаблон атрибутов в конфиге типа устройства "ISG":
Сервисы модуля
- Заводим служебный договор для авторизации сервисов. Необходимо, чтобы у него всегда был неотрицательный баланс/лимит, активный статус и т.п. Не лишним будет ограничить к нему доступ и пометить как "Скрытый".
- Вешаем на него простейший тариф (персональный или глобальный):
- Добавляем модуль "ISG-справочник" и заводим на нём сервисы с нашим типом сервиса "ISG":
...