Для обеспечения работы клиентов, подключаемых через авторизацию по протоколу EAP (в первую очередь, Wi-Fi клиентов с RADIUS-авторизацией через EAP/MSCHAPv2) был создан модуль интеграции биллигна NETAMS4 со сторонним популярным RADIUS-сервером FreeRADIUS.

Данный функционал доступен с релиза NETAMS 4.0.1522 (03 марта 2013).

Модуль оформлен в виде источника данных типа FreeRadiusDataSource, который добавляется как и другие источники данных. Настроек не содержит, кроме параметра interim_interval (в минутах), который инструктирует FreeRADIUS передавать анформацию об аккаунтинге (статистике по трафику) каждые N минут.

Источник данных не имеет никакого отношения к другому, существующему источнику данных типа LocalJustRadius, который использует собственный RADIUS-сервер, и предназначен для VPN-подключений. 

FreeRadiusDataSource работает с внешним сервером FreeRADIUS через внутренний сервис MonitorResponderEngine, и скрипт-связку netams4-freeradius-bridge.pl (можно взять здесь)

Применение

Данный тип источника данных должен применяться для обеспечения работы пользователей в сети передачи данных, где доступ клиентов осуществляется при авторизации RADIUS-сервером, в частности при использовании беспроводного радио-доступа (Wi-Fi), авторизации через пару "логин-пароль" (PEAP/EAP-MSCHAPv2). Клиенты (саппликанты) для такой авторизации встроены в подавляющее большинство современный WiFi-устройств. Данный метод проверен на клиентах (ПК Windows, устройства iOS) и беспроводной сети на базе точек доступа Ubiquiti UniFi, но должен работать при применении любых других точек доступа, поддерживающих (автономно, или через контроллер) авторизацию по RADIUS (802.1x).

Предварительные требования

Для того, чтобы авторизация работала нормально, вам необходимо настроить беспроводную сеть, убедиться в ее работе при WPA/WPA2 PSK (Personal) авторизации, затем настроить авторизацию в данной сеть через FreeRADIUS и локальную базу пользователей (/etc/freeradius/users). В биллинге NETAMS необходимо создать соответствующие записи о:

Необходимо создать и запустить источник данных FreeRadiusDataSource, и настроить соответствующую связку с FreeRADIUS и DHCP (ниже)

Механика работы

Беспроводной клиент (ноутбук) при подключении к беспроводной сети через встроенный саппликант производит авторизацию с FreeRADIUS-сервером, передавая указанные в настройках логин-пароль. FreeRADIUS согласно своим настройкам запускает скрипт-связку netams4-freeradius-bridge.pl, который получает все текущие атрибуты (в том числе имя (логин) пользователя), упаковывает их в MIME64, отправляет в сторону процесса NETAMS/jserver запрос (аналогично клиенту n4ctl, через локальный UDP-сокет, порт 20003). 

Запрос на стороне NETAMS4/jserver получается службой MonitorResponderEngine, которая выполняет следующие действия:

Источник данных для операции запроса авторизации (authorization) проверяет наличие какой-либо активной услуги, ассоциированной с пришедшим параметром username. Имя проверяется либо по указанному в параметрах контракта логину (web username), либо по отдельно указанному имени доступа к услуге (для тех услуг, которые это предусматривают в своих параметрах). Если имя найдено, то авторизация возвращает обратно по цепочке FreeRadiusDataSource - MonitorResponderEngine - netams4-freeradius-bridge.pl - FreeRADIUS открытый пароль для данного логина (открытый-потому что он используется при построеннии ответа NTLM в сторону саппликанта). Если логин не найден, либо услуга с данным логином уже активна (дабы предотвратить множественные подключения под одним логином), возвращается состояние ошибки, и продолжение авторизации клиента оканчивается неудачей. 
Для данных аккаунтинга (start) происходит прописывание MAC-адреса абонента в параметры учетного объекта (acctunit). Внимание: поскольку беспроводная сеть работает на уровне 2, информации об IP-адресе клиента данные от RADIUS-сервера не содержат! Для аккаунтинга (update) происходит передача статистики (счетчиков) трафика в биллинг. Внимание: у оборудования Ubiquiti UniFi аккаунтинг сломан и всегда передает неправильные значения. Для завершения аккаунтинга (stop) происходит обнуления параметров MAC и IP address учетного объекта, и дополнительно оповещение ядра биллинга о событии LOGOFF.
Как вы обратили внимание, в данной схеме информация об IP-адресе абонента в биллинг не передается. Это связано с тем, что адрес абонент получает уже после того, как прошла авторизация в беспроводной сети, и беспроводная сеть (и соответственно FreeRADIUS с источником данных) об адресе не знают. Так как адрес абонент получает по DHCP, есть возможность совершить действие при назначении адреса DHCP-сервером (при использовании ISC DHCPD), а именно уведомить ядро биллинга о таком назначении. Для этого вызывается утилита n4ctl с параметром setip и MAC-и IP-адресом абонента; при получении данной информации биллинг ищет в списке учетных объектов соответствующий данному MAC-адресу (только что прописан через RADIUS ACCT сообщение), и прописывает динамический IP адрес абонента, заодно вызывая событие LOGIN в ядре биллинга.

