第十一章:iapp(忽略)
第十二章:使用规则和本地流量策略定制应用程序交付
用最简单的术语来说,iRule是在网络流量通过BIGIP系统时对其执行的脚本。其思想非常简单:规则使您能够编写简单的网络感知代码片段,这些代码以各种方式影响您的网络流量。无论您是希望以BIG-IP内置选项中目前无法提供的方式进行某种形式的自定义应用程序交付,还是希望通过细粒度控制流甚至给定数据包的内容来完全自定义用户体验,这都是构建irrules的目的。
规则可以路由、重路由、重定向、检查、修改、延迟、丢弃或拒绝、记录,或者对通过BIG-IP系统的网络流量做任何其他事情。irules背后的想法是使BIG-IP几乎无限灵活,为您提供在需要时做您需要的事情的能力。当标准的BIG-IP选项(如配置文件和流量策略)还不够时,irrules提供了一种自定义语言,您可以使用该语言将业务和应用程序逻辑添加到网络级的部署中。
规则的常用用法在BIG-IP系统中,规则可以用于做各种各样的事情,而且它们不仅仅局限于BIG-IP本地流量管理器(LTM)。例如,根据包头或负载的内容,您可以:
- 选择负载均衡池、负载均衡池成员或节点
- 将客户端从HTTP重定向到HTTPS(如果可能,最好使用本地流量策略)
- 将客户端持久化到特定池成员选择一个适当的IP地址用于源地址转换(智能SNAT)
- 对DNS查询提供自定义响应(智能DNS)
- 提供自定义阻塞响应页面操纵响应有效负载以掩盖敏感信息
- 将AD查询结果传递给web服务器
在本例中,规则检查客户端的IP地址,并根据该信息决定负载平衡池和源地址转换(SNAT)的使用。如果客户端IP地址以字符串“10”开头,则负载均衡连接到internal_pool,源地址从客户端地址转换为SNAT池internal_snatpool中的地址。
你觉得这个规则有什么潜在的问题吗?尽管没有语法错误,但是按照if语句的构造方式,IP地址以“100.”开头的客户机也将匹配条件,而不仅仅是IP地址以“10.”开头的客户机,如下所示。(还有其他方法可以匹配IP地址。)
触发规则
iRules是一种事件驱动的语言,这意味着规则是用代码块编写的,每个代码块只在特定的时间点执行——一个事件——作为一个通过BIG-IP代理的连接。
如图3所示,一些事件与BIG-IP系统(客户端)上客户端和虚拟服务器之间的流量相关。例如,CLIENT_ACCEPTED事件发生在客户端3次握手完成时,作为TCP连接建立的一部分。此时可以触发规则来检查和操作有效负载。其他事件与BIG-IP系统和池成员(服务器端)之间的流量相关。例如,SERVER_CONNECTED事件发生在服务器端3次握手完成时。其他事件与BIG-IP系统内部的活动相关联。例如,当BIG-IP选择要对连接进行负载平衡的池成员时,就会发生LB_SELECTED事件。
上图还显示了HTTP_REQUEST事件发生在接收到HTTP请求之后(而不是之前)。在这个过程中,规则可以安全地检查并根据HTTP头信息做出决定。在完成所有客户端请求处理并做出负载平衡决策之前,但在将实际数据发送到所选服务器之前,不会触发SERVER_CONNECTED。当服务器将其响应发送回BIG-IP系统时发生HTTP_RESPONSE。请注意,某些事件(如HTTP_REQUEST和HTTP_RESPONSE)可以在单个TCP连接上发生多次。
这确保了控制何时以及如何执行规则代码的粒度,并允许您尽可能地控制。这也使得BIG-IP系统每次只需要执行相关的事件块代码,而不是执行整个脚本,从而使事情变得高效。
iRule Wiki : http://devcentral.f5.com 或 DevCentral: An F5 Technical Community
作为一个完整的代理平台,BIG-IP系统本质上有两个上下文,客户端和服务器端,每个上下文都有自己独立的、功能齐全的TCP堆栈,其中上下文是严格执行的。这些术语并不表示流入或流出BIG_IP系统的方向流,甚至也不表示存在服务器。就我们的目的而言,客户端仅仅是指客户端发起到BIG-IP连接的一方,而服务器端则是指BIG-IP系统出于传输流量的需要而发起到服务器连接的一方。
规则构造概述
Tool Command Language(Tcl)可以在http://tmml.sourceforge.net/doc/tcl/index.html上找到Tcl文档。它有四种结构:
实验
负载平衡, XFF报头和自定义404响应
实验目标:
- 根据客户端的IP地址选择负载均衡池
- 在HTTP请求传递到web服务器之前,插入一个X-Forwarded-For报头
- 当后端服务器返回HTTP 404状态时,发送自定义响应页面
- 使用变量将仅在客户端上下文中可用的值传递给服务器端事件
创建规则并将其分配给虚拟服务器
1、创建两个pool
第一个:
- Name:in_network_http_pool
- Member:172.16.20.1:80,172.16.20.2:80,
- Load Balancing Method:Round Robin
第二个:
- Name:out_network_http_pool
- Member:172.16.20.3:80,
- Load Balancing Method:Round Robin
2、创建vs
- Name:custom_http_vs
- Destination IP:10.10.10.110:80
通过规则从HTTP响应中删除不需要的标头
1、请求http://10.10.10.110,先确认响应头有什么内容。
基于负载内容的负载平衡-HTTP和TCP
1、创建一个iRule
使用Policy完成负载平衡,插入XFF头
创建规则并将其分配给虚拟服务器
1、清理custom_http_vs的所有irules。
2、将in_network_http_pool的成员全部配置成enable。
使用policy完成基于HTTP URI查询字符串的负载平衡
1、添加rule
- HTTP URI query parameter named 'user' is 'me' at request time.-Forward traffic to pool '/Common/in_network_http_pool' at request time.
- HTTP URI query parameter named 'user' is not 'me' at request time.-Forward traffic to pool '/Common/out_network_http_pool' at request time.