sqlippool duplicated IP assignments

Antonio Modesto Amaral Sousa modesto at isimples.com.br
Fri Dec 6 18:21:57 CET 2013



On Fri 06 Dec 2013 02:59:54 PM BRST, Alan DeKok wrote:
> Antonio Modesto Amaral Sousa wrote:
>> I'm using freeradius-2.1.12_1 with MySQL 5.1 and sqlippool configured to
>> assign IP's to my PPPoE clients, I redistribute these routes with iBGP,
>> until yesterday it was working fine, the problem started after a
>> blackout that happened last night.
>
>    When a blackout happens, the PPPoE server SHOULD tell the RADIUS
> server that all of the sessions have been dropped.  If it doesn't, the
> RADIUS server has no idea the sessions have been dropped.
>
>> I have a lot of clients that are
>> being assigned duplicated IP addresses and I just don't know why,
>
>    That shouldn't happen, even in the above scenario.  It should be
> assigned new IPs, not IPs which are already assigned.
>
>    Or, maybe the PPPoE server told FreeRADIUS that the sessions were all
> dropped... then let the users keep the old IP addresses.
>
>> I've
>> configured a long lease time for each assignment so that the NAS has a
>> good time frame to transmit the interim updates, my radippool table is
>> using the engine InnoDB and I think the select lock should be working
>> fine. Any suggestions?
>
>    Blame the PPPoE server for everything.  FreeRADIUS assumes that IP's are:
>
> - assigned when it says to assign them
>
> - NOT assigned to other users
>
> - timed out when Session-Timeout = 0
>
> - closed when the PPPoE server / NAS reboots
>
>
>    FreeRADIUS also assumes that it gets told when something happens with
> the user session.  If the PPPoE server isn't doing the right thing, and
> isn't telling FreeRADIUS what it's doing... FreeRADIUS can do nothing.


Hello Alan,

I noticed something in the sqlippool config:

## The ORDER BY clause of this query tries to allocate the same 
IP-address
## which user had last session...
#allocate-find = "SELECT framedipaddress FROM ${ippool_table} \
# WHERE pool_name = '%{control:Pool-Name}' AND (expiry_time < NOW() OR 
expiry_time IS NULL) \
# ORDER BY (username <> '%{User-Name}'), \
# (callingstationid <> '%{Calling-Station-Id}'), \
# expiry_time \
# LIMIT 1 \
# FOR UPDATE"

# ## If you prefer to allocate a random IP address every time, i
# ## use this query instead
 allocate-find = "SELECT framedipaddress FROM ${ippool_table} \
  WHERE pool_name = '%{control:Pool-Name}' \
  AND expiry_time IS NULL \
  ORDER BY RAND() \
  LIMIT 1 \
  FOR UPDATE"


The first allocate-find method assumes that the IP is free if the 
expiry_time is null, or if it's in the past, but the second one just 
check if the expiry time is null, isn't it wrong? Can I insert the 
other condition? because I noticed that I have some records here that 
weren't updated and are with the expiry_time in the past, probably 
because the NAS didn't told radius that...

>
>    Alan DeKok.
> -
> List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html

--








More information about the Freeradius-Users mailing list