Forum Discussion
midhun_108442
Jan 21, 2012Nimbostratus
Help need to create a irule for limit Client Connection
Hi,
Can anyone help us to create a irule to limit number of client connection hitting to Virtual server , I got the same irule scenario in Dev central site for (iRule.Limit Connection from Client) , but thats not working with me its only logging the message not blocking the connection ,Kindly anyone help me to provide the irule for the same.
Regards,
Midhun P.K
- hooleylistCirrostratusYou can take Thomas's logic and store the hosts and/or networks in a data group with the values set for the connection limit.
Data group mapping hosts/networks to connection limit values class conn_limit_dg { network 10.0.0.0/8 { "5" } network 192.168.0.0/16 { "5" } host 172.16.1.1 {"10"} }
From http://devcentral.f5.com/wiki/iRules.table.ashx Limit each client IP address to 20 concurrent connections when CLIENT_ACCEPTED { Max connections per client IP set limit [class match [IP::client_addr] equals conn_limit_dg] Set a subtable name with a standard prefix and the client IP set tbl "connlimit:[IP::client_addr]" Use a key of the client IP:port set key "[IP::client_addr][TCP::client_port]" Check if the subtable has over X entries if { [table keys -subtable $tbl -count] >= $limit } { log local0. "[IP::client_addr]:[TCP::client_port]: Rejecting connection ([table keys -subtable $tbl -count] connections / limit: $limit)" reject } else { Add the client IP:port to the client IP-specific subtable with a max lifetime of 1800 seconds (30min) table set -subtable $tbl $key "ignored" 1800 log local0. "[IP::client_addr]:[TCP::client_port]: Allowing connection ([table keys -subtable $tbl -count] connections / limit: $limit)" } } when CLIENT_CLOSED { When the client connection is closed, remove the table entry table delete -subtable $tbl $key log local0. "[IP::client_addr]:[TCP::client_port]: Decrementing ([table keys -subtable $tbl -count] connections / limit: $limit)" }
- midhun_108442NimbostratusHi Aaron/Thomas,
- midhun_108442NimbostratusHi Aaron/Thomas,
- hooleylistCirrostratusTry Hamish's example for 10.1 or higher:
- midhun_108442NimbostratusHi Aaron,
- hooleylistCirrostratusI think this should work if you've defined the host/network = limit pairs in the conn_limit_dg data group.
when RULE_INIT { This defines how long is the sliding window to count the requests. This example allows 10 requests in 3 seconds set static::windowSecs 3 set static::timeout 30 } when CLIENT_ACCEPTED { Max connections per client IP set limit [class match [IP::client_addr] equals conn_limit_dg] log local0. "[IP::client_addr]: \$limit: $limit" } when HTTP_REQUEST { if { [HTTP::method] eq "GET" } { set getCount [table key -count -subtable [IP::client_addr]] log local0. "getCount=$getCount" if { $getCount < $limit} { incr getCount 1 table set -subtable [IP::client_addr] $getCount "ignore" $static::timeout $static::windowSecs } else { log local0. "[IP::client_addr]: exceeded the number of requests allowed. $getCount / $limit" HTTP::respond 501 content "Request blockedExceeded requests/sec limit." } } }
- midhun_108442NimbostratusHi Aaron,
- hooleylistCirrostratusHi Midhun,
when RULE_INIT { This defines how long is the sliding window to count the requests. This example allows 10 requests in 3 seconds set static::windowSecs 3 } when CLIENT_ACCEPTED { Max connections per client IP set limit [class match -value [IP::client_addr] equals conn_limit_dg] log local0. "[IP::client_addr]: \$limit: $limit" } when HTTP_REQUEST { if { [HTTP::method] eq "GET" } { set getCount [table key -count -subtable [IP::client_addr]] log local0. "[IP::client_addr]: getCount=$getCount" if { $getCount < $limit} { incr getCount 1 table set -subtable [IP::client_addr] $getCount "" indefinite $static::windowSecs } else { log local0. "[IP::client_addr]: exceeded the number of requests allowed. $getCount / $limit" HTTP::respond 501 content "Request blocked. Exceeded requests/sec limit." } } }
- midhun_108442NimbostratusHi Aaron,
- hooleylistCirrostratusSorry for missing this... the class match command was missing the -value flag so it was just returning 1 for true (meaning the client IP was found in the data group). Using the -value flag indicates class match should return the value for the corresponding data group key. I've edited my post above with the update. Can you try that instead?
Recent Discussions
Related Content
Â
DevCentral Quicklinks
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
Discover DevCentral Connects