Процессор ru.bitel.bgbilling.modules.inet.radius.InetRadiusProcessor

Предназначен для авторизации и аккаунтинга по протоколу RADIUS большинства типов коммутируемых соединений.

Загружает список NAS'ов из дочерних узлов корневого узла сервера, начиная с самого корневого узла. Если нужно фильтовать по типам устройств (т.е. какие-то дочерние узлы не учитывать как NAS'ы), то в конфигурации корневого устройства в параметре radius.deviceTypeIds необходимо указать id типов устройств-NAS'ов через запятую. У устройства-NAS'а поле Идентификатор должно быть заполнено.

Поиск NAS'а для пришедшего пакета производится сначала по атрибуту NAS-Identifier с поиском по идентификатору устройства, затем, если устройство не найдено, по NAS-IP-Address с поиском по хостам устройств. Сессия сервиса привязывается к устройству, представляющему NAS.

Поиск сервиса/логина

При авторизации поиск сервиса Inet может осуществляться как по логину, так и по интерфейсу или VLAN'у. Для указания режима поиска необходимо прописать в конфигурации устройства-NAS'а или в конфиге любого его устройства-предка параметр:

# Режим поиска сервиса: 0 (по умолчанию) - по логину, 1 - по интерфейсу на устройстве (в предобработке должны быть
# проставлены опции AGENT_REMOTE_ID и AGENT_CIRCUIT_ID или INTERFACE_ID), 2 - по VLAN на устройстве (в предобработке
# должны быть проставлены опции AGENT_REMOTE_ID и AGENT_CIRCUIT_ID или VLAN_ID), 4 - по VLAN на устройстве или
# дочернем устройстве (в предобработке должны быть проставлены опции AGENT_REMOTE_ID и AGENT_CIRCUIT_ID или VLAN_ID),
# 5 - по MAC-адресу на устройстве (в предобработке должна быть проставлена опция MAC_ADDRESS), 6 - по MAC-адресу на
# устройстве или дочернем устройстве (в предобработке должна быть проставлена опция MAC_ADDRESS).
radius.servSearchMode=0

radius.servSearchMode может принимать значения:

  • 0 - поиск по логину из атрибута User-Name;

  • 1 - поиск по интерфейсу на (найденном) устройстве;

  • 2 - поиск по VLAN'у на устройстве (в предобработке должны быть проставлены опции AGENT_REMOTE_ID и AGENT_CIRCUIT_ID или VLAN_ID);

  • 4 - поиск по VLAN'у на устройстве и его дочерних устройствах (в предобработке должны быть проставлены опции AGENT_REMOTE_ID и AGENT_CIRCUIT_ID или VLAN_ID);

  • 5 - поиск по MAC-адресу на устройстве (в предобработке должна быть проставлена опция MAC_ADDRESS);

  • 6 - поиск по MAC-адресу на устройстве и дочерних устройствах (в предобработке должна быть проставлена опция MAC_ADDRESS);

  • 7 - поиск по адресу, указанному в User-Name, из диапазона адресов сервиса (в типе сервиса должно быть указано serv.search.address=1);

  • 9 - поиск по адресу, указанному в User-Name, из диапазона адресов сервиса (в типе сервиса должно быть указано serv.search.address=1) на агентских (дочерних) устройствах;

  • 10 - поиск по MAC-адресу на всех устройствах.

Также возможен дополнительный поиск дочернего сервиса:

radius.servSearchMode=<servSearchMode>-<subServSearchMode>

<subServSearchMode> может принимать значения:

  • 0 или отсутсвует - нет поиска дочернего сервиса

  • 1 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - ошибка авторизации;

  • 2 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - сессия будет привязана к родительскому сервису;

  • 5 - поиск дочернего сервиса по IP-адресу из поля User-Name, если такого дочернего сервиса нет - ошибка авторизации;

  • 6 - поиск дочернего сервиса по IP-адресу из поля User-Name, если такого дочернего сервиса нет - сессия будет привязана к родительскому сервису;

  • 7 - проверка IP-адреса из поля User-Name на совпадение с IP-адресом сервиса или поиск дочернего сервиса по IP-адресу, если не совпадает и такого дочернего сервиса нет - ошибка авторизации;

  • 8 - проверка IP-адреса из поля User-Name на совпадение с IP-адресом сервиса или поиск дочернего сервиса по IP-адресу, если не совпадает и такого дочернего сервиса нет - сессия будет привязана к родительскому сервису.

