Freeradius показывает неправильное количество онлайн-пользователей по сравнению с NAS

Сценарий: Сервер Freeradius 2.2.8 в качестве биллинговой системы на Ubuntu Server, NAS — Mikrotik Router ccr1036 v 6.42.4

Проблема: на NAS я вижу 900 активных/онлайн-пользователей, тогда как на freeradius я вижу 500 сеансов (где время acctstop равно NULL)

Я использую следующий запрос для расчета количества онлайн-пользователей в FR.

mysql -uroot -s -e "use radius; select * from radacct  WHERE acctstoptime IS NULL;" |wc -l

Я попытался отключить всех пользователей на NAS, очистить все сеансы от freeradius, пользователи переподключаются нормально, но количество пользователей на NAS и freeradius все равно не совпадает. Что я должен проверить?


person iBBi    schedule 10.07.2018    source источник


Ответы (1)


Это фундаментальная проблема с тем фактом, что RADIUS является протоколом с потерями. Если пользователь выходит из сети и по какой-то причине сервер RADIUS не получает пакет Acct-Status-Type=Stop, сеанс будет навсегда помечен как открытый.

Если вы используете SQL-запросы из FreeRADIUS v3, вы увидите, что они имеют поле AcctUpdateTime. В этом поле AcctUpdateTime устанавливается значение NOW() каждый раз при изменении сеанса.

https://github.com/FreeRADIUS/freeradius-server/blob/v3.0.x/raddb/mods-config/sql/main/mysql/queries.conf#L332

Это поле предназначено для облегчения входа внешних сценариев и исправления сеансов, которые явно устарели, путем просмотра даты последнего обновления сеанса.

Если вы хотите исправить это, я бы либо обновился до FreeRADIUS v3.0.x (2.2.8 уже некоторое время не поддерживается), либо использовал схему и запросы v3.0.x (в основном они должны работать ).

Затем просто запускайте запрос каждые 10 минут, чтобы обновить строки с NULL AcctStopTime, где разница между NOW() и AcctUpdateTime составляет > <NAS Interim Interval> * 2, установив AcctStopTime на NOW().

Чтобы это работало, на вашем NAS должны быть включены промежуточные обновления. Это Accounting-Requests, которые периодически отправляются с NAS для обновления таких вещей, как счетчики трафика, но в этом случае их также можно использовать в качестве полезных сообщений пульса.

Если вы не можете понять, где на вашем NAS находится параметр статической конфигурации для этого, иногда его можно включить, вернув атрибут Acct-Interim-Interval в вашем Access-Accept, который укажет промежуточный интервал в секундах.

person Arran Cudbard-Bell    schedule 10.07.2018
comment
Уважаемый г-н Арран, Благодарю вас за быстрый ответ. Я уже использую столбец lastupdate в radacct вместе со сценарием bash, который проверяет сеанс, учетные данные которого не были получены за последние 10 минут, и закрываю его. но проблема в том, что у NAS больше пользователей по сравнению с пользователями онлайн в freeradius, разница становится высокой через какое-то время. - person iBBi; 10.07.2018
comment
mysql -uroot -pSQLPASS -s --skip-column-names -e использовать радиус; ОБНОВЛЕНИЕ radacct SET acctstoptime = NOW(), acctterminatecause = 'ДЕЙСТВИЕ СЦЕНАРИЯ', ГДЕ acctstoptime ИМЕЕТ NULL И lastupdate ‹ DATE_SUB(NOW(), ИНТЕРВАЛ 10 МИНУТ); - person iBBi; 10.07.2018
comment
Я сделал bash-скрипт, который делает следующее: › получить активного пользователя из FR › получить активного пользователя из Mikrotik PPP Активные пользователи, теперь он проверяет разницу между обоими списками, какие бы дополнительные пользователи он ни находил, он идет на микротик через ssh и принудительно отключает их , но некоторые пользователи создаются локально в разделе микротик ppp, они тоже отключаются, нужно найти способ это проверить. - person iBBi; 10.07.2018
comment
может быть возможность включить учет RADIUS для локальных пользователей, многие NAS позволяют это - person Arran Cudbard-Bell; 10.07.2018
comment
Если связь NAS и Radius разъединяется, НО пользователи находятся в сети NAS, Radius закроет все активные сеансы через 10 минут (с помощью нашего скрипта проверки устаревших версий, который проверяет столбец lastupdate в radacct, и, поскольку скрипт будет думать, что NAS находится в автономном режиме, он закрывает сеансы, чтобы избежать ложных сеансов). /sim проверяет ошибки). После этого связь восстанавливается, и NAS отправляет учетные пакеты уже подключенных пользователей в RADIUS, FR отбрасывает их, поскольку в RADACCT нет активных сеансов, соответствующих идентификаторам сеансов, отправленных NAS. Если это правильно, то каково решение этой проблемы? - person iBBi; 11.07.2018
comment
Не пытайтесь активно определять состояние сеансов. Сделайте то, что я предложил в своем первоначальном ответе. - person Arran Cudbard-Bell; 11.07.2018