Cisco ISG c авторизацией по порту коммутатора
Материал из BiTel WiKi
Содержание |
Схема сети
vlan 50 (94.125.95.113) -------------------trunk----[ whole world ] | | | vlan 834 vlan 50 (109.233.170.1) [клиент] --access-- [ edge-core opt.82 ] -------trunk----[ cisco 7201 ISG ] | vlan 834 (94.125.95.117) | | vlan 50 (94.125.95.114) -------------------trunk----[ bgbilling server ]
Адреса реальные, клиенту выдаются адреса из сети 109.233.170.0/24. Далее всё руководство построено под эти адреса, при необходимости корректируйте на свои. Взаимодействие сервера биллина с Cisco происходит через внешнюю сеть. Не совсем правильно, так сделано для упрощения схемы.
Предоставляется 2 сервиса INET и INET_TURBO. В случае ошибки авторизации клиент авторизуется с сервисом INET_FAKE с выдачей фиктивного адреса.
При необходимости блокировки сессии с помощью CoA все сервисы блокируются и активируется INET_FAKE, в DHCP сервере ставится пометка о необходимости переаренды. При следующем DHCP запросе клиент получит NAK ответ, в результате чего сессия переавторизуется и клиент получит фиктивный адрес и сервис INET_FAKE. До этого момента он будет пользоваться реальным адресом но с тем же сервисом.
Сервис INET_FAKE предполагает перенаправление всех HTTP запросов на страницу с ошибкой.
При необходимости разблокировки клиента. Если у него есть сессия с сервисом INET_FAKE - в DHCP сервере ставится пометка он необходимости переаренды. Со следующим DHCP запросом клиент получает NAK ответ, сессия переавторизуется с полноценным сервисом и адресом.
Обсчёт трафика производится по атрибутам, класс ru.bitel.bgbilling.inet.dyn.device.isg.ISGProtocolHandler переносит подменяет в Update пакета сервисов Acct-Session-Id на код родительской сессии. и переносит счётчики байт в атрибут cisco-avpair сопровождая префиксом INET_IN, INET_OUT, INET_TURBO_IN, INET_TURBO_OUT.
Для лучшего понимания логики желательно изучить классы ru.bitel.bgbilling.inet.dyn.device.isg.ISGProtocolHandler и ru.bitel.bgbilling.inet.dyn.device.isg.ISGServiceActivator.
Договор TEST представляет из себя клиента, TEST_Service Param - параметры сервиса.
Настройка экземпляра модуля
Установка и создание экземпляра модуля стандартное код экземлляра - 1. Далее скриншоты с процессом настройки и примечаниями.
Обратите внимание, что почти каждая опция у нас дублирована второй опцией, которая называется "параметры". Сделано так из-за изумительно "удобного" режима работы ISG, когда после указания параметров сессии поступает ещё один авторизационный запрос с запросом параметров переданных опций, где уже указываются скорость и т.п. Далее будет объяснено более подробно. Коды опций, услуг, экземпляра модуля далее используются по всему руководству. Внимательно сверяйте их со своими, либо при первой настройке переименуйте опции согласно данному руководству для получения нужных кодов.
Привязки типов трафика. Трафик извлекается из атрибута cisco-avpair с текстовым префиксом, зависящим от сервиса. В этот атрибут трафик помещает динамический код предобработки запроса.
Сеть 109.233.170 с 1 по 100 адреса выдаётся для реальных соединений, с 101 по 254 -для соединений Reject-To-Accept. В конфигурациях (см. далее) используются коды категорий ресурсов, не коды самих ресурсов.
В типе устройства ISG определены динамические классы управления и предобработки запросов. Они поставляются с модулем. Если данных классов в списке нет, посмотрите Сервис => Автоматизация => Управление динамическим кодом, возможно код необходимо принудительно скомпилировать. Тип устройства ProcessGroup нужен исключительно для группировки, никакого другого смысла он не несёт. Коды типов устройств также далее активно используются в конфигурации, будьте внимательны или подгоните вашу настройку под эти коды.
В конфигурации устройства ProcessGroup указаны строки.
nas.deviceTypeIds=1 dhcp.relay.deviceTypeIds=1
Первая строка необходима для процессора ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor, чтобы определить, какие типы устройств являются NASами. Вторая - для ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpHelperProcessor, для определения, какие типы устройств являются DHCP релеем. В нашем случае это один тип устройства - ISG. Причём идентификация устройства как NASа будет производится по его идентификатору 7201-ipoe.nettrans.ru, а как DHCP релея - по IP адресу 109.233.170.1. В данном случае использовать для идентификации RADIUS процессором IP адрес просто не выйдет, т.к. это поле нужно для DHCP процессора.
Конфигурация устройства ISG в текстовом виде:
# радиус атрибуты, выдаваемые при авторизации для сервисов INET и INET_TURBO nas.radius.inetOption.1.attributes=cisco-SSG-Account-Info=AINET nas.radius.inetOption.4.attributes=cisco-SSG-Account-Info=AINET_TURBO # # радиус атрибуты, выдываемые при авторизции самих сервисов, запросе их свойств nas.radius.inetOption.2.attributes=cisco-avpair=ip:traffic-class=in access-group 196 priority 200;cisco-avpair=ip:traffic-class=in default drop;cisco-avpair=ip:traffic-class=out access-group 196 priority 200;cisco-avpair=ip:traffic-class=out default drop;cisco-avpair=subscriber:accounting-list=ISG-AUTH-1;Acct-Interim-Interval=60;cisco-SSG-Service-Info=QU;;500000;;750000;;D;;500000;;750000 nas.radius.inetOption.3.attributes=cisco-avpair=ip:traffic-class=in access-group 196 priority 201;cisco-avpair=ip:traffic-class=in default drop;cisco-avpair=ip:traffic-class=out access-group 196 priority 200;cisco-avpair=ip:traffic-class=out default drop;cisco-avpair=subscriber:accounting-list=ISG-AUTH-1;Acct-Interim-Interval=60;cisco-SSG-Service-Info=QU;;600000;;760000;;D;;600000;;760000 nas.radius.inetOption.6.attributes=cisco-avpair=ip:traffic-class=in access-group 196 priority 201;cisco-avpair=ip:traffic-class=in default drop;cisco-avpair=ip:traffic-class=out access-group 196 priority 200;cisco-avpair=ip:traffic-class=out default drop;cisco-avpair=subscriber:accounting-list=ISG-AUTH-1;Acct-Interim-Interval=60;cisco-SSG-Service-Info=QU;;600000;;760000;;D;;600000;;760000 # # код категории ресурсов с "нормальными" адресами nas.radius.realm.default.pool=1 # # коды ошибок, которые обрабатываются системой Reject-To-Accept realm.reject.error=1,2,3,4,10,11,12 # код категории ресурсов Fake пула nas.radius.realm.reject.pool=2 # радиус атрибуты, отправляемые в режиме Reject-To-Accept nas.radius.realm.reject.attributes=cisco-SSG-Account-Info=AINET_FAKE # #CoA порт nas.radius.port=1700 nas.radius.host=94.125.95.117 nas.secret=123 # # параметры DHCP к сети не привязанные dhcp.option.serverIdentifier=0.0.0.0 dhcp.option.dns=109.233.170.1 dhcp.option.leaseTime=600 # # параметр DHCP "основной шлюз" для сети dhcp.net.option.109.233.170.0:255.255.255.0.gate=109.233.170.1
Первый тип сервиса - непосредственно ISG сервис, добавляемый в договор клиента. Для простоты здесь в логин вручную вбиваются опции circuit_id:remote_id, приходящие в опциях 82 отрелеенного запроса. Далее, при запуске системы в реальную эксплуатацию, имеет смысл убрать требование ввода логина и заменить на его генерацию исходя из выбранного коммутатора и порта. Скрипт или динамический код можно повесить на событие "Измененяется сервис договора". Примерный вид динамического класса для генерации логина:
package ru.clink.bgbilling.module.inet.serv; import ru.bitel.bgbilling.kernel.script.server.dev.*; import ru.bitel.bgbilling.modules.inet.api.common.bean.*; import ru.bitel.bgbilling.modules.inet.api.server.event.*; import ru.bitel.bgbilling.server.util.*; import ru.bitel.common.sql.*; public class ClipsLoginGenerator extends EventScriptBase<InetServChangingEvent> implements EventScript<InetServChangingEvent> { @Override public void onEvent( InetServChangingEvent e, Setup setup, ConnectionSet connectionSet ) throws Exception { InetServ inetServ = e.getInetServ(); int deviceId = inetServ.getDeviceId(); InetDevice device = new InetDeviceDao( connectionSet.getConnection(), e.getModuleId() ).get( deviceId ); int port = inetServ.getInterfaceId(); String port_str = ""; if (port > 15) { port_str = String.format( "%x", new Object[]{ port } ); } else { port_str = String.format( "0%1$x", new Object[]{ port } ); } String userName = device.getIdentifier().toLowerCase() + ":" + port_str; inetServ.setLogin( userName ); inetServ.setPassword( "123" ); print( "Setting userName:" + userName ); } }
Сервисы типа ISG описание сервиса добавляются на один договор и используются для передачи ISG параметров конкретного ISG сервиса.
Настройка тарифа и договора
В тарифном плане определяется услуга и стоимость для каждого из типов трафиков, потребляемых сервисом. Второй тариф сделан по принципу "чтобы был", т.к. при отсутствии тарифа в договоре сервиса не пройдёт RADIUS авторизация. Первый тариф указывается для договора TEST, второй - TEST_Service Param. Не забывайте нажимать "Оповестить об изменениях" по завершению правки тарифа.
К каждому из сервисов в фиктивном договоре привязано по одной опции. Для опции в конфигурации устройства ISG определены атрибуты. Пароль для сервисов в договоре клиента - 123, это указано в конфигурации Cisco. Для сервисов в фиктивном договоре - cisco, это ничем не определяется. Просто данность. По крайней мере, я не нашёл.
Настройка Коммутатора
Использовался EDGE-CORE ES3528(52)M. Firmware версия 1.4.10.1 (примечательно, что последняя на данный момент версия firmware 1.4.16.4 не пропускает в сторону сервера dhcp - запросы)
vlan database vlan 834 name IPOE media ethernet state active ! ip dhcp snooping ip dhcp snooping vlan 834 ip dhcp snooping information option ! клиентский порт ! interface ethernet 1/1 description IPOE ip source-guard sip-mac switchport allowed vlan add 834 untagged switchport native vlan 834 switchport allowed vlan remove 1 ! порт в сторону IPOE ! interface ethernet 1/26 description Link to 7201-ipoe ip dhcp snooping trust switchport allowed vlan add 1 untagged switchport allowed vlan add 1,50,834 tagged switchport mode trunk !
Конфигурация Cisco
! aaa new-model aaa session-mib disconnect ! ! aaa group server radius ISG-RADIUS server 94.125.95.114 auth-port 1812 acct-port 1813 ! aaa authentication login ISG-AUTH-1 group ISG-RADIUS aaa authorization network ISG-AUTH-1 group ISG-RADIUS aaa authorization subscriber-service default local group ISG-RADIUS aaa accounting delay-start aaa accounting update periodic 5 aaa accounting network ISG-AUTH-1 start-stop group ISG-RADIUS ! aaa nas port extended ! aaa server radius dynamic-author client 94.125.95.114 client 109.233.170.2 server-key 123 auth-type any ! aaa session-id common ! ip subnet-zero ip source-route ! ! ip dhcp relay information policy keep ip dhcp relay information trust-all ! ! ip cef ! ! subscriber authorization enable multilink bundle-name authenticated ! ! ! ip ssh version 2 policy-map type control ISG-INTERFACE-POLICY class type control always event session-start 10 authorize aaa list ISG-AUTH-1 password 123 identifier remote-id plus circuit-id plus mac-address 30 service-policy type service name LOCAL_L4R ! class type control always event session-restart 10 authorize aaa list ISG-AUTH-1 password 123 identifier remote-id plus circuit-id plus mac-address 30 service-policy type service name LOCAL_L4R ! ! interface GigabitEthernet0/1 no ip address media-type rj45 speed auto duplex auto negotiation auto ! interface GigabitEthernet0/1.50 description MGMT test ISG encapsulation dot1Q 50 ip address 94.125.95.117 255.255.255.240 ! interface GigabitEthernet0/1.834 description IPOE encapsulation dot1Q 834 ip address 109.233.170.1 255.255.255.0 ip helper-address 94.125.95.114 service-policy type control ISG-INTERFACE-POLICY ip subscriber l2-connected initiator dhcp class-aware ! ip classless ip route 0.0.0.0 0.0.0.0 94.125.95.113 ! ! radius-server attribute 44 include-in-access-req radius-server attribute 8 include-in-access-req radius-server attribute 32 include-in-access-req radius-server attribute 32 include-in-accounting-req radius-server attribute 55 include-in-acct-req radius-server attribute 55 access-request include radius-server attribute nas-port format e UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU radius-server attribute 61 extended radius-server host 94.125.95.114 auth-port 1812 acct-port 1813 key 123 radius-server unique-ident 112 radius-server vsa send cisco-nas-port radius-server vsa send accounting radius-server vsa send authentication ! access-list 196 remark catch all traffic access-list 196 permit ip any any !
Настройка BGInetAccess, BGInetAccounting серверов
Конфигурация BGInetAccess, файл inet-access.xml.
<?xml version="1.0" encoding="UTF-8"?> <application context="access"> <param name="app.name" value="BGInetAccess"/> <param name="app.id" value="1"/> <param name="moduleId" value="1"/> <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"/> <param name="db.user" value="bill"/> <param name="db.pswd" value="bgbilling"/> <param name="mq.url" value="failover:(tcp://localhost:61616)"/> <param name="mq.user" value="bill"/> <param name="mq.pswd" value="bgbilling"/> <!-- код корневого устройства --> <param name="rootDeviceId" value="4"/> <!-- типы фейковых устройств, являющихся аккаунтинг серверами --> <param name="accounting.deviceTypeIds" value="4"/> <param name="commonIdentifierName" value="rootDeviceId" /> <bean name="access" class="ru.bitel.bgbilling.modules.inet.access.Access" /> <param name="datalog.radius.dir" value="data/radius"/> <context name="radius"> <bean name="radiusProcessor" class="ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor"/> <scheduledExecutorService name="hrlydtlggr" corePoolSize="1" /> <bean name="radiusDataLogger" class="ru.bitel.bgbilling.modules.inet.radius.RadiusHourlyDataLogger"> <param name="scheduledExecutor">hrlydtlggr</param> </bean> <bean name="radiusListener" class="ru.bitel.bgbilling.modules.inet.radius.InetRadiusListener"> <constructor> <param name="host" value=""/> <param name="port" value="1812"/> <param name="byteBufferCapacity">512 * 1024</param> <param name="processor">radiusProcessor</param> <param name="mode">RadiusListener.Mode.authentication</param> <param name="dataLogger">radiusDataLogger</param> <param name="threadCount">10</param> <param name="maxQueueSize">200</param> </constructor> </bean> </context> <context name="dhcp"> <bean name="dhcpProcessor" class="ru.bitel.bgbilling.modules.inet.dhcp.InetDhcpHelperProcessor"/> <bean name="dhcpListener" class="ru.bitel.bgbilling.kernel.network.dhcp.DhcpListener"> <constructor> <param name="host" value=""/> <param name="port" value="67"/> <param name="byteBufferCapacity">512 * 1024</param> <param name="processor">dhcpProcessor</param> <param name="dataLogger"></param> <param name="threadCount">10</param> <param name="maxQueueSize">200</param> </constructor> </bean> </context> </application>
Конфигурация BGInetAccounting, файл inet-accounting.xml.
<?xml version="1.0" encoding="UTF-8"?> <application context="accounting"> <param name="app.name" value="BGInetAccounting"/> <param name="app.id" value="2"/> <param name="moduleId" value="1"/> <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"/> <param name="db.user" value="bill"/> <param name="db.pswd" value="bgbilling"/> <param name="mq.url" value="failover:(tcp://localhost:61616)"/> <param name="mq.user" value="bill"/> <param name="mq.pswd" value="bgbilling"/> <!-- код корневого устройства --> <param name="rootDeviceId" value="4"/> <param name="commonIdentifierName" value="rootDeviceId"/> <bean name="accounting" class="ru.bitel.bgbilling.modules.inet.accounting.Accounting"/> <param name="datalog.radius.dir" value="data/radius" /> <param name="datalog.flow.dir" value="data/flow" /> <context name="radius"> <bean name="processor" class="ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor"/> <scheduledExecutorService name="hrlydtlggr" corePoolSize="1"/> <bean name="radiusDataLogger" class="ru.bitel.bgbilling.modules.inet.radius.RadiusHourlyDataLogger"> <param name="scheduledExecutor">hrlydtlggr</param> </bean> <bean name="radiusListener" class="ru.bitel.bgbilling.modules.inet.radius.InetRadiusListener"> <constructor> <param name="host" value=""/> <param name="port" value="1813"/> <param name="byteBufferCapacity">512 * 1024</param> <param name="processor">processor</param> <param name="mode">RadiusListener.Mode.accounting</param> <param name="setup">setup</param> <param name="dataLogger">radiusDataLogger</param> </constructor> </bean> </context> <!-- <context name="collector"> <scheduledExecutorService name="hrlydtlggr" corePoolSize="1"/> <bean name="flowDataLogger" class="ru.bitel.bgbilling.modules.inet.collector.IPHourlyDataLogger"> <param name="scheduledExecutor">hrlydtlggr</param> </bean> <bean name="flowListener" class="ru.bitel.bgbilling.modules.inet.collector.InetFlowListener"> <constructor factoryMethod="newInstance"> <param name="type" value="netflow"/> <param name="host" value=""/> <param name="port" value="2001"/> <param name="threadCount" value="10"/> <param name="recvBufferSize">8 * 1024 * 1024</param> <param name="soRCVBUF">512 * 1024</param> <param name="sources" value=""/> </constructor> </bean> <bean name="flowListener" class="ru.bitel.bgbilling.modules.inet.collector.InetFlowListener"> <constructor factoryMethod="newInstance"> <param name="type" value="netflow9"/> <param name="host" value=""/> <param name="port" value="9367"/> <param name="threadCount" value="8"/> <param name="recvBufferSize">8 * 1024 * 1024</param> <param name="soRCVBUF">512 * 1024</param> <param name="sources" value="4"/> </constructor> </bean> <bean name="flowListener" class="ru.bitel.bgbilling.modules.inet.collector.InetFlowListener"> <constructor factoryMethod="newInstance"> <param name="type" value="netflow"/> <param name="host" value=""/> <param name="port" value="9368"/> <param name="threadCount" value="8"/> <param name="recvBufferSize">8 * 1024 * 1024</param> <param name="soRCVBUF">512 * 1024</param> <param name="sources" value="20"/> </constructor> </bean> </context> --> </application>
После конфигурирования устройства необходимо обновить с BGBillingServer а командой update.sh. В конфигурации указываются слушатели и процессоры протоколов и их параметры: порты, количество потоков обработки, буферы. Указывается код экземпляра модуля и код корневого устройства, от которого сервер начинает загрузку базы устройств и сервисов клиентов. Такая разбивка позволяет разнести обслуживание по нескольким Access и Accounting серверам. С группой серверов каждого Access сервера может быть связано один или более групп Accounting серверов, каждый из которых идентифицируется своим узлом. В данном простейшем случае у нас одна группа Access и Accounting серверов и она завязано на устройство с кодом 4 и типом с кодом также 4.
Отладка и разбор алгоритма работы
Список полезных команд для Cisco:
- show subscr sess all - просмотр всех ISG сессий
- clear subscr sess all - сброс всех ISG сессий
- <забыл команду, дописать> - просмотр детальной информации по ISG сессии с выводом сервисов
Что можно включить для дебага на Cisco:
debug aaa authentication debug aaa accounting debug aaa coa debug aaa attr debug aaa subscriber profile debug sss error debug sss event debug sss fsm debug sss aaa authorization event debug sss aaa authorization fsm debug sss feature event debug sss feature detail debug sss policy all debug subscriber service debug subscriber policy condition error debug subscriber policy condition detail debug subscriber policy condition event debug dhcp debug ip dhcp server packet debug ip udp