Например, radius.servSearchMode=1 - поиск по порту, radius.servSearchMode=2-1 - поиск по VLAN с проверкой MAC-адреса, radius.servSearchMode=2-7 - поиск по VLAN с проверкой IP-адреса.

Возможен последовательный поиск c разными режимами (если по первому режиму сервис не был найден - применяется следующий), для этого режимы нужно указать через запятую:

radius.servSearchMode=7,2

При поиске по логину поиск сервиса происходит по значению атрибута User-Name, по его совпадению с логином сервиса. После логина в атрибуте User-Name может быть указан реалм c разделителем @, например "vasya@local". Если реалм не указан, то предполагается, что пользователь использует реалм default. При этом принудительное указание реалма default (например, "vasya@default") не допускается.

По умолчанию перед поиском сервиса по логину из User-Name удаляется значение домена и не удаляются пробелы в начале и в конце. Также поиск идет с учетом регистра. Изменить поведение можно в конфигурации устройства (см. Пример конфигурации устройства-NAS'а).

Список допустимых реалмов указывается в параметре устройства/типа сервиса radius.realm через запятую, например:

#radius.realm=default
radius.realm=default, local

Параметр может быть указан как в конфигурации устройства (или типа устройтва), так и в конфигурации типа сервиса - в последнем случае значение будет главнее, чем тот же параметр в конфигурации устройства. По умолчанию допускается только реалм default.

При поиске по интерфейсу или VLAN'у, сервис может быть привязан к дочернему для NAS'а устройству - например, в случае Cisco ISG или Redback CLIPS - сервис привязан к коммутатору, NAS'ом выступает маршрутизатор. В этом случае необходимо в предобработке RADIUS-запроса установить опцию AGENT_REMOTE_ID со значением идентификатора дочернего коммутатора. Если опция будет присутствовать и такое дочернее устройство существует, то поиск сервиса будет идти относительно этого агентского устройства, иначе, по умолчанию, поиск идет относительно устройства-NAS'а.

request.setOption( InetRadiusProcessor.AGENT_REMOTE_ID, "1CBDB9E64878" );

Данную опцию необходимо устанавливать как в preprocessAccessRequest, так и в preprocessAccountingRequest. Значение обычно извлекается из RADIUS-атрибутов запроса, содержащих, например, значение субопций DHCP option 82. Значение можно установить как строкой, так и массивом байт (byte[]). В случае, если опция установлена в предобработке запроса, будет произведен поиск агентского устройства на совпадение с полем Идентификатор.

Также возможна схема с несколькими NAS'ами, работающими параллельно, в этом случае ветку с устройствами коммутаторами нужно завести отдельно (не делать ее дочерней по отношению к одному из устройств-NAS'ов), а в конфигурации устройств-NAS'ов указать параметр device.agentDeviceRootId =<x>, где <x> - ID устройства-папки, в котором находится подветка с коммутаторами:

images/download/attachments/73597961/manygw.png

Для определения интерфейса или VLAN возможны два способа: установка опции AGENT_CIRCUIT_ID или установка напрямую опции INTERFACE_ID/VLAN_ID. В первом случае значение номера интерфейся или VLAN из опции будет извлечено по параметрам конфигурации агентского устройства dhcp.option82.interfaceId.position, dhcp.82.interfaceId.length, dhcp.option82.vlanId.position, dhcp.option82.vlanId.length. Во втором - значение должно быть равно интерфейсу или порту.

Пример (установка опций из атрибутов-значений субоций DHCP option 82, данный код есть в обработчиках, которые входят в дистрибутив модуля):

RadiusAttribute<?> agentRemoteId = request.getAttribute( 2352, 96 );
if( agentRemoteId != null )
{
ByteBuffer data = agentRemoteId.getData();
data.position( 2 );
data = data.slice();
 
request.setOption( InetRadiusProcessor.AGENT_REMOTE_ID, data );
}
 
