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 с текстовым префиксом, зависящим от сервиса. В этот атрибут трафик помещает динамический код предобработки запроса.

Ресурсы IP адресов

Сеть 109.233.170 с 1 по 100 адреса выдаётся для реальных соединений, с 101 по 254 -для соединений Reject-To-Accept. В конфигурациях (см. далее) используются коды категорий ресурсов, не коды самих ресурсов.

Типы устройств
Тип устройства ISG
Тип устройства Switch
Тип устройства Switch - интерфейсы
Тип устройства ProcessGroup

В типе устройства ISG определены динамические классы управления и предобработки запросов. Они поставляются с модулем. Если данных классов в списке нет, посмотрите Сервис => Автоматизация => Управление динамическим кодом, возможно код необходимо принудительно скомпилировать. Тип устройства ProcessGroup нужен исключительно для группировки, никакого другого смысла он не несёт. Коды типов устройств также далее активно используются в конфигурации, будьте внимательны или подгоните вашу настройку под эти коды.

Дерево устройств
Конфигурация устройства ProcessGroup
Конфигурация устройства ISG
Конфигурация устройства Switch

В конфигурации устройства 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
Тип сервиса ISG описание сервиса

Первый тип сервиса - непосредственно 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&amp;characterEncoding=Cp1251&amp;allowUrlInLocalInfile=true&amp;zeroDateTimeBehavior=convertToNull&amp;jdbcCompliantTruncation=false&amp;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&amp;characterEncoding=Cp1251&amp;allowUrlInLocalInfile=true&amp;zeroDateTimeBehavior=convertToNull&amp;jdbcCompliantTruncation=false&amp;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

Порядок инициации соединения следующий: 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 должен прийти старт-пакет с информацией по сессии.

Ссылки

  1. Обсуждение в форуме
  2. Изыскания в форуме
  3. WiKi в т.ч. по ISG
  4. Схема запросов при авторизации
  5. Презентация ISG
  6. Официальная дока по ISG
  7. CoA для ISG
  8. Официальная дока по отладке ISG
  9. Справочник по Cisco командам
  10. Официальная дока по настройке DHCP релея
  11. Разбор, как работает Cisco DHCP релей
Личные инструменты