我需要为一个虚拟主机设置一个自定义过滤器,它同时需要ip地址检查和URL检查。就像这样:
_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性能方面?
发布于 2013-05-16 10:31:48
在iRule中,这是一件非常常见的事情,除非您有一个严重加载的大IP,否则您不应该有问题。
如果需要考虑,您可以打开iRule时间来查看该规则使用了多少个CPU周期。DevCentral有一个古老但很好的关于如何做到这一点的文章。唯一过时的部分是关于v11的,您需要的是tmsh而不是bigpipe (例如,“显示/ltm规则”)。
如果您真的想避免iRules,另一种方法是HTTP (本地流量>概要文件>协议> HTTP ),但是这是按URI而不是源IP分类的。它使您能够将匹配的URI发送到不同的池或返回重定向。您可以将其与v11.3中的Virtual上的新Source属性相结合,以生成多个虚拟服务器,每个服务器只处理来自特定网络的通信。
但是,如果您有许多源范围要覆盖,我只需要使用一个iRule和一个地址类型的数据组(使用"match class . equals“命令在Data中搜索客户机IP,就像在路由表中搜索客户机IP一样)。
数据包筛选器是残酷的,将导致客户端超时,而HTTP或iRule选项允许您选择是否删除请求、选择不同的池、返回重定向或返回错误页。
发布于 2013-05-31 00:52:59
我会在一个iRule里完成这一切。
下面是一个示例,它为每个虚拟服务器执行第4层ACL:
https://devcentral.f5.com/wiki/iRules.AccessControlBasedOnNetworkOrHost.ashx
您可以根据CLIENT_ACCEPTED中的数据组检查客户端IP,然后使用HTTP::uri检查HTTP_REQUEST中的URI。
下面是一个使用类命令的示例:
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!}
}
}
Aaron
https://serverfault.com/questions/495614
复制相似问题