RadiusAttribute<?> agentCircuitId = request.getAttribute( 2352, 97 );
if( agentCircuitId != null )
{
ByteBuffer data = agentCircuitId.getData();
data.position( 2 );
data = data.slice();
 
// значение интерфейса или VLAN'а будет извлечено из этого параметра
request.setOption( InetRadiusProcessor.AGENT_CIRCUIT_ID, data );
}

Пример (vlan per user - поиск по vlan):

/*
// Если агентское устройство всегда известно - раскомментарить, режим поиска 2;
// иначе - режим поиска 4 (по vlan с учетом всех дочерних устройств)
RadiusAttribute<?> agentRemoteId = request.getAttribute( 2352, 96 );
if( agentRemoteId != null )
{
ByteBuffer data = agentRemoteId.getData();
data.position( 2 );
data = data.slice();
 
request.setOption( InetRadiusProcessor.AGENT_REMOTE_ID, data );
}*/
 
Pattern vlanPattern = Pattern.compile( "(.+) vlan-id (\\d+)" );
 
String nasPortId = request.getStringAttribute( -1, 87, null );
if( nasPortId != null )
{
Matcher m = vlanPattern.matcher( nasPortId );
if( m.find() )
{
String vlanId = m.group( 2 );
request.setOption( InetRadiusProcessor.VLAN_ID, vlanId );
}
}

Таким образом для поиск сервиса возможен:

  • - по атрибуту User-Name (по умолчанию);

  • - по опциям AGENT_REMOTE_ID (идентификатор агентского устройства - устройства, на котором, собственно, интерфейс) и INTERFACE_ID (или AGENT_CIRCUIT_ID, содержащий номер интерфейса);

  • - по опциям AGENT_REMOTE_ID (не обязательна, если в пределах NAS'а VLAN уникальны) и VLAN_ID (или AGENT_CIRCUIT_ID, содержащий номер VLAN'а).

При аутентификации во всех случаях происходит проверка пароля, поэтому в некоторых случаях пароль нужно устанавливать на NAS'е, в коде preprocessAccessRequest или, при необходимости, отключить проверку пароля для NAS'а:

# Включение (1, по умолчанию) или отключение (0) проверки пароля для NAS'а
#radius.password.verification=1

RADIUS-атрибуты

Когда сервис определён, определяется набор атрибутов сессии, последовательным добавлением:

  • атрибутов, определённых для реалма;

  • атрибутов, определенных для сервиса(логина);

  • атрибутов, определённых для опций.

Атрибуты задаются перечислением <имя атрибута>=<значение> через точку с запятой, если в значении атрибута должна присутствовать точка с запятой (т.е. это не разделение двух разных атрибутов), то её нужно указать два раза: ";;".

Атрибуты реалма

Атрибуты реалма определяются в конфигурации устройства-NASа следующим образом:

radius.realm.<realm>.attributes=<attributes>

Где:

  • <realm> - реалм;

  • <attributes> - атрибуты.

Пример:

Пример
radius.realm.default.attributes=Acct-Interim-Interval=300;Session-Timeout=604800

Есть возможность добавлять динамические атрибуты, с помощью макросов:

radius.realm.<realm>.attributes.macros=<attributes>
 
radius.realm.default.attributes.macros=Interface-Name=$ipParam(ifaceName)

Запись атрибутов производится в таком же виде, как и в параметрах radius.realm.<realm>.attributes, однако здесь поддерживаются макросы вида $имя или $имя(параметр1,параметр2), например:

radius.realm.default.attributes.macros=Interface-Name=$ipParam(ifaceName)

