Weird behaviour of sqlcounter / dailycounter

Alan DeKok aland at deployingradius.com
Wed May 31 02:52:19 UTC 2023


On May 30, 2023, at 8:37 PM, Robert Senger <robert.senger at lists.microscopium.de> wrote:
> The situation is that the station trying to connect is allowed a Max-
> Daily-Session of 300 seconds. The counter is at 299, so sqlcounter
> correctly sets Session-Timeout = 1, and the station is allowed access
> for one second remaining...

  That is very much not going to work.  Most NASes will not deal well with Session-Timeouts that small.

  It's more common to set Session-Timeout to larger values, like 5 minutes.

> However, this connection is terminated immediately by the Wifi AP
> (running hostapd 2.due to Session-Timeout = 1.

  i.e. the *used* session time is zero.  So the server never gets an accounting packet with Acct-Session-Time = 1, and the counter is never changed.

  So the next time the user tries to log in, he will get Session-Timeout = 1 again.

> The counter never gets
> increased, the station retries and is allowed access, and every 5
> seconds or so this repeats and repeats and repeats... The logs get
> flooded and there's useless load on the AP and freeradius. The station
> (Linux machine with NetworkManager) stopped trying to connect after
> half an hour or so...

  So... don't set Session-Timeout = 1?

  This isn't really a FreeRADIUS issue.  The RADIUS protocol can only handle times based on seconds.  Sub-second resolution isn't supported.

> This behaviour is reproduceable. Every time the station's Max-Daily-
> Session value is reached and it get's kicked off by the AP, it get's
> into this loop. The number of retries until the station finally is
> giving up is significantly higher if more than one AP with the same
> SSID is reachable (>30 minutes). This behaviour also occurs if the
> "counter" module is used rather than the "sqlcounter" module. 
> 
> Freeradius version is 3.0.21, hostapd version is 2.10-8.
> 
> Did I configure something wrong, or what happens here? Thank you for
> help!

  The solution is a post-processing state, say in the "post-auth" section:

post-auth {
	if (&reply:Session-Timeout < 30) {
		reject
	}
	...
}

  i.e. "if they have less than 30 seconds of time remaining, just reject them".

  There is no good way to allow sub-second session timeouts, or sub-second Acct-Session-Time.  The RADIUS protocol doesn't support that.

  So you're left with a time resolution of one second.  And even then, the RADIUS client is likely to not deal well with very small values in Session-Timeout.

  Alan DeKok.



More information about the Freeradius-Users mailing list