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 с 2 по 100 адреса выдаётся для реальных соединений, с 101 по 254 -для соединений Reject-To-Accept. В конфигурациях (см. далее) используются коды категорий ресурсов, не коды самих ресурсов.
В типе устройства ISG определены динамические классы управления и предобработки запросов. Они поставляются с модулем. Если данных классов в списке нет, посмотрите Сервис => Автоматизация => Управление динамическим кодом, возможно код необходимо принудительно скомпилировать. Тип устройства ProcessGroup нужен исключительно для группировки, никакого другого смысла он не несёт. Коды типов устройств также далее активно используются в конфигурации, будьте внимательны или подгоните вашу настройку под эти коды.
В конфигурации устройства ProcessGroup указаны строки.
nas.deviceTypeIds=1 dhcp.relay.deviceTypeIds=1 # session.suspend.timeout=1800 session.close.timeout=900 # accounting.tariffication.thread.count=1 accounting.tariffication.1=0:10:5 # accounting.flushing.thread.count=1 accounting.flushing.1=0:10:5
Первая строка необходима для процессора 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 сессий
- show subscriber session detailed - просмотр детальной информации по ISG сессии с выводом сервисов
- show subscriber session uid 1 detailed - по Based on Unique ID
- show subscriber session username WORD detailed - по Based on username
Что можно включить для дебага на 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 ip dhcp server packet debug ip udp
После запуска BGInetAccess убедитесь: 1. Что устройства и привязанные к ним сервисы загрузились:
[root@bgb BGInetAccess]# ./access.sh servmap Java Runtime: Sun Microsystems Inc. Java HotSpot(TM) Server VM [1.6.0_26] /usr/java/jdk1.6.0_26/jre Runtime name: 19324@bgb.nettrans.ru Java endorsed dirs: /usr/java/jdk1.6.0_26/jre/lib/endorsed OS: Linux 2.6.32.26-175.fc12.i686.PAE [i386], file.encoding: UTF-8, user.name: root Heap sizes: current=30912k free=30098k max=233024k ContractId: 5; servId: 3 Логин: INET Options [2:17.03.2011-…; ] TariffModuleTreeSet [3:28.02.2011-…; ] Device state: 1; optionSet: Balance: 0; Limit: 0 ContractId: 5; servId: 4 Логин: INET_TURBO Options [3:17.03.2011-…; ] TariffModuleTreeSet [3:28.02.2011-…; ] Device state: 0; optionSet: Balance: 0; Limit: 0 ContractId: 5; servId: 6 Логин: INET_FAKE Options [6:22.04.2011-…; ] TariffModuleTreeSet [3:28.02.2011-…; ] Device state: 1; optionSet:6 Balance: 0; Limit: 0 ContractId: 1; servId: 1 LOGIN: 00060012cf539f5e:000403420101 Options [1:24.03.2011-…; ] TariffModuleTreeSet [1:14.02.2011-…; ] Device state: 1; optionSet:1 Balance: 77; Limit: 0
2. В radius-processor.log должен быть загружен NAS.
radius-processor.log 2348/2348 UTF-8 100% 08-24/09:39:33 INFO [main] DefaultServerSetup - Binding javax.jms.ConnectionFactory[org.apache.activemq.ActiveMQConnectionFactory@198cb3d] to java:comp/env/mq/connectionFactory 08-24/09:39:33 INFO [main] DefaultServerSetup - Init DB connection pools 08-24/09:39:33 INFO [main] DefaultServerSetup - Binding JDBC pool "master" to java:comp/env/jdbc/master 08-24/09:39:34 INFO [main] DefaultServerSetup - Init trash pools.. 08-24/09:39:35 INFO [main] InetRadiusProcessor - Reloading nas list 08-24/09:39:35 INFO [main] InetNasList - Loading NAS list... 08-24/09:39:36 INFO [main] NasList - LOADED NAS: Nas id: 7201-ipoe.nettrans.ru; ip: 109.233.170.1 CONFIG: dhcp.option.dns=109.233.170.1 dhcp.option.leaseTime=600 dhcp.option.serverIdentifier=0.0.0.0 dhcp.relay.deviceTypeIds=1 nas.deviceTypeIds=1 nas.radius.host=94.125.95.117 nas.radius.inetOption.1.attributes=cisco-SSG-Account-Info=AINET 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 dr 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 dr nas.radius.inetOption.4.attributes=cisco-SSG-Account-Info=AINET_TURBO 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 dr nas.radius.port=1700 nas.radius.realm.default.pool=1 nas.radius.realm.reject.attributes=cisco-SSG-Account-Info=AINET_FAKE nas.radius.realm.reject.pool=2 nas.secret=123 realm.reject.error=1,2,3,4,10,11,12
3. В dhcp.log должна отобразиться загрузка релея.
08-24/09:39:33 INFO [main] DefaultServerSetup - Binding javax.jms.ConnectionFactory[org.apache.activemq.ActiveMQConnectionFactory@198cb3d] to java:comp/env/mq/connectionFactory 08-24/09:39:33 INFO [main] DefaultServerSetup - Init DB connection pools 08-24/09:39:33 INFO [main] DefaultServerSetup - Binding JDBC pool "master" to java:comp/env/jdbc/master 08-24/09:39:34 INFO [main] DefaultServerSetup - Init trash pools.. 08-24/09:39:36 INFO [main] InetDhcpDeviceMap - Load DHCP relay list, types: [1]. 08-24/09:39:36 INFO [main] InetDhcpDeviceMap - Loaded device: 1; /109.233.170.1 08-24/09:39:36 INFO [main] InetDhcpHelperProcessor - Restore connections on DhcpHelper
Порядок инициации соединения следующий: 1. Клиентская машина отправляет широковещательный запрос DHCP Discover. Для иницииации запроса можно использовать команду:
dhclient eth1 (или ваш интерфейс)
Тут есть риск "потерять" по SSH машину, когда она получит по DHCP новый шлюз по умолчанию. Решить проблему можно либо не передавая в период тестирования этот шлюз (уберите опцию dhcp.net.option.109.233.170.0:255.255.255.0.gate в конфигурации устройства ISG), либо придумать что-то с маршрутизацией.
2. Коммутатор пропускает запрос, добавляя в него опции 82 с remoteId и circuitId, содержащими информацию о MAC адресе коммутатора и порте абонента. И отправляет широковещательно же на Cisco.
3. Cisco получает запрос, инициирует авторизацию по RADIUS протоколу. В это время в radius.log BGInetAccess должно появиться.
08-23/17:38:29 INFO [radiusListener-p-9-t-3] RadiusListenerWorker - REQUEST: Packet type: Access-Request Identifier: 95 Authenticator: {A7 01 05 BB 98 BD AC 26 C3 91 C2 B1 FD 97 50 05} Attributes: User-Name=00060012cf539f5e:000403420101:0080.4840.a46f NAS-Identifier=7201-ipoe.nettrans.ru NAS-Port-Id=0/0/1/834 User-Password=123 Event-Timestamp=1314102653 NAS-IP-Address=94.125.95.117 NAS-Port=357 Service-Type=5 Acct-Session-Id=7200000000000165 NAS-Port-Type=33 cisco-avpair=circuit-id-tag=000403420101 cisco-avpair=remote-id-tag=00060012cf539f5e cisco-NAS-Port=0/0/1/834 08-23/17:38:29 INFO [radiusListener-p-9-t-3] InetRadiusProcessor - REQUEST_AFTER_PREPROCESS: Packet type: Access-Request Identifier: 95 Authenticator: {A7 01 05 BB 98 BD AC 26 C3 91 C2 B1 FD 97 50 05} Attributes: User-Name=00060012cf539f5e:000403420101 NAS-Identifier=7201-ipoe.nettrans.ru NAS-Port-Id=0/0/1/834 User-Password=123 Event-Timestamp=1314102653 NAS-IP-Address=94.125.95.117 NAS-Port=357 Service-Type=5 Calling-Station-Id=0080.4840.a46f Acct-Session-Id=7200000000000165 NAS-Port-Type=33 cisco-avpair=circuit-id-tag=000403420101 cisco-avpair=remote-id-tag=00060012cf539f5e cisco-NAS-Port=0/0/1/834 08-23/17:38:29 INFO [radiusListener-p-9-t-3] InetRadiusProcessor - [username=00060012cf539f5e:000403420101] Authenticated as inetServId:1 08-23/17:38:29 INFO [radiusListener-p-9-t-3] InetRadiusProcessor - Return code=0 08-23/17:38:29 INFO [radiusListener-p-9-t-3] InetDhcpHelperProcessor - Put auth accept 1:00060012CF539F5E:000403420101:00804840A46F 08-23/17:38:29 INFO [radiusListener-p-9-t-3] InetRadiusProcessor - RESPONSE_BEFORE_POSTPROCESS: Packet type: Access-Accept Identifier: 95 Authenticator: {} Attributes: Framed-IP-Address=109.233.170.2 cisco-SSG-Account-Info=AINET Process time auth: 4 08-23/17:38:29 INFO [radiusListener-p-9-t-3] InetRadiusListenerWorker - RESPONSE: Packet type: Access-Accept Identifier: 95 Authenticator: {93 20 E7 D2 47 8A 45 DE 0F 2B 5E 25 2C 9E CA F1} Attributes: Framed-IP-Address=109.233.170.2 cisco-SSG-Account-Info=AINET Process time auth: 4
Это прошла первая авторизация: клиенту выдан адрес и выделен сервис. Реально адрес не нужен циске, он подставляется процессором по-умолчанию. Скрипт процессора протокола ru.bitel.bgbilling.inet.dyn.device.isg.ISGProtocolHandler вычленяет из User-Name последнюю часть и перемещает её в атрибут Calling-Station-Id.
Обратите внимание, что InetDhcpHelperProcessor Access сервера ловит событие успешной авторизации, размещаяя в своём кэше запись: <код устройства>:<User-Name до :>:<User-Name после :>:<Calling-Station-Id>. В данном случае в InetDhcpHelperProcessor жёстко зашита логика, что в User-Name должны идти разделённые двоеточием remoteId и circuitId, а в Calling-Station-Id - MAC адрес.
После получения акцепта первой авторизации Cisco посредством второй авторизации получает параметры сервисов.
08-23/17:38:29 INFO [radiusListener-p-9-t-4] RadiusListenerWorker - REQUEST: Packet type: Access-Request Identifier: 96 Authenticator: {36 17 4F 42 3B 6D B5 CE CE E4 8C 5A 15 CE AA 8B} Attributes: User-Name=INET NAS-Identifier=7201-ipoe.nettrans.ru NAS-Port-Id=0/0/1/834 User-Password=cisco Event-Timestamp=1314102653 NAS-IP-Address=94.125.95.117 NAS-Port=357 Service-Type=5 Acct-Session-Id=7200000000000165 NAS-Port-Type=33 cisco-avpair=circuit-id-tag=000403420101 cisco-avpair=remote-id-tag=00060012cf539f5e cisco-NAS-Port=0/0/1/834 08-23/17:38:29 INFO [radiusListener-p-9-t-4] InetRadiusProcessor - REQUEST_AFTER_PREPROCESS: Packet type: Access-Request Identifier: 96 Authenticator: {36 17 4F 42 3B 6D B5 CE CE E4 8C 5A 15 CE AA 8B} Attributes: User-Name=INET NAS-Identifier=7201-ipoe.nettrans.ru NAS-Port-Id=0/0/1/834 User-Password=cisco Event-Timestamp=1314102653 NAS-IP-Address=94.125.95.117 NAS-Port=357 Service-Type=5 Acct-Session-Id=7200000000000165 NAS-Port-Type=33 cisco-avpair=circuit-id-tag=000403420101 cisco-avpair=remote-id-tag=00060012cf539f5e cisco-NAS-Port=0/0/1/834 08-23/17:38:29 INFO [radiusListener-p-9-t-4] InetRadiusProcessor - [username=INET] Authenticated as inetServId:3 08-23/17:38:29 INFO [radiusListener-p-9-t-4] InetRadiusProcessor - Return code=0 08-23/17:38:29 INFO [radiusListener-p-9-t-4] InetDhcpHelperProcessor - Skip userName: INET 08-23/17:38:29 INFO [radiusListener-p-9-t-4] InetRadiusProcessor - RESPONSE_BEFORE_POSTPROCESS: Packet type: Access-Accept Identifier: 96 Authenticator: {} Attributes: Acct-Interim-Interval=60 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 cisco-SSG-Service-Info=QU;500000;750000;D;500000;750000 Process time auth: 7 08-23/17:38:29 INFO [radiusListener-p-9-t-4] InetRadiusListenerWorker - RESPONSE: Packet type: Access-Accept Identifier: 96 Authenticator: {78 09 2E B6 16 56 0F 6F 49 78 DF CA DB DD 56 3F} Attributes: Acct-Interim-Interval=60 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 cisco-SSG-Service-Info=QU;500000;750000;D;500000;750000 Process time auth: 7
Данная двухзвенная система авторизации изрядно путает схему и никакой логикой не объясняется.
4. Получив RADIUS Accept Cisco отправляет отрелеенные DHCP запросы. Примерно такое должно появиться в dhcp.log BGInetAccess сервера.
08-23/17:38:29 INFO [dhcpLstnr-p-10-t-3] InetAbstractDhcpProcessor - REQUEST: Message type: BOOT_REQUEST Dhcp message type: DHCP Discover{1} htype: 1, hlen: 6, hops: 1 xid: 415586937, secs: 6, flags: 0 Client IP: 0.0.0.0 Your IP: 0.0.0.0 Server IP: 0.0.0.0 Relay IP: 109.233.170.1 Client MAC: {00804840A46F} Host name{12}={support-desktop} Parameter request list{55}={1, 28, 2, 3, 15, 6, 119, 12, 44, 47, 26, 121, 42} Agent information{82}= sub{1}={000403420101} sub{2}={00060012CF539F5E} 08-23/17:38:29 INFO [dhcpLstnr-p-10-t-3] InetAbstractDhcpProcessor - REQUEST_AFTER_PREPROCESS: ... 08-23/17:38:29 INFO [dhcpLstnr-p-10-t-3] InetAbstractDhcpProcessor - RESPONSE_BEFORE_POSTPROCESS: ... 08-23/17:38:29 INFO [dhcpLstnr-p-10-t-3] InetAbstractDhcpProcessor - RESPONSE: Message type: BOOT_RESPONSE Dhcp message type: DHCP Offer{2} htype: 1, hlen: 6, hops: 1 xid: 415586937, secs: 0, flags: 0 Client IP: 0.0.0.0 Your IP: 109.233.170.2 Server IP: 0.0.0.0 Relay IP: 109.233.170.1 Client MAC: {00804840A46F} Server Identifier{54}={00000000} IP Address Lease Time{51}=600 DNS{6}={6DE9AA01} Parameter request list{55}={1, 28, 2, 3, 15, 6, 119, 12, 44, 47, 26, 121, 42} Agent information{82}= sub{1}={000403420101} sub{2}={00060012CF539F5E} 08-23/17:38:29 INFO [dhcpLstnr-p-10-t-4] InetAbstractDhcpProcessor - REQUEST: Message type: BOOT_REQUEST Dhcp message type: DHCP Request{3} htype: 1, hlen: 6, hops: 1 xid: 415586937, secs: 6, flags: 0 Client IP: 0.0.0.0 Your IP: 0.0.0.0 Server IP: 0.0.0.0 Relay IP: 109.233.170.1 Client MAC: {00804840A46F} Server Identifier{54}={6DE9AA01} Requested IP Address{50}=109.233.170.2 Host name{12}={support-desktop} Parameter request list{55}={1, 28, 2, 3, 15, 6, 119, 12, 44, 47, 26, 121, 42} Agent information{82}= sub{1}={000403420101} sub{2}={00060012CF539F5E} 08-23/17:38:29 INFO [dhcpLstnr-p-10-t-4] InetAbstractDhcpProcessor - REQUEST_AFTER_PREPROCESS: ... 08-23/17:38:29 INFO [dhcpLstnr-p-10-t-4] InetAbstractDhcpProcessor - RESPONSE_BEFORE_POSTPROCESS: ... 08-23/17:38:29 INFO [dhcpLstnr-p-10-t-4] InetAbstractDhcpProcessor - RESPONSE: Message type: BOOT_RESPONSE Dhcp message type: DHCP ACK{5} htype: 1, hlen: 6, hops: 1 xid: 415586937, secs: 0, flags: 0 Client IP: 0.0.0.0 Your IP: 109.233.170.2 Server IP: 0.0.0.0 Relay IP: 109.233.170.1 Client MAC: {00804840A46F} Server Identifier{54}={00000000} IP Address Lease Time{51}=600 DNS{6}={6DE9AA01} Parameter request list{55}={1, 28, 2, 3, 15, 6, 119, 12, 44, 47, 26, 121, 42} Agent information{82}= sub{1}={000403420101} sub{2}={00060012CF539F5E}
Здесь происходит классический DHCP обмен: Discover - Offer - Request - Ack. Есть опять некоторый нюанс в реализации DHCP релея на Cisco. Пакет пересылается с обратным адресом 109.233.170.1, хотя выходит он с Cisco с интерфейса 94.125.95.117. Т.е. чтобы ответ дошёл до циски, необходимо наличие на сервере биллинга маршрута к адресу 109.233.170.1. Всё это весьма нелогично, хотя честно указано в документации Cisco.
Процессор DhcpHelper находит по этому адресу устройство - релей ISG, добавляет remoteId и circuitId и ищет в кэше выданный адрес. В случае если записи нет - запросы Discover игнорируются, а на Request выдаются NaK ответы.
5. На BGInetAccounting должен прийти старт-пакет с информацией по сессии.
08-23/17:38:29 INFO [radiusListener-p-5-t-4] RadiusListenerWorker - REQUEST: Packet type: Accounting-Request Identifier: 79 Authenticator: {1F B7 4F C3 07 15 C1 73 54 C0 DE EC 31 C2 36 04} Attributes: User-Name=00060012cf539f5e:000403420101:0080.4840.a46f NAS-Identifier=7201-ipoe.nettrans.ru NAS-IP-Address=94.125.95.117 NAS-Port=357 Service-Type=2 Framed-Protocol=1 Framed-IP-Address=109.233.170.2 Acct-Status-Type=1 Acct-Delay-Time=0 Acct-Session-Id=7200000000000166 NAS-Port-Id=0/0/1/834 Event-Timestamp=1314102653 NAS-Port-Type=33 UNKNOWN[-1-151]={39 44 46 33 33 36 46 35} cisco-avpair=parent-session-id=7200000000000165 cisco-avpair=circuit-id-tag=000403420101 cisco-avpair=remote-id-tag=00060012cf539f5e cisco-NAS-Port=0/0/1/834 cisco-SSG-Service-Info=NINET 08-23/17:38:29 INFO [radiusListener-p-5-t-4] InetRadiusProcessor - REQUEST_AFTER_PREPROCESS: Packet type: Accounting-Request Identifier: 79 Authenticator: {1F B7 4F C3 07 15 C1 73 54 C0 DE EC 31 C2 36 04} Attributes: User-Name=00060012cf539f5e:000403420101 NAS-Identifier=7201-ipoe.nettrans.ru NAS-IP-Address=94.125.95.117 NAS-Port=357 Service-Type=2 Framed-Protocol=1 Framed-IP-Address=109.233.170.2 Acct-Status-Type=1 Acct-Delay-Time=0 Acct-Session-Id=7200000000000165 NAS-Port-Id=0/0/1/834 Event-Timestamp=1314102653 Calling-Station-Id=0080.4840.a46f NAS-Port-Type=33 UNKNOWN[-1-151]={39 44 46 33 33 36 46 35} cisco-avpair=parent-session-id=7200000000000165 cisco-avpair=circuit-id-tag=000403420101 cisco-avpair=remote-id-tag=00060012cf539f5e cisco-avpair=INET_IN:0 cisco-avpair=INET_OUT:0 cisco-NAS-Port=0/0/1/834 cisco-SSG-Service-Info=NINET 08-23/17:38:29 INFO [radiusListener-p-5-t-4] InetRadiusProcessor - Creating NasConnection from radius accounting packet 08-23/17:38:29 INFO [radiusListener-p-5-t-4] Accounting - Write new connection to DB 08-23/17:38:29 INFO [radiusListener-p-5-t-4] Accounting - New connection id=9 08-23/17:38:29 INFO [radiusListener-p-5-t-4] Accounting - Write new session to DB 08-23/17:38:29 INFO [radiusListener-p-5-t-4] Accounting - New session's id=9 08-23/17:38:29 INFO [radiusListener-p-5-t-4] connection - 9:9 Register ip: 109.233.170.2 08-23/17:38:29 INFO [radiusListener-p-5-t-4] RadiusListenerWorker - RESPONSE: Packet type: Accounting-Response Identifier: 79 Authenticator: {86 A1 4F 51 3E 1C BB 73 1B 92 1B 7A 1F AC 29 1C} Attributes: Process time start: 55
Строго говоря, это пришёл пакет старта сервиса. В ISG аккаунтинг сервисов идёт раздельно. Динамический код процессора протокола переносит атрибут cisco-avpair=parent-session-id= в Acct-Session-Id и переносит счётчики в посервисных же апдейт пакетах в атрибуты cisco-avpair=<префикс>:<значение>, что позволяет RADIUS процессору воспринимать аккаунтинг как будто поступающий от одной сессии.
В этот момент соединение уже должно быть видно в мониторе модуля в текущих. Также его можно посмотреть с помощью консольных команд BGInetAccess и BGInetAccounting:
[root@bgb BGInetAccess]# ./access.sh conlist Java Runtime: Sun Microsystems Inc. Java HotSpot(TM) Server VM [1.6.0_26] /usr/java/jdk1.6.0_26/jre Runtime name: 19660@bgb.nettrans.ru Java endorsed dirs: /usr/java/jdk1.6.0_26/jre/lib/endorsed OS: Linux 2.6.32.26-175.fc12.i686.PAE [i386], file.encoding: UTF-8, user.name: root Heap sizes: current=30912k free=30098k max=233024k +----------+---------------+---------------+------------------------------+--------------------+------------------------------+---------------+--------------------+---------------+----------+ | ID | NAS_ID | NAS_IP | Session | Start | UserName | IP | FromNum | Contract | Status | +----------+---------------+---------------+------------------------------+--------------------+------------------------------+---------------+--------------------+---------------+----------+ | 11 | DID: 1 | | 720000000000016C |24.08.2011 09:42:36 |00060012cf539f5e:000403420101 | 109.233.170.2 | 0080.4840.a46f | CID: 0 | 0 | +----------+---------------+---------------+------------------------------+--------------------+------------------------------+---------------+--------------------+---------------+----------+ [root@bgb BGInetAccounting]# ./accounting.sh sesslist Java Runtime: Sun Microsystems Inc. Java HotSpot(TM) Server VM [1.6.0_26] /usr/java/jdk1.6.0_26/jre Runtime name: 19934@bgb.nettrans.ru Java endorsed dirs: /usr/java/jdk1.6.0_26/jre/lib/endorsed OS: Linux 2.6.32.26-175.fc12.i686.PAE [i386], file.encoding: UTF-8, user.name: root Heap sizes: current=30912k free=30098k max=233024k Call sessions: +---------------+---------------+---------------+--------------------+--------------------+---------------------+---------------------+---------------------+---------------------+---------------------+----------+ | ID | ContractId | ServId | Session | Start | Stop | AccLastTime | AccPerFrom | AccPerTo | OptionSet | Status | +---------------+---------------+---------------+--------------------+--------------------+---------------------+---------------------+---------------------+---------------------+---------------------+----------+ | 11 | 1 | 1 | 720000000000016C |24.08.2011 09:42:36 | | 24.08.2011 09:44:29 | 22.08.2011 00:00:00 | 31.08.2011 23:59:59 | 1 | 0 | +---------------+---------------+---------------+--------------------+--------------------+---------------------+---------------------+---------------------+---------------------+---------------------+----------+
6. Изменение свойств соединения.
Для изменения свойств соединения во время его работы используются CoA запросы. Их отправляет класс ru.bitel.bgbilling.inet.dyn.device.isg.ISGServiceActivator при вызове в нём метода connectionModify. В BGInetAccess/log/mq.log. В тестовых целях проще всего инициировать изменение свойств переключив опцию непосредственно в сервисе и сохранив, либо изменив её в тарифном плане.
08-24/14:28:22 INFO [sa-p-5-t-3] ServiceActivatorSet - Invoking connectionModify 08-24/14:28:22 INFO [sa-p-5-t-3] ISGServiceActivator - Connection modify! 08-24/14:28:22 INFO [sa-p-5-t-3] PodSupport - Sending to /94.125.95.117:1700 Packet type: CoA-Request Identifier: 5 Authenticator: {3C 9F 98 3A 4F F2 97 0C 61 D1 73 F6 61 22 5C E0} Attributes: Acct-Session-Id=7200000000000181 cisco-SSG-Command-Code=\0xbINET_TURBO 08-24/14:28:22 INFO [sa-p-5-t-3] ISGServiceActivator - Send adding CoA: Packet type: CoA-Request Identifier: 5 Authenticator: {02 14 A3 7C 54 02 78 C3 CF 85 33 72 C6 E2 66 86} Attributes: Acct-Session-Id=7200000000000181 cisco-SSG-Command-Code=\0xbINET_TURBO 08-24/14:28:22 INFO [sa-p-5-t-3] PodSupport - Sending to /94.125.95.117:1700 Packet type: CoA-Request Identifier: 6 Authenticator: {D0 9F 44 6F B9 A8 5D 44 7C 86 02 0A 71 AC A4 4E} Attributes: Acct-Session-Id=7200000000000181 cisco-SSG-Command-Code=\0xcINET 08-24/14:28:22 INFO [sa-p-5-t-3] ISGServiceActivator - Send closing CoA: Packet type: CoA-Request Identifier: 6 Authenticator: {DA 18 2C 29 99 72 17 27 28 3B 0F 57 63 87 C8 16} Attributes: Acct-Session-Id=7200000000000181 cisco-SSG-Command-Code=\0xcINET
Так это выглядит на Cisco при включении debug aaa coa:
7201-ipoe# Aug 24 15:20:30: COA: 94.125.95.114 request queued Aug 24 15:20:30: RADIUS: authenticator 02 14 A3 7C 54 02 78 C3 - CF 85 33 72 C6 E2 66 86 Aug 24 15:20:30: RADIUS: Acct-Session-Id [44] 18 "7200000000000181" Aug 24 15:20:30: RADIUS: Vendor, Cisco [26] 19 Aug 24 15:20:30: RADIUS: ssg-command-code [252] 13 Aug 24 15:20:30: RADIUS: 0B 49 4E 45 54 5F 54 55 52 42 4F [Service-Log-On INET_TURBO] Aug 24 15:20:30: ++++++ CoA Attribute List ++++++ Aug 24 15:20:30: 068CD314 0 00000001 session-id(363) 4 385(181) Aug 24 15:20:30: 068CD2A8 0 00000009 ssg-command-code(432) 11 0B 49 4E 45 54 5F 54 55 52 42 4F Aug 24 15:20:30: Aug 24 15:20:30: COA: 94.125.95.114 request queued Aug 24 15:20:30: RADIUS: authenticator DA 18 2C 29 99 72 17 27 - 28 3B 0F 57 63 87 C8 16 Aug 24 15:20:30: RADIUS: Acct-Session-Id [44] 18 "7200000000000181" Aug 24 15:20:30: RADIUS: Vendor, Cisco [26] 13 Aug 24 15:20:30: RADIUS: ssg-command-code [252] 7 Aug 24 15:20:30: RADIUS: 0C 49 4E 45 54 [Service-Log-Off INET] Aug 24 15:20:30: ++++++ CoA Attribute List ++++++ Aug 24 15:20:30: 068CD380 0 00000001 session-id(363) 4 385(181) Aug 24 15:20:30: 068CD3EC 0 00000009 ssg-command-code(432) 5 0C 49 4E 45 54
Т.к. для ISG отключение и включение сервисов в одном CoA запросе поддерживается только для "старших" цисок, то переключение осуществляется двумя запросами. Результат ответа на второй запрос оценивается как результат всей операции смены сервисом. Т.е. пропадание первого запроса никак не отслеживается. Если же не поступит ответ на второй запрос, попытка CoA будет повторена.
7. Блокировка сервиса.
Проще всего инициировать переключением статуса договора на нерабочий.