Forum Discussion
suyeup_77835
Nimbostratus
Jun 07, 2011need count a HTTPheader Referer
hi.. my name is sooyeup.kim i'm from korea.
i need help.
now, my company have F5 L7-Switch.(four!!) but we don't have iRule engineer.
(customize the iRule is very hard!!T0T) i need this iRule.
1. Count a All Referer(HTTP::header) and IP
2. if some Referer is over the limit, drop that IP
i was write the this iRule, but that is wrong!!!T-T
when RULE_INIT {
array unset ::user array
set ::user { } array
set ::blocklist { } array
set ::refererlist{ }
set ::attacktime 10
set ::maxreferer 100
set ::holdtime 3 set ::referer }
when HTTP_REQUEST {
set ::referer [HTTP::header Referer]
if { ($::referer contains "mrtg") } {
if { [ info exists ::blocklist([IP::remote_addr]) ] } {
if {$::holdtime > [ expr [clock seconds] - $::blocklist([IP::remote_addr]) ] } {
drop log local5. "[IP::remote_addr] is HOLD" return
} else {
unset ::blocklist([IP::remote_addr]) log local5. "[IP::remote_addr] is released" }
}
if{[info exists ::refererlist]}{
if{[HTTP::header Referer] equals $::refererlist}{
if { [info exists ::user([IP::remote_addr],count)] } {
if { $::attacktime > [expr [clock seconds] - $::user([IP::remote_addr],duration)]} {
if {$::user([IP::remote_addr],count) > $::maxreferer } {
set ::blocklist([IP::remote_addr]) [clock seconds]
log local5. "[IP::remote_addr] is blocked"
drop
return
} else {
incr ::user([IP::remote_addr],count) 1
return
}
} else {
unset ::user([IP::remote_addr],count)
unset ::user([IP::remote_addr],duration) }
} else {
if { 20000 < [array size ::user] } {
array unset ::user array set ::user { } }
set ::user([IP::remote_addr],count) 1
set ::user([IP::remote_addr],duration) [clock seconds]
set ::refererlist([HTTP::header Referer]) }
}
}
}
}
help me please!
thank you..
5 Replies
- hoolio
Cirrostratus
Are you on 10.x or 9.x? For 10.x, you'd want to use a subtable to store the Referers instead of a global array. You can use the table command to access and modify a subtable:
http://devcentral.f5.com/wiki/default.aspx/iRules/table
You'd also want to change ::referer to a local variable as a global variable will be changed by all TCP connections--not just the current connection.
Aaron - John_Alam_45640Historic F5 AccountHere is an example i-rule which uses the tables. This irule counts connections on a per source IP basis. You can change it to count referrers instead.
rule connection_counter {
Irule, written by John Alam, Feb 21st, 2011.
This irule counts the connections from a source IP within a time interval. When the number connections
allowed within specified interval is exceeded, a message is logged and the measurement is restarted.
when RULE_INIT {
maxRate is the maximum number of connection an IP address can initiate in windowSecs interval.
set static::maxRate 10
WindowSec is the length of an interval in seconds.
set static::windowSecs 10
}
when CLIENT_ACCEPTED {
set srcip [IP::remote_addr]
set currtime [clock second]
set count [ table lookup -subtable conns $srcip]
if { $count > 0 } {
set count [incr -subtable Conns $srcip]
If frequency is more than ::maxRate send message to log.
Any existing record cannot have been more than windowSecs old.
Count is the number of connections within windowSecs.
if { $count > $static::maxRate } {
set elapsed_secs [expr $static::windowSecs - [table timeout -subtable conns -remaining $srcip]]
log "IP address <$srcip> Connected $count times within $elapsed_secs seconds"
we must delete and start over otherwise every subsequent new connecton will trigger a log message.
table delete -subtable conns $srcip
return
}
} else {
In this clause, either the user is new
or more than ::maxRate connections were established per windowSec and we issued a log message.
Or the lifetime (windowSec) has expired.
We are creating a new record.
table set -subtables conns $srcip 1 $static::windowSecs $static::windowSecs
log "New or refreshed user <$srcip> <$currtime> Connections $count interval remaining [table timeout -subtable conns -remaining $srcip]"
}
}
} - suyeup_77835
Nimbostratus
thank!!
but i need count same Referer T0T
if max referer is 3,
IP 1.1.1.1 Referer is A, B, C, A, A is drop.
because A is three~~
can i make it? - suyeup_77835
Nimbostratus
thank!!
but i need count same Referer T0T
if max referer is 3,
IP 1.1.1.1 Referer is A, B, C, A, A is drop.
because A is three~~
can i make it? - Colin_Walker_12Historic F5 AccountSure, you could take the code above and change it around to count the number of requests from a given referrer ([HTTP::header "referrer"]) and it should work fine. If you have any specific questions on how to make this work let us know.
Colin
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)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