Поддерживаются следующие макросы:

  • $ipGate - значение поля "Роутер" IP-ресурса, из которого выдан IP-адрес;

  • $ipDns - значение поля "DNS" IP-ресурса, из которого выдан IP-адрес;

  • $ipSubnetMask - значение поля "Маска подсети" IP-ресурса, из которого выдан IP-адрес;

  • $ipParam(name) - значение параметра конфигурации IP-ресурса, из которого выдан IP-адрес, аргумент макроса - имя параметра, например $ipParam(ifaceName) вернет значение параметра ifaceName= конфигурации IP-ресурса;

  • $param($device,name,default) - значение параметра конфигурации устройства-NAS'а или агентского устройства (коммутатора), указывается так: $param($device,myParam,myDefault) или $param($agentDevice,myParam,myDefault);

  • $requestAttribute(vendor,type) или $requestAttribute(name) - значение атрибута из запроса, например $requestAttribute(User-Name).

Атрибуты опций

Полный набор опций сессии определяется объединением опций, указанных в самом сервисе и опций из тарифного плана. Соответствие кодов опций атрибутам определяется в конфигурации устройства-NASа следующим образом:

radius.inetOption.<option_id>.attributes=<attributes>

Где:

  • <option_id> - числовой код опции;

  • <attributes> - RADIUS атрибуты.

Пример конфигурации, где определены атрибуты для реалмов и опций:

radius.realm.default.attributes=Service-Name:1=RSE-SVC-EXT;Service-Options:1=1
 
radius.inetOption.1.attributes=Service-Parameter:1=Rate=100000 Burst=12500000
radius.inetOption.2.attributes=Service-Parameter:1=Rate=100000 Burst=12500000

Для удобства указания однотипных наборов атрибутов, например, для указания атрибутов скорости можно использовать шаблоны. Для этого опции скорости должны находиться в одной родительской опции (которую можно назвать, например, "Скорость"). В конфигурации устройства нужно будет указать:

radius.inetOption.<parent_option_id>.template=Service-Parameter:1=Rate=$rate Burst=$burst

где <parent_option_id> - ID родительской опции ("Скорость").

В конфигурации опций-скоростей необходимо указать необходимые значения rate= и burst=. Таким образом отпадает необходимость указания практически одинакового набора атрибутов для каждой опции-скорости в конфигурации устройства, достаточно лишь прописать один раз шаблон. Также значения параметров можно прописать в конфигурации родительской опции, для того чтобы использовать как значения по умолчанию (если значение не переопределено в дочерней опции) или просто как самостоятельную переменную шаблона.

Атрибуты сервиса/логина

Атрибуты специфичные для типа сервиса можно прописать в конфигурации типа сервиса:

serv.radius.realm.default.attributes=

При необходимости выдавать специфичные атрибуты (значения) индивидуально для сервиса, в конфигурации типа сервиса укажите

param.myParam.title=Мой параметр

Теперь на вкладке "Дополнительно" в редакторе сервиса на договоре можно будет добавить данный параметр, указав его значение. Теперь этот параметр можно использовать при выдаче RADIUS-атрибутов, прописав в конфигурации типа сервиса, в том же параметре serv.radius.<realm>.default.attributes атрибут с помощью макроса:

serv.radius.realm.default.attributes=My-Attribute=$myParam

Выдача IP-адреса

Выдача IP-адреса производится через атрибут Framed-IP-Address из диапазона (адреса), указанного в самом сервисе на договоре (т.е. выдача статического IP-адреса), либо, если адрес в сервисе не указан или занят другой сессий этого же сервиса - из пула, определённого в конфигурации устройства параметром radius.realm.<realm>.ipCategories=<cat_codes>, где:

Например, выдача динамических адресов из категории IP-ресурсов с кодом 4:

radius.realm.default.ipCategories=4

Вы также можете выдавать адреса из разных пулов в зависимости от активной опции Inet, указав опцию в тарифе или статически в сервисе на договоре. Таким образом, можно в зависимости от различных условий выдавать адреса из разных подсетей (для ситуации, когда баланс меньше лимита смотрите ниже Reject-To-Accept). Благодаря гибкости тарифа можно выдавать адреса из разных пулов в зависимости от баланса, активных тарифных опций, групп договоров, времени, периода и других условий.

Для этого в конфигурации устройства-NAS'а или корневого устройства укажите именованный пул адресов. Пул состоит из имени и перечисления id категорий ресурсов IP-адресов через запятую: resource.ip.pool.<name>.ipCategories=<cat_codes>

resource.ip.pool.whitePool.ipCategories=5

