For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

Forum Discussion

ZANOOB's avatar
ZANOOB
Icon for Cirrus rankCirrus
Jul 23, 2021

iRule not working to have a RADIUS presistant load balancing.

Hello All,

 

I having trouble with an iRule that I created to load balance the RADIUS traffic on F5. I have a virtual server created that is listening on "all ports" and I have created an iRule in which it will only accept packets with ports 1812 & 1813.

This iRule is called in a Persistent profile I created (where parent profile is Universal). This Persistent profile was called under the Virtual server --resources--> Default Persistent profile.

 

Somehow this is it is not working for me. I see that the packets are reaching the F5 , but "Access-Request" packets are not being sent out to the pool members. iRule for reference is shown below :

 

when RULE_INIT {

 array set ::attr_code2name {

         1     User-Name

         2     User-Password

         3     CHAP-Password

         4     NAS-IP-Address

         5     NAS-Port

         6     Service-Type

         7     Framed-Protocol

         8     Framed-IP-Address

         9     Framed-IP-Netmask

        10     Framed-Routing

        11     Filter-Id

        12     Framed-MTU

        13     Framed-Compression

        14     Login-IP-Host

        15     Login-Service

        16     Login-TCP-Port

        17     (unassigned)

        18     Reply-Message

        19     Callback-Number

        20     Callback-Id

        21     (unassigned)

        22     Framed-Route

        23     Framed-IPX-Network

        24     State

        25     Class

        26     Vendor-Specific

        27     Session-Timeout

        28     Idle-Timeout

        29     Termination-Action

        30     Called-Station-Id

        31     Calling-Station-Id

        32     NAS-Identifier

        33     Proxy-State

        34     Login-LAT-Service

        35     Login-LAT-Node

        36     Login-LAT-Group

        37     Framed-AppleTalk-Link

        38     Framed-AppleTalk-Network

        39     Framed-AppleTalk-Zone

        60     CHAP-Challenge

        61     NAS-Port-Type

        62     Port-Limit

        63     Login-LAT-Port

   }

}

when CLIENT_ACCEPTED {

  if { ([UDP::local_port] != 1812) && ([UDP::local_port] != 1813) } {

   log local0. "packet on port [UDP::local_port] dropped"

   drop

  }else {

      set CALLID [RADIUS::avp 31 string]

      persist uie $CALLID

      log local0. "persisted $CALLID"

  }

}

when CLIENT_DATA {

   if { [UDP::local_port] == 1813 } {

   set CALLID [RADIUS::avp 31 string]

   set IP [RADIUS::avp 8 ip4]

   if { $IP != "" } {

       table set $IP [LB::server addr] 900

       log local0. "Radius maps $IP to [LB::server addr] for $CALLID"

       }

   }

}

when LB_SELECTED {

   log local0. "Selected [LB::server addr] [LB::server port]"

}

when SERVER_DATA {

   persist add uie $CALLID

   log local0. "persist added for $CALLID to [LB::server addr]"

}

 

 

 

