Accounting - FramedIPAddress - DHCP/IPPOOL

Phil Mayers p.mayers at imperial.ac.uk
Wed May 10 16:51:34 CEST 2006


mad wrote:
> Hello,
> I have a freeradius server, I use an eap/ttls authentication with 802.1x 
> and ldap.
> I want to save the username, the ip adress, the MAC address, the start 
> time and the stop time of the connection with the accounting function 
> (with mysql).
> I have a problem with the ip address ... because it's dhcpd who give an 
> ip address at the client, so freeradius can't have this information.

Correct

> 
> I have try ippool in freeradius (freeradius want to give an ip address 
> but the client don't receive). Also I have read that it's impossible to 
> use ippool with eap and when there are access point and/or swith between 
> client and server ... it's true ?

I'm afraid so. EAP happens before IPs are assigned, and doesn't interact 
with DHCP.

> 
> I have also try other solutions (with syslog-ng who get the ip address 
> in the log and insert in acct table ..., a scripts with omshell who 
> permit to freeradius to indicate at dhcpd what ip address give at this 
> client ...) BUT I think this solution are very unstable ...

The omshell one is a clever idea. But you're right, it's not very stable.

I think for the moment processing the DHCP logs or lease database and 
adding it to the radius accouting table will be needed.

The other way would be to get a list of IP->mac (either by processing 
the logs or "snmpwalk ipnettomedia" of the router) and dump them to a 
file, then use the "hints" and an "exec" module to insert the IP into 
the accounting requests. Obviously the accounting-start will happen 
before you have that info, but the interim and accounting-stop should be 
ok. So, something like this in "hints":

DEFAULT
	Framed-IP-Address = `{exec:lookup_ip}`

and in radiusd.conf:

modules {
   exec lookup_ip {
     wait = yes
     program = "/usr/local/bin/lookup_ip"
     input_pairs = request
   }
}

If you have access to the DHCP servers leases database (assuming ISC 
dhcpd) then the following would work as a script (or something like it - 
this is untested):

#!/bin/sh

BUF=`mktemp`
if [ $? -ne 0 ]
then
	exit 1
fi
trap "rm -f $BUF" EXIT

# Radius attributes are in environment variables
# Calling-Station-Id is...
MAC="$CALLING_STATION_ID"
if [ -z "$MAC" ]
then
	exit 1
fi

DHCP_LEASES=/var/lib/dhcp/dhcpd.leases

awk -v MAC=$MAC '
/^#/ { next; }
/^lease / { our_lease=0; ip=$2; next; }
/^}/ {
     if (our_lease) {
         if (state!="active")
             del leases[ip];
         else
             leases[ip] = mac;
     }
     ip = "";
     our_lease = 0;
     next;
}
{
     if (!ip)
         next;
     if ($1=="binding" && $2=="state") {
         state = $3;
         gsub(/;/,"",state);
     } else if ($1=="hardware" && $2=="ethernet") {
         mac = $3;
         gsub(/;/,"",mac);
         if (mac==MAC) {
             our_lease = 1;
         }
     }
}
END {
     for (ip in leases) {
         print ip, mac;
     }
}' $DHCP_LEASES >$BUF

NUM_LEASES=`wc -l $BUF | awk '{ print $1 }'`
if [ $NUM_LEASES -gt 1 ]
then
	# >1 lease for this mac, help!
         exit 1
elif [ $NUM_LEASES -ne 1 ]
then
	# no leases
	exit 1
else
	ip=`cut -d ' ' -f 1 $BUF`
	echo $ip
fi

> 
> What do you think about this ?
> Have you an other solution ?
> 
> Sorry my english is rusty ... and thanks for your answers

Your english is better than my - well, anything!

> 
> Regards,
> 
> Psymad


Hope that helps



More information about the Freeradius-Users mailing list