Forum Discussion
Ert_27713
Nimbostratus
Jan 21, 2008Irule ACL based on URI
Can someone help me with creating a rule that can filter URI access based on IP address.
Something like
userIP1 can access /userDIR1
userIP2 can access /userDIR2
userIP3 can access /userDIR3
anyIP can access /publicDIR
default drop
Here is my stab at it, that doesn't work:
when CLIENT_ACCEPTED {
if {[matchclass [IP::remote_addr] equals $::userIP1] and [HTTP::uri] equals /userDIR1} then {
log local0.info "Allowed client to userIP1: [IP::remote_addr] requesting: [HTTP::uri]"
} elseif {
if {[matchclass [IP::remote_addr] equals $::userIP2] and [HTTP::uri] equals /userIP2} then {
log local0.info "Allowed client to userIP2: [IP::remote_addr] requesting: [HTTP::uri]"
} elseif {
if {[matchclass [IP::remote_addr] equals $::userIP3] and [HTTP::uri] equals /userIP3} then {
log local0.info "Allowed client to userIP3: [IP::remote_addr] requesting: [HTTP::uri]"
} else {
if {[HTTP::uri] equals /any}
} else {
default {
drop
log local0. "Dropped client [IP::remote_addr] requesting: [HTTP::uri]"
}
}
}
Thanks
Eric
2 Replies
- hoolio
Cirrostratus
I expect you'd get a parser error when trying to save that rule because the HTTP::uri command isn't valid in the CLIENT_ACCEPTED event. To access the HTTP request headers, you should use the HTTP_REQUEST event. The IP:: commands are still valid there as well, so you can just change CLIENT_ACCEPTED to HTTP_REQUEST.
Is user IP just one IP or is it a set of hosts and/or networks? If it's just one IP or network, you can use IP::addr (Click here) to perform the comparison:
if {[IP::addr [IP::client_addr] equals 1.2.3.4] and [HTTP::path] equals /userDIR1}{
If you have a set of networks or hosts you want to compare for $::userIP1, then the matchclass method you were using will work well.
Also, you can use HTTP::path instead of HTTP::uri to get the URI minus the query string.
Aaron - Colin_Walker_12Historic F5 AccountSo what hoolio's saying is, try something like:
when HTTP_REQUEST { if {[matchclass [IP::remote_addr] equals $::userIP1] and [HTTP::uri] equals /userDIR1} { log local0.info "Allowed client to userIP1: [IP::remote_addr] requesting: [HTTP::uri]" } elseif {[matchclass [IP::remote_addr] equals $::userIP2] and [HTTP::uri] equals /userIP2} { log local0.info "Allowed client to userIP2: [IP::remote_addr] requesting: [HTTP::uri]" } elseif {[matchclass [IP::remote_addr] equals $::userIP3] and [HTTP::uri] equals /userIP3} { log local0.info "Allowed client to userIP3: [IP::remote_addr] requesting: [HTTP::uri]" } else { drop log local0. "Dropped client [IP::remote_addr] requesting: [HTTP::uri]" } }
This is what it looked like you were trying to get to. Let us know if you've got further questions.
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
