Покопался я в очередной раз с FreeRadius-ом версии 3 - голова болит, протрахался хз сколько часов, даже в исходники лез. И вот какие замечания:
1) Хочу сначала отметить, что в конфиге Cell-а авторизация принимается всегда, даже если неправильный пароль. У него такая схема, но я думаю большинству это не подходит. Я нашел причину, почему не получилось проверить пароль - новый радиус в ответе процедуры radcheck требует :=, а не ==
2) В процедуре атрибут Password меняется на Cleartext-Password - это уже упоминалось, просто отмечу еще раз
3) Обнаружилось идиотское поведение freeradius3: он делает radcheck, затем radreply и потом проверяет пароль. Никуда не годится проверять пароль после того, как для учетки будет запрошен динамический ip, а в итоге выдан чужаку не будет. Поэтому пришлось проверять пароль и в radreply (добавлен параметр "пароль" - слава богу, он есть в параметрах радиуса)
4) Чтобы mpd5 получил корректные ответы радиуса на эккаунтинг нужно чтобы radupdate заапдейтило как минимум одну строку в базе. Лол. Мы делаем тупой запрос: UPDATE users SET id=usr_id WHERE id=usr_id LIMIT 1, который по сути ничего не делает, но без него mpd5 будет постоянно рвать сессии.
5) Чтобы в accounting секции шло разделение на start и stop запросы - нужно вставить строку:
reference = "%{tolower:type.%{Acct-Status-Type}.query}"
6) По ходу выяснилось, что mpd уже (ура) может принимать кое-какие атрибуты в аккаунтинге. Теперь можно, например скорость менять (для NoDeny это не нужно, он фаерволом режет) прямо на ходу. Но главное мы можем кильнуть юзера без COA. Зачем килять? А например, если мы видим, что юзеру поменяли ip. Тогда он переконнектится и получит новый. Собственно из-за этой проблемы смены ip и была немного долюанутая схема, что в radupdate NoDeny игнорит ip от радиуса и вычисляет свой. Теперь все будет проще и надежней
7) Я голову сломал, но так и не понял как можно в радиусе через sql модуль передать атрибуты из radreply (думаю никак). Поэтому в самом конфиге делаю проверку if( %{sql: проверяем привязан ли еще ip к юзеру}) { дропаем сессию }. Для дропа сессии надо атрибуты в словарь радиуса добавить (в доке отразил это)
8 ) Заюзал radstop чтоб авторизация удалялась сразу после дисконнекта, а не по таймауту как раньше (сделано было из-за того, что в этом случае не велся лог авторизаций). Сразу удалять авторизации нужно для того чтобы контролить параллельные сессии (не давать двум юзерам сидеть под одним логином). Кстати я уже получил более-менее рабочий вариант, но надо еще тестить. Да и radstop под конец изменилась и у меня уже нет сил ее тестить (возможно в доке не рабочая), завтра.
Дока