Radius Accounting Interim Update
Problem this snippet solves:
This iRule generates a Radius Accounting logging event with the status-type of Interim-Update when a user establishes a VPN Tunnel with APM.
How to use this snippet:
Apply this iRule to the HTTPS virtual that has the APM Profile applied to it that you want to generate Radius Accounting events for.
Code :
######################################################################
##
## See the RFC page for additional information on Accounting-Request
## http://tools.ietf.org/html/rfc2866#section-4
##
######################################################################
when HTTP_REQUEST {
## Check to see if the user is currently authenticated
## If the HTTP path starts with /isession than most of the time
## the user is trying to initiate a Network Access tunnel
if { [ACCESS::policy result] eq "allow" && [HTTP::path] eq "/isession"} {
## Wait a little bit so the variable can be populated
after 1000 -periodic {
## If the variable was populated than generate the Radius message
if {[ACCESS::session data get session.assigned.clientip] ne ""}{
after cancel -current
## Since the iRule doesn't have access to the AAA radius section
## the variables need to be populated with the correct information
set __secret"123"
set __destination"1.1.1.1"
set __port"1813"
##
set __code[format %02x 4]
set __id[format %02x [expr { int(255 * rand()) }]]
## Accounting Session ID
set NA_SessionID[ACCESS::session data get session.user.sessionid]
binary scan $NA_SessionID H* __sid
set __asiLENGTH[expr {[string length $__sid] /2 + 2}]
set __asi[format %02x 44][format %02x $__asiLENGTH]$__sid
## Accounting Status Type
set __ast[format %02x 40][format %02x 6][format %08x 3]
## Accounting Authentication
set __aa[format %02x 45][format %02x 6][format %08x 1]
## Service Type
set __st[format %02x 06][format %02x 6][format %08x 8]
## NAS Port
set __np[format %02x 05][format %02x 6][format %08x 0]
## Tunnel Client Endpoint
binary scan [IP::client_addr] H* __cip
set __tceLENGTH[expr {[string length $__cip] /2 + 2}]
set __tce[format %02x 66][format %02x $__tceLENGTH]$__cip
## User-Name
set NA_UserName[ACCESS::session data get session.logon.last.username]
binary scan $NA_UserName H* __username
set __unLENGTH[expr {[string length $__username] /2 + 2}]
set __un[format %02x 1][format %02x $__unLENGTH]$__username
## Framed-IP-Address
set NA_ClientIP[ACCESS::session data get session.assigned.clientip]
scan $NA_ClientIP %d.%d.%d.%d t__ip1 t__ip2 t__ip3 t__ip4
set __vpn[format %02x $t__ip1][format %02x $t__ip2][format %02x $t__ip3][format %02x $t__ip4]
set __fiaLENGTH[expr {[string length $__vpn] /2 + 2}]
set __fia[format %02x 8][format %02x $__fiaLENGTH]$__vpn
## Combine the attributes above into a single string
set __attributes${__asi}${__ast}${__aa}${__st}${__np}${__tce}${__un}${__fia}
## Calculate the lenght of the attribute string and then device by 2 to get octet count
set __attributesL[expr {[string length $__attributes]/2}]
## Combine the attributes length with the radius header length
set __length[expr {$__attributesL + 20}]
## The length value needs to be stored in HEX when the MD5 attribute is calculated
set __length_HEX[format %04x $__length]
## The Request Authenticator field contatins 16 zero octets
set __zero [format %032x 0]
## Generate the Request Authenticator value
set __md5_auth [md5 [binary format H* ${__code}${__id}${__length_HEX}${__zero}${__attributes}]${__secret}]
## Convert the MD5 value into binary
binary scan $__md5_auth H* __auth
## Populate the Radius Information
set __radiusPayload[binary format cH2SH32H* $__code $__id $__length $__auth $__attributes]
## Create the sideband connection and send the data
set sb_conn[connect -protocol UDP -timeout 100 -idle 30 -status conn_status $__destination:$__port]
set sb_send[send -timeout 100 -status send_status $sb_conn $__radiusPayload]
set sb_recv [recv -peek -status peek_status -timeout 1000 $sb_conn]
## After the data is sent close the connection
close $sb_conn
}
}
}
}Published Oct 06, 2015
Version 1.0Robert_Teller_7
Historic F5 Account
Joined November 11, 2011
Robert_Teller_7
Historic F5 Account
Joined November 11, 2011
No CommentsBe the first to comment
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)