CoA — Change of Authorization — это оповещения от Radius-сервера о том, что свойства пользователя поменялись или что пользователь стал неавторизованным. CoA-Request нотификация говорит о том, что пользователь авторизован и, опционально, у него изменились некоторые параметры. Таким образом, CoA-Request может приходить в следующих случаях:
Виды СоА:
Access-Request
на Radius-сервер, как описано ранее.CoA-Request
может содержать полный список изменившихся атрибутов пользователя.CoA-Request
может содержать полный список изменившихся атрибутов пользователя, предлагается использовать упрощенный вариант этой нотификации. Такой вариант говорит fastDPI, что атрибуты пользователя изменились и требуется повторная авторизация. Получив такое оповещение, fastDPI шлет обычный запрос Access-Request
на Radius-сервер, как описано ранее.
CoA-Request
содержит следующие атрибуты:
Service-Type=8
(Authenticate-Only).User-Name
— имя (логин) пользователя. Framed-IP-Address
, Framed-IPv6-Address
, Framed-IPv6-Prefix
— IPv4 или IPv6-адрес абонента.VasExperts-L2-SubsId
— идентификатор L2-абонента.
Предпочтительным идентификатором абонента в CoA является его логин.
При обработке CoA fastDPI ищет абонента по логину (User-Name
или VasExperts-UserName
), если логин не найден — это ошибка.
Если логин не указан в CoA, абонент ищется по IP-адресу.
Если в CoA задан и логин, и IP-адрес, — IP-адрес игнорируется: fastDPI не анализирует, связаны ли логин и IP-адрес в базе данных UDR.
[СКАТ 7.5+] Начиная с версии СКАТ 7.5, возможно указывать атрибут Acct-Session-Id
в качестве идентификатора абонента.
СКАТ ищет по Acct-Session-Id
IP-адрес абонента у себя во внутренней БД и в случае успеха — формирует внутренний запрос реавторизации по IP.
Acct-Session-Id
является наиболее "слабым" из идентификаторов: он принимается во внимание только тогда, когда в CoA-запросе не указан ни логин, ни IP-адрес.
[СКАТ 8.3+] Вместо атрибута User-Name
можно указать логин абонента в атрибуте Chargeable-User-Identity
(CUI). Чтобы СКАТ поддержал CUI, необходимо в fastpcrf.conf указать
radius_attr_cui=1
Согласно RFC5176, на CoA-Request с Service-Type=8 (Authenticate-Only) должен быть ответ CoA-NAK с атрибутом Error-Cause=507 (Request Initiated). Это не всегда удобно, так как некоторые утилиты (например, radclient из FreeRadius)
трактуют ответ CoA-NAK как ошибку.
FastPCRF имеет настроечный параметр coa_reauth_ack
, который определяет, как отвечать на CoA-Request с Service-Type=8:
Этот параметр может быть задан в fastpcrf.conf как глобально, для всех Radius-серверов, так и для каждого Radius-сервера:
# глобальная настройка coa_reauth_ack=0 # для этого сервера применяется глобальная настройка coa_reauth_ack=0 radius_server=mysecret1@192.168.10.10%eth0 # а для этого явно задано coa_reauth_ack=1 radius_server=mysecret2@192.168.20.10%eth0;coa_reauth_ack=1
Хотя нотификация CoA-Request и поддерживается fastPCRF, но не рекомендуется к использованию из-за потенциальной сложности реализации: она должна содержать только изменения атрибутов (списка услуг и пр.) абонента.
Для авторизованного пользователя нотификация CoA-Request содержит только изменения параметров пользователя;
поддерживаются следующие атрибуты:
VasExperts-UserName
, Chargeable-User-Identity
(CUI), User-Name
.Framed-IP-Address
, Framed-IPv6-Address
, Framed-IPv6-Prefix
— IPv4/IPv6-адрес; этот атрибут применяется только для поиска абонента, если логин не задан.VasExperts-Multi-IP-User
— задает изменение признака, один или много IP-адресов связано с данным пользователем. Если пользователь становится многоадресным (то есть с одним пользователем может быть связано много IP-адресов), данный атрибут должен быть установлен в 1. Если пользователь становится одноадресным — данный атрибут должен быть установлен в 0. Если признак multi-IP
пользователя не изменяется, CoA-Request не должен содержать атрибут VasExperts-Multi-IP-User
. Допустимо не более одного данного атрибута в CoA-Request.VasExperts-Policing-Profile
— имя профиля полисинга для пользователя. Данный атрибут должен включаться только если изменился профиль полисинга пользователя. В CoA-Request допустимо не более одного атрибута VasExperts-Policing-Profile
. Если требуется удалить профиль полисинга у клиента, то следует послать атрибут VasExperts-Policing-Profile
с пустым значением (с пустой строкой).VasExperts-Policing-Profile=<n/a>
.VasExperts-Enable-Service
— задает изменение статуса услуги: подключена (on) или отключена (off). В CoA-Request указываются все услуги, статус подключения которых изменился. Если какая-то услуга не содержится в CoA-Request, это значит, что статус её "подключенности" не изменился для пользователя. Каждая сменившая статус услуга должна задаваться отдельным атрибутом VasExperts-Enable-Service
, то есть CoA-Request может содержать ноль или более атрибутов VasExperts-Enable-Service
.VasExperts-Service-Profile
— задает имя нового профиля услуги (то есть набор параметров услуги). Если данная услуга отключена, она включается (то есть VasExperts-Service-Profile
имеет более высокий приоритет, чем VasExperts-Enable-Service
). Для того чтобы отключить услугу с профилем, следует задать для неё атрибут VasExperts-Enable-Service
со значением "off" (например, для услуги 5: VasExperts-Enable-Service="5:off"
). Каждое изменение имени профиля услуги задается отдельным атрибутом VasExperts-Service-Profile
, то есть CoA-Request может содержать ноль или более атрибутов VasExperts-Service-Profile
.Session-Timeout
— опциональный атрибут, задает время действия авторизации в секундах. Значение 0 игнорируется. По истечении этого времени статус авторизации пользователя устанавливается в "неизвестен", что приводит к отправке запроса на авторизацию Access-Request.
Нотификация Disconnect-Request
сигнализирует о том, что пользователь стал неавторизованным (например, закончились средства на счете). Нотификация Disconnect-Request может содержать следующие атрибуты:
Framed-IP-Address
, Framed-IPv6-Address
, Framed-IPv6-Prefix
— IPv4 или IPv6-адрес абонента.VasExperts-UserName
, Chargeable-User-Identity
(CUI), User-Name
.Acct-Session-Id
— идентификатор accounting-сессии. По этому идентификатору СКАТ ищет у себя во внутренней БД IP-адрес, связанный с данной accounting-сессией.VasExperts-L2-SubsId
— идентификатор L2-абонента.При получении Disconnect-Request СКАТ:
Флаги опции bras_dhcp_disconnect
используются для обеспечения гибкости в обработке PoD, так как между PoD и реавторизацией DHCP Discover от клиента может пройти достаточно много времени (max lease time / 2) и трафика:
disable acct stop
, не посылать немедленно acct stop
для disconnected
DHCP-абонента. Позволяет учитывать трафик после PoD. По умолчанию acct-сессия закрывается по PoD, что может привести к неучтенному трафику для DHCP-абонентов от момента PoD до DHCP-реавторизации. disable L3 auth
, не выполнять L3-авторизации для disconnected
DHCP-абонента. СКАТ может авторизовать L2-абонента по его IP-адресу при поддержке Radius.block traffic
— блокируем весь трафик от disconnected
абонента (то есть на пути subs → inet
). Попытка сократить время реавторизации: многие CPE при пропадании соединения в Интернет досрочно шлют DHCP. Но цена этого флага — разрыв всех существующих сессий абонента. Эта опция покрывает следующие случаи:
bras_dhcp_disconnect=0
(default, как сейчас):
=1
: ожидание DHCP-запроса от абонента без блокировки трафика, c L3 auth, без acct stop
=2, 3
: ожидание DHCP-запроса от абонента без блокировки трафика, без L3 auth
=4, 5
: ожидание DHCP-запроса от абонента с блокировкой трафика, L3 enabled. То есть пакеты от абонента блокируются, но L3 auth по ним производится
=6, 7
: (2 + 4) ожидание DHCP-запроса от абонента с блокировкой трафика, L3 disabled
=8, 9
: ожидание DHCP-запроса от абонента без блокировки трафика, L3 auth enabled
=10, 11
: (2 + 8) ожидание DHCP-запроса от абонента без блокировки трафика, L3 auth disabled
=12, 13
: (4 + 8) ожидание DHCP-запроса от абонента с блокировкой трафика, L3 auth enabled. То есть пакеты от абонента блокируются, но L3 auth по ним производится
=14, 15
: (2 + 4 + 8) ожидание DHCP-запроса от абонента с блокировкой трафика, L3 auth disabled
=16, 17
: ожидание DHCP-запроса от абонента без блокировки трафика, L3 auth enabled
=18, 19
: (2 + 16) ожидание DHCP-запроса от абонента без блокировки трафика, L3 auth disabled
=20, 21
: (4 + 16) ожидание DHCP-запроса от абонента с блокировкой трафика, L3 auth enabled. То есть пакеты от абонента блокируются, но L3 auth по ним производится
=22, 23
: (2 + 4 + 16) ожидание DHCP-запроса от абонента с блокировкой трафика, L3 auth disabled
Все остальные значения bras_dhcp_disconnect
являются ошибкой.
В некоторых конфигурациях CoA-клиент, посылающий CoA-запросы Disconnect-Request и CoA-Request, может быть отдельной сущностью, не являющейся Radius-сервером. Например, это может быть некая утилита, умеющая формировать CoA-запросы и применяющаяся в скриптах. FastPCRF поддерживает такие "обособленные" CoA-клиенты. В конфигурационном файле fastpcrf.conf каждый такой CoA-клиент задается отдельным параметром "coa_client", имеющим формат, аналогичный параметру radius_server
:
coa_client=secret@ip%dev:port{;param=value}*
secret
— секрет Radius;ip
— IP-адрес CoA-клиента;dev
(необязательный) — имя интерфейса, на котором слушать входящие запросы; если не задан — интерфейс выбирается операционной системой;port
— слушаемый локальный порт;param=value
— перечень (через точку с запятой) конфигурационных параметров для данного CoA-клиента. Поддерживаются параметры: max_resend_count
, msg_auth_attr
, coa_resend_timeout
.
Каждый CoA-клиент описывается в conf-файле отдельным параметром coa_client
.
Всего может быть до 16 обособленных CoA-клиентов.
FastPCRF принимает CoA-запросы только от зарегистрированных (описанных в conf-файле) Radius-серверов и CoA-клиентов. Если Radius-сервер поддерживает CoA, нет необходимости описывать его ещё и параметром coa_client
, — достаточно для этого Radius-сервера указать опцию coa_port
в параметре radius_server
.
[СКАТ 8.2] Добавлена возможность запроса сторонней системой состояния accounting-сессии.
Эта возможность реализована через CoA-Request с атрибутом VasExperts-Command-Code=1
.
[СКАТ 8.3] В связи с поддержкой мульти-сессий изменились логика работы и CoA-ответы.
CoA-Request со следующими атрибутами проверит, существует ли указанная accounting-сессия:
VasExperts-Command-Code=1
Acct-Session-Id=A1B2C3D4E5F6
В случае успеха возвращается CoA-ACK с указанием IP-адреса, к которому эта сессия относится:
# CoA-ACK атрибуты: VasExperts-Command-Code=1 Acct-Session-Id=A1B2C3D4E5F6 # СКАТ-8.3: добавился атрибут ID мульти-сессий Acct-Multi-Session-Id=MA1B2C3D4E5F6 # СКАТ-8.3: добавился атрибут NAS-IP-Address - каким fastDPI создана сессия NAS-IP-Address=192.168.0.200 Framed-IP-Address=192.168.10.20
Если указанной сессии не существует (или она неактивна, например, завершена по idle timeout), возвращается CoA-NAK с атрибутами:
# CoA-NAK атрибуты: VasExperts-Command-Code=1 Acct-Session-Id=A1B2C3D4E5F6 Error-Cause=503 # Session Context not found # Атрибут Error-Cause может принимать и другие значения.
Можно запросить у СКАТ идентификатор активной accounting-сессии для данного IP-адреса. Структура запроса отличается для случаев "один fastPCRF — один fastDPI" и "один fastPCRF — несколько fastDPI".
Для случая "один fastPCRF — один fastDPI" CoA-Request выглядит так:
VasExperts-Command-Code=1
Framed-IP-Address=192.168.10.20
Для случая "один fastPCRF — несколько fastDPI" в CoA-Request нужно указать, какой fastDPI нас интересует:
# CoA-ACK атрибуты VasExperts-Command-Code=1 Framed-IP-Address=192.168.10.20 # СКАТ-8.3: какой сервер fastDPI NAS-IP-Address=192.168.0.200
В принципе, атрибут NAS-IP-Address
(или NAS-Identifier
) можно не указывать, если вы уверены, что данный IP-адрес есть только на одном fastDPI.
Если для указанного IP-адреса есть активная accounting-сессия, СКАТ вернет CoA-ACK с идентификатором сессии:
# CoA-ACK атрибуты VasExperts-Command-Code=1 Framed-IP-Address=192.168.10.20 Acct-Session-Id=A1B2C3D4E5F6 # СКАТ-8.3: добавился атрибут ID мульти-сессий Acct-Multi-Session-Id=MA1B2C3D4E5F6 # СКАТ-8.3: добавился атрибут NAS-IP-Address - каким fastDPI создана сессия NAS-IP-Address=192.168.0.200
Если активной сессии нет или же её нет на указанном fastDPI, вернется CoA-NAK вида:
# CoA-NAK атрибуты VasExperts-Command-Code=1 Framed-IP-Address=192.168.10.20 Error-Cause=503 # Session Context not found # Атрибут Error-Cause может принимать и другие значения.
Command-Code=1
— поиск acct session по IP.Framed-IPv6-Prefix
или Delegated-IPv6-Prefix
. В ответе команды указываются все известные IP-адреса найденной acct-сессии — Framed-IP-Address
, Framed-IPv6-Prefix
, Delegated-IPv6-Prefix
.
[СКАТ 8.3] Можно по идентификатору мульти-сессии узнать, какому IP-адресу она соответствует и какая активная сессия у него есть для указанного fastDPI:
# Атрибуты CoA-Request VasExperts-Command-Code=1 Acct-Multi-Session-Id=MA1B2C3D4E5F6
Если данная мульти-сессия найдена, СКАТ вернет IP-адрес, который соответствует данной мульти-сессии. В случае, если у мульти-сессии есть только одна активная сессия, вернется CoA-ACK:
# CoA-ACK атрибуты VasExperts-Command-Code=1 Framed-IP-Address=192.168.10.20 Acct-Session-Id=A1B2C3D4E5F6 Acct-Multi-Session-Id=MA1B2C3D4E5F6 # каким fastDPI создана сессия NAS-IP-Address=192.168.0.200
Если нет активной сессии или же их более одной, вернется CoA-NAK с указанием IP-адреса абонента:
# CoA-NAK атрибуты VasExperts-Command-Code=1 Acct-Multi-Session-Id=MA1B2C3D4E5F6 Framed-IP-Address=192.168.10.20 Error-Cause=503 # Session Context not found # Атрибут Error-Cause может принимать и другие значения.
Можно в CoA-Request указать, какой fastDPI нас интересует:
# Атрибуты CoA-Request VasExperts-Command-Code=1 Acct-Multi-Session-Id=MA1B2C3D4E5F6 NAS-IP-Address=192.168.0.200
В этом случае СКАТ вернет IP-адрес абонента и ID сессии, если для данного fastDPI есть активная сессия:
# CoA-ACK атрибуты VasExperts-Command-Code=1 Framed-IP-Address=192.168.10.20 Acct-Session-Id=A1B2C3D4E5F6 Acct-Multi-Session-Id=MA1B2C3D4E5F6 # каким fastDPI создана сессия NAS-IP-Address=192.168.0.200
Если активной сессии для указанного fastDPI нет, СКАТ вернет CoA-NAK:
# CoA-NAK атрибуты VasExperts-Command-Code=1 Acct-Multi-Session-Id=MA1B2C3D4E5F6 NAS-IP-Address=192.168.0.200 Framed-IP-Address=192.168.10.20 Error-Cause=503 # Session Context not found # Атрибут Error-Cause может принимать и другие значения.