Далее создайте опции Inet, например, создав опцию-ветку "Пулы IP-адресов" и внутри нее опцию "Белый пул IP-адресов". В конфигурации устройства или типа устройства-NAS'а или же корневого устройства укажите привязку данной опции к пулу IP-адресов, например, если у созданной опции "Белый пул IP-адресов" ID=72:

radius.inetOption.72.ipPool=whitePool

Теперь, если в сервисе договора будет активна (с помощью тарифа или указана статически в сервисе) опция "Белый пул IP-адресов", то адрес будет выдаваться из пула whitePool, который состоит из IP-адресов категорий, указанных в параметре resource.ip.pool.whitePool=, т.е. в данном примере - из категории IP-ресурсов с ID=5. Если же опция будет не активна - то адрес будет выдан из параметра radius.realm.<realm>.ipCategories=<cat_codes>, если он указан.

Также вместо указания списка IP-категорий для реалма можно воспользоваться указанием имени пула, т.е. вместо radius.realm.default.ipCategories=4 указать, например:

resource.ip.pool.greyPool.ipCategories=4
radius.realm.default.ipPool=greyPool

При использовании схем IPoE возможна ситуация, когда с Cisco/SE приходит подряд несколько Access-Request'ов. Например, абонентский DHCP-клиент шлет сразу несколько DHCP-Discover-пакетов, или в Cisco инициация сессии срабатывает не только на DHCP-Discover, но и на DHCP-Request. По умолчанию для динамической выдачи IP-адресов InetAccess на каждый Access-Request выдает Access-Accept с новым IP-адресом, что может быть проблемой для связки DHCP-клиент+Cisco/SE. В этом случае можно использовать параметр radius.address.authReserveTimeout. При выдаче адреса он будет запоминаться по ключу сервис+устройство-NAS+(агентское_устройство)+User-Name+(MAC-address)+(CallingStationId)+(identifier) и в течении указанного времени (в миллисекундах) на очередной Access-Request с таким же ключом будет предлагать тот же адрес.

# Кэширование выданного абоненту IP-адреса по ключу (для IPoE), по умолчанию - 0 (выкл)
radius.address.authReserveTimeout=3000

Выдача статической подсети

Для того, чтобы в Access-Accept биллинг выдавал подсеть в виде атрибутов Framed-IP-Address и Framed-IP-Netmask, то в типе сервиса нужно указать "Тип адреса": "статическая сеть", а также добавить в конфигурации типа сервиса:

# Выдаем в Access-Accept всю подсеть сервиса в виде Framed-IP-Address=<net> и Framed-IP-Netmask=<mask>
serv.radius.staticSubnet=1

Не выдавать адрес из диапазона сервиса

Возможен случай, когда в сервисе или дочернем сервисе нужно указать IP-адрес, диапазон или подсеть, которые будут нужны только для управления. Т.е. задача в том, чтобы из данного сервиса IP-адрес не выдавать. Например, в родительском сервисе мы указываем подсеть, а в дочерних сервисах - разрешенные абоненту IP-адреса из этой подсети (т.е. абонент должен получать адрес из дочерних сервисов, а не из родительского). Для того, чтобы адрес из сервиса не выдавался, в конфигурации типа сервиса нужно указать:

# Не выдаем IP-адреса из диапазона этого сервиса
serv.radius.skipStaticAddress=1

Не добавлять Framed-IP-Address в Access-Accept

В некоторых схемах, например, IP Subscriber, не требуется выдавача IP-адреса в Access-Accept, т.к. IP-адрес у абонента уже есть, и адрес в сервисе указан только для того, чтобы найти абонента по нему при запросе Access-Request. В этом случае в конфигурации типа сервиса нужно указать:

# Не добавляем Framed-IP-Address в Access-Accept
serv.radius.noAddress=1

Выдача Framed-Route

Для того, чтобы выдавать в Access-Accept абоненту атрибут Framed-Route нужно создать тип сервиса, который будет дочерним, в поле "Тип адреса" выбрать значение "статическая сеть", указать в конфигурации типа сервиса:

# Данный сервис используется для указания Framed-Route
serv.radius.framedRoute=1