Настройка

Устанавливаем FreeRADIUS (из пакетов, или как удобно). Прописываем устройства доступа (NAS) в конфигурации /etc/freeradius/clients.conf - указываем IP-адрес или адреса RADIUS-клиентов (точек доступа или контроллера), пароль.

Прописываем вызов модуля perl для процедуры внутренней авторизации (секция authorization) в EAP-туннеле (inner-tunnel). Убеждаемся, что mschap и eap там тоже есть.   

Прописываем вызов модуля perl для процедуры аккаунтинга (секция accounting) в общем конфиге (default). 

Прописываем вызов скрипта netams4-freeradius-bridge.pl в настройках модуля PERL-интеграции (modules/perl) вместо базового example.pl.

Поскольку FreeRADIUS при запуске нашего Perl-скрипта использует прекомпиляцию и библиотеку libperl, убеждаемся что библиотека доступна. Например, для Debian Linux необходимо в начало файла /etc/default/freeradius дописать параметр 

LD_PRELOAD=/usr/lib/libperl.so.5.10
export LD_PRELOAD

Создаем и включаем источник данных FreeRadiusDataSource

Для того, чтобы DHCP-сервер сообщал биллингу о присвоении IP-адреса, добавляем следующие строки в /etc/dhcp/dhcpd.conf в секцию subnet { ... }

on commit {
   set clip = binary-to-ascii(10, 8, ".", leased-address);
   set clhw = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
   execute("/usr/local/netams4/jserver/bin/n4ctl", "setip", "commit", clip, clhw);
}

Запускаем FreeRADIUS с ключом -X, клиентом пробуем подключиться к радиосети, смотрим в netams4/logs/jserver.log :

2013-03-06 10:18:33,535 DEBUG [monitor_responder] com.netams.netams4.datasource.FreeRadiusDatasource - RAD_AUTH: authenticated user 'user' having SE=1
2013-03-06 10:18:33,547 DEBUG [monitor_responder] com.netams.netams4.datasource.FreeRadiusDatasource - RAD_AUTH: authenticated user 'user' having SE=1
2013-03-06 10:18:33,560 DEBUG [monitor_responder] com.netams.netams4.datasource.FreeRadiusDatasource - RAD_AUTH: authenticated user 'user' having SE=1
2013-03-06 10:18:33,587 INFO [monitor_responder] com.netams.netams4.datasource.FreeRadiusDatasource - RAD_ACCT START user='user' AU id=1 Wireless, SET MAC to '98:fe:94:9b:38:58'
2013-03-06 10:18:34,971 INFO [RMI TCP Connection(10)-172.16.130.80] com.netams.netams4.RPCBridgeEngine - CAJO collection_subset [q='mod_name=backup_restore and mod_key=sys and attribute_name=root_url', 1, 1, unidata]
2013-03-06 10:18:34,973 INFO [RMI TCP Connection(10)-172.16.130.80] com.netams.netams4.RPCBridgeEngine - CAJO collection_subset [q='mod_name=backup_restore and mod_key=sys and attribute_name=root_url', unidata] returns=1
2013-03-06 10:18:35,139 INFO [RMI TCP Connection(10)-172.16.130.80] com.netams.netams4.RPCBridgeEngine - CAJO authservice_getinfo [10.1.1.11]
2013-03-06 10:18:36,108 DEBUG [monitor_responder] com.netams.netams4.MonitorResponderEngine - setip: cmd=commit, IP=10.1.1.11, MAC=98:fe:94:9b:38:58
2013-03-06 10:18:36,109 DEBUG [monitor_responder] com.netams.netams4.MonitorResponderEngine - setip: notified au=1, set ip to 10.1.1.11
2013-03-06 10:18:36,109 DEBUG [monitor_responder] com.netams.netams4.BillingEngine - billing_notify_datasource LOGIN, AU=1, ip=10.1.1.11, DS=0, rule=[128kbit]
2013-03-06 10:18:36,192 DEBUG [datasource] com.netams.netams4.datasource.ScriptCallDatasource - DS:2, CMD: 'LOGIN 10.1.1.11 32 1 '128kbit' 1362550716', state=0
2013-03-06 10:26:58,665 INFO [monitor_responder] com.netams.netams4.datasource.FreeRadiusDatasource - RAD_ACCT STOP user='user' AU id=1 Wireless, CLEAR MAC from '98:fe:94:9b:38:58' and IP from 10.1.1.11
2013-03-06 10:26:58,665 DEBUG [monitor_responder] com.netams.netams4.BillingEngine - billing_notify_datasource LOGOUT, AU=1, ip=10.1.1.11, DS=0, rule=[]
2013-03-06 10:26:58,752 DEBUG [datasource] com.netams.netams4.datasource.ScriptCallDatasource - DS:2, CMD: 'LOGOUT 10.1.1.11 32 1 '' 1362551218', state=0

 

Если все нормально, запускаем FreeRADIUS в нормальном режиме.