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 сессий
  • <забыл команду, дописать> - просмотр детальной информации по 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

Ссылки

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