与 NAS 相比,Freeradius 显示的在线用户数量不正确

Freeradius showing incorrect number of online users vs NAS

场景: Freeradius 服务器 2.2.8 作为 Ubuntu 服务器上的计费系统, NAS 是 Mikrotik 路由器 ccr1036 v 6.42.4

问题: 在 NAS 上我可以看到 900 active/online 用户,而在 freeradius 上我看到 500 个会话(acctstop 时间为 NULL)

我使用以下查询来计算 FR 中的在线用户数。

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

我尝试断开 NAS 上的所有用户,清除 freeradius 的所有会话,用户重新连接正常,但 NAS 上的用户数与 freeradius 上的用户数仍然不匹配。我应该检查什么?

这是一个根本问题,因为 RADIUS 是一种有损协议。如果用户离线,由于某种原因,RADIUS 服务器没有收到 Acct-Status-Type=Stop 数据包,则会话将永久标记为打开。

如果您使用来自 FreeRADIUS v3 的 SQL 查询,您会看到它们有一个 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, 设置 AcctStopTimeNOW().

为此,需要在您的 NAS 上启用临时更新。这些是 NAS 定期发送的记帐请求,用于更新流量计数器等内容,但在这种情况下,它们也可以用作有用的心跳消息。

如果您无法弄清楚 NAS 上的静态配置选项在哪里,有时可以通过返回 Access-Accept 中的 Acct-Interim-Interval 属性来启用它,这将指定以秒为单位的临时间隔。