Справочник Cisco-ISG сервисов
Материал из BiTel WiKi
(→Нестандартные сервисы) |
м (переименовал «Inet-isg-dictionary» в «Справочник Cisco-ISG сервисов»: ибо ваистену) |
Версия 06:22, 21 июля 2014
Содержание |
Описание задачи
Схемы с использованием 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-справочник". Например: заводим опцию модуля INET1000 -> заводим сервис договора с логином "INET1000" -> вешаем на сервис опцию -> перечитываем конфигурацию -> авторизуемся.
Опции модуля
- Заводим дерево опций:
- Опции в дереве группируем по типам, чтобы было удобнее настраивать шаблоны атрибутов в конфиге типа устройства 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;
- В шаблоне 3 параметра:
- $optionTitle - имя опции в дереве опций, подставляется по-умолчанию, определять явно не нужно
- $acctInterval - интервал отсылки аккаунтинга по ISG-сессии в секундах
- $speed - скорость для сервиса
- Пропишем $acctInterval для всех опций типа INET по-умолчанию:
- Добавляем опцию INET1000 в дерево опций:
- Добавляем опцию INET448 с Acct-Interim-Interval=300 (для примера):
Т.о. мы в конфиге опции INET448 переопределили $acctInterval=300, который по-умолчанию определён для всех опций INET =900
Сервисы модуля
- Заводим служебный договор для авторизации сервисов. Необходимо, чтобы у него всегда был неотрицательный баланс/лимит, активный статус и т.п. Не лишним будет ограничить к нему доступ и пометить как "Скрытый".
- Вешаем на него простейший тариф (персональный или глобальный):
- Добавляем модуль "ISG-справочник" и заводим на нём сервисы INET1000 и INET448 с нашим типом сервиса "ISG":
- Не забываем привязать к сервису соответствующую ему опцию!
Выдача атрибутов
Проверяем, что у нас получилось: Устройства -> Перечитать конфигурацию на серверах
Авторизуем сервис со стороны циски, смотрим логи:
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=IINET1000 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» и одноимённой опцией на сервисе (в разделе «Опции» сервиса)
- Проверяем, как выдаются атрибуты