Freeraadius stale sessions (no SQL scenario)

Roman romeo.r at gmail.com
Fri Nov 4 08:33:42 CET 2016


2016-11-03 17:31 GMT+02:00 Alan DeKok <aland at deployingradius.com>:

>
> > On Nov 3, 2016, at 7:18 AM, Roman <romeo.r at gmail.com> wrote:
> > Sometimes I do some networking downtimes and during these periods I'm
> > getting pretty much stale sessions in radwho output. I understand why it
> > happens, but all I want to do is to clear them automatically, when user
> > logs in.
> >
> > So what I've done is added this line:
> >
> >   *exec("/usr/bin/radzap", "-u", $ARGV[3], "127.0.0.1", "secret");*
> >
> > to this part of checkrad code for mikrotik sub.
>
>   Please don't do that.  It's not necessary.


>   The purpose of checkrad is to tell the server if the session is still
> up.  If it isn't the server will automatically create a "zap" packet, and
> remove the session.
>

Thanks for an answer. But it seems like it is not. If I stop freeradius and
disconnect the user from NAS/PPPoE server manually, start the freeradius
server and user connects, Freeradius just freezes and there are some logs
like these:

Fri Nov  4 09:22:22 2016 : Error: (0) Ignoring duplicate packet from client
cli-ter1-lo0 port 52896 - ID: 181 due to unfinished request in component
session module radutmp
Fri Nov  4 09:22:30 2016 : Error: (0) Ignoring duplicate packet from client
cli-ter1-lo0 port 52896 - ID: 181 due to unfinished request in component
session module radutmp
Fri Nov  4 09:22:37 2016 : Error: (1) Ignoring duplicate packet from client
cli-ter1-lo0 port 33336 - ID: 182 due to unfinished request in component
session module radutmp
Fri Nov  4 09:22:45 2016 : Error: (1) Ignoring duplicate packet from client
cli-ter1-lo0 port 33336 - ID: 182 due to unfinished request in component
session module radutmp
Fri Nov  4 09:22:47 2016 : Error: Unresponsive child for request 0, in
component session module radutmp

If I run it in debug mode, these are the last lines:

