Mikrotik hotspot + Radius + счетчики (трафика?)

Собсно ничего сложного в этом нет.
Настройка 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)

Добавить комментарий