我需要为需要IP地址检查和URL检查的虚拟主机设置自定义filter。 像这样:
_if_ _(_ http-request matches url _and_ ip is from certain host/net range _)_ _or_ ip is from a certain VIP range _then_ let the request through
我想知道是否应该尝试将IP检查移动到数据包筛选器,然后执行两次IP检查(绕过VIP范围的URL检查),还是可以将其置于irule性能明智之列?
这是在iRule中很常见的事情,除非你有一个严重的BIG-IP,否则你不应该有问题。
如果您担心,您可以打开iRule计时,查看规则正在使用多less个CPU周期。 DevCentral有一个关于如何做到这一点的旧的,但很好的文章 。 唯一过时的部分是在V11上你会想要tmsh而不是bigpipe(例如“show / ltm rule”)。
如果你真的想避免iRules,另一种方法是HTTP类(本地stream量>configuration文件>协议> HTTP类),但是这个分类是通过URI而不是源IP。 它使您能够将匹配的URI发送到不同的池或返回redirect。 您可以将其与v11.3中的“虚拟服务器”上的新“源”属性结合使用,以制作多个虚拟服务器,每个虚拟服务器仅处理来自特定networking的stream量。
但是,如果你有很多的源代码范围可以覆盖,我只需要使用一个iRule和一个地址types数据组(使用“match class .. equals”命令来search数据组中的客户端IP,就像使用一个路由表)。
数据包filter是残酷的,将导致客户端超时,而HTTP类或iRule选项让您select是否放弃请求,select一个不同的池,返回一个redirect或返回一个错误页面。
我会在一个iRule中完成。
以下是每个虚拟服务器执行第4层ACL的示例:
https://devcentral.f5.com/wiki/iRules.AccessControlBasedOnNetworkOrHost.ashx
您可以根据CLIENT_ACCEPTED中的数据组检查客户端IP,然后使用[HTTP :: uri]检查HTTP_REQUEST中的URI。
这是一个使用class命令的例子:
https://devcentral.f5.com/wiki/iRules.class.ashx
when CLIENT_ACCEPTED { # Check if the client IP is in the allowed_hosts_dg data group if {[class match [IP::client_addr] equals allowed_hosts_dg]}{ set allowed_ip 1 } else { set allowed_ip 0 } } when HTTP_REQUEST { # If the client is a legal source IP check if the HTTP path is in the allowed_paths_dg data group if {$allowed_ip == 1 && [class search allowed_paths_dg contain [string tolower [HTTP::path]]]}{ # allow the request } else { # Send a 403 blocking response HTTP::respond 403 content {Illegal request!} } }
亚伦