Reject-To-Accept

В случае ошибки авторизации высылается пакет AUTHENTICATION_REJECT с отображением ошибки и её кода в мониторе модуля. Допустимые коды ошибок данного процессора.

Вместо AUTHENTICATION_REJECT может быть выслан AUTHENTICATION_ACCEPT-пакет с дополнительными атрибутами. Перечень кодов ошибок, для которых производится подмена Reject-To-Accept определяется переменной конфигурации NAS'а radius.disable.accessCodes=<codes>, где <codes> - перечень кодов ошибок авторизации через запятую. Например:

radius.disable.accessCodes=1,2,3,4,10,11,12

Соответственно, для Reject-To-Accept могут быть собственные диапазоны IP-адресов, например:

radius.disable.ipCategories=3

Если же нужно выдавать статический IP-адрес такой же, как при обычном доступе (также, как когда не возникает ошибок авторизации), нужно указать режим:

# Режим выдачи статического адреса при ошибке авторизации:
# 0 (по умолчанию) - выдавать динамический адрес из категорий radius.disable.ipCategories,
# 1 - выдавать статический адрес как при удачной авторизации
radius.disable.mode=1

Если нужно выдавать динамический IP-адрес такой же, как при обычном доступе - то нужно прописать в radius.disable.ipCategories те же самые пулы.

При ошибке авторизации, атрибуты выдаются из параметра radius.disable.attributes:

# Атрибуты, выдаваемые при ошибке авторизации
radius.disable.attributes=
# атрибуты, выдаваемые при ошибке авторизации с кодом 1 (сервис/логин не найден), 2 или 3
#radius.disable.1,2,3.attributes=
# атрибуты с использованием макросов
#radius.disable.attribute.macros=

Атрибуты из опций Inet в данном режиме не выдаются.

Для поддержки Reject-To-Accept при ошибке с кодом 1 (Логин не найден), т.е. для предоставления гостевого доступа, необходимо создать договор с балансом меньше лимита и сервисом модуля Inet со статусом закрыт, а id сервиса прописать в конфигурации устройства:

radius.disable.servId=<inetServId>

Таким образом, сессии с ненайденным сервисом будут привязываться к указанному сервису.

При превышении числа сессий над ограничением, установленным для сервиса, генерируется ошибка авторизации. Данная ошибка также может быть обработана механизмом Reject-To-Accept с выдачей адреса из пула фиктивных адресов.

MAC-адрес и идентификатор

При RADIUS Access-Request можно также использовать MAC-адрес, чтобы авторизовывать запросы только с определенным MAC-адресом. MAC-адрес из Access-Request пакета устанавливается в Обработчике процессора протокола, в методе preprocessAccessRequest: request.setOption( InetRadiusProcessor.MAC_ADDRESS, macAddress ). Стандартные обработчики процессора протокола, поставляемые с модулем уже реализуют этот функционал, нужно только прописать в конфигурации устройства или типа устройства:

# Вендор атрибута, где хранится MAC-адрес
radius.macAddress.vendor=-1
# Код атрибута, где хранится MAC-адрес
radius.macAddress.type=31
# Префикс атрибута (если есть), где хранится MAC-адрес. Например, для cisco avpair
#radius.macAddress.prefix=client-mac-address=

Или:

# Вендор атрибута, где хранится MAC-адрес
radius.macAddress.vendor=9
# Код атрибута, где хранится MAC-адрес
radius.macAddress.type=1
# Префикс атрибута (если есть), где хранится MAC-адрес. Например, для cisco avpair
radius.macAddress.prefix=client-mac-address=

Таким образом, при извлечении MAC-адреса из RADIUS-пакета, он будет сравнен с MAC-адресом из аутентифицированного сервиса при условии, что в этом сервисе заведен MAC-адрес.

Для автоматического привязывания MAC-адреса к сервису в конфигурации модуля/типа сервиса/устройства/типа устройства можно прописать:

# Нужно ли автоматически проставлять в сервис MAC-адрес, если его еще нет.
# Можно указать в конфигурации модуля, конфигурации устройства, конфигурации типа сервиса.
# 0 - не привязывать, 1 - привязывать, если поле сервиса пустое, 2 - перетирать новым значением, 3 - добавлять
# (в последних двух случаях отказа в авторизации по MAC-адресу не будет)
serv.macAddress.auto=1

