Это фундаментальная проблема с тем фактом, что 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