编写 iRule

来源:互联网 发布:哈里路亚淘宝 编辑:程序博客网 时间:2024/06/04 23:32
• iRule 简介
• 创建iRule
• 控制对iRule 的选择运用
• 指定工具命令
• 指定流量目的地和地址转换
• 查询标头或内容数据
• 处理标头或内容数据
• 使用UIE 函数命令
• 使用Profile
• 通过iRule 启用会话持续性
• 创建、管理和使用数据组
• 覆盖Profile 设置
iRule简介
iRule 是BIG-IP®本地流量管理(LTM)系统中提供的一个功能强大的
灵活特性,可以用于管理网络流量。使用iRules™特性,不仅可以基于
标头数据来选择pool,而且可以通过搜索您定义的任何内容数据类型来
对引导流量。因此,iRule 特性可以显著增强对内容交换的定制能力,
以准确满足您的需求。
什么是iRule?
iRule 是一种脚本。如果希望各个连接不要指向为Real Server 定义的缺
省pool,而是指向其它pool,就可以编写iRule。iRule 允许您更直接地
指定希望将流量引导至哪些pool。使用iRule 不仅可以将流量发送至
pool,而且可以发送至各个Pool 成员、端口或URI。
根据您对内容交换的需要,可以创建简单iRule,也可以创建复杂iRule。
图13.1 显示了一个简单iRule 的示例。
图13.1 iRule 示例
此iRule 在完成客户机端SSL 握手时触发,使LTM 系统将数据包发送
至poolmy_pool。
使用称为通用检查引擎(UIE)的特性,可以编写搜索数据包标头或数
据包实际内容的iRule,然后基于该搜索结果来引导数据包。iRule 还可
以基于尝试进行客户机认证的结果来引导数据包。
iRule 不仅可以将流量引导至特定的pool,还可以引导至各个Pool 成员
(包括端口号和URI 路径),以实施持续性或满足特定的负载平衡要求。
用来编写iRule 的语法基于工具命令语言(Tcl)编程标准。因此,您可
以使用众多标准Tcl 命令,外加LTM 系统提供的一组健壮的扩展命令来
帮助进一步提高负载平衡的效率。
有关标准Tcl 语法的信息, 请参阅以下网址:
http://tmml.sourceforge.net/doc/tcl/index.html。有关已在LTM 系统
中禁用,因此编写iRule 时无法使用的Tcl 命令列表,请参阅附录B“禁
用的Tcl 命令”。
iRule基本元素
iRule 由以下这些基本元素组成:
• 事件声明
• 运算符
• iRule 命令
事件声明
iRule 是事件驱动的,这表示LTM 系统基于您在iRule 中指定的事件来
触发iRule。事件声明是iRule 中的事件规范,它使LTM 系统在该事件
发生时触发该iRule。以下是可以触发iRule 的事件声明示例:系统从
HTTP 请求中接收内容数据时触发iRule 的HTTP_REQUEST_DATA,
以及客户机已建立连接时触发iRule 的CLIENT_ACCCEPTED。
有关iRule 事件的详细信息,请参阅第13-5 页上的“指定事件”。
运算符
iRule 运算符用于比较表达式中的两个运算对象。例如,您可以使用
equals 运算符将可变运算对象与常量进行比较。您可以创建表示以下含
义的if 语句:“如果远程客户机的地址是10.10.10.10,便发送至
my_pool。”
表 13.1 列出了可以在iRule 中使用的有效运算符。
运算符 语法
关系运算符
逻辑运算符
contains
matches
equals
starts_with
ends_with
matches_regex
not
and
or
表13.1 iRule 运算符
iRule 命令
iRule 命令是iRule 中的命令规范,它使LTM 系统执行某些操作。可以
包括在iRule 中的命令类型有:
• 查询命令
这些命令用于搜索标头和内容数据。IP::remote_addr 便是查询命
令的一个示例,它搜索并返回连接的远程IP 地址。有关查询命令
的详细信息,请参阅第13-16 页上的“查询标头或内容数据”。
• 操作/修改命令
这些命令执行各种操作,例如将标头插入HTTP 请求中。
HTTP::header remove<name>便是操作命令的一个示例,它从
请求或响应中删除最后一个命名标头实例。有关操作/修改命令的
详细信息,请参阅第13-24 页上的“处理标头或内容数据”。
• 语句命令
这些命令用于指定流量的目的地,例如pool 或URL(用于重写
HTTP 重定向)。pool <name>便是语句命令的一个示例,它将流
量引导至命名负载平衡Pool。有关详细信息,请参阅第13-12 页
上的“指定流量目的地和地址转换”与第13-31 页上的“使用UIE
函数命令”。
• UIE 命令
这些命令用于执行深层数据包检查功能,以便直接选择pool 中的
Pool 成员,或者根据对命令中指定的任何数据的搜索结果来选择
pool。decode_uri <string>便是UIE 命令的一个示例,它对使用
HTTP URI 编码的命名字符串进行解码,然后返回结果。有关使用
UIE 函数命令的详细信息,请参阅第13-31 页上的“使用UIE 函
数命令”。
创建iRule
您可以使用Configuration 工具来创建iRule。
创建iRule 的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在屏幕的右上角,点击Create。
4. 在Name 框中,键入名称(1 到31 个字符)。
5. 在Definition 框中,键入iRule 的语法。
6. 点击Finished。
有关编写iRule 的详细语法信息,请参阅本章剩余部分。
♦ 重要信息
创建 iRule 之后,需要配置Real Server 来参考iRule。有关配置Real
Server 来参考iRule 的信息,请参阅第2 章“配置Real Server”。
控制对iRule的选择运用
在没有iRule 的基本系统配置中,LTM 系统将入站流量引导至为接收该
流量的Real Server 分配的缺省pool。但您可能希望LTM 系统将特定类
型的连接引导至其它目的地。实现这一点的方式是编写随着特定事件类
型的发生,将流量引导至其它目的地的iRule。如果未发生该类事件,
流量将继续流入分配给Real Server 的缺省pool。
只要发生您在iRule 中指定的事件,便会选择运用规则。例如,如果iRule
包括事件声明CLIENT_ACCEPTED,那么只要LTM 系统接受客户机请
求,便触发iRule。然后,LTM 系统将按照iRule 中剩余部分指示的方
向,确定数据包的目的地。
配置前提条件
LTM 系统能够选择运用所编写的iRule 前,必须执行以下操作:
• 将iRule 分配给Real Server。
将iRule 分配给Real Server 时,表示该Real Server 参考该iRule,
这类似于Real Server 参考pool 或Profile。
• 确保Real Server 参考正确的Profile。
例如,如果iRule 包括事件声明HTTP_REQUEST,那么仅当Real
Server 参考HTTP Profile 类型时,LTM 系统才选择运用iRule。
有关将iRule 和Profile 分配给Real Server 的信息,请参阅第2 章“配
置Real Server”。
指定事件
iRule 特性包括数类可在iRule 中指定的事件声明。指定事件声明用于确
定LTM 系统选择运用iRule 的时机。以下小节列出并介绍了这些事件类
型,同时还介绍了iRule 的环境概念和关键字when 的用法。
事件类型
iRule 命令语法包括以下数类可在iRule 中指定的事件声明:
• 全局事件
• HTTP 事件
• SSL 事件
• 认证事件
表13.2 列出并介绍了可在iRule 中声明的每种事件类型的事件。
iRule 事件 说明
全局事件
CLIENT_ACCEPTED 客户机建立连接时触发。
CLIENT_DATA 连接处于Collect 状态时,如果客户机收到新数据,便触发此
事件。
SERVER_SELECTED LTM 系统选定目标节点时触发。
SERVER_CONNECTED 系统与目标节点建立连接时触发。
SERVER_DATA 连接处于Hold 状态时,如果客户机接收到来自目标节点的新数
据,便触发此事件。
RULE_INIT 添加或修改iRule 时触发。此事件用于初始化iRule 中使用的全
局变量。
HTTP 事件
HTTP_REQUEST 系统完全解析整个客户机请求标头时触发。此处所说标头是指
方法、URI、版本和所有标头,不包括请求正文。
HTTP_REQUEST_DATA 请求接收到新的HTTP 内容数据时触发。
HTTP_RESPONSE 系统解析服务器响应中的所有响应状态和标头行时触发。
HTTP_RESPONSE_DATA 系统从响应中接收到新的HTTP 内容数据时触发。
HTTP_RESPONSE_CONTINU
E
系统从服务器接收到100 Continue 响应时触发。
SSL 事件
CLIENTSSL_HANDSHAKE 完成客户机端SSL 握手时触发。
CLIENTSSL_CLIENTCERT 系统将SSL 客户机证书添加到客户机证书链时触发。LTM 系统
可以使用SSL::cert 和SSL::cert issuer 命令来检索X509 证
书及其X509 签发者。
SERVERSSL_HANDSHAKE 完成服务器端SSL 握手时触发。
认证事件
iRule 事件 说明
AUTH_FAILURE 未成功的授权操作结束时触发。此事件的缺省处理程序与每个
认证Profile 都相关联,可使系统关闭连接。
AUTH_ERROR 授权过程出错时触发。此事件的缺省处理程序与每个认证
Profile 都相关联,可使系统关闭连接。收到此事件表示相关认
证会话ID 失效,用户应立即丢弃该会话ID。
AUTH_WANTCREDENTIAL 授权操作需要其它证书时触发。另请参阅第13-23 页上“查询
认证数据”一节中对AUTH::wantcredential_prompt 命令的描
述。此事件的缺省处理程序与每个认证Profile 都相关联,可使
系统关闭连接,除非能够获得所需证书。通常,这意味着因为
系统未启用所需的认证协议,所以提供证书的协议层也尚未获
得证书。每个认证Profile 都包含用于其各自协议的适当缺省处
理程序。
AUTH_SUCCESS 授权成功完成全部所需的认证服务时触发。
表13.2 iRule 的事件声明
iRule 的环境
对于在 iRule 中指定的每个事件,您还可以指定环境,由关键字
clientside 或serverside 指明。因为每个事件都带有与其关联的缺省环
境,所以仅当希望更改缺省环境时,才需要声明环境。
例如, 图13.2 显示了my_iRule1 , 其中包括事件声明
CLIENT_ACCEPTED,以及iRule 命令IP::remote_addr。在此情形中,
iRule 命令返回的IP 地址是客户机的IP 地址,因为事件声明
CLIENT_ACCEPTED 的缺省环境是clientside。
图 13.2 使用缺省clientside 环境的iRule
与之类似, 图13.3 显示了my_iRule2 , 其中包括事件声明
SERVER_CONNECTED,以及iRule 命令IP::remote_addr。在此情
形中,iRule 命令返回的IP 地址是服务器的IP 地址,因为事件声明
SERVER CONNECTED 的缺省环境是serverside。
图 13.3 使用缺省serverside 环境的iRule
以上两个示例显示了如果所编写的iRule 使用缺省环境来处理iRule 命
令,将产生的结果。但您可以明确指定关键字clientside 和serverside,
以改变iRule 命令的行为。
继续上一个示例,图13.4 显示了my_iRule3,其中包括事件声明
SERVER_ACCEPTED,并为iRule 命令IP::remote_addr 明确指定关
键字clientside。
在此情形中,iRule 命令返回的IP 地址是客户机的IP 地址,尽管事件声
明的缺省环境是服务器端。
图13.4 明确指定iRule 环境的iRule
使用关键字“when”
在 iRule 中,使用后接事件名称的关键字when 来进行事件声明。上图
显示了iRule 中的一个事件声明示例。
Real Server 上列出的iRule
为 Real Server 分配多个iRule 作为资源时,有必要考虑它们在Real
Server 上列出的顺序。这是因为LTM 系统按照可用iRule 列出的顺序来
处理重复的iRule 事件。因此,iRule 事件可以终止事件的触发,从而阻
止LTM 系统触发后续事件。
♦ 注意
如果 iRule 参考Profile,那么LTM 系统将最后处理此类iRule,而不考
虑它在分配给Real Server 的iRules 列表中的顺序如何。
指定语句命令
有些可在iRule 中使用的命令称为语句命令。语句命令用于使LTM 系统
以某种方式执行直接操作。例如,这些命令中的一些用于指定希望LTM
系统将流量引导至其中的pool 或服务器。其它命令则用于指定将流量重
定向至其中的URI 或端口号,以及用于实施SNAT 连接的转换地址。
表13.3 列出并介绍了可以在iRule 中使用的语句命令。
语句命令 说明
cache <expression> {
origin_pool <pool_name>
cache_pool <pool_name>
[hot_pool <pool_name>]
[hot_threshold <hit_rate>]
[cool_threshold <hit_rate>]
[hit_period <seconds>]
[content_hash_size <sets>]
[persist <value>]}
动态选择要用于负载平衡的pool(请参阅pool 命令)。如果<
表达式>的值为假,那么使用原始pool。如果值为真,使用高速
缓存pool,除非符合常用标准,此时将使用hot_pool。此语句
可以按照一定的条件与if 语句进行关联。
clientside {<iRule commands>} 用于使指定的iRule 命令在客户机端环境下得到选择运用。如果
iRule 已在客户机端环境下得到选择运用,此命令不会产生任何
效果。
detach 停止对此连接选择运用此iRule 事件。但iRule 继续运行。
discard 此命令将导致当前数据包或连接(具体取决于事件的环境)被
丢弃。此语句必须按照一定的条件与if 语句进行关联。
语句命令 说明
drop 与discard 命令相同。
forward 将连接设置为转发IP 数据包。
if { <expression> } {
<statement command>
}
elseif { <expression> } {
<statement command>
}
询问一个判断真假的问题,然后根据答案(真或假)执行一些
操作。
请注意:在iRule 中,if 语句可以嵌套的最大层数是100 层。
log [<facility> <level>} <message> 生成指定的消息,然后记录到系统日志工具。语句通过在为
HTTP Profile 的Header Insert 属性定义的消息基础上,执行
可变扩充来实现这些操作。
如果使用不当,log 语句会生成大量输出。
matchclass <data-group name> 指定数据组。通常在if 语句中与contains 运算符一起使用。
[use] node <addr> [<port>] 此命令导致对标识的服务器节点的直接使用,从而绕过任何负
载平衡。
peer { <iRule commands> } 用于使指定的iRule 命令在对等(相反)环境下得到选择运用。
persist
<persistence_profile_name>
用于使LTM 系统利用命名持续性Profile 来实现连接的持续性。
有关使用iRule 启用持续性的详细信息,请参阅第13-35 页上
的“使用Profile”。
[use] pool <pool_name>
[member <addr> [<port>]]
用于使LTM 系统将流量负载平衡至命名的pool。此语句必须按
照一定的条件与if 语句进行关联。您也可以选择指定要将流量
引导至其中的特定Pool 成员。
[use] rateclass <rate_class> 用于使LTM系统选择指定的速率等级,以便传输数据包时使用。
reject 此命令导致连接被拒,返回适合于该协议的重置结果。
return [<expression>] 终止执行iRule 事件,然后(可选)返回对<expression>选择
运用的结果。
serverside { <iRule commands> } 用于使指定的iRule 命令在服务器端环境下得到选择运用。如果
iRule 已在服务器端环境下得到选择运用,此命令不会产生任何
效果。
[use] snat <addr> [<port>] 用于使LTM 系统将指定的转换地址分配给iRule 中指定的一个
或多个源IP 地址。
[use] snatpool <snatpool_name> 此命令导致使用由<snatpool_name>标识的pool 的地址作为
转换地址,来创建SNAT。
表 13.3 iRule 语句命令
指定工具命令
有些可在iRule 中使用的命令称为工具命令。这些命令中的大多数用于
确保数据的完整性。表13.4 列出并介绍了可以在iRule 中使用的语句命
令。
工具命令 说明
b64encode <string> 返回base-64 编码的字符串,如果发生错误,则返回空字符串。
b64decode <string> 返回base-64 解码的字符串,如果发生错误,则返回空字符串。
crc32 <string> 返回所提供字符串的crc32 校验和,如果发生错误,则返回空字
符串。用于确保数据的完整性。
md5 <string> 返回运用RSA Data Security 公司MD5 消息摘要算法(md5)得
到的所提供字段串的消息摘要;或者如果发生错误,则返回空字
符串。用于确保数据的完整性。
sha1 <string> 返回运用1.0 版安全散列算法(SHA1)得到的所提供字段串的消
息摘要;或者如果发生错误,则返回空字符串。用于确保数据的
完整性。
表13.4 iRule 工具命令
指定流量目的地和地址转换
第13-8 页上“指定语句命令”一节中描述的iRule 命令用于指示LTM
系统以某种方式执行直接操作。以下数节介绍语句命令的一个子集,这
些命令或者将流量引导至特定目的地,或者分配用于SNAT 实施的转换
地址。
有关语句命令的完整列表,请参阅第13-8 页上的“指定语句命令”。
选择负载平衡Pool
在iRule 中指定查询后,可以使用pool 命令来选择希望LTM 系统将数
据包发送至其中的负载平衡Pool。图13.5 显示了此命令的一个示例。
图13.5 iRule 中的pool 命令的示例
选择特定服务器
您也可以编写将流量引导至pool 中特定服务器的iRule,以代替pool
命令。要编写此iRule,请使用node 命令。图13.6 显示了此命令的一
个示例。
图13.6 iRule 中的node 命令的示例
选择高速缓存pool
iRule 可以包含基于HTTP 标头数据来选择pool 的cache 命令。cache
命令返回原始pool、常用pool 或高速缓存pool。选择高速缓存pool 时,
还包括指明的节点地址和端口。iRule 返回pool 和Pool 成员时,LTM
系统不会进行任何额外的负载平衡或持续性处理。
图13.7 显示了一个包含cache 命令的iRule 示例。
图13.7 包含 cache 命令的iRule 示例
表13.5 介绍了cache 命令的属性及其语法。
属性 说明 必需属性?
origin_pool
<pool_name>
指定包含以下所有内容的服务器的pool:无法高速缓存所
请求内容时;所有高速缓存服务器都不可用时;或者使用
LTM 系统来重定向高速缓存中已丢失的请求时,将请求负
载平衡至这些内容。

