我需要为需要检查 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 性能范围内?
答案1
这在 iRule 中是非常常见的事情,除非您的 BIG-IP 负载严重,否则不会有问题。
如果你担心,你可以打开 iRule 计时来查看规则使用了多少个 CPU 周期。DevCentral 有一个老旧但好用的关于如何做到这一点的文章。唯一过时的部分是在 v11 上,您需要 tmsh 而不是 bigpipe(例如“show /ltm rule”)。
如果您确实想避免使用 iRules,另一种方法是 HTTP 类(本地流量 > 配置文件 > 协议 > HTTP 类),但这是通过 URI 而不是源 IP 进行分类的。它使您能够将匹配的 URI 发送到不同的池或返回重定向。您可以将其与 v11.3 中虚拟服务器上的新源属性相结合,以创建多个仅处理流量的虚拟服务器从特定网络。
但是如果您要覆盖许多源范围,我只会使用 iRule 和地址类型数据组(使用“match class ..equals”命令在数据组中搜索客户端 IP,有点像使用路由表一样)。
数据包过滤器非常残酷,会导致客户端超时,而 HTTP 类或 iRule 选项可让您选择是否丢弃请求、选择其他池、返回重定向或返回错误页面。
答案2
我会在一个 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!}
}
}
亚伦