iRule to load balance based on source IP
Hi Folks, This is my first attempt at an iRule so I wanted to bounce it off all of you for comment. There are, no doubt, syntax and logic errors.
The purpose of this iRule is to load balance based on the source IP address's third octet. If it's odd, then we go to pool member 1. If its even, to pool member 2. In this particular case, the session is ssl encrypted through the F5 so I cannot use a cookie or other persistence method. I am left with just the src and dest IP and an encrypted data packet to work with. Since the application requires some form of persistence, load balancing based on the IP address seems to be the best possibility.
when CLIENT_ACCEPTED { ! Use getfield to pull the source IP address's third octet and determine if its even or odd. set third-octet [expr {[getfield [IP::client_addr] "." 3]}] if { [$third-octet ends_with 0,2,4,6,8] { set destination even } elseif { set destination odd } }
! Send even sources to one Pool member, odds to the other.
if { [$destination eq odd]
pool Application-pool member server1 80
persist source_addr 14400
}
if { [$destination eq even]
pool Application-pool member server2 80
persist source_addr 14400
}
!If a pool member is not available, send the session back to the Pool and set the persistence
!for a 60 minute timeout
when LB_FAILED { pool Application-pool persist source_addr 3600 LB::reselect }
There are a few things I'm not sure are going to work right, particularly the ends_with on line 4 to determine if the $third-octet is even or odd. I'm also not sure if I need the expr on line 3 when I'm setting the third-octet variable.
Many thanks in advance.
Simon Coffin