Таким образом при первой удачной авторизации MAC-адрес будет привязан к сервису и с другим MAC-адресом клиент уже не сможет авторизоваться.

Аналогично MAC-адресу можно использовать поле Идентификатор сервиса. Например, в качестве идентификатора использовать значение атрибута Calling-Station-Id, устанавливая в Обработчике процессора протокола, в методе preprocessAccessRequest: request.setOption( InetRadiusProcessor.IDENTIFIER, callingStationId ).

Для автоматического привязывания идентификатора к сервису в конфигурации модуля/типа сервиса/устройства/типа устройства можно прописать:

# Нужно ли автоматически проставлять в сервис идентификатор, если его еще нет.
# Можно указать в конфигурации модуля, конфигурации устройства, конфигурации типа сервиса.
# 0 - не привязывать, 1 - привязывать, если поле сервиса пустое, 2 - перетирать новым значением, 3 - добавлять
# (в последних двух случаях отказа в авторизации по идентификатору не будет)
serv.identifier.auto=1

Calling-Station-Id

Атрибут Calling-Station-Id используется для подстановки в поле сессии "С номера". При отсутствии данного атрибута можно настроить, чтобы обработчик процессора протокола (CoAProtocolHandler, SmartEdgeProtocolHandler, ISGProtocolHandler и другие) при предобработке RADIUS-запроса устанавливал значение в данный атрибут из другого, например, из атрибутра Mac-Address Redback (ID вендора 2352, ID типа атрибута 145):

# Копирование значения в атрибут Calling-Station-Id.
# ID вендора RADIUS-атрибута
radius.callingStationId.vendor=2352
# Тип RADIUS-атрибута
radius.callingStationId.type=145
# Префикс RADIUS-атрибута, если присутствует (будет удален из строки)
#radius.callingStationId.prefix=

Привязка сервиса к NAS'у или ветке NAS'ов

