Configuring Originate Change of Authority (COA) Packet From Freeradius Version 3.0 - POD-packet of disconnect
WHY:
When a connected user exhausts their allocated bandwidth they are not logged
out immediately until the next Acct-Interim-Interval elapses. In order to
disconnect without delay you can use the originate coa and radius packet of
disconnect (POD) to achieve this.
DRAWBACKS:
There is an added overhead on the database engine especially in the
select query that computes
(SUM(ACCTINPUTOCTETS) + SUM(ACCTINPUTOCTETS))) FROM RADACCT
SELECT VALUE FROM RADCHECK WHERE USERNAME="*" AND
ATTRIBUTE="ChilliSpot-Max-Total-Octets"
The latter select statement are performed periodically and can cause the mentioned unnecessary overhead on the RDBMS.
DISCLAIMER: For large networks it is discouraged, else you can upgrade to a
highly performant RDBMS that handles Radius Accounting.
MERITS:
The WISPR network will be highly responsive in handling session timedout
clients and facilitate for quick redirects to the captive portal. Server configuration files are the following:
1. /etc/freeradius/3.0/sites-available/originate-coa
2. /etc/freeradius/3.0/clients.conf
3. /etc/chilli/defaults
4. /etc/freeradius/3.0/sites-enabled/default
SUMMARY – QUICK & EASY STARTUP
APPEND BELOW CONTENTS TO END OF /etc/freeradius/3.0/clients.conf
home_server example-coa { type = coa # # Note that a home server of type "coa" MUST be a real NAS, # with an ipaddr or ipv6addr. It CANNOT point to a virtual # server. # # Change this IP address to the IP address of the NAS. # ipaddr = 10.1.0.1 port = 3799 # This secret SHOULD NOT be the same as the shared # secret in a "client" section. #secret = testing1234 secret = radpass # CoA specific parameters. See raddb/proxy.conf for details. coa { irt = 2 mrt = 16 mrc = 5 mrd = 30 } }# NOTE: above contents are derived from /etc/freeradius/3.0/sites-available/originate-coa
# → Port 3799 – is the CoovaChilli COA port and can be setup by
adding the following entry into the file:
/etc/chilli/defaults
CONFIGURING COA SUPPORT ON NAS (COOVACHILLI)
APPEND THE FOLLOWING ENTRY into the /etc/chilli/defaults
HS_COAPORT=3799 ~ ~ ~
# RESTART COOVACHILLI - >
uelekezo@WISPR > cat /etc/chilli/defaults | grep HS_COA HS_COAPORT=3799 uelekezo@WISPR > # restarting coovachilli service uelekezo@WISPR > sudo systemctl restart chilli uelekezo@WISPR > systemctl status chilli ● chilli.service - LSB: Start CoovaChilli daemon at boot time Loaded: loaded (/etc/init.d/chilli; generated) Active: active (running) since Sat 2022-12-17 10:34:53 EAT; 9s ago Docs: man:systemd-sysv-generator(8) Process: 39625 ExecStart=/etc/init.d/chilli start (code=exited, status=0/SUCCESS) Tasks: 1 (limit: 3966) Memory: 4.4M CPU: 481ms CGroup: /system.slice/chilli.service └─39754 /usr/sbin/chilli -c /etc/chilli.conf Dec 17 10:34:54 lab-HP-15-Notebook-PC chilli[39754]: Username must be included in disconnect request Dec 17 10:34:54 lab-HP-15-Notebook-PC chilli[39754]: bad idx (-1) Dec 17 10:34:54 lab-HP-15-Notebook-PC chilli[39754]: RADIUS id 4 was not found in queue! Dec 17 10:34:54 lab-HP-15-Notebook-PC chilli[39754]: Username must be included in disconnect request Dec 17 10:34:54 lab-HP-15-Notebook-PC chilli[39754]: bad idx (-1) Dec 17 10:34:54 lab-HP-15-Notebook-PC chilli[39754]: RADIUS id 3 was not found in queue! Dec 17 10:34:56 lab-HP-15-Notebook-PC chilli[39754]: Username must be included in disconnect request Dec 17 10:34:56 lab-HP-15-Notebook-PC chilli[39754]: Username must be included in disconnect request Dec 17 10:35:01 lab-HP-15-Notebook-PC chilli[39754]: Username must be included in disconnect request Dec 17 10:35:01 lab-HP-15-Notebook-PC chilli[39754]: Username must be included in disconnect request uelekezo@WISPR > # check that COA PORT on UDP port 3799 is Listening for incoming connects uelekezo@WISPR > sudo lsof -i :3799 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chilli 39754 chilli 3u IPv4 460467 0t0 UDP *:3799 uelekezo@WISPR >
ENABLE IMPLICIT CLIENT DISCONNECT WHEN CLIENT HAS EXHAUSTED THEIR ALLOCATED BANDWIDTH
The originate coa – freeradius module will originate the disconnect packet
when client exhausts their allocated bandwidth.
SETTING UP PACKET OF DISCONNECT (POD)
- Modify the
/etc/freeradius/3.0/sites-enabled/default
1. MODIFY THE ACCOUNTING SECTION BY ADDING THE FOLLOWING CONTENTS
accounting {
# Update accounting packet by adding the CUI
attribute
# recorded from the corresponding
Access-Accept
# use it only if your NAS boxes do not
support CUI themselves
# cui
#
# Create a 'detail'ed log of the packets.
# Note that accounting requests which are
proxied
# are also logged in the detail file.
detail
# Update the wtmp file
#
# If you don't use "radlast", you can delete
this line.
unix
#
# For Simultaneous-Use tracking.
#
# Due to packet losses in the network, the
data here
# may be incorrect. There is little we
can do about it.
radutmp
# sradutmp
# Return an address to the IP Pool when we
see a stop record.
# main_pool
#
#
# If you receive stop packets with zero
session length,
# they will NOT be logged in the
database. The SQL module
# will print a message (only in debugging
mode), and will
# return "noop".
#
# You can ignore these packets by
uncommenting the following
# three lines. Otherwise, the server
will not respond to the
# accounting request, and the NAS will
retransmit.
#
# if (noop) {
# ok
# }
# Cisco VoIP specific bulk accounting
# pgsql-voip
# For Exec-Program and Exec-Program-Wait
exec
# Filter attributes from the accounting
response.
attr_filter.accounting_response
#
#
# See "Autz-Type Status-Server" for how this
works.
#
# Acct-Type Status-Server {
#
# }
#
<
# Log traffic to an SQL database. # Must enable sql sql # Disconnects a user once they've exhausted their bandwidth # if ( "%{sql: SELECT ((SUM(AcctInputOctets)+SUM(AcctOutputOctets))) FROM radacct WHERE UserName='%{User-Name}'}" >= "%{sql: SELECT value from radcheck where username='%{User-Name}' and attribute='ChilliSpot-Max-Total-Octets'}" ) { update disconnect { User-Name = "%{User-Name}" Calling-Station-Id = "%{Calling-Station-Id}" } }
}
############## IMPORTANT ###########################
> DECOMPILED SQL QUERY: QUERY 1:= SELECT (SUM(ACCTINPUTOCTETS) + SUM(ACCTINPUTOCTETS))) FROM RADACCT WHERE USERNAME = ‘CLIENT_USERNAME’ QUERY 2:= SELECT VALUE FROM RADCHECK WHERE USERNAME=’CLIENT_USERNAME’ AND ATTRIBUTE=’ChilliSpot-Max-Total-Octets’ if (query1 >= query2) { disconnect(client_device); }
############## IMPORTANT ###########################
Initiating disconnect packet from radius
echo User-Name=admin | radclient -x 127.0.0.1:3799 40 radpass
No comments:
Post a Comment