PostgreSQL accounting callingstationid field blank
Stoycho Ganev
stoycho at ganev.org
Fri Jul 25 16:31:30 CEST 2014
Alan, thanks for the help. I understand it is a problem with the NAS not
sending Calling-Station-Id in the Accounting-Request packet, but I was
unable to make it do so.
I followed your advice and updated post-auth to include the following:
if(User-Name){
if("%{sql:UPDATE radacct set
callingstationid='%{Calling-Station-Id}' WHERE UserName='%{User-Name}'
and acctsessionid='%{Acct-Session-Id}' and AcctStopTime is NULL}"){
}
}
It expands correctly, but affects 0 rows, because post-auth is executed
before accounting and the row I'm trying to update in post-auth does not
exist until it is INSERTed by accounting later (with an empty
Calling-Station-Id field).
Could you help me with some further suggestions, please? Thanks!
--- DEBUG ---
......
Login OK: [cleaver] (from client mikrotik03 port 0 cli
CC-FA-00-C6-4A-A6)
# Executing section post-auth from file
/etc/freeradius/sites-enabled/default
+- entering group post-auth {...}
++? if (User-Name)
? Evaluating (User-Name) -> TRUE
++? if (User-Name) -> TRUE
++- entering if (User-Name) {...}
+++? if ("%{sql:UPDATE radacct set
callingstationid='%{Calling-Station-Id}' WHERE UserName='%{User-Name}'
and acctsessionid='%{Acct-Session-Id}' and AcctStopTime is NULL}")
sql_xlat
expand: %{User-Name} -> cleaver
sql_set_user escaped user --> 'cleaver'
expand: UPDATE radacct set callingstationid='%{Calling-Station-Id}'
WHERE UserName='%{User-Name}' and acctsessionid='%{Acct-Session-Id}' and
AcctStopTime is NULL -> UPDATE radacct set
callingstationid='CC-FA-00-C6-4A-A6' WHERE UserName='cleaver' and
acctsessionid='8200009a' and AcctStopTime is NULL
rlm_sql (sql): Reserving sql socket id: 4
rlm_sql_postgresql: Status: PGRES_COMMAND_OK
rlm_sql_postgresql: query affected rows = 0
rlm_sql (sql): SQL query affected no rows
rlm_sql (sql): Released sql socket id: 4
expand: %{sql:UPDATE radacct set
callingstationid='%{Calling-Station-Id}' WHERE UserName='%{User-Name}'
and acctsessionid='%{Acct-Session-Id}' and AcctStopTime is NULL} -> 0
? Evaluating ("%{sql:UPDATE radacct set
callingstationid='%{Calling-Station-Id}' WHERE UserName='%{User-Name}'
and acctsessionid='%{Acct-Session-Id}' and AcctStopTime is NULL}") ->
FALSE
+++? if ("%{sql:UPDATE radacct set
callingstationid='%{Calling-Station-Id}' WHERE UserName='%{User-Name}'
and acctsessionid='%{Acct-Session-Id}' and AcctStopTime is NULL}") ->
FALSE
++- if (User-Name) returns noop
Sending Access-Accept of id 38 to 192.168.13.4 port 41876
Session-Timeout := 1800
User-Name = "cleaver"
MS-MPPE-Recv-Key =
0x3475108df78cbe34afa52b064ab754e661ca85d1dccad4c48cdcf5bb9a621e88
MS-MPPE-Send-Key =
0xe528698a571c8a5e3406bc55f49d487c065ab6ecbd86c70a5f7bb0c8e639103b
EAP-Message = 0x030c0004
Message-Authenticator = 0x00000000000000000000000000000000
Finished request 12.
Going to the next request
Waking up in 4.6 seconds.
rad_recv: Accounting-Request packet from host 192.168.13.4 port 59174,
id=39, length=153
Service-Type = Framed-User
NAS-Port-Id = "wlan1"
NAS-Port-Type = Wireless-802.11
User-Name = "cleaver"
Acct-Session-Id = "8200009a"
Acct-Multi-Session-Id =
"D4-CA-6D-F6-55-C1-CC-FA-00-C6-4A-A6-82-00-00-00-00-00-00-79"
Acct-Authentic = RADIUS
Acct-Status-Type = Start
NAS-Identifier = "MikroTik"
Acct-Delay-Time = 0
NAS-IP-Address = 192.168.13.4
# Executing section preacct from file
/etc/freeradius/sites-enabled/default
+- entering group preacct {...}
++[preprocess] returns ok
[acct_unique] Hashing 'NAS-Port-Id = "wlan1",Client-IP-Address =
192.168.13.4,NAS-IP-Address = 192.168.13.4,Acct-Session-Id =
"8200009a",User-Name = "cleaver"'
[acct_unique] Acct-Unique-Session-ID = "af85b9caf30c3554".
++[acct_unique] returns ok
++[files] returns noop
# Executing section accounting from file
/etc/freeradius/sites-enabled/default
+- entering group accounting {...}
[detail] expand: %{Packet-Src-IP-Address} -> 192.168.13.4
[detail] expand:
/var/log/freeradius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d
-> /var/log/freeradius/radacct/192.168.13.4/detail-20140725
[detail]
/var/log/freeradius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d
expands to /var/log/freeradius/radacct/192.168.13.4/detail-20140725
[detail] expand: %t -> Fri Jul 25 17:17:54 2014
++[detail] returns ok
[sql] expand: %{User-Name} -> cleaver
[sql] sql_set_user escaped user --> 'cleaver'
[sql] expand: %{NAS-Port} ->
[sql] ... expanding second conditional
[sql] expand: %{Acct-Delay-Time} -> 0
[sql] expand: INSERT INTO radacct (AcctSessionId, AcctUniqueId,
UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime,
AcctAuthentic, ConnectInfo_start, CalledStationId, CallingStationId,
ServiceType, FramedProtocol, FramedIPAddress, AcctStartDelay,
XAscendSessionSvrKey) VALUES('%{Acct-Session-Id}',
'%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', NULLIF('%{Realm}',
''), '%{NAS-IP-Address}', %{%{NAS-Port}:-NULL},
'%{NAS-Port-Type}', ('%S'::timestamp -
'%{%{Acct-Delay-Time}:-0}'::interval), '%{Acct-Authentic}',
'%{Connect-Info}', '%{Called-Station-Id}', '%{Calling-Station-Id}',
'%{Service-Type}', '%{Framed-Protocol}',
NULLIF('%{Framed-IP-Address}', '')::inet, 0,
'%{X-Ascend-Session-Svr-Key}') -> INSERT INTO radacct (AcctSessionId,
AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType,
AcctStartTime, AcctAuthentic, ConnectInfo_start, CalledStationId,
CallingStationId, ServiceType, FramedProtocol, FramedIPAddress,
AcctStartDelay,
rlm_sql (sql): Reserving sql socket id: 3
rlm_sql_postgresql: Status: PGRES_COMMAND_OK
rlm_sql_postgresql: query affected rows = 1
rlm_sql (sql): Released sql socket id: 3
++[sql] returns ok
......
--- DEBUG ---
On 25.07.2014 15:17, Alan DeKok wrote:
> Stoycho Ganev wrote:
>
>> Everything works fine except that when accounting records are INSERTed
>> in the radacct table, the callingstationid field is left blank instead
>> of being populated with the MAC address of the calling station. This
>> is rather strange, because the Calling-Station-Id is present in the
>> Access-Request, and is the correct format (no wimax rubbish).
>
> The point of the debug output is to READ IT. Honestly...
>
> You're seeing a Calling-Station-Id in an Access-Request. That's nice.
> But you're not seeing the Calling-Station-Id in an Accounting-Request.
> And then blaming FreeRADIUS when the SQL insert doesn't contain the
> Calling-Station-Id.
>
> Well... it doesn't exist in the accounting request. If you want it in
> the accounting request, go fix the NAS. The NAS is the one sending the
> packet. It's not sending Calling-Station-Id in the accounting packet.
>
> Or, update the "post-auth" configuration to write the
> Calling-Station-Id to the accounting tables. From the debug log, all
> packets contain an Acct-Session-Id and Acct-Multi-Session-Id. So you
> can use those to track a unique session.
>
> Alan DeKok.
More information about the Freeradius-Users
mailing list