ISG, схема со стартом сессии и ее авторизацией по IP, выдача адресов на основе option82

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

(Различия между версиями)
Перейти к: навигация, поиск
м
Строка 28: Строка 28:
*При отрицательном балансе ISG сессия сбрасывается и создается новая (unauth) сессия с таймером и локальными сервисами, ограничивающими абоненту доступ. Эта сессия каждые N минут переавторизуется на BGBilling'е в надежде, что абонент уже пополнил баланс. И - если баланс выправился - стартует как обычно (с сервисами из биллинга, в соответствие с тарифом). Это не совсем true way для ISG. Правильно - не сбрасывая сессию, снять с нее (через CoA) текущие тарифные ISG сервисы и назначить другие (ограничивающие доступ), а при пополнении баланса - наоборот. BGBilling так может. Почему я сделал по другому? Потому что удобно на циске видеть абонентов с отрицательным балансом (их сессии - unauth) и удобно отслеживать повторные радиус запросы на авторизацию. Это опять же очень удобно для быстрой аналитики и при траблшутинге (почему это у этого абонента ничего не работает? а вот и логи...). Опять же IMHO.
*При отрицательном балансе ISG сессия сбрасывается и создается новая (unauth) сессия с таймером и локальными сервисами, ограничивающими абоненту доступ. Эта сессия каждые N минут переавторизуется на BGBilling'е в надежде, что абонент уже пополнил баланс. И - если баланс выправился - стартует как обычно (с сервисами из биллинга, в соответствие с тарифом). Это не совсем true way для ISG. Правильно - не сбрасывая сессию, снять с нее (через CoA) текущие тарифные ISG сервисы и назначить другие (ограничивающие доступ), а при пополнении баланса - наоборот. BGBilling так может. Почему я сделал по другому? Потому что удобно на циске видеть абонентов с отрицательным балансом (их сессии - unauth) и удобно отслеживать повторные радиус запросы на авторизацию. Это опять же очень удобно для быстрой аналитики и при траблшутинге (почему это у этого абонента ничего не работает? а вот и логи...). Опять же IMHO.
-
[[ISG, схема со стартом сессии и ее авторизацией по IP, выдача адресов на основе option82 (Конфигурация сети)]]
+
#[[ISG, схема со стартом сессии и ее авторизацией по IP, выдача адресов на основе option82 (Конфигурация сети)]]
-
[[ISG, схема со стартом сессии и ее авторизацией по IP, выдача адресов на основе option82 (Конфигурация BGBilling'а)]]
+
#[[ISG, схема со стартом сессии и ее авторизацией по IP, выдача адресов на основе option82 (Конфигурация BGBilling'а)]]
-
 
+
-
== Конфигурация BGBilling'а ==
+
-
 
+
-
Устанавливаем модуль inet_5.2_1118.zip, создаем его в редакторе модулей и услуг, добавляем услуги.<br />
+
-
Затем, создаем Опции (имена ISG сервисов), типы трафика и тарифный план (в нем прописываем стоимости типов трафика и подключаем Опции, т.е. ISG сервисы):
+
-
{|
+
-
| [[Файл:ISG-INET-0001.jpg|200px|thumb|left|Модуль, услуги]]
+
-
| [[Файл:ISG-INET-0002.jpg|200px|thumb|left|Опции (ISG сервисы)]]
+
-
| [[Файл:ISG-INET-0003.jpg|200px|thumb|left|Типы трафика]]
+
-
| [[Файл:ISG-INET-0024.jpg|200px|thumb|left|Тарифный план: стоимость трафика и подключение опций (ISG сервисов)]]
+
-
|}
+
-
 
+
-
Описываем откуда брать информацию о количестве каждого из типов трафика (можно конечно использовать netflow, но я ограничился Acct-Input-Octets и Acct-Output-Octets из radius аккаунтинга, так как тарифов по траффику у меня нет и эта информация нужна всего лишь для статистики):
+
-
{|
+
-
| [[Файл:ISG-INET-0004.jpg|200px|thumb|left|Привяка типов трафика: Local Upstream]]
+
-
| [[Файл:ISG-INET-0005.jpg|200px|thumb|left|Привяка типов трафика: Local Downstream]]
+
-
| [[Файл:ISG-INET-0006.jpg|200px|thumb|left|Привяка типов трафика: Internet Upstream]]
+
-
| [[Файл:ISG-INET-0007.jpg|200px|thumb|left|Привяка типов трафика: Internet Downstream]]
+
-
|}
+
-
Далее, создаем пул IP адресов - они должны быть из диапазона адресов интерфейса Loopback52 (на свиче уровня аггрегации), а default gateway должен быть адрес интерфейса Loopback52.<br />
+
-
Создаем сервис INTERNET, который будем подключать к договору в биллинге (не путать с ISG сервисом, назначаемым на ISG сессию абонента на циске), чтобы собственно предоставить ему (договору) доступ в интернет через модуль Inet.
+
-
{|
+
-
| [[Файл:ISG-INET-0008.jpg|200px|thumb|left|IP-ресурсы]]
+
-
| [[Файл:ISG-INET-0009.jpg|200px|thumb|left|Сервис INTERNET]]
+
-
|}
+
-
Создаем сущность ''коммутатор'', привязываем к ней атрибут ''адрес'' (позже пригодится для указания местоположения свичей доступа, чтобы потом хоть как-то ориентироваться что-где):
+
-
{|
+
-
| [[Файл:ISG-INET-0016.jpg|200px|thumb|left|Сущности]]
+
-
| [[Файл:ISG-INET-0023.jpg|200px|thumb|left|Атрибуты]]
+
-
|}
+
-
Создаем типы устройств:
+
-
#абстрактный тип Access+Accounting, являющийся верхушкой иерархии всех типов устройств, объединяя их все (в нем прописываются настройки общие для всех типов устройств)
+
-
#тип ASR ISG, описывающий BRAS'ы
+
-
#тип SW-1, описывающий свичи уровня аггрегации (они же dhcp релеи)
+
-
#тип Switch, описывающий свичи уровня доступа (те, которые вставляют option82), привязываем к нему сущность ''коммутатор''.
+
-
{|
+
-
|-
+
-
| [[Файл:ISG-INET-0011.jpg|200px|thumb|left|Типы устройств]]
+
-
| [[Файл:ISG-INET-0012.jpg|200px|thumb|left|Типы устройств: Access+Accounting (абстрактный тип, верхушка иерархии типов)]]
+
-
|-
+
-
| [[Файл:ISG-INET-0013.jpg|200px|thumb|left|Типы устройств: ASR ISG (BRAS)]]
+
-
| [[Файл:ISG-INET-0014.jpg|200px|thumb|left|Типы устройств: SW-1 (уровень аггрегации)]]
+
-
| [[Файл:ISG-INET-0015.jpg|200px|thumb|left|Типы устройств: Switch (уровень доступа)]]
+
-
|}
+
-
и привязываем сервис INTERNET к всем этим типам (через абстрактный Access+Accounting):
+
-
{|
+
-
| [[Файл:ISG-INET-0010.jpg|200px|thumb|left|Сервис INTERNET, типы устройств]]
+
-
|}
+
-
Создаем сами устройства (соответствующих типов):
+
-
{|
+
-
|-
+
-
| [[Файл:ISG-INET-0017.jpg|200px|thumb|left|Устройства]]
+
-
| [[Файл:ISG-INET-0018.jpg|200px|thumb|left|Устройства: Access+Accounting (абстрактное устройство, верхушка иерархии устройств)]]
+
-
|-
+
-
| [[Файл:ISG-INET-0019.jpg|200px|thumb|left|Устройства: R31_ASR1002 (BRAS)]]
+
-
| [[Файл:ISG-INET-0020.jpg|200px|thumb|left|Устройства: (каталист уровня аггрегации)]]
+
-
| [[Файл:ISG-INET-0021.jpg|200px|thumb|left|Устройства: (каталист уровня доступа)]]
+
-
|}
+
-
Для свичей доступа указываем местоположение (используя сущность и атрибут ''адрес''):
+
-
{|
+
-
| [[Файл:ISG-INET-0022.jpg|200px|thumb|left|Устройства: (каталист уровня доступа, атрибуты)]]
+
-
|}
+
-
Теперь осталось привязать сервис INTERNET (выбрав нужный свич уровня доступа и указав правильный номер порта) к договору:
+
-
{|
+
-
| [[Файл:ISG-INET-0025.jpg|200px|thumb|left|Договор, сервисы (постоянный IP)]]
+
-
| [[Файл:ISG-INET-0026.jpg|200px|thumb|left|Договор, сервисы (случайный IP)]]
+
-
|}
+
-
И не забыть про тариф, так как именно через него (помимо определения стоимостей) назначаются ISG сессии (Опции):
+
-
{|
+
-
| [[Файл:ISG-INET-0029.jpg|200px|thumb|left|Договор, тарифный план (назначение Опций, т.е. ISG сервисов)]]
+
-
|}
+
-
 
+
-
Теперь ставим ''BGInetAccess сервер для модуля Inet'' (выполняет функции DHCP и RADIUS серверов). Конфиг (файл inet-access.xml):
+
-
<source lang="bash">
+
-
<?xml version="1.0" encoding="UTF-8"?>
+
-
<application context="access">
+
-
<!-- Уникальное имя приложения -->
+
-
<param name="app.name" value="BGInetAccess"/>
+
-
<!-- Уникальный числовой id приложения -->
+
-
<param name="app.id" value="10101"/>
+
-
 
+
-
<!-- Параметры подключения к БД -->
+
-
<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="***"/>
+
-
<param name="db.validationTimeout" value="10"/>
+
-
+
-
<!-- Параметры подключения к MQ -->
+
-
<param name="mq.url" value="failover:(tcp://localhost:61616)"/>
+
-
<param name="mq.user" value="bill"/>
+
-
<param name="mq.pswd" value="bgbilling"/>
+
-
+
-
<!-- id модуля -->
+
-
<param name="moduleId" value="2"/>
+
-
<!-- id корневого устройства -->
+
-
<param name="rootDeviceId" value="1"/>
+
-
<!-- Типы фейковых устройств, являющихся аккаунтинг серверами -->
+
-
<param name="accounting.deviceTypeIds" value="1"/>
+
-
 
+
-
<!-- Внутренняя переменная приложения, не изменять -->
+
-
<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.InetRadiusHelperProcessor"/>
+
-
+
-
<!-- Служебный 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="1812"/>
+
-
<!-- Размер буфера приема слушателя -->
+
-
<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>
+
-
+
-
<context name="dhcp">
+
-
<!-- Cоздание процессора dhcp-пакетов -->
+
-
<bean name="dhcpProcessor" class="ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpProcessor"/>
+
-
+
-
<scheduledExecutorService name="hrlydtlggr" corePoolSize="1" />
+
-
 
+
-
<!-- Cоздание dataLogger, сохраняющего dhcp-пакеты на диск  -->
+
-
<bean name="dhcpDataLogger" class="ru.bitel.bgbilling.modules.inet.dhcp.DhcpHourlyDataLogger">
+
-
<param name="scheduledExecutor">hrlydtlggr</param>
+
-
</bean>
+
-
+
-
<!-- Cоздание слушателя dhcp-пакетов на порту с передачей ему процессора и dataLogger -->
+
-
<bean name="dhcpListener" class="ru.bitel.bgbilling.kernel.network.dhcp.DhcpListener">
+
-
<constructor>
+
-
<!-- Хост (интерфейс), на котором будет открыт сокет. Если пусто - на всех -->
+
-
<param name="host" value=""/>
+
-
<!-- Порт, на котором будет открыт сокет -->
+
-
<param name="port" value="67"/>
+
-
<!-- Размер буфера приема слушателя -->
+
-
<param name="recvBufferSize">512 * 1024</param>
+
-
<!-- Количество потоков-обработчиков -->
+
-
<param name="threadCount">10</param>
+
-
<!-- Максимальное количество пакетов в очереди на обработку -->
+
-
<param name="maxQueueSize">200</param>
+
-
<!-- Передача процессора -->
+
-
<param name="processor">dhcpProcessor</param>
+
-
<!-- Передача dataLogger -->
+
-
<param name="dataLogger">dhcpDataLogger</param>
+
-
</constructor>
+
-
</bean>
+
-
</context>
+
-
</application>
+
-
</source>
+
-
Здесь, в <param name="moduleId" value="'''2'''"/>  цифра '''2''' - это ID модуля Inet, а<br />
+
-
в <param name="rootDeviceId" value="'''1'''"/> цифра '''1''' - это ID устройства Access+Accounting.
+
-
 
+
-
Запускаем, подключаем клиента и вот результат:
+
-
{|
+
-
| [[Файл:ISG-INET-0027.jpg|200px|thumb|left|Монитор (активные сессии договора)]]
+
-
| [[Файл:ISG-INET-0028.jpg|200px|thumb|left|Отчет (по-сервисный аккаунтинг)]]
+
-
|}
+
-
 
+
-
 
+
-
<u>Полный конфиг типа устройств Access+Acounting</u>:
+
-
<source lang="bash">
+
-
access.group=1
+
-
 
+
-
#типы устройств - Nas-ов
+
-
#radius.deviceTypeIds=3,4
+
-
#типы устройств, являющиеся dhcp relay
+
-
#dhcp.relay.deviceTypeIds=
+
-
#привязка по ip
+
-
radius.key.deviceTypeIds=3
+
-
 
+
-
#количество потоков на worker'а
+
-
accounting.worker.1.thread.count=1
+
-
#тарификатор:
+
-
#минимальная сумма трафика, при которой тарифицировать соединение
+
-
accounting.worker.1.tariffication.1.minDeltaAmount=0
+
-
#пауза между заданиями тарификации
+
-
accounting.worker.1.tariffication.1.delay=1
+
-
#максимальное количество тарифицируемых соединений за задание
+
-
accounting.worker.1.tariffication.1.batchSize=100
+
-
#трекер (обработка сессий без наработки):
+
-
#пауза между заданиями трекинга
+
-
accounting.worker.1.tracking.1.delay=2
+
-
#максимальное количество проверенных соединений за задание
+
-
accounting.worker.1.tracking.1.batchSize=100
+
-
+
-
#количество потоков на worker'а
+
-
accounting.worker.2.thread.count=1
+
-
#сброс в базу трафиков и наработки
+
-
#минимальная наработка, при которой сбрасывать соединения в базу
+
-
accounting.worker.2.flushing.1.minDeltaAccount=0
+
-
#пауза между заданиями сброса в базу
+
-
accounting.worker.2.flushing.1.delay=2
+
-
#максимальное количество сброшенных соединений в базу за задание
+
-
accounting.worker.2.flushing.1.batchSize=500
+
-
 
+
-
#количество потоков на worker'а
+
-
accounting.worker.3.thread.count=1
+
-
#завершатель соединений
+
-
#пауза между заданиями
+
-
accounting.worker.3.finishing.1.delay=2
+
-
#максимальное количество сброшенных соединений в базу за задание
+
-
accounting.worker.3.finishing.1.batchSize=500
+
-
+
-
connection.start.fromAccept=1
+
-
#таймаут перевода соединения в статус suspended при остутствии радиус пакетов
+
-
connection.suspend.timeout=900
+
-
#таймаут закрытия соединения при остутствии радиус пакетов (не складывается с connection.suspend.timeout)
+
-
connection.close.timeout=1300
+
-
#таймаут перевода соединения в статус suspended при остутствии радиус пакетов (для сессий с ограниченным доступом)
+
-
connection.disable.suspend.timeout=900
+
-
#таймаут закрытия соединения при остутствии радиус пакетов (не складывается с connection.suspend.timeout, для сессий с ограниченным доступом)
+
-
connection.disable.close.timeout=1300
+
-
#Radius-STOP
+
-
connection.finish.timeout=5
+
-
 
+
-
session.split.onTariffOption=1
+
-
session.split.onDeviceState=1
+
-
</source>
+
-
 
+
-
<u>Полный конфиг типа устройств ASR ISG</u>:
+
-
<source lang="bash">
+
-
# Версия SNMP (по умолчанию 1)
+
-
snmp.version=2
+
-
# SNMP OID, из которого ивлекается значение uptime (1.3.6.1.2.1.1.3.0)
+
-
snmp.uptimeOid=1.3.6.1.2.1.1.3.0
+
-
 
+
-
# По умолчанию для Inet каждое устройство является netflow-агентом,
+
-
# для оптимизации указываем, что у нас только один netflow-агент
+
-
flow.agent.type=netflow
+
-
flow.agent.link={@deviceId}:-1
+
-
 
+
-
# Поиск устройства по giaddr и remoteId - 1,
+
-
# поиск устройства только по giaddr, агентское устройство ищется отдельно, после preprocessDhcpRequest - 2,
+
-
dhcp.deviceSearchMode=1
+
-
 
+
-
# убираем заголовок-длину
+
-
dhcp.option82.removeHeader=2
+
-
# позиция agentRemoteId
+
-
dhcp.option82.agentRemoteId.position=0
+
-
 
+
-
# Поиск сервиса Inet по
+
-
dhcp.servSearchMode=1
+
-
 
+
-
# выдавать тот же IP адрес, что при открытом доступе
+
-
dhcp.disable.mode=1
+
-
 
+
-
# Отключаем проверку пароля
+
-
radius.password.verification=0
+
-
 
+
-
# Берем адрес из Access-Request
+
-
radius.address.fromRequest=1
+
-
 
+
-
# Код атрибута, из которого извлекать acctSessionId родительской сессии (по умолчанию - из cisco-avpair)
+
-
#radius.parentAcctSessionId.type=1
+
-
# префикс в значении атрибута перед acctSessionId родительской сессии
+
-
#radius.parentAcctSessionId.prefix=parent-session-id=
+
-
# код атрибута, из которого извлекать имя сервиса ISG (по умолчанию cisco-SSG-Service-Info)
+
-
#radius.serviceName.type=251
+
-
# префикс в значении атрибута перед именем сервиса ISG (если есть)
+
-
#radius.serviceName.prefix=
+
-
 
+
-
# Атрибуты, выдаваемые в Access-Accept
+
-
radius.realm.default.attributes=Acct-Interim-Interval=60;Idle-Timeout=1300;cisco-avpair=subscriber:accounting-list=ipoe-isg-aaa
+
-
 
+
-
# Радиус атрибуты, выдаваемые при авторизации для сервисов
+
-
radius.inetOption.2.attributes=cisco-SSG-Account-Info=AISG-5MBPS
+
-
radius.inetOption.3.attributes=cisco-SSG-Account-Info=AISG-10MBPS
+
-
radius.inetOption.4.attributes=cisco-SSG-Account-Info=AISG-LOCAL
+
-
 
+
-
# Категории ip адресов из ресурсов, из которых будут выдаваться адреса ("пул", указывается во вкладке "IP ресурсы")
+
-
radius.realm.default.ipCategories=1
+
-
 
+
-
# Коды ошибок, при которых вместо reject выдавать accept с заданными атрибутами
+
-
#(пользователю выдается серый адрес и устанавливается HTTP-редирект)
+
-
#radius.disable.accessCodes=1,2,3,4,10,11,12,46
+
-
# атрибуты, выдаваемые при rejectToAccept
+
-
radius.disable.attributes=Acct-Interim-Interval=60;cisco-avpair=subscriber:accounting-list=ipoe-isg-aaa;cisco-SSG-Account-Info=AL4REDIRECT;cisco-SSG-Account-Info=AOPENGARDEN
+
-
#radius.realm.reject.attributes=Acct-Interim-Interval=60;IP-Interface-Name=IP-Interface-Name=ISG-IP-UNAUTH;cisco-SSG-Account-Info=ALOCAL_L4R
+
-
#категории ip адресов из ресурсов, из которых будут выдаваться адреса для отключенных ("пул", указывается во вкладке "IP ресурсы")
+
-
radius.disable.ipCategories=2
+
-
+
-
# Параметры активации сервисов
+
-
# длина паузы, если возникла ошибка
+
-
#sa.error.pause=60
+
-
# количество заданий за раз
+
-
#sa.batch.size=20
+
-
# время (сек) ожидания завершения всех заданий (при асинхронной работе)
+
-
#sa.batch.wait=5
+
-
# пауза (сек) после обработки заданий
+
-
#sa.batch.pause=0
+
-
# время (сек) ожидания новой задачи перед вызовом disconnect.
+
-
#sa.batch.waitNext=5
+
-
#режим отправки CoA. 1 - команды 0xc и 0xb в одном пакете для каждого сервиса, 2 - атрибуты subscriber:command= в раздельных пакетах для каждого сервиса
+
-
sa.radius.connection.coa.mode=2
+
-
# при отключении посылать команду account-logoff
+
-
sa.radius.connection.close.mode=3
+
-
# не посылать команды на отключение сервисов
+
-
#sa.radius.connection.close.disableServices=1
+
-
# чтобы, если деньги закончились, не закрывал сервисы, а закрывал сразу сессию ISG целиком - 0, иначе - 1
+
-
sa.radius.connection.withoutBreak=0
+
-
# если dhcp lease time большой, а при положительном балансе доступ нужно дать (даже если адрес сейчас выдан серый), нужно установить 1
+
-
#sa.radius.connection.coa.onEnable=0
+
-
# откуда при отправке CoA брать атрибуты опций (по умолчанию - те же атрибуты, что выдаются при удачной авторизации)
+
-
#sa.radius.option.attributesPrefix=
+
-
sa.radius.connection.attributes=Acct-Session-Id,User-Name,Framed-IP-Address
+
-
radius.connection.attributes=Acct-Session-Id,User-Name,Framed-IP-Address
+
-
# атрибуты CoA запроса для прекращения доступа (используется при sa.radius.connection.withoutBreak=1)
+
-
#sa.radius.disable.attributes=
+
-
# фиксированные атрибуты, добавляемые в запрос перед отправкой CoA
+
-
#sa.radius.coa.attributes=
+
-
# добавлять ли при отправке CoA атрибуты реалма (для default - из radius.realm.default.attributes)
+
-
#sa.radius.realm.addAttributes=0
+
-
# фиксированные атрибуты, добавляемые в запрос перед отправкой PoD
+
-
#sa.radius.pod.attributes=
+
-
sa.radius.connection.close.removeFromKeyMap=0
+
-
 
+
-
# Лог CoA запросов
+
-
sa.radius.log=1
+
-
 
+
-
#radius.disable.attributes=cisco-avpair=subscriber:accounting-list=ISG-AUTH-1;cisco-SSG-Account-Info=ALOCAL_L4R
+
-
 
+
-
#radius.serviceName.disable=L4REDIRECT,OPENGARDEN
+
-
#sa.radius.service.disable=L4REDIRECT,OPENGARDEN
+
-
 
+
-
#Для автоматического привязывания MAC-адреса к сервису в конфигурации модуля/типа сервиса/устройства/типа устройства можно прописать
+
-
#serv.macAddress.auto=1
+
-
 
+
-
# Пауза между выполнениями команды после ошибки
+
-
manage.error.pause=5
+
-
# Пауза между получением uptime
+
-
manage.uptime.pause=360
+
-
# Пауза после ошибки, возникшей при получении uptime
+
-
manage.uptime.error.pause=360
+
-
 
+
-
# Синхронизировать ли сервисы при обнаружении перезагрузки, 0 - не синхронизировать (по умолчанию), 1 - синхронизировать
+
-
# (для обнаружения перезагрузки в типе устройства должен быть установлен обработчик управления устройством)
+
-
#sa.device.sync.onReboot=0
+
-
# Вызывать ли при синхронизации для каждого сервиса, 0 - только serviceCreate или 1 (по умолчанию) 
+
-
# сначала serviceCancel, а затем serviceCreate
+
-
#sa.device.sync.cancelBeforeCreate=1
+
-
</source>
+
-
Здесь нужно обратить внимание на:
+
-
<source lang="bash">
+
-
# Поиск устройства по giaddr и remoteId - 1,
+
-
# поиск устройства только по giaddr, агентское устройство ищется отдельно, после preprocessDhcpRequest - 2,
+
-
dhcp.deviceSearchMode=1
+
-
 
+
-
# Поиск сервиса Inet по
+
-
dhcp.servSearchMode=1
+
-
 
+
-
# выдавать тот же IP адрес, что при открытом доступе
+
-
dhcp.disable.mode=1
+
-
 
+
-
# Берем адрес из Access-Request
+
-
radius.address.fromRequest=1
+
-
 
+
-
# Радиус атрибуты, выдаваемые при авторизации для сервисов
+
-
radius.inetOption.2.attributes=cisco-SSG-Account-Info=AISG-5MBPS
+
-
radius.inetOption.3.attributes=cisco-SSG-Account-Info=AISG-10MBPS
+
-
radius.inetOption.4.attributes=cisco-SSG-Account-Info=AISG-LOCAL
+
-
 
+
-
# чтобы, если деньги закончились, не закрывал сервисы, а закрывал сразу сессию ISG целиком - 0, иначе - 1
+
-
sa.radius.connection.withoutBreak=0
+
-
</source>
+
-
В radius.inetOption.'''2'''.attributes=cisco-SSG-Account-Info=AISG-5MBPS цифра '''2''' - это ID соответствующей ''Опции'' (ISG-5MBPS).<br />
+
-
А это должно быть закомментировано:
+
-
<source lang="bash">
+
-
# Коды ошибок, при которых вместо reject выдавать accept с заданными атрибутами
+
-
#(пользователю выдается серый адрес и устанавливается HTTP-редирект)
+
-
#radius.disable.accessCodes=1,2,3,4,10,11,12,46
+
-
+
-
# не посылать команды на отключение сервисов
+
-
#sa.radius.connection.close.disableServices=1
+
-
 
+
-
#radius.disable.attributes=cisco-avpair=subscriber:accounting-list=ISG-AUTH-1;cisco-SSG-Account-Info=ALOCAL_L4R
+
-
#radius.serviceName.disable=L4REDIRECT,OPENGARDEN
+
-
#sa.radius.service.disable=L4REDIRECT,OPENGARDEN
+
-
</source>
+
-
 
+
-
<u>Полный конфиг типа устройств SW-1</u>:
+
-
<source lang="bash">
+
-
# Код субопции 82, содержащей VLAN, позиция и длина в субопции
+
-
dhcp.option82.vlanId.code=1
+
-
dhcp.option82.vlanId.position=0
+
-
dhcp.option82.vlanId.length=2
+
-
 
+
-
dhcp.option82.interfaceId.code=1
+
-
dhcp.option82.interfaceId.position=2
+
-
dhcp.option82.interfaceId.length=2
+
-
 
+
-
dhcp.option.leaseTime=600
+
-
 
+
-
# параметры DHCP к сети не привязанные
+
-
dhcp.option.serverIdentifier=0.0.0.0
+
-
#dhcp.option.leaseTime=600
+
-
#dhcp.option.timeServer=ntp.bgbilling.ru
+
-
# параметр DHCP "основной шлюз" для сети
+
-
#dhcp.net.option.188.191.0.0:255.255.255.0.gate=
+
-
#dhcp.net.option.188.191.1.0:255.255.255.0.gate=
+
-
#dhcp.net.option.188.191.2.0:255.255.255.0.gate=
+
-
#dhcp.net.option.188.191.3.0:255.255.255.0.gate=
+
-
 
+
-
#dhcp.option.timeOffset=43200
+
-
#dhcp.option.domainName=bgbilling.ru
+
-
</source>
+
-
 
+
-
<u>Полный конфиг устройства Access+Acounting</u>:
+
-
<source lang="bash">
+
-
ip.resource.categoryId=1
+
-
</source>
+
-
 
+
-
<u>Полный конфиг устройства R31_ASR1002</u>:
+
-
<source lang="bash">
+
-
# Хост для отправки PoD и CoA запросов (по умолчанию - хост, заданный в параметрах устройства Хост/порт)
+
-
#radius.host=<хост устройства>
+
-
# порт для отправки PoD и CoA запросов (по умолчанию - порт, заданный в параметрах устройства Хост/порт)
+
-
radius.port=1700
+
-
# идентификатор - Nas-Identifier (по умолчанию - значение из поля Идентификатор параметров устройства)
+
-
#radius.identifier=<идентификатор устройства>
+
-
# используемый secret для общения по radius-протоколу (по умолчанию - значение из поля Community/secret параметров устройства)
+
-
#radius.secret=<community/sercret устройства>
+
-
sa.radius.secret=***
+
-
# Сommunity (по умолчанию из параметра устройства Сommunity/Secret)
+
-
snmp.community=***
+
-
</source>
+
-
 
+
-
<u>Полный конфиг устройства SW-1</u>:
+
-
<source lang="bash">
+
-
ip.resource.categoryId=1
+
-
vlan.resource.category=1
+
-
dhcp.ipCategories=1
+
-
</source>
+
-
 
+
-
<u>Полный конфиг модуля Inet</u>:
+
-
<source lang="bash">
+
-
# Активные и приостановленные статусы договора
+
-
contract.status.active.codes=0
+
-
contract.status.suspend.codes=3,4
+
-
 
+
-
# Проверка цены в тарифе: 0 - проверка отсутсвует, 1 - ошибка только? если у сессии есть трафик определенного типа,
+
-
# но для него нет цены, 2 - ошибка? если хотя бы для одного типа трафика в привязке типа сервиса нет цены (по умолчанию - 1)
+
-
#accounting.tariffication.checkPrice=1
+
-
 
+
-
# Режим активации учетного периода, если не используется скрипт на событие активации,
+
-
# 0 (по умолчанию) - активация со дня подключения (старта сессии), 1 - активация с начала месяца.
+
-
# Следует учитывать, что учетный период является второй величиной при вычислении пропорциональности
+
-
# в тарифной ветке "Диапазон трафика"
+
-
#accounting.period.activation.mode=0
+
-
 
+
-
# Нужно ли отключать сервис с типом инициации "по трафику", если тариф не найден
+
-
#serv.disableOnTariffError=0
+
-
 
+
-
#Пункты Web - меню
+
-
web.menuItem1=Отчет по сессиям Inet
+
-
web.menuItem2=Смена пароля на логины Inet
+
-
web.menuItem3=none
+
-
#web.menuItem3=Отчет по трафикам Inet
+
-
 
+
-
# Параметры автоматической генерации логина для сервиса.
+
-
# Минимальное значение логина при генерации логина
+
-
#serv.login.min=1
+
-
# Максимальное значение логина при генерации логина (т.е. если в базе присутствуют логины 1,2,3 и 10000000,
+
-
# то при генерации создастся логин 4, а не 10000001)
+
-
#serv.login.max=9999999
+
-
 
+
-
# Парамерты автоматической генерации пароля для сервиса. Можно указать в конфигурации модуля, конфигурации устройства, конфигурации типа сервиса
+
-
# (в последнем случае значения будут главнее):
+
-
# Минимальная длина пароля
+
-
serv.password.length.min=5
+
-
# Максимальная длина пароля
+
-
serv.password.length.max=16
+
-
# Разрешенные символы (используются также при генерации пароля)
+
-
serv.password.chars=1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+
-
# Описание разрешенных символов, если пользователь ввел другие
+
-
serv.password.chars.description=В пароле допустимы только цифры и латинские буквы.
+
-
# Длина для автоматически генерируемого пароля
+
-
serv.password.length.auto=6
+
-
# Используемые символы для автоматически генерируемого пароля (по умолчанию значение берется из параметра serv.password.chars)
+
-
#serv.password.chars.auto=
+
-
 
+
-
# Параметры активации карточек модуля card при использовании InetRadiusProcessor,
+
-
# данные параметры можно указать как в конфигурации модуля, так и в конфигурации устройства.
+
-
# Код модуля card
+
-
#card.moduleId=
+
-
# id услуг активации
+
-
#card.activate.serviceIds=
+
-
# Минимальное значение карточного логина используется, чтобы указать, какие числовые логины нужно искать в карточках;
+
-
# если 0, то ограничение не действует.
+
-
#card.login.min=0
+
-
# Максимальное значение карточного логина используется, чтобы указать, какие числовые логины нужно искать в карточках;
+
-
# если 0, то ограничение не действует.
+
-
#card.login.max=0
+
-
</source>
+
-
 
+
-
----
+
-
 
+
-
Вся вышеприведенная конфигурация будет работать только если ISG сервисы будут описаны локально (на BRAS'е). Чтобы загружать сервисы из биллинга (как изначально предполагалось):
+
-
 
+
-
 
+
-
 
+
-
'''продолжение следует...'''
+

Версия 10:57, 28 марта 2013

Данная схема была собрана на лабе, но спроектирована под реальный проект, т.е. - никакой не сферический ISG в вакууме.

Оборудование

  • Уровень доступа (физическое подключение абонентов): catalyst 3550.
  • Уровень аггрегации (объединение нескольких свичей уровня доступа, плюс терминация абонентов по L3): catalyst 3550, с последующей заменой на 3560 при росте сети.
  • Ядро сети: catalyst 6509 (WS-SUP720-3BXL)
  • BRAS (ISG): ASR1002-ESP5

Задача

Подключить абонента по IPoE (без дополнительных инкапсуляций PPPoE или PPTP), выдать адрес по DHCP, авторизовать абонента по номеру порта на соответствующем каталисте уровня доступа, ограничить выход в интернет в соответствие с балансом договора.

Минусы схемы и ее реализации

  • Один IP на абонента (для подключения нескольких устройств абонент должен приобрести CPE - любой ethernet роутер с NAT'ом), потому как cisco реализация ISG создает сессию основываясь на уникальности source IP.
  • Более сложный механизм масштабирования BRAS'ов по сравнению с PPPoE.
  • Нет "локалки" по дому - весь траффик идет через ядро.

Плюсы

  • В простейшем случае (один PC) абоненту вообще не нужно ничего настраивать, достаточно вставить кабель.
  • Транспортная сеть не загромождается MAC-адресами абонентов (при цифрах больше 8-12 тысяч маков приходится переходить на значительно более дорогое железо)
  • Высокая безопасность сети и абонента (изоляция vlan-per-user, "физическая" авторизация абонента через dhcp-snooping, anti-spoofing благодаря ip source guard, динамические /32 маршруты на SVI, создаваемые только после успешной авторизации, изоляция от остальной части сети внутри VRF).
  • Отсутствие дополнительной инкапсуляции в PPP протокол, что разгружает BRAS.

Особенности реализации

  • Получение IP адреса абонентом и получение им доступа в сеть (этакий аналог "онлайна") разделены (хотя и зависимы друг от друга). В результате - в мониторе модуля Inet видим две сессии на договор: по одной понимаем, что абонент получил IP адрес, по другой - что он пользуется сетью (при правильно подобранном Idle-Timeout). Если в мониторе всего одна (dhcp) сессия - значит абонент успешно прошел авторизацию (т.е. сидит в разрешенном порту), но интернет ему в данный момент не нужен (или трафик не доходит до BRAS'а). Это очень удобно для аналитики. ISG session-restart также проходит без проблем, потому как ISG сессия авторизуется по source-IP, который у абонента уже есть (при авторизации ISG сессии непосредственно по option82 пришлось бы заново запрашивать IP, чтобы на BRAS попал dhcp запрос). В результате - на циске можно спокойно сбрасывать сессию, будучи уверенным что при первом же пакете она тут же поднимется. Очень удобно при всяком траблшутинге. IMHO.
  • При отрицательном балансе ISG сессия сбрасывается и создается новая (unauth) сессия с таймером и локальными сервисами, ограничивающими абоненту доступ. Эта сессия каждые N минут переавторизуется на BGBilling'е в надежде, что абонент уже пополнил баланс. И - если баланс выправился - стартует как обычно (с сервисами из биллинга, в соответствие с тарифом). Это не совсем true way для ISG. Правильно - не сбрасывая сессию, снять с нее (через CoA) текущие тарифные ISG сервисы и назначить другие (ограничивающие доступ), а при пополнении баланса - наоборот. BGBilling так может. Почему я сделал по другому? Потому что удобно на циске видеть абонентов с отрицательным балансом (их сессии - unauth) и удобно отслеживать повторные радиус запросы на авторизацию. Это опять же очень удобно для быстрой аналитики и при траблшутинге (почему это у этого абонента ничего не работает? а вот и логи...). Опять же IMHO.
  1. ISG, схема со стартом сессии и ее авторизацией по IP, выдача адресов на основе option82 (Конфигурация сети)
  2. ISG, схема со стартом сессии и ее авторизацией по IP, выдача адресов на основе option82 (Конфигурация BGBilling'а)
Личные инструменты