cache_pool
<pool_name>
指定以下这类高速缓存服务器的pool:将请求引导至这些
服务器,以优化高速缓存性能。

hot_pool <pool_name> 指定包含以下内容的服务器的pool:所请求内容经常被请
求(常用)时,将请求负载平衡至该内容。如果指定此表
中以下属性的任何一个,hot_pool 属性便是必需的。

persist <expr> 指定将被选择运用,并用于持续连接至高速缓存pool 中
同一节点的表达式。

cool_threshold
<hit_rate>
指定对所指定内容的最大请求次数,此最大值将使内容在
周期结束时由常用内容变为罕用内容。

hit_period <seconds> 以秒为单位指定一个周期,将按照该周期来计算对特定内
容的请求,然后确定是否将该内容的状态变为常用或罕
用。

content_hash_size
<sets_in_content_hash
>
指定计算内容处于常用还是罕用状态时,将该内容分成多
少个子集。将对同一子集中所有内容的请求加在一起,然
后据此为每个子集分配一个常用状态或罕用状态。此属性
的值不应超过可能的实际请求数。例如,如果整个站点由
500,000 条内容组成,那么content_hash_size 通常为
100,000。

表13.5 cache 命令语法介绍
重定向HTTP请求
除了将iRule 配置为选择特定pool 之外,还可以使用iRule 命令
HTTP::redirect 对iRule 进行配置,将HTTP 请求重定向至特定位置。
该位置可以是主机名称,也可以是URI。
例如,字符串https://www.siterequest.com 指定将HTTP 请求重定向
至一个不同的协议(https,而不是标准的http)。
图 13.8 显示了配置用于重定向HTTP 请求的iRule。
图13.8 基于HTTP 重定向的iRule
为SNAT连接分配转换地址
iRule 特性带有snat 和snatpool 这两个语句命令。
使用snat 命令可以将特定转换地址分配给iRule 中的源IP 地址,而无
需再使用Configuration 工具中的SNAT 屏幕。
尽管与snat 命令不同,但snatpool 命令也可以用于将转换地址分配给
源IP 地址,它使LTM 系统从指定的以前创建的SANT pool 中选择转换
地址。
有关实施SNAT 的详细信息,请参阅第11 章“配置SNAT 和NAT”。
查询标头或内容数据
iRule 特性包含若干命令,专门设计用于允许您对以下内容运行查询:
• 链路层标头
• IP 标头
• TCP 标头和内容
• UDP标头和内容
• HTTP 请求中的SSL 标头
• 认证数据
查询链路层标头
您可以通过指定链路层标头信息来选择pool,表13.6 列出并介绍了这
些命令。
iRule 命令 说明
LINK::vlan_id
LINK::vlan_qos
返回数据包的VLAN 标记。
返回数据包的VLAN 服务质量(QoS)值。
表13.6 用于查询链路层标头的iRule 命令
服务质量(QoS)级别
网络设备通过服务质量(QoS)标准来根据标识符确认和区别对待流量。
流量进入站点时,LTM 系统可以应用根据数据包中的QoS 级别将流量
发送至不同服务器pool 的iRule。
要将iRule 配置为根据数据包的QoS 级别来选择pool,可以使用iRule
命令LINK::vlan_qos,如图13.9 中的示例所示。
图13.9 基于服务质量(QoS)级别的iRule
有关针对数据包设置QoS 值的详细信息,请参阅第13-24 页上的“处
理链路层数据”和第4 章“配置负载平衡Pool”。
查询IP数据包标头
您可以通过查询IP 数据包标头信息来选择pool,表13.7 列出并介绍了
这些命令。
iRule 命令 说明
IP::remote_addr 返回连接的远程IP 地址。
IP::local_addr 返回连接的本地IP 地址。
IP::client_addr
返回连接的客户机IP 地址。此命令与命令clientside
{ IP::remote_addr }等效。
IP::server_addr 返回服务器的IP 地址。此命令与命令serverside { IP::remote_addr }
等效。
IP::protocol 返回IP 协议值。
IP::tos 返回IP 协议的服务类型(ToS)字段的值。
IP::idle_timeout 返回或设置空闲超时值。
表13.7 用于查询IP 数据包标头的iRule 命令
如上表所示,可以在iRule 中查询的特定IP 数据包标头数据类型包括:
• IP 地址
• 协议号
• ToS 级别
• 空闲超时值
指定IP 地址
您可以在iRule 中指定IP::remote_addr 或IP::local_addr 命令,以便
选择pool。例如,您可以根据客户机的IP 地址部分对流量进行负载平
衡,也可以指定IP::client_addr 和IP::server_addr 命令。
图13.10 显示了实施上述语句的iRule。在此示例中,将源地址首字节
等于206 的所有客户机请求都引导至名为clients_from_206 的pool。
而将所有其它请求引导至名为other_clients_pool 的pool。
图13.10 基于IP::local_addr 命令的iRule
指定 IP 协议号
LTM 系统包括iRule 命令IP::protocol,使用该命令可以根据IP 协议号
来选择pool。
要将iRule 配置为根据IP 协议号来选择pool,请使用如图13.11 中的示
例所示的语法。
图13.11 基于IP 协议号的iRule
指定服务类型(ToS)级别
网络设备通过服务类型(ToS)标准来根据标识符确认和区别对待流量。
流量进入站点时,LTM 系统可以应用根据数据包中的ToS 级别将流量发
送至不同服务器pool 的iRule。
用来针对数据包设置ToS 级别的命令是IP::tos。
要将iRule 配置为根据数据包的ToS 级别来选择pool,可以使用iRule
命令IP::tos,如图13.12 中的示例所示。
图13.12 基于服务类型(ToS)级别的iRule
有关针对数据包设置ToS 值的详细信息,请参阅第13-24 页上的“处理
IP 标头”和第4 章“配置负载平衡Pool”。
指定空闲超时值
通过iRule 中的IP::idle_timeout 命令,可以将空闲超时值指定为选择
希望LTM 系统将流量发送至其中的pool 的标准。
查询UDP标头和内容
您可以通过指定UDP 标头或内容信息来选择pool。表13.8 列出并介绍
了这些命令。
iRule 命令 说明
UDP::remote_port 返回远程的UDP 端口/服务号。
UDP::local_port 返回本地的UDP 端口/服务号。
UDP::client_port 返回客户机的UDP 端口/ 服务号。与命令clientside
{ UDP::remote_port }等效。
UDP::server_port 返回服务器的UDP 端口/ 服务号。与命令serverside
{ UDP::remote_port }等效。
UDP::payload [<size>] 返回当前UDP 有效负载内容。
UDP::payload length 返回UDP 有效负载内容的大小(以字节为单位)。
表13.8 用于查询UDP 标头或内容的iRule 命令
查询TCP标头和内容
您可以通过指定TCP 标头或内容信息来选择pool。表13.9 列出并介绍
了这些命令。
iRule 命令 说明
TCP::remote_port 返回远程的TCP 端口/服务号。
TCP::local_port 返回本地的TCP 端口/服务号。
TCP::client_port 返回客户机的TCP 端口/ 服务号。与命令clientside
{ TCP::remote_port }等效。
TCP::server_port
返回服务器的TCP 端口/ 服务号。与命令serverside
{ TCP::remote_port }等效。
TCP::payload [<size>] 返回累计的TCP 数据内容。
TCP::payload_length 返回累积的TCP 数据内容的大小(以字节为单位)。
TCP::rtt 返回为TCP 连接估计的正常返回时间。
TCP::mss 返回TCP 连接的连接最大字段大小(MSS)。
TCP::unused_port 返回指定IP 元祖未使用的TCP 端口,以<hint_port>的值作为起点。
TCP::offset 返回所收集的TCP 数据在TCP 数据流中的开始位置。
表13.9 用于查询TCP 标头或内容的iRule 命令
例如,您可能希望iRule 具有如下逻辑含义:“如果数据包的数据包含带
有字符串XYZ 的TCP 请求,那么使用pool xyz_servers 进行负载平衡。
如果未找到该字符串,那么在指定的偏移处搜索字符串ABC,然后使用
pool abc_servers 来进行负载平衡。如果未找到字符串ABC,那么使
用pool web_servers 来进行负载平衡。”
要实现这一操作,您可以编写使用TCP::payload 命令的iRule。图13.13
显示的iRule 说明了此示例。
图13.13 使用TCP 请求字符串命令的示例iRule
查询HTTP标头和内容
您可以通过指定HTTP 标头或内容信息来选择目的地。表13.10 列出并
介绍了这些命令。请注意,此列表未包括用于查询HTTP 请求中的SSL
相关标头的命令。有关查询SSL 标头的信息,请参阅第13-22 页上的“查
询HTTP 请求的SSL 标头”。
iRule 命令 说明
HTTP::header [value] <name> 返回名称等于<name>值的HTTP 标头的值。如果标头名称不与任何
子命令冲突,那么可以省略<value>参数。
HTTP::header names 返回请求或响应中带有的所有标头的列表。
HTTP::header count 返回请求或响应中带有的HTTP 标头数。
HTTP::header at <index> 返回系统在基于零的索引值处找到的HTTP 标头。
HTTP::header exists <name> 如果请求或响应中带有此命名标头,那么返回“真”。
HTTP::method 返回HTTP 请求方法的类型。
HTTP::status 返回响应状态代码。
HTTP::version ["0.9" | "1.0" |
"1.1"]
返回请求或响应的HTTP 版本。
HTTP::username 返回HTTP 基本授权的用户名部分。
HTTP:: password 返回HTTP 基本授权的密码部分。
HTTP::path [<string>] 返回HTTP 请求的路径部分。
HTTP::uri [<string>] 返回请求的完整URI。
iRule 命令 说明
HTTP::query [<string>] 返回HTTP 请求的查询部分。
HTTP::is_redirect 如果响应是特定类型的重定向,那么返回真。
HTTP::is_keepalive 如果此连接是Keep-Alive 连接,那么返回真。
HTTP::collect [<length>] 收集通过[length]参数指定的数据量。系统收集指定的数据量时,将调
用Tcl 事件HTTP_REQUEST_DATA 或HTTP_RESPONSE_DATA。
省略内容长度值时应格外小心。虽然在特定情形中允许这样做,但省
略内容长度值或是使用大于实际长度大小的值会使连接延迟。
HTTP:: release 释放收集的数据。没有必要在HTTP_REQUEST_DATA 和
HTTP_RESPONSE_DATA 事件中使用HTTP::release 命令,因为在
这些事件下,数据是暗中释放的。
HTTP::payload [<size>] 返回HTTP::collect 命令截至目前收集的内容。如果不指定大小,系
统将返回收集的内容。
HTTP::payload length 返回命令截至目前收集的内容的大小,不包括HTTP 标头。
HTTP::payload replace <offset>
<length> <string>
用开始于<string>的<offset>处的<length>参数来代替指定的内容数
量。
HTTP::close 插入Connection:Close 标头,然后关闭HTTP 连接。
URI::protocol <string> 从指定的URI 字符串中提取协议部分。
URI::basename <string> 从指定的URI 字符串中提取基础名称部分。
URI::path <string> 从指定的URI 字符串中提取路径部分。
URI::query <string> 从指定的URI 字符串中提取查询部分。
URI::host <string> 从指定的URI 字符串中提取主机部分。
URI::compare <uri1> <uri2> 根据RFC 2616 第3.2.3 节的建议比较URI。
URI::decode <string> 返回经过解码的URI 字符串。
URI::encode <string> 返回经过编码的URI 字符串。
URI::port <string> 从指定的URI 字符串中提取端口部分。
表13.10 用于查询IHTTP 标头和内容的iRule 命令
例如,您可能希望iRule 具有如下逻辑含义:“如果数据包的数据包含
URI 以cgi 结束的HTTP 请求,那么使用pool cgi_pool 进行负载平衡。
无此类HTTP 请求时,如果数据包的数据包含URI 以/foo 开始的HTTP
请求,那么使用pool foo_servers 进行负载平衡。无此类HTTP 请求时,
使用pool default_pool 进行负载平衡。”
图 13.14 显示的iRule 说明了此示例。
图13.14 使用HTTP 请求字符串命令的示例iRule 查询HTTP 请求
的SSL标头
您可以根据HTTP 请求的SSL 标头中驻留的数据来选择目的地。表
13.11 列出并介绍了这些命令。
iRule 命令 说明
SSL::mode 在客户机端环境下,返回require、request、ignore 或auto 之一。
在服务器端环境下,返回require 或ignore 之一。
SSL::cert <index> 返回索引值大于或等于零的对等证书链中的X509 SSL 证书索引。值
为零代表证书链中的第一个证书,值为一代表第二张证书,依此类推。
此命令目前仅在客户机端环境下可用,在服务器端环境下将返回错误。
SSL::cert issuer <index> 返回索引值大于或等于零的对等证书链中的X509 SSL 证书索引的签
发者证书。值为零代表证书链中的第一个证书,值为一代表第二张证
书,依此类推。此命令目前仅在客户机端环境下可用,在服务器端环
境下将返回错误。
SSL::cert count 返回对端提供的证书总数。
SSL::verify_result 返回对等证书验证的结果代码, 所用的值与OpenSSL
SSL_get_verify_result()函数相同。
SSL::cipher name 返回当前SSL 加密版本, 所用的格式与OpenSSL
SSL_CIPHER_get_version()函数相同。
SSL::cipher version 返回当前SSL 加密版本, 所用格式与OpenSSL
SSL_CIPHER_get_version()函数相同。
SSL::cipher bits 返回当前SSL 加密使用的密码位数,所用的格式与OpenSSL
SSL_CIPHER_get_bits()函数相同。
SSL::SSL::current_sessioni
d
返回当前协商的SSL 会话ID;如果会话ID 不存在,返回值-1。
SSL::modssl_sessionid_he
aders [<option>+]
返回系统将要添加到HTTP 标头,以便模拟modssl 行为的字段列表。
返回类型是Tcl 列表,系统随后将其以标头名称/标头值对的形式进行
解释。使用此命令可以指定的选项包括initial 和current。有关
ModSSL 模拟的信息,请参阅第7 章“管理SSL 流量”。
表13.11 用于查询HTTP 请求中的SSL 标头的iRule 命令
查询认证数据
您可以根据认证数据来选择目的地,表13.12 列出并介绍了这些命令。
iRule 命令 说明
iRule 命令 说明
AUTH::wantcredential_prompt <authid> 返回系统最后一次请求( 系统生成
AUTH_WANTCREDENTIAL 事件时)的授权会话授权ID
的证书提示字符串,例如Username:。向交互式协议(例
如telnet 和ftp)提供认证服务时,此命令格外有用,此
时实际文本提示和响应可能直接与远程用户通信。
AUTH::wantcredential_prompt_style
<authid>
返回系统最后一次请求( 系统生成
AUTH_WANTCREDENTIAL 事件时)的授权会话授权ID
的证书提示样式。返回的值可以是echo_on、echo_off
或unknown。向交互式协议(例如telnet 和ftp)提供认
证服务时,此命令格外有用,此时实际文本提示和响应可
能直接与远程用户通信。
AUTH::wantcredential_type <authid> 返回系统最后一次请求( 系统生成
AUTH_WANTCREDENTIAL 事件时)的授权会话授权ID
的证书类型。返回的值可以是username、password、
x509、x509_issuer 或unknown,具体取决于证书提示
字符串和样式的系统评估。
AUTH::status <authid> 根据系统对授权会话授权ID 执行的最近一次授权的结果,
返回值success、failure、error 或not-authed。
AUTH::ssl_cc_ldap_username <authid> 返回系统最后一次对授权会话授权ID 进行成功的基于客
户机证书的LDAP 查询时,从LDAP 数据库中检索的用户
名。如果最后一次的成功查询并未执行成功的基于客户机
证书的LDAP 查询,或者尚未执行查询,系统将返回空字
符串。
AUTH::ssl_cc_ldap_status <authid> 返回最后一次对授权会话授权ID 进行成功的基于客户机
证书的LDAP 查询时的状态。如果最后一次的成功查询并
未执行基于客户机证书的LDAP 查询,或者尚未执行查
询,系统将返回空字符串。
表13.12 用于查询认证数据的iRule 命令
处理标头或内容数据
iRule 特性包括若干专门设计用来处理特定数据类型的命令。此处的数
据处理是指插入、替换和删除数据,以及对标头和cookie 中的特定值进
行设置。
可以使用iRule 来处理的标头和内容包括以下数类:
• 链路层数据
• IP标头
• TCP标头
• HTTP 标头和cookie
• SSL标头
处理链路层数据
使用表13.13 中介绍的命令可以设置用于发送数据包的QoS 级别。
iRule 命令 说明
LINK::vlan_qos 设置希望系统在发送数据包时使用的VLAN QoS 级别。
表13.13 用于处理链路层数据的iRule 命令
处理IP标头
使用表13.14 中介绍的命令可以设置用于发送数据包的ToS 级别。
iRule 命令 说明
IP::tos 设置希望系统在发送数据包时使用的IP ToS 级别。
表13.14 用于处理IP 标头数据的iRule 命令
处理TCP标头和内容
使用表13.15 中介绍的命令可以处理TCP 标头和内容数据。
iRule 命令 说明
TCP::collect <length> 使TCP 开始收集指定数量的内容数据。
TCP:: release 使TCP 恢复对连接的处理,并更新已收集的数据。
TCP::payload replace
<offset> <length> <data>
用给定的数据替代已收集的有效负载。
TCP::respond <data> 将命名数据直接发送给对端。此命令用于通过iRule 完成协议握手。
TCP::close 关闭连接。
表13.15 用于处理TCP 内容数据的iRule 命令
处理HTTP标头和cookie
以下这几个可在iRule 中使用的iRule 命令用于处理HTTP 标头数据、
内容数据和cookie。
处理HTTP标头和内容
表13.16 列出的iRule 命令可以用于处理HTTP 请求和响应中的标头。
iRule 命令 说明
HTTP::header insert ["lws"] <name>
<value>
将命名HTTP 标头及其值插入HTTP 请求和响应的结尾
处。如果指定"lws",系统将为长标头值添加直线型空白。
HTTP::header insert ["lws"] {n1, v1, n2,
v2, n3, v3, ...}
传递要插入标头中的Tcl 列表。在此情形中,系统将列表
作为名称/值对的列表进行处理。如果指定"lws",系统将
为长标头值添加直线型空白。
HTTP::header [value] <name> <string>
设置命名标头的值。如果标头存在,此命令将替换标头;
如果不存在,命令将添加标头。如果标头名称不与任何其
它值冲突,那么可以省略<value>参数。
HTTP::header replace <name>
[<string>]
使用<string>的值替换最后一个命名标头。如果标头不存
在,此命令将执行标头插入的操作。
HTTP::header remove <name> 删除请求或响应中的最后一个命名标头。
HTTP::redirect <url> 将HTTP 请求或响应重定向至指定的URL。请注意,此
命令将立即向客户机发送响应。因此,不能在一个iRule
中多次指定此命令,也不能在指定此命令后,指定任何修
iRule 命令 说明
改标头或内容的其它命令。
表13.16 用于处理HTTP 请求和响应中的标头的iRule 命令
iRule 命令 说明
HTTP::respond <status
code> [content <content
Value>] [<Header name>
<Header Value>]+
这是一个功能强大的API,允许用户生成或重写客户机请求或服务器
响应。在客户机端运行此命令时,系统不进行任何负载平衡便将响应
发送给客户机。如果在服务器端运行此命令,系统将丢弃实际服务器
中的内容,代之以为此API 提供的信息。请注意,因为此iRule 运行
后,系统将立即发送响应数据,所以我们建议不要在此API 之后运行
任何额外的iRule。
HTTP::header
insert_modssl_fields
{options}
插入复制ModSSL 行为所需的HTTP 标头字段。请注意,要使用此命
令,必须在SSL Profile 中启用ModSSL Methods 设置。有关ModSSL
选项的详细信息,请参阅第7 章“管理SSL 流量”。
HTTP::header sanitize
<header name>+
删除所有标头,指定的标头除外。此命令不会删除一些基本的HTTP
标头。
HTTP::request_num 返回客户机针对此连接发出的HTTP 请求数。
COMPRESS::enable 此命令启用对当前HTTP 响应的压缩。请注意,使用此命令时,必须
将HTTP Profile 的Compression 设置配置为Selective。此命令仅
可在iRule 事件HTTP_REQUEST、HTTP_REQUEST_DATA 和
HTTP_RESPONSE 的环境下使用。
COMPRESS::disable 此命令启用对当前HTTP 响应的压缩。请注意,使用此命令时,必须
将HTTP Profile 的Compression 设置配置为Selective。此命令仅
可在iRule 事件HTTP_REQUEST、HTTP_REQUEST_DATA 和
HTTP_RESPONSE 的环境下使用。
COMPRESS::buffer_size
<value>
设置压缩缓冲区的大小,第6 章“管理HTTP 和FTP 流量”中对此进
行了详细介绍。此命令仅可在iRule 事件HTTP_REQUEST、
HTTP_REQUEST_DATA 和HTTP_RESPONSE 的环境下使用。
COMPRESS::gzip
memory_level <level>
设置gzip 内存级别,第6 章“管理HTTP 和FTP 流量”中对此进行
了详细介绍。此命令仅可在iRule 事件HTTP_REQUEST 、
HTTP_REQUEST_DATA 和HTTP_RESPONSE 的环境下使用。
COMPRESS::gzip
window_size <size>
设置gzip 窗口的大小,第6 章“管理HTTP 和FTP 流量”中对此进
行了详细介绍。此命令仅可在iRule 事件HTTP_REQUEST、
HTTP_REQUEST_DATA 和HTTP_RESPONSE 的环境下使用。
COMPRESS::gzip level
<level>
指定压缩的数量和速度。
表13.16 用于处理HTTP 请求和响应中的标头的iRule 命令
您也可以选择使用插入HTTP 请求中的标头的值作为SSL 查询命令的
结果。要实现这一点,请将SSL 查询命令指定为HTTP::header insert
命令的参数。有关SSL 查询命令的信息,请参阅第13-22 页上的“查询
HTTP 请求的SSL 标头”。
♦ 注意
在 iRule 中使用HTTP::header insert 或HTTP::remove 命令将覆盖相
应HTTP Profile 中的标头插入和标头删除设置。
处理HTTP cookie
表13.17 列出的iRule 命令可以用于处理HTTP 请求和响应中的cookie。
iRule 命令 说明
用于请求消息的命令
HTTP::cookie names 返回HTTP 标头中显示的所有cookie 的名称。
HTTP::cookie count 返回HTTP 标头中显示的cookie 的数量。
HTTP::cookie [value] <name>
[string]
设置或获取给定名称的cookie 值。如果cookie 名称不与任何
其它命令冲突,那么可以省略此命令的值。
HTTP::cookie version <name>
[version]
设置或获取cookie 的版本。
HTTP::cookie path <name> [path] 设置或获取cookie 的路径。
HTTP::cookie domain <name>
[domain]
设置或获取cookie 的域。
HTTP::cookie ports <name>
[portlist]
设置或获取版本1 cookie 的cookie 端口列表。
HTTP::cookie insert <name>
<value> [path <path>] [domain
<domain>] [version <0 | 1 | 2>]
添加或替代cookie。版本缺省值为0。
HTTP::cookie remove <name> 删除cookie。
HTTP::cookie sanitize [attribute]+ 删除cookie 中的所有属性,指定的属性除外。
HTTP::cookie exists <name> 如果cookie 存在,返回“真”值。
Commands for response messages
HTTP::cookie names 返回HTTP 标头中显示的所有cookie 的名称。
HTTP::cookie count 返回HTTP 标头中显示的cookie 的数量。
HTTP::cookie [value] <name>
[string]
设置或获取给定名称的cookie 值。如果cookie 名称不与任何
其它命令冲突,那么可以省略此命令的值。
HTTP::cookie version <name>
[version]
设置或获取cookie 的版本。
HTTP::cookie path <name> [path] 设置或获取cookie 的路径。
HTTP::cookie domain <name>
[domain]
设置或获取cookie 的域。
HTTP::cookie ports <name>
[portlist]
设置或获取版本1 cookie 的cookie 端口列表。
HTTP::cookie insert <name>
<value> [path] [domain][version]
添加或替代cookie。cookie 的版本缺省值为0。
HTTP::cookie remove <name> 删除cookie。
HTTP::cookie maxage <name>
[seconds]
设置或获取最长生存时间。仅适用于版本1 的cookie。
HTTP::cookie expires <name>
[seconds] [absolute | relative]
设置或获取过期属性。仅适用于版本0 的cookie。如果指定
absolute 参数,那么seconds 值表示自UNIX 发布(1970 年
1 月1 日)以来的秒数。缺省秒数是relative,表示自当前时间
以来的秒数。
HTTP::cookie comment <name>
[comment]
设置或获取cookie 的注释。仅适用于版本1 的cookie。
HTTP::cookie secure <name>
[enable|disable]
设置或获取安全属性。仅适用于版本1 的cookie。
HTTP::cookie commenturl
<name> [commenturl]
设置或获取注释的URL。仅适用于版本1 的cookie。
HTTP::cookie discard <name>
[enable|disable]
设置或获取丢弃属性。仅适用于版本1 的cookie。
HTTP::cookie sanitize [attribute] 删除cookie 中的所有属性,指定的属性除外。
HTTP::cookie exists <name> 如果cookie 存在,返回“真”值。
HTTP::cookie encrypt <name>
<pass phrase> <data> ["128" |
"192" | "256"]
使用密码短语生成的密钥来加密给定cookie 的值。缺省密钥长
度为128。
HTTP::cookie decrypt <name> 使用密码短语生成的密钥来解密给定cookie 的值。缺省密钥长
iRule 命令 说明
<pass phrase> <data> ["128" |
"192" | "256"]
度为128。
表13.17 用于处理HTTP 请求和响应中的cookie 的iRule 命令
处理 SSL 标头和内容
可以在iRule 中使用的SSL 数据处理命令分为以下两类:
• 用于处理SSL 查询结果的命令
• 用于更改设置或调用操作的命令
以下两节介绍了这些命令
处理SSL 查询结果
iRule 特性包括用于处理SSL 查询命令结果的SSL 命令。表13.18 显示
了这些命令。有关SSL 查询命令的详细信息,请参阅第13-22 页上的“查
询HTTP 请求的SSL 标头”。
iRule 命令 说明
X509::version <X509 certificate> 返回X509 证书的版本号(一个整数)。
X509::serial_number <X509 certificate> 返回X509 证书的序列号(一个整数)。
X509::signature_algorithm <X509
certificate>
返回X509 证书的签名算法。
X509::issuer <X509 certificate> 返回X509 证书的签发者。
X509::not_valid_before <X509
certificate>
返回X509 证书的not-valid-before 日期(生效日期)。
X509::not_valid_after <X509
certificate>
返回X509 证书的not-valid-after 日期(失效日期)。
X509::subject <X509 certificate> 返回X509 证书的主题。
X509::subject_public_key_type <X509
certificate>
返回X509 证书主题的公钥类型。值可以是RSA、DSA
或unknown。
X509::subject_public_key <X509
certificate>
返回X509 证书主题的公钥。
X509::subject_public_key_RSA_bits
<X509 certificate>
返回X509 证书主题的公共RSA 密钥的位数。仅当公钥
类型为RSA 时,此命令才适用,否则会生成错误。
X509::extensions <X509 certificate> 返回证书上的X509 扩展集。
X509::whole <X509 certificate> 以PEM 格式返回整个X509 证书。
X509::hash <X509 certificate> 返回X509 证书的MD5 散列(指纹)。
X509::verify_cert_error_string <X509
verify error code>
与OpenSSL 函数X509_verify_cert_error_string()的返
回结果相同。<X509 verify error code >参数使用的值与
SSL::verify result 命令返回的值相同。
X509::cert_fields <X509 certificate>
<verify error code> {options}
返回将要添加到HTTP 标头,以便模拟ModSSL 行为的
字段列表。返回类型是Tcl 列表,系统随后将其以标头名
称/标头值对的形式进行解释。有关ModSSL 的详细信息,
请参阅第7 章“管理SSL 流量”。
表13.18 用于处理SSL 查询结果的iRule 命令
更改 SSL 设置或调用操作
表 13.19 列出并介绍了一组可用于更改SSL 设置或调用操作的SSL 命
令。
iRule 命令 说明
iRule 命令 说明
SSL::renegotiate 根据LTM 系统是在客户机端环境下还是在服务器端环境下选择运用此
命令,命令的结果有所不同。
仅当针对连接启用了SSL 时,命令才会成功;否则,命令将返回错误。
在客户机端环境下选择运用此命令时,系统将使用强制SSL 重新协商
的配置选项,立即重新协商关联客户机端连接的请求。重新协商会强制
更改连接的任何SSL 设置,包括客户机证书设置。在服务器端环境下
选择运用此命令时,系统将使用强制SSL 重新协商的配置选项,立即
启动关联服务器端连接的重新协商。
SSL::cert mode
<"request" | "require" |
"ignore" | "auto">
根据系统是在客户机端环境下还是在服务器端环境下选择运用此命令,
命令的结果有所不同。
系统在客户机端环境下选择运用此命令时,命令将覆盖客户机端SSL
连接关于客户机证书的当前设置。
系统在服务器端环境下选择运用此命令时,命令将覆盖服务器端SSL
连接关于服务器证书的当前设置。在此实例中,有效参数只有require
或ignore。
SSL::authenticate
<"once" | "always">
此命令仅在客户机端环境下有效,它覆盖客户机端SSL 连接关于认证
频率的当前设置。
SSL::authenticate depth
<number>
根据系统是在客户机端环境下还是在服务器端环境下选择运用此命令,
命令的结果有所不同。
系统在客户机端环境下选择运用此命令时,命令将覆盖客户机端SSL
连接关于最大证书链遍历深度的当前设置。
系统在服务器端环境下选择运用此命令时,命令将覆盖服务器端SSL
连接关于最大证书链遍历深度的当前设置。
SSL::unclean shutdown
<"enable" | "disable">
根据系统是在客户机端环境下还是在服务器端环境下选择运用此命令,
命令的结果有所不同。系统在客户机端环境下选择运用此命令时,命令
将覆盖客户机端SSL 连接关于非正常关机的当前设置。系统在服务器
端环境下选择运用此命令时,命令将覆盖服务器端SSL 连接关于非正
常关机的当前设置。
SSL::verify result
<result_code>
设置对等证书验证的结果代码。<result_code>参数使用的值与
SSL::verify result 命令返回的值相同。
SSL::handshake hold 中止任何有关认证的SSL 操作。
SSL::handshake resume 恢复系统之前使用SSL::handshake hold 命令中止的任何SSL 操作。
表13.19 用于更改设置或调用操作的iRule 命令
使用UIE函数命令
LTM 系统包括若干可用作表达式一部分的特殊函数命令。这些iRule 命
令是通用检查引擎(UIE)的组成部分。
UIE 表达式的主要用途是返回持续性字符串,或者返回pool 能够将流量
直接发送到其中的节点。
♦ 注意
有关持续性的信息,参阅第13-35 页上的“使用Profile”。
可以在UIE 表达式中使用的函数命令分为以下两类:用于返回字符串的
命令和用于直接选择节点的命令。
用于返回字符串的命令
表13.20 列出并介绍了用于返回指定字符串的命令,表后的数页中提供
了命令的详细信息和示例。
命令 说明
findstr 在另一个字符串中查找字符串,然后从匹配项中指定的偏移处开始,返回字符串。
substr 在另一个字符串中查找字符串,然后从匹配项中指定的偏移处开始,返回字符串。
getfield 以字符为基础分割字符串,然后返回与特定字段相关的字符串。
findclass 查找包含指定表达式的结果的类成员,然后返回该类成员。
decode_uri 选择运用表达式,然后返回经过如下处理、带有任何%XX 换码序列的字符串:这
些字符串按照RFC2396 中定义的HTTP 换码序列进行解码。
domain 解析并返回指定表达式中域名的后缀部分,直至达到指定的个数。
imid 用于解析i-mode®标识符字符串的http_uri 变量和user-agent 标头字段,此字符
串可用于持续进行i-mode 会话。
表13.20 用于返回字符串的UIE 命令
findstr
findstr 命令在<string>中查找字符串<search string>,任何根据匹配
位置的<skip_count>和<terminator>返回子字符串。
请注意以下数点:
• <terminator>可以是字符,也可以是长度。
• 如果未指定<skip_count>,那么缺省为零。
• 如果未指定<terminator>,那么缺省为字符串的结尾。
• 此命令(不带有<skip_count>或<terminator>)与以下Tcl 命令
等效:“string range <string> [string first <string> <search
string>] end”。
findstr()命令的语法如下:
findstr <string> <search string> [<skip_count> [<terminator>]
图13.15 显示了一个使用findstr 命令的iRule 示例。
图13.15 使用findstr 命令的iRule
substr
substr 命令根据<skip_count>和<terminator>的值返回子字符串
<string>。
请注意以下数点:
• <skip_cunnt>和<terminator>参数的用法与它们在findstr 命令
中的用法相同。
• 此命令与Tcl 命令string range 等效,区别在于此命令的
<terminator>值可以是字符,也可以是数字。
substr 命令的语法如下:
substr <string> <skip_count> [<terminator>]
getfield
getfield 命令以字符为基础分割字符串,然后返回与特定字段相关的字
符串。
getfield 命令的语法如下:
getfield <string> <split> <field_number>
findclass
findclass 命令从数据组列表中搜索以<string>开始的成员,然后返回
数据组成员字符串。此命令与matchclass 命令类似,区别在于此命令
不要求成员相等,而只要求成员以该字符串开始,而且此命令返回的是
整个成员值。
findclass 命令的语法如下:
findclass <string> <class>
decode_uri
decode_uri 命令使用根据RFC2616 编码的HTTP URI 来解码字符串
<string>,然后返回结果。
decode_uri 命令的语法如下:
decode_uri <string>
domain
domain 命令将字符串<string>解析为以点分隔的域名,然后返回域名
最后的<count>部分。
domain 命令的语法如下:
domain <string> <count>
imid
imid 函数专用于为特有的i-mode 用户标识符字符串解析HTTP::uri 和
HTTP::header 的“user-agent”值,该字符串可用于会话持续性。imid
命令没有任何参数,仅仅返回表示i-mode 标识符的字符串;如果没有
找到相关项,则返回空字符串。
imid 命令的语法如下:
imid
用于返回节点地址的命令
表13.21 列出并介绍了用于返回节点地址,以便直接选择Pool 成员的
命令。
命令 说明
node 返回从地址加端口的字符串表示方法中转换而来的字符型节点地址。
mapclass2node 表示命令findclass、findstr 和node 的简单组合。
wlnode 返回从特定BEA WebLogic™字符串格式转换成字符型节点地址的字符型节点
地址,用于表示应用IP 地址和服务。
表13.21 用于返回节点地址的UIE 命令
node
node 命令返回从地址加端口的字符串表示方法中转换而来的字符型节
点地址。设计此函数的主要目的是与持续性表达式一起使用,以便直接
选择要持续连接的节点。
node 命令的语法如下:
node <string>
mapclass2node
mapclass2node 命令在<class>中搜索以<string>开始的类成员,根据
<split>分割成员字符串,然后将第二个字段转换为节点对象。如果未指
定<split>,那么缺省为空格字符。此命令与以下汇聚命令等效:node
[getfield [findclass <string> <class>] <split> 2]。mapclass2node
命令是findclass、findstr 和node 命令的简单组合。
wlnode
wlnode 函数返回从BEA WebLogic™格式的字符串转换而来的字符型
节点地址,以便标识连接应与其进行持续的应用节点。
设计wlnode 函数的主要目的是与持续性表达式一起使用,以便直接选
择要持续连接的节点。
使用Profile
编写iRule 时,可能希望iRule 获得特定Profile 设置的值,以便能够制
定更有针对性的流量管理决策。幸运的是,iRules 特性包括一个命令,
专门设计用于读取iRule 中指定的Profile 设置的值。
iRule 不仅能够读取Profile 设置的值,而且能够覆盖特定设置的值。这
表示,您可以对单独的连接应用配置值,这些值与LTM 系统应用到流经
Real Server 的大多数连接的值不同。
读取Profile设置
iRule 特性包括一个称为PROFILE 的命令。在iRule 中指定PROFILE
命令并命名Profile 类型和设置时,iRule 便会读取该特定Profile 设置的
值。为了实现此目的,iRule 查找分配给Real Server 的命名Profile 类
型,然后读取PROFILE 命令序列中指定的设置的值。随后,iRule 可以
使用此信息来管理流量。
例如,可以在iRule 中指定命令PROFILE::tcp idle_timeout。然后,
LTM 系统查找分配给Real Server 的TCPProfile(例如my_tcp),并查
询分配给Idle Timeout 设置的值。
覆盖Profile设置
一些特定的iRule 命令可以用于覆盖特定的Profile 设置。例如,可以使
用这些命令来覆盖SSL 或HTTP Profile 中的设置。
然后,为对其应用iRule 的连接指定带有设置值的iRule 命令时,LTM
系统将使用在iRule 中指定的设置值,而不是相应Profile 中的值。用于
覆盖Profile 设置的iRule 命令包括:
• SSL::renegotiate
• SSL::cert mode
• SSL::authenticate
• SSL::authenticate depth
• SSL::unclean shutdown
• COMPRESS::buffer_size
• COMPRES S::gzip memory_level
• COMPRESS::gzip window_size
• COMPRESS::gzip level
通过iRule启用会话持续性
第9 章“启用会话持续性”介绍了如何配置持续性Profile,将其分配到
Real Server,从而启用会话持续性。如该章中所述,LTM 系统将这些
持续性Profile 的设置应用于流经Real Server 的每个适用的会话。例如,
如果将msrdp Profile 分配给Real Server,那么LTM 系统将对每个入
站的Microsoft®远程桌面协议(RDP)连接应用那些设置。
但在有些情形中,您可能希望以更精确的方式启用持续性。例如,您可
能希望根据插入HTTP 请求标头的SSL 证书状态来持续会话,而不是
使用仅作用于非端接SSL 流量的ssl 持续性Profile。要实现此目的,可
以使用HTTP::header 命令编写一个iRule,然后将该iRule 分配给Real
Server。这样,只要LTM 系统终止了一个SSL 请求,iRule 便会将证书
状态以标头形式插入请求,然后根据该状态来持续会话。
LTM 系统包括一个特殊的iRule 命令persist,用于实施第9 章“启用
会话持续性”中介绍的会话持续性类型。您只需在iRule 中键入persist
命令,以便指定持续性类型。对于某些持续性类型,必须指定一些额外
的参数。
• persist cookie
• persist destaddr [mask <mask>] [<timeout>]
• persist hash
• persist msrdp
• persist sip
• persist srcaddr [mask <mask>] [<timeout>]
• persist ssl
• persist universal <string> [<timeout>]
• persist none
persist none、hash、srcaddr、destaddr 和universal 命令可在任何
情形中使用,即使没有配置相应的持续性Profile,然后将其分配给Real
Server。但persist ssl、cookie、msrdp 和sip 命令要求为Real Server
分配相应的持续性Profile。尝试在没有相应Profile 的情况下使用这些命
令将生成运行时iRule 错误。
创建、管理和使用数据组
数据组在编写iRule 时非常有用。简单地来说,data group 是相关元素
的编组,例如用于AOL 客户机的一组IP 地址。将数据组与matchclass
命令或contains 运算符一起指定时,便无需在iRule 表达式中列出多个
值作为参数。
要了解数据组的用途,有必要首先了解matchclass 命令和contains
运算符。
使用matchclass命令和contains运算符
LTM 系统包括一个称为matchclass 的iRule 命令,可以用于根据iRule
中正在使用的命令是否代表特定数据组的成员来选择pool。使用
matchclass 命令时,LTM 系统知道跟在标识符后面的字符串便是数据
组的名称。
例如,如果IP::remote_addr 命令的值是数据组AOL 的成员,那么使
用matchclass 命令可以使LTM 系统对所有指向pool aol_pool 的入站
AOL 连接进行负载平衡。图13.16 显示了此类iRule。在此情形中,
matchclass 命令清楚地指示名为aol 的对象是一个数值集合(即数据
组)。
图13.16 基于matchclass 命令的iRule
请注意,如果表达式(例如IP::remote _addr eq matchclass aol)确
实具有至少一个数据组中的特定值,那么表达式为真。
您也可以使用contains 运算符,它与matchclass 命令类似。例如,
可以编写如图13.17 中所示的iRule。
图13.17 基于 contains 运算符的iRule
创建数据组
在iRule 中使用matchclass 命令时,可以指定以下三类数据组中的任
何一组:
• 地址数据组--IP 地址的集合
• 字符串数据组--字符串的集合(例如*.jpg)
• 整数数据组--数值的集合
以下数节中介绍了这些数据组类型。
♦ 注意
数据组的大小仅受系统资源的限制。
地址数据组
IP 地址数据组有两类:网络IP 地址和主机IP 地址。
以下过程可用于创建网络或主机地址数据组:
创建地址数据组的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在菜单栏上,点击Data Group List。
4. 在屏幕的右上角,点击Create。
5. 在Name 框中, 为数据组键入一个唯一的名称, 例如
my_address_group。
6. 在Type 框中,选择Address。
屏幕将扩展,显示更多设置。
7. 在Records 部分中,选择所需Type(Host 或Network)。
8. 在Address 框中,键入数据组的第一个IP 地址。如果要创建网络
数据组,请在Mask 框中输入网络掩码。
9. 点击Add。
此条目将显示在Address Record 框中。
10. 重复步骤7 和8,直到输入了所有IP 地址。
11. 点击Finished。
字符串数据组
字符串数据组包含一个字符串列表,例如*.jpg 或*.gif。以下过程可用于
创建字符串数据组。
请注意,此示例使用引号和粗体字表示UI。
创建字符串数据组的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在菜单栏上,点击Data Group List。
4. 在屏幕的右上角,点击Create。
5. 在Name 框中,为数据组键入一个唯一的名称,例如my_images。
6. 在Type 框中,选择String。
屏幕将扩展,显示字符串专用的设置。
7. 在String 框中,键入数据组的第一个字符串。
8. 点击Add。
此条目将显示在String Record 框中。
9. 重复步骤6 和7,直到输入了所有字符串。
10. 点击Finished。
整数数据组
整数数据组包含一个整数列表。以下过程介绍了如何创建整数数据组。
创建整数数据组的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在菜单栏上,点击Data Group List。
4. 在屏幕的右上角,点击Create。
5. 在Name 框中, 为数据组键入一个唯一的名称, 例如
my_integer_group。
6. 在Type 框中,选择Integer。
屏幕将扩展,显示Records 部分。
7. 在Integer 框中,键入数据组的第一个整数。
8. 点击Add。
此条目将显示在Integer Records 框中。
9. 重复步骤6 和7,直到添加了所有整数。
10. 点击Finished。
存储选项
LTM 系统允许您以两种方式存储数据组,即嵌入式存储和外部存储。
嵌入式存储
创建数据组时,LTM 系统自动将它们作为一个整体存储在bigip.conf
文件中。这类存储称为嵌入式存储。
数据组中的任何数据需要更新时,必须重新加载整个数据组。通常,由
于对大型数据组的广泛搜索要求,嵌入式存储会占用额外的系统资源。
此外,嵌入式存储要求即使以增量方式更新数据,也需要重新加载整个
数据组。考虑到这些因素,LTM 系统为您提供了以外部方式(即在
bigip.conf 文件之外)存储数据组的功能。
外部存储
您可以选择将数据组存储在LTM 系统上的其它位置,即存储在
bigip.conf 文件之外。这些数据组称为外部数据组。外部数据组的缺省
存储位置是/config 目录下。因为数据组以外部方式存储在其它位置,
所以bigip.conf 文件仅包含数据组的元数据。对于以外部方式存储的数
据组文件,其中的数据存储为逗号分割的数值列表(CSV 格式)的形式。
创建外部数据组非常有用,因为无需在加载数据时对它们进行排序。反
之,数据存储在内核的散列表中。iRule 使用大型数据组将流量引导至
pool 时,这种存储方法可获得性能的提高。
以外部方式存储数据组的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在菜单栏上,点击Data Group List。
4. 在屏幕的右上角,点击Create。
5. 在Type 框中,键入希望存储在外部位置的现有数据组的名称。
6. 在Type 框中,选择(External File)。
屏幕将扩展,显示Records 部分。
7. 指定存储位置:
• 如果不希望将数据组存储在缺省外部位置(/config)中,请
使用Path/Filename 框指定外部位置的路径名和文件名,例
如/home/my_address_group。
此文件名应与分配给数据组自身的名称相匹配。
• 如果希望将数据组存储在缺省外部位置(/config)中,请将
Path/Filename 框保留为空。
8. 在File Contents 框中,选择适合于数据组的文件类型(Address、
String 或Integer)。
9. 点击Finished。
将数据存储在外部数据组文件中时,LTM 系统将它们存储为逗号分割列
表的形式;任何数据值(例如IP 地址)的格式都与bigip.conf 文件中
使用的格式相匹配。图13.18 显示了数据组文件/home/ip2.data group
的内容。
图 13.18 外部数据组文件示例
显示数据组属性
使用Configuration 工具可以显示现有数据组的属性。
显示数据组属性的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在菜单栏上,点击Data Group List。
4. 点击数据组的名称。
此操作将显示该数据组的属性。
管理数据组成员
使用Configuration 工具可以向现有数据组添加成员,也可以从现有数据
组中删除成员。
向数据组添加成员的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在菜单栏上,点击Data Group List。
4. 点击数据组的名称。
此操作将显示该数据组的属性。
5. 找到记录框,然后在合适的框中键入地址、字符串或整数。
6. 点击Add。
7. 在屏幕底部,点击Update。
从数据组中删除成员的步骤
1. 在Main 选项卡上,展开Local Traffic。
2. 点击iRules。
将显示iRules 屏幕。
3. 在菜单栏上,点击Data Group List。
4. 点击数据组的名称。
此操作将显示该数据组的属性。
5. 选中要删除的成员对应的Select 框。
6. 点击Delete 按钮,显示确认信息时再次点击Delete。
在同步配置时包括外部数据组
同步冗余系统的BIG-IP 系统配置时,LTM系统仅包括驻留在bigip.conf
文件中的数据组,即以嵌入方式存储的数据组。如果希望同步过程包括
以外部方式存储的数据组,必须为每个数据组添加一个关联条目到
bigip.conf 文件中。
覆盖Profile设置
对于一些用来查询和处理标头和内容数据的iRule 命令,各种Profile 中
具有等效设置。在iRule 中使用那些命令时,如果有事件触发了该iRule,
LTM 系统将覆盖那些Profile 设置的值,改为使用iRule 中指定的值。
例如,HTTP Profile 可以指定要使用的特定缓冲区大小,以便压缩HTTP
数据,但您可能希望为特定类型的HTTP 连接指定不同的缓冲区大小。
在此情形中, 您可以在iRule 中包括命令
HTTP::compress_buffer_size,指定与Profile 值不同的值。
原创粉丝点击