2 Replies

  • Hi ZANOOB,

    [RADIUS::avp 31 string] may be returning empty string. If empty, iRule will throw an error.

    Can you investigate the ltm logs and try this iRule?

    when CLIENT_DATA {
    	if { [UDP::local_port] == 1813 } {
    		set CALLID [RADIUS::avp 31 string]
    		set IP [RADIUS::avp 8 ip4]
    		if { $IP != "" } {
    			table set $IP [LB::server addr] 900
    			log local0. "Radius maps $IP to [LB::server addr] for $CALLID"
    		}
    	}
    }
     
    when CLIENT_ACCEPTED {
    	if { ([UDP::local_port] != 1812) && ([UDP::local_port] != 1813) } {
    		log local0. "packet on port [UDP::local_port] dropped"
    		drop
    	}
    	elseif {
    		set CALLID [RADIUS::avp 31 string]
    		log local0. "persisted $CALLID"
    		
    		if { $CALLID ne "" } {
    			persist uie $CALLID
    		}
    	}
    }
     
    when CLIENT_DATA {
    	if { [UDP::local_port] == 1813 } {
    		set CALLID [RADIUS::avp 31 string]
    		set IP [RADIUS::avp 8 ip4]
    		if { $IP ne "" && $CALLID ne "" } {
    			table set $IP [LB::server addr] 900
    			log local0. "Radius maps $IP to [LB::server addr] for $CALLID"
    		}
    	}
    }
     
    when LB_SELECTED {
    	log local0. "Selected [LB::server addr] [LB::server port]"
    }
     
    when SERVER_DATA {
    	if { $CALLID ne "" } {
    		persist add uie $CALLID
    		log local0. "persist added for $CALLID to [LB::server addr]"
    	}
    }
  • Hello Enes Afsin Al,

     

    Thank you for your reply. Much appreciated.

    The above iRule, I was not able to save it since it shows some syntax errors. Not an expert in scripts, so couldn't find what is wrong with the syntax of it.

    -------------------------------

    01070151:3: Rule [/Common/CallIDUIE2] error: /Common/CallIDUIE2:17: error: [parse error: PARSE syntax 501 {syntax error in expression "

    set CALLID [RADIUS::avp 31 string]

    log local0. ...": variable references require preceding $}][{

    set CALLID [RADIUS::avp 31 string]

    log local0. "persisted $CALLID"

     

    if { $CALLID ne "" } {

    persist uie $CALLID

    }

    }]

    /Common/CallIDUIE2:24: error: [missing a script after "elseif"][]

    /Common/CallIDUIE2:27: error: ["Duplicate event"][when CLIENT_DATA {

    if { [UDP::local_port] == 1813 } {

    set CALLID [RADIUS::avp 31 string]

    set IP [RADIUS::avp 8 ip4]

    if { $IP ne "" && $CALLID ne "" } {

    table set $IP [LB::server addr] 900

    log local0. "Radius maps $IP to [LB::server addr] for $CALLID"

    }

    }

    }]

     

     

    --------------------------------

     

    The packet capture shows the AVP 31 attribute ( Calling-Station-Id) in it. So the issue is not the attribute value missing, however, something that F5 is not able to understand is the packet not processing it forwards.

     

     

    Frame 2: 317 bytes on wire (2536 bits), 317 bytes captured (2536 bits)

    Ethernet II, Src: Fortinet_09:00:12 (00:09:0f:09:00:12), Dst: VMware_f5:03:01 (00:50:56:f5:03:01)

    802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 4091

    Internet Protocol Version 4, Src: 172.17.70.60, Dst: 10.1.6.100

    User Datagram Protocol, Src Port: 54892, Dst Port: 1812

    RADIUS Protocol

       Code: Access-Request (1)

       Packet identifier: 0x5e (94)

       Length: 164

       Authenticator: e0a10849518a2fc1f0827505db9f8a5c

       Attribute Value Pairs

           AVP: t=NAS-IP-Address(4) l=6 val=172.17.70.60

           AVP: t=NAS-Port(5) l=6 val=0

           AVP: t=NAS-Port-Type(61) l=6 val=Virtual(5)

           AVP: t=User-Name(1) l=15 val=mgalantowicza

           AVP: t=User-Password(2) l=18 val=Encrypted

           AVP: t=Service-Type(6) l=6 val=Shell-User(6)

           AVP: t=Calling-Station-Id(31) l=14 val=b0b867cd68ee

               Type: 31

               Length: 14

               Calling-Station-Id: b0b867cd68ee

           AVP: t=Called-Station-Id(30) l=14 val=b0b867cd68ee

           AVP: t=Vendor-Specific(26) l=23 vnd=Aruba, a Hewlett Packard Enterprise company(14823)

           AVP: t=Vendor-Specific(26) l=18 vnd=Aruba, a Hewlett Packard Enterprise company(14823)

           AVP: t=Message-Authenticator(80) l=18 val=a0d082620a1137f9110e2a5975c7d6a8

    F5 Ethernet Trailer Protocol

     

     

    However, I will check the LTM logs. But last time I checked it really didn't give any error for the virtual server. It simply is not forwarding the traffic, to the load-balanced Radius servers.