Ready to process requests
(0) Received Access-Request Id 192 from IP:44964 to IP:1812 length 150
(0)   Service-Type = Framed-User
(0)   Framed-Protocol = PPP
(0)   NAS-Port = 15729029
(0)   NAS-Port-Type = Ethernet
(0)   User-Name = "tt23kswp17"
(0)   Calling-Station-Id = "00:A0:C5:3F:13:2D"
(0)   Called-Station-Id = "cli-ter1"
(0)   NAS-Port-Id = "Eth7-PPPoE"
(0)   CHAP-Challenge = 0xd2cd740b875babcdc257988ee1c00466
(0)   CHAP-Password = 0x01f43d52627cb7db7466e0a2959d3cfea5
(0)   NAS-Identifier = "cli-ter1"
(0)   NAS-IP-Address = IP
(0) # Executing section authorize from file
/etc/freeradius/sites-enabled/default
(0)   authorize {
(0)     policy filter_username {
(0)       if (&User-Name) {
(0)       if (&User-Name)  -> TRUE
(0)       if (&User-Name)  {
(0)         if (&User-Name =~ / /) {
(0)         if (&User-Name =~ / /)  -> FALSE
(0)         if (&User-Name =~ /@[^@]*@/ ) {
(0)         if (&User-Name =~ /@[^@]*@/ )  -> FALSE
(0)         if (&User-Name =~ /\.\./ ) {
(0)         if (&User-Name =~ /\.\./ )  -> FALSE
(0)         if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/))  {
(0)         if ((&User-Name =~ /@/) && (&User-Name !~ /@(.+)\.(.+)$/))   ->
FALSE
(0)         if (&User-Name =~ /\.$/)  {
(0)         if (&User-Name =~ /\.$/)   -> FALSE
(0)         if (&User-Name =~ /@\./)  {
(0)         if (&User-Name =~ /@\./)   -> FALSE
(0)       } # if (&User-Name)  = notfound
(0)     } # policy filter_username = notfound
(0)     [preprocess] = ok
(0) auth_log: EXPAND
/var/log/freeradius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/auth-detail-%Y%m%d
(0) auth_log:    --> /var/log/freeradius/radacct/IP/auth-detail-20161104
(0) auth_log:
/var/log/freeradius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/auth-detail-%Y%m%d
expands to /var/log/freeradius/radacct/IP2/auth-detail-20161104
(0) auth_log: EXPAND %t
(0) auth_log:    --> Fri Nov  4 09:24:57 2016
(0)     [auth_log] = ok
(0) chap:   &control:Auth-Type := CHAP
(0)     [chap] = ok
(0)     [mschap] = noop
(0) suffix: Checking for suffix after "@"
(0) suffix: No '@' in User-Name = "tt23kswp17", looking up realm NULL
(0) suffix: No such realm "NULL"
(0)     [suffix] = noop
(0) files: users: Matched entry tt23kswp17 at line 107
(0)     [files] = ok
(0)     [expiration] = noop
(0)     [logintime] = noop
(0)   } # authorize = ok
(0) Found Auth-Type = CHAP
(0) # Executing group from file /etc/freeradius/sites-enabled/default
(0)   Auth-Type CHAP {
(0) chap: Comparing with "known good" Cleartext-Password
(0) chap: CHAP user "tt23kswp17" authenticated successfully
(0)     [chap] = ok
(0)   } # Auth-Type CHAP = ok
(0) # Executing section session from file
/etc/freeradius/sites-enabled/default
(0)   session {
(0) radutmp: EXPAND /var/log/freeradius/radutmp
(0) radutmp:    --> /var/log/freeradius/radutmp
(0) radutmp: EXPAND %{User-Name}
(0) radutmp:    --> tt23kswp17
(0) # Executing section preacct from file
/etc/freeradius/sites-enabled/default
(0)   preacct {
(0)     [preprocess] = ok
(0)     policy acct_unique {
(0)       if ("%{string:Class}" =~ /ai:([0-9a-f]{32})/i) {
(0)       EXPAND %{string:Class}
(0)          -->
(0)       if ("%{string:Class}" =~ /ai:([0-9a-f]{32})/i)  -> FALSE
(0)       else {
(0)         update request {
(0)           EXPAND
%{md5:%{User-Name},%{Acct-Session-ID},%{%{NAS-IPv6-Address}:-%{NAS-IP-Address}},%{NAS-Identifier},%{NAS-Port-ID},%{NAS-Port}}
(0)              --> 97445737b73ef01afe83c8b742ef8bdb
(0)           &Acct-Unique-Session-Id := 97445737b73ef01afe83c8b742ef8bdb
(0)         } # update request = noop
(0)       } # else = noop
(0)     } # policy acct_unique = noop
(0) suffix: Checking for suffix after "@"
(0) suffix: No '@' in User-Name = "tt23kswp17", looking up realm NULL
(0) suffix: No such realm "NULL"
(0)     [suffix] = noop
(0)     [files] = noop
(0)   } # preacct = ok
(0) # Executing section accounting from file
/etc/freeradius/sites-enabled/default
(0)   accounting {
(0) detail: EXPAND
/var/log/freeradius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d
(0) detail:    --> /var/log/freeradius/radacct/IP/detail-20161104
(0) detail:
/var/log/freeradius/radacct/%{%{Packet-Src-IP-Address}:-%{Packet-Src-IPv6-Address}}/detail-%Y%m%d
expands to /var/log/freeradius/radacct/IP/detail-20161104
(0) detail: EXPAND %t
(0) detail:    --> Fri Nov  4 09:24:57 2016
(0)     [detail] = ok
(0)     [unix] = ok

and the mikrotik_snmp sub part is here:

sub mikrotik_snmp {

  # Set SNMP version
  # MikroTik only supports version 1
  $snmp_version = "1";

  # Look up community string in naspasswd file.
  ($login, $password) = naspasswd($ARGV[1], 1);
  if ($login && $login ne 'SNMP') {
    if($debug) {
      print LOG "Error: Need SNMP community string for $ARGV[1]\n";
    }
    return 2;
  } else {
  # If password is defined in naspasswd file, use it as community,
  # otherwise use $cmmty_string
    if ($password eq '') {
      $password = "$cmmty_string";
    }
  }

  # We want interface descriptions
  $oid = "ifDescr";

  # Mikrotik doesnt give port IDs correctly to RADIUS :(
  # practically this would limit us to a simple only-one user limit for
  # this script to work properly.
  @output = snmpwalk_prog($ARGV[1], $password, "$oid");

  foreach $line ( @output ) {
    #remove newline
    chomp $line;
    #remove trailing whitespace
    ($line = $line) =~ s/\s+$//;
    if( $line =~ /<.*-$ARGV[3]>/ ) {
      $username_seen++;
    }
  }
   #lets return something
  if ($username_seen > 0) {
    return 1;
  } else {
    return 0;
  }
}


Version:
radiusd: FreeRADIUS Version 3.0.11, for host x86_64-pc-linux-gnu, built on
Jul 13 2016 at 02:30:07


-- 
Best regards,
Roman.


More information about the Freeradius-Users mailing list