Предназначен для авторизации и аккаунтинга по протоколу RADIUS большинства типов коммутируемых соединений.
Загружает список NAS'ов из дочерних узлов корневого узла сервера, начиная с самого корневого узла. Если нужно фильтовать по типам устройств (т.е. какие-то дочерние узлы не учитывать как NAS'ы), то в конфигурации корневого устройства в параметре
необходимо указать id типов устройств-NAS'ов через запятую. .Поиск NAS'а для пришедшего пакета производится сначала по атрибуту NAS-Identifier с поиском по идентификатору устройства, затем, если устройство не найдено, по NAS-IP-Address с поиском по хостам устройств. Сессия сервиса привязывается к устройству, представляющему NAS.
При авторизации поиск сервиса может осуществляться как по логину, так и по интерфейсу или 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
По умолчанию поиск сервиса происходит по значению атрибута
, по его совпадению с логином сервиса. После логина в атрибуте User-Name может быть указан c разделителем , например "vasya@local". Если реалм не указан, то предполагается, что пользователь использует реалм default. При этом принудительное указание реалма default (например, "vasya@default") не допускается.По умолчанию перед поиском сервиса по логину из User-Name удаляется значение домена и не удаляются пробелы в начале и в конце. Также поиск идет с учетом регистра. Изменить поведение можно в конфигурации устройства (см. Пример конфигурации устройства-NAS'а).
может принимать значения:
- поиск по логину из атрибута User-Name; |
- поиск по интерфейсу на (найденном) устройстве; |
- поиск по VLAN'у на устройстве (в предобработке должны быть проставлены опции AGENT_REMOTE_ID и AGENT_CIRCUIT_ID или VLAN_ID); |
- поиск по VLAN'у на устройстве и его дочерних устройствах (в предобработке должны быть проставлены опции AGENT_REMOTE_ID и AGENT_CIRCUIT_ID или VLAN_ID); |
- поиск по MAC-адресу на устройстве (в предобработке должна быть проставлена опция MAC_ADDRESS); |
- поиск по MAC-адресу на устройстве и дочерних устройствах (в предобработке должна быть проставлена опция MAC_ADDRESS); |
- поиск по адресу, указанному в User-Name, из диапазона адресов сервиса (в типе сервиса должно быть указано serv.search.address=1). |
Также возможен дополнительный поиск дочернего сервиса:
radius.servSearchMode=<servSearchMode>-<subServSearchMode>
может принимать значения:
0 или отсутсвует - нет поиска дочернего сервиса |
1 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - ошибка авторизации; |
2 - поиск дочернего сервиса по MAC-адресу, если такого дочернего сервиса нет - сессия будет привязана к родительскому сервису. |
Список допустимых реалмов указывается в параметре устройства/типа сервиса radius.realm через запятую, например:
#radius.realm=default radius.realm=default, local
Параметр может быть указан как в конфигурации устройства (или типа устройтва), так и в конфигурации типа сервиса - в последнем случае значение будет главнее, чем тот же параметр в конфигурации устройства. По умолчанию допускается только реалм default.
При поиске по интерфейсу или VLAN'у, сервис может быть привязан к дочернему для NAS'а устройству - например, в случае Cisco ISG или Redback CLIPS - сервис привязан к коммутатору, NAS'ом выступает маршрутизатор. В этом случае необходимо в предобработке RADIUS-запроса установить опцию
со значением идентификатора дочернего коммутатора. Если опция будет присутствовать и такое дочернее устройство существует, то поиск сервиса будет идти относительно этого агентского устройства, иначе, по умолчанию, поиск идет относительно устройства-NAS'а.request.setOption( InetRadiusProcessor.AGENT_REMOTE_ID, "1CBDB9E64878" );
Данную опцию необходимо устанавливать как в preprocessAccessRequest, так и в preprocessAccountingRequest. Значение обычно извлекается из RADIUS-атрибутов запроса, содержащих, например, значение субопций DHCP option 82. Значение можно установить как строкой, так и массивом байт (byte[]). В случае, если опция установлена в предобработке запроса, будет произведен поиск агентского устройства на совпадение с полем Идентификатор.
Для определения интерфейса или VLAN возможны два способа: установка опции dhcp.option82.interfaceId.position, dhcp.82.interfaceId.length, dhcp.option82.vlanId.position, dhcp.option82.vlanId.length. Во втором - значение должно быть равно интерфейсу или порту.
или установка напрямую опции / . В первом случае значение номера интерфейся или VLAN из опции будет извлечено по параметрам конфигурации агентского устройстваПример (установка опций из атрибутов-значений субоций 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 ); } }
Таким образом для поиск сервиса возможен:
- по атрибуту | (по умолчанию);
- по опциям | (идентификатор агентского устройства - устройства, на котором, собственно, интерфейс) и I (или , содержащий номер интерфейса);
- по опциям | (не обязательна, если в пределах NAS'а VLAN уникальны) и VLAN_ID (или , содержащий номер 'а).
При аутентификации во всех случаях происходит проверка пароля, поэтому в некоторых случаях пароль нужно устанавливать на NAS'е, в коде preprocessAccessRequest или, при необходимости, отключить проверку пароля для NAS'а:
# Включение (1, по умолчанию) или отключение (0) проверки пароля для NAS'а #radius.password.verification=1
Когда сервис определён, определяется набор атрибутов сессии, последовательным добавлением:
- атрибутов, определённых для реалма; |
- атрибутов, определённых для опций. |
Атрибуты реалма определяются в конфигурации устройства-NASа следующим образом:
radius.realm.<realm>.attributes=<attributes>
Где:
- реалм; |
- атрибуты. |
Полный набор опций сессии определяется объединением опций, указанных в самом сервисе и опций из тарифного плана. Соответствие кодов опций атрибутам определяется в конфигурации устройства-NASа следующим образом:
radius.inetOption.<option_id>.attributes=<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
Выдача IP-адреса производится через атрибут Framed-Ip-Address, либо из диапазона (адреса), указанного в самом сервисе, либо, если он не указан или занят - из пула, определённого в конфигурации устройства параметром , где:
- реалм; |
категорий ресурсов IP-адресов через запятую. | - id коды
Например:
radius.realm.default.ipCategories=4
В случае ошибки авторизации высылается пакет AUTHENTICATION_REJECT с отображением ошибки и её кода в мониторе модуля. Допустимые коды ошибок данного процессора.
Вместо AUTHENTICATION_REJECT может быть выслан AUTHENTICATION_ACCEPT-пакет с дополнительными атрибутами. Перечень кодов ошибок, для которых производится подмена Reject-To-Accept определяется переменной конфигурации NAS'а
, где - перечень кодов ошибок авторизации через запятую. Например:radius.disable.accessCodes=1,2,3,4,10,11,12
Соответственно, для Reject-To-Accept могут быть собственные диапазоны IP-адресов, например:
radius.disable.ipCategories=3
Для поддержки Reject-To-Accept при ошибке с кодом 1 (Логин не найден), т.е. для предоставления гостевого доступа, необходимо создать договор с балансом меньше лимита и сервисом модуля Inet со статусом закрыт, а id сервиса прописать в конфигурации устройства:
radius.disable.servId=<inetServId>
Таким образом, сессии с ненайденным сервисом будут привязываться к указанному сервису.
При превышении числа сессий над ограничением, установленным для сервиса, генерируется ошибка авторизации. Данная ошибка также может быть обработана механизмом Reject-To-Accept с выдачей адреса из пула фиктивных адресов.
При RADIUS Access-Request можно также использовать MAC-адрес, чтобы авторизовывать запросы только с определенным MAC-адресом. MAC-адрес из Access-Request пакета устанавливается в Обработчике процессора протокола, в методе preprocessAccessRequest: request.setOption( InetRadiusProcessor.MAC_ADDRESS, macAddress ). Стандартные обработчики процессора протокола, поставляемые с модулем уже реализуют этот функционал, нужно только прописать в конфигурации устройства или типа устройства:
# Вендор атрибута, где хранится 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
Для привязки сервиса к устройству - т.е. для того, чтобы клиент мог авторизоваться только на устройстве (NAS'е), привязанному к сервису, или являющимся дочерним по отношению к нему (устройству), необходимо указать в конфигурации устройства/типа устройства/типа сервиса:
# Привязка авторизации сервиса к устройству, указанному в сервисе договора # 0 - клиент может авторизоваться на любом устройстве (NAS'е), 1 - клиент может авторизоваться только на прописанном в сервисе устройстве, # или являющимся дочерним по отношению к нему serv.device.link=1
При подключении абонента может быть ситуация, когда в биллинге сессия еще активная, а клиент на самом деле уже отключился и пытается подключиться заново. Это может произойти при потере связи с NAS'ом (т.е. STOP-пакет не пришел, но connection.close.timeout еще не произошел), или, например, при использовании IPoE с Cisco/Redback (когда абонент подключил другое устройство, а Cisco/Redback по таймауту DHCP-lease еще не поняли, что старое соединение можно закрывать). Для обработки такой ситуации можно использовать параметр конфигурации
. Он работает в связке с 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.
Этот параметр можно указать для типа сервиса, в конфигурации типа сервиса:
.Для поддержки посервисного аккаунтинга (например, при использовании Cisco ISG или Redback CLIPS) в обработчике процессора протокола необходимо указывать AcctSessionId родительского соединения (аккаунтинга) и имя сервиса (ServiceName), по которому пришел аккаунтинг-пакет: request.setOption( InetRadiusProcessor.PARENT_ACCT_SESSION_ID, parentAcctSessionId ); и request.setOption( InetRadiusProcessor.SERVICE_NAME, serviceName );
Пример для Redback SmartEdge 100:
@Override public void preprocessAccountingRequest( RadiusPacket request, RadiusPacket response, ConnectionSet connectionSet ) throws Exception { int acctStatusType = request.getIntAttribute( -1, RadiusDictionary.Acct_Status_Type, -1 ); switch( acctStatusType ) { // если сервисный аккаунтинг case 101: case 102: case 103: { // получаем id родительского соединения final String parentAcctSessionId = request.getStringAttribute( -1, parentAcctSessionIdType, null ); // получаем имя сервиса, по которому идет аккаунтинг final String serviceName = request.getStringAttribute( radiusVendor, serviceNameType, null ); // подменяем Acct-Status-Type, чтобы биллинг понял типы пакетов request.setIntAttribute( -1, RadiusDictionary.Acct_Status_Type, acctStatusType - 100 ); // устанавливаем id родительской сессии request.setOption( InetRadiusProcessor.PARENT_ACCT_SESSION_ID, parentAcctSessionId ); // устанавливаем имя сервиса текущего аккаунтинга request.setOption( InetRadiusProcessor.SERVICE_NAME, serviceName ); } break; default: { } break; } }
Тогда Accounting считает данное соединение как дочернее родительскому, а в поле username соединения (в базе) устанавливается ServiceName.
При обработке трафиков используется ServiceName - он может выступать в качестве фильтра правила привязки трафиков: если указано ServiceName, то данное правило будет отрабатывать только для сервисной сессии с таким ServiceName, и наоборот, если поле ServiceName в правиле пусто, то данное правило не будет отрабатывать ни для какой сервисной сессии.
В поле ServiceName можно указать несколько сервисов через запятую (RSE-SVC-EXT, RSE-SVC-EXT1024) или же указать REGEXP внутри двух слешей (/^RSE-SVC-EXT.*$/).
Например, если у вас внешний трафик идет посервисным аккаунтингом с ServiceName=RSE-SVC-EXT, то нужно назначить такую привязку:
# Порт для отправки PoD и CoA-запросов (по умолчанию - порт, заданный в параметрах устройства Хост/порт) #radius.port=<порт устройства> # При выдаче Access-Accept добавлять запись в базу. # Hеобходимо, если используется Reject-To-Accept и по Start-пакету нельзя определить в каком состоянии соединение connection.start.fromAccept=1 # Бывают ситуации, когда Start-пакет не дошел до Accounting-сервера. В этом случае, при # 1 (значение по умолчанию) - сессия создастся от текущего момента, # 2 - Accounting проверит, что время сессии из Update/Stop пакета не больше, чем значениеи создаст сессию от ее начала, иначе, # если время сессии больше чем , сессия создастся от текущего момента, # 0 - сессия без Start-пакета создана не будет. #connection.start.fromUpdate=1 # При создании сессии по Update-пакету нужно ли игнорировать отсутствие IP-адреса сессии (Framed-Ip-Address). По умолчанию сессия # по Update-пакету без адреса не создается (0). #connection.start.fromUpdate.ignoreFramedIpLack=0 # Таймаут перевода соединения в статус suspended при остутствии радиус пакетов connection.suspend.timeout=900 # Таймаут закрытия соединения при остутствии радиус пакетов (не складывается с connection.suspend.timeout) connection.close.timeout=900 # При закрытии соединения по таймауту, 0 (по умолчанию) - просто закрыть, # 1 - попытаться сбросить также на NAS'е (вызвать connectionClose у обработчика активации сервисов) #connection.close.timeout.forceClose=1 # Атрибуты, выдаваемые при авторизации по реалму default (default - реалм по умолчанию) radius.realm.default.attributes= # Коды ошибок, при которых отвечать Access-Accept в состоянии disable (rejectToAccept) radius.disable.accessCodes= # Какие адреса выдавать при ответе Access-Accept в состоянии disable: # 0 (по умолчанию) - из radius.disable.ipCategories, 1 - так же, как если бы не было ошибки (в том числе привязанные к сервису в договоре) #radius.disable.mode=0 # Атрибуты, выдаваемые при ответе Access-Accept в состоянии disable radius.disable.attributes= # Id фиктивного сервиса, к которому будут привязываться сессии, по которым нормальный сервис не был найден (код ошибки: 1, логин не найден). # Необходим, если в radius.disable.accessCodes присутствует код 1 #radius.disable.servId= # Атрибуты, при наличии которых соединение должно считаться в состоянии DISABLE (т.е. с ограниченным доступом) #radius.disable.pattern.attributes= # Вендор атрибута, где хранится MAC-адрес #radius.macAddress.vendor=9 # Код атрибута, где хранится MAC-адрес #radius.macAddress.type=1 # Префикс атрибута (если есть), где хранится MAC-адрес. Например, для cisco avpair #radius.macAddress.prefix=client-mac-address= # Режим поиска сервиса: 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 # Нужно ли проверять пароль: 0 - нет, 1 (по умолчанию) - да. #radius.password.verification=1 # Проверка на повторную аутентификацию при Access-Request. Бывает нужна в случаях, когда NAS сбрасывает (теряет) сессию, но # Stop-пакет не присылает и клиент пытается подключиться повторно, но у него стоит ограничение на максимум одну сессию. При совпадении # callingStationId с одной из активных сессий и установленным параметром: 1 - осуществляется попытка закрытия старой сессии (connectionClose), # 2 - попытка закрытия сессии (connectionClose) и завершение ее в базе, не дожидаясь стоп пакета, 3 - завершение в базе. #radius.connection.checkDuplicate=0 # Нужно ли убирать домен перед поиском сервиса по логину из поля User-Name. По умолчанию - да (1). # Следует отключить, если при посылке CoA и PoD пакетов NAS'у необходим атрибут User-Name. radius.username.removeDomain=1 # Нужно ли убирать пробелы из поля User-Name перед поиском логина. По умолчанию - нет (0). # Следует отключить, если при посылке CoA и PoD пакетов NAS'у необходим атрибут User-Name. #radius.username.removeWhitespace=0 # Должен ли поиск по логину идти без учета регистра. По умолчанию - нет (0). #radius.username.ignoreCase=0 # Включение (1, по умолчанию) или отключение (0) проверки пароля для NAS'а #radius.password.verification=1 # Шаблон вывода ошибки в мониторе с использованием атрибутов из RADIUS-пакета #radius.accessError.infoPattern=LOGIN:$User-Name # Привязка кодов опций модуля к атрибутам # данные атрибуты будут выдаваться в AccessAccept при удачной авторизации и при наличии активных опций в тарифе или сервисе radius.inetOption.1.attributes= radius.inetOption.2.attributes= radius.inetOption.3.attributes= # Параметры активации сервисов # длина паузы, если возникла ошибка #sa.error.pause=60 # количество заданий за раз #sa.batch.size=20 # время (сек) ожидания завершения всех заданий (при асинхронной работе) #sa.batch.wait=5 # пауза (сек) после обработки заданий #sa.batch.pause=0 # время (сек) ожидания новой задачи перед вызовом disconnect. #sa.batch.waitNext=5 # Параметры обработчика активации сервисов # откуда при отправке CoA брать атрибуты опций (по умолчанию - те же атрибуты, что выдаются при удачной авторизации) #sa.radius.option.attributesPrefix=nas.radius.inetOption. #sa.radius.connection.attributes=NAS-Port, Acct-Session-Id, User-Name, Framed-IP-Address, NAS-IP-Address, NAS-Identifier # атрибуты CoA-запроса для прекращения доступа (используется при sa.radius.connection.withoutBreak=1) #sa.radius.disable.attributes={@radius.disable.attributes} # фиксированные атрибуты, добавляемые в запрос перед отправкой CoA #sa.radius.coa.attributes= # добавлять ли при отправке CoA-атрибуты реалма (для default - из radius.realm.default.attributes) #sa.radius.realm.addAttributes=0 # фиксированные атрибуты, добавляемые в запрос перед отправкой PoD #sa.radius.pod.attributes=