Для привязки сервиса к устройству - т.е. для того, чтобы клиент мог авторизоваться только на устройстве (NAS'е), привязанному к сервису, или являющимся дочерним по отношению к нему (устройству), необходимо указать в конфигурации устройства/типа устройства/типа сервиса:

# Привязка авторизации сервиса к устройству, указанному в сервисе договора
# 0 - клиент может авторизоваться на любом устройстве (NAS'е), 1 - клиент может авторизоваться только на прописанном в сервисе устройстве,
# 2 - клиент может авторизоваться только на прописанном в сервисе устройстве или являющимся дочерним по отношению к нему
serv.device.link=2

Действие при получении Access-Request при наличии активной сессии

При подключении абонента может быть ситуация, когда в биллинге сессия еще активна, а клиент на самом деле уже отключился и пытается подключиться заново. Это может произойти при потере связи с NAS'ом (т.е. STOP-пакет не пришел, но connection.close.timeout еще не произошел), или, например, при использовании IPoE с Cisco/Redback (когда абонент подключил другое устройство, а Cisco/Redback по таймауту DHCP-lease еще не поняли, что старое соединение можно закрывать). Для обработки такой ситуации можно использовать параметр конфигурации radius.connection.checkDuplicate. Он работает в связке с Calling-Station-Id - если происходит попытка авторизации, а количество активных соединений превышено и среди активных соединений есть соединение с таким же Calling-Station-Id, то при указании radius.connection.checkDuplicate:

  • 1 - происходит попытка сброса старого соединения (например, отправка PoD-пакета), абонента на этой авторизации не пускаем;

  • 2 - происходит попытка сброса старого соединения, его завершение в биллинге, абонента на этой авторизации не пускаем, должно пустить при следующей попытке, т.к. старой сессии уже не будет;

  • 3 - происходит завершение старого соединения в биллинге, абонента на этой авторизации не пускаем, должно пустить при следующей попытке, т.к. старой сессии уже не будет;

  • 4 - происходит попытка сброса старого соединения, затем через 5 секунд завершение в биллинге, абонента на этой авторизации не пускаем;

  • 5 - попытка сброса старого соединения в биллинге, завершение и пускаем немедленно (т.е. игнорируется ошибка );

  • 6 - завершение старого соединения в биллинге, пускаем абонента немедленно;

  • 7 - попытка в течении 5 секунд сбросить соединение, затем закрытие сессии в биллинге с ожиданием полного выполнения закрытия (т.е. IP-адрес станет свободным), пускаем абонента

  • 8 - попытка сброса и сразу закрытие в биллинге с ожиданием полного выполнения закрытия (т.е. IP-адрес станет свободным), пускаем абонента;

  • 9 - закрытие старого соединения в биллинге с ожиданием полного выполнения закрытия (т.е. IP-адрес станет свободным), пускаем абонента.

Для более быстрого подключения абонента при использовании и динамическим адресом рекомендуем использовать 4, 5, 6. Для статических адресов (чтобы абонент мог получить свой адрес) - 8,9.

Для обработки ситуации, когда количество активных соединений превышено, но соединения с таким Calling-Station-Id не найдено, и нужно отключить просто самое старое соединение, нужно указать цифру во втором разряде, например: 88.

Для сброса соединения с таким же Calling-Station-Id, даже если количество соединений не превышено, нужно указать цифру в третьем разряде, например, 808, 909, 888 или 818.

Этот параметр можно указать для типа сервиса, в конфигурации типа сервиса: serv.radius.connection.checkDuplicate.

В некоторых IPoE-схемах для обработки этого событие требуется использовать не Calling-Station-Id, а User-Name. Для этого нужно указать параметр radius.connection.checkDuplicate.type=1. В этом режиме будет проверяться User-Name из Access-Request с полем username сессии. Этот параметр можно указать для типа сервиса, в конфигурации типа сервиса: serv.radius.connection.checkDuplicate.type.

Т.к. параметр 8 и 9 (закрытие в биллинге с ожиданием полного выполнения закрытия, т.е. IP-адрес станет свободным) ожидает полного завершения соединения в биллинге, а необходимо такое ожидание только для некоторых схем, например, статических адресов, то рекомендуется задавать этот параметр в типе сервиса. Например, в конфигурации NAS'а radius.connection.checkDuplicate=5, в конфигурации типа сервиса для статических адресов radius.connection.checkDuplicate=8.

Без атрибута Calling-Station-Id в Access-Request-пакете данная функция работать не будет. При невозможности присылать Calling-Station-Id в Access-Request можно настроить подмену в обработчике процессора протокола (в предобработке RADIUS-запросов).

Блокировка частых Access-Request -> Access-Reject

Спам-запросы на авторизацию порождаются, обычно, забытым оборудованием, самостоятельно предпринимающем попытки авторизации на RADIUS. Постоянные обращения при таких запросах могут существенно повышать загрузку. Признаком спам-запроса являются несколько Reject-ответов на одинаковые запросы авторизации в течение определённого интервала времени. В этом случае подобные запросы попадают в спам-кэш на определённое время и по ним автоматически выдаётся Reject-ответ без полных проверок, производимых при авторизации. Для включения антиспам-системы в конфигурации модуля добавьте (требуется перезапуск InetAccess):

antispam.key.attributes=<key_attributes>
antispam.reject.count=<reject_count>
antispam.reject.per.time=<per_time>
antispam.ban.time=<ban_time>

Где:

  • <key_attributes> - RADIUS-атрибуты, идентифицирующие запрос, через запятую;

  • <reject_count> - количество Reject, возвращённых на запрос с одинаковыми идентифицирующими атрибутами;

  • <per_time> - за какое количество секунд выдано указанное в <reject_count> количество Reject-ответов;

  • <ban_time> - время в секундах, на которое данный запрос попадает в спам-базу.

Например, запрос идентифицируется атрибутами User-Name и Calling-Station-Id. При десяти Reject-ответах в течении минуты запрос попадает в спам-базу на полчаса.

antispam.key.attributes=User-Name,Calling-Station-Id
antispam.reject.count=10
antispam.reject.per.time=60
antispam.ban.time=900