Собсно ничего сложного в этом нет.
Настройка Radius+MySQL стандартна:
apt-get install freeradius freeradius-mysql mysql-server |
добавить базу, залить таблички из /etc/freeradius/sql/mysql/schema.sql
подключаем базу к freeradius правя /etc/freeradius/sql.conf
и раскомментируя загрузку модуля sql.conf в radiusd.conf
раскоментируем модуль sql в /etc/freeradius/sites-enabled/default
(или в том, что используется) в секциях authorize authenticate и прочих закомментированных местах (мануалов тысяча, даже чуть больше), все стандартно.
Добавляем клиента в clients.conf - nastype=other
добавляем в табличку radcheck:
> insert into radcheck (username,attribute,op,value) values ('test', 'Cleartext-Password', ':=', '123123');
запускаем
# freeradius -X
проверяем в другой консоли
# radtest test 123123 localhost 1812 testing123
Если не получилось - думаем где накосячили, читаем другием мануалы.
Hotspot на микротике устанавливается мастером в три клика, тоже ничего сложного.
добавляем radius сервер в /radius, отмечаем его как service hotspot, пароль из clients.conf итд.
В профиле hotspot-сервера включаем use-radius radius-accounting
Радиус должен подхватиться и тестовый пользователь должен логиниться.
Всякие хитрые и постоянные аттрибуты (вроде rate-limit) можно невозбранно подсмотреть тут: https://www.mikrotik.com/testdocs/ros/2.9/guide/aaa_radius.php и добавить к соответсвующему пользователю в табличке radreply;
А вот с переменными - немного шаманства.
Например, есть у микротика параметр Mikrotik-Xmit-Limit - Download-лимит пользователя, при достижении которого сессия завершается. Но если поставить его постоянным - пользователь перелогинивается (а если включены куки, даже не замечает этого) и продолжает работать. Посему будем считать и выдавать нужное.
добавляем новый параметр в /etc/freeradius/dictionary (если его нет):
например так:
ATTRIBUTE Mikrotik-Xmit-Limit 3001 integer ATTRIBUTE Download-Limit 3002 integer
включаем в radiusd.conf счетчики раскоментировав
$INCLUDE sql/mysql/counter.conf
и добавляем в него счетчик:
sqlcounter downloadcounter { counter-name = Download-Limit-Total check-name = Download-Limit reply-name = Mikrotik-Xmit-Limit sqlmod-inst = sql key = User-Name reset = never query = "SELECT ifnull(SUM(acctoutputoctets),0) FROM radacct WHERE username='%{%k}'" }
здесь:
check-name - тот самый параметр который нужно добавить (или найти в словарях подходящий)
reply-name - сильно шаманское поле - из пользовательского аттрибута вычетается значение счетчика и возвращается под этим именем в ответе
query как не сложно догадаться - собсно запрос. Проверка вот тут не очень, нужна - но бывает что потребуется: если запрос возвращает NULL (например в базе нет записей по этому отбору) freeradius переисполненный радостью этого события проигнорирует счетчик.
Подключаем модуль счетчика в секции authorize
Ну и добавляем check-аттрибут:
> insert into radcheck (username,attribute,op,value) values ('test', 'Download-Limit', ':=', '1000000');
А дальше всё - если ничего не забыл, должно работать.
P.S.
На ошибки в атрибутах SQL таблиц FreeRAIDUS реагирует вполне однозначно: он их игнорирует. Поэтому, если сани не едут,
первое что нужно сделать - это перенести пользователя в файловую базу данных (users)
test Cleartext-Password := "123", Download-Limit := 100000
если аттрибут не найден в справочниках, FreeRADIUS ругнется и незапустится (invalid octet string ... for attribute)