rediswho and Simultaneous-Use
Nitzan Tzelniker
nitzan.tzelniker at gmail.com
Wed Oct 8 16:21:56 UTC 2025
In the meantime, I considered the following implementation approach.
Please let me know if it sounds reasonable:
Session Key Structure:
Append the Acct-Unique-Session-Id to the User-Name to form the
Redis list name, using a separator such as : (which is invalid in
usernames) — e.g. %{User-Name}:%{Acct-Unique-Session-Id}.
Interim-Update Handling:
Use LSET 0 instead of LPUSH to overwrite the existing session
data during Interim-Update events.
Stop Records:
Use DEL on Stop packets to remove the corresponding session entry.
NAS Reload Tracking:
For Accounting-On and Accounting-Off events, create Redis keys
with the NAS IP address and timestamp, similar to how the SQL
nasreload mechanism works.
Session Validation Logic (via Python script under session):
a. The script performs Redis SCAN 0 MATCH %{User-Name}:* to find all
active session keys for the user.
b. If the number of sessions returned is less than the configured
Simultaneous-Use limit, the Access-Request is accepted.
c. Otherwise, for each matching session key:
Retrieve the session data using LRANGE and parse it.
If the NAS reload timestamp is newer than the last update,
accept the Access-Request and Redis DEL the session.
Otherwise, run radcheck (or equivalent Python logic) to
verify if the user is still actually logged in:
If yes → reject the Access-Request.
If no → accept the Access-Request and Redis DEL the
stale session.
By the way, for FreeRADIUS v4.0, what is the recommended method to
implement Simultaneous-Use, given that the checksimul functionality
has been removed from all modules?
Nitzan
On Wed, Oct 8, 2025 at 5:35 PM Alan DeKok <alan.dekok at inkbridge.io> wrote:
>
> On Oct 8, 2025, at 8:46 AM, Nitzan Tzelniker via Freeradius-Users <freeradius-users at lists.freeradius.org> wrote:
> >
> > I’m working on implementing a Simultaneous-Use check using the
> > rediswho module in the FreeRADIUS 3.2 branch.
> > The approach is inspired by the blog post “Preventing Fraudulent
> > Logins with a Session Database” (which unfortunately appears to be
> > offline).
>
> That happens. It's also why we don't recommend using third-party documentation. Not only is most of it wrong, but it tends to disappear over time.
>
> > At this stage, I’m successfully writing accounting records into Redis
> > through rediswho. However, I haven’t found any documentation or
> > examples describing how to query Redis for Simultaneous-Use checking
> > and verification — specifically, the equivalent of the
> > simul_count_query and simul_verify_query mechanisms used in the SQL
> > module
>
> Hmm, yes. That does appear to be missing. We'd have to add code to the rlm_rediswho module in order to support that.
>
> > If anyone has implemented this or can provide guidance on best
> > practices for performing Simultaneous-Use checks with rediswho, I
> > would appreciate any insights or references.
>
> I think it would require code changes. The Simultaneous-Use functionality does some odd internal magic IIRC.
>
> You might be able to get away with manual redis queries, but I haven't looked into that.
>
> > Additionally, I noticed that the default rediswho configuration in
> > both versions 3.2 and 4.0 uses the same insert operation for all
> > Acct-Status-Type values. As a result, when querying the Redis, it’s
> > not possible to distinguish between sessions that have terminated with
> > an Acct-Status-Type = Stop and those that are still active.
>
> Ah, good point. That should be fixed, too.
>
> I'll make some notes in GitHub.
>
> Alan DeKok.
>
More information about the Freeradius-Users
mailing list