当前位置:文档之家› iRules编程宝典

iRules编程宝典

iRules 编程宝典

周辛酉2011.6

目录

1.iRules介绍及应用领域 (2)

1)iRules介绍 (2)

2)iRules开发工具iRule Editor (3)

2.iRules编程基础 (6)

1)TCL语言和命令结构 (6)

a)TCL语言简介 (6)

b)iRules的命令结构 (7)

c)iRules的注释语句 (7)

2)变量 (8)

a)简单变量 (8)

b)数组变量 (8)

c)全局变量 (8)

d)Class (9)

e)变量的置换 (10)

3)数据类型 (10)

a)数值和字符串 (10)

b)反斜杠置换 (10)

c)双引号和大括号 (11)

4)操作符 (11)

a)运算符和优先级 (11)

b)数学函数 (12)

5)事件 (13)

6)命令 (17)

7)逻辑流模型 (17)

8)CLIENT SIDE 和SERVER SIDE (19)

3.编写第一个iRules (21)

4.常用iRules分析 (22)

1)根据不同URI分配用户访问连接到不同的POOL (22)

2)http访问转向 (23)

3)根据HTTP Header包字段进行会话保持 (23)

4)根据目的地址选择outbound 路径 (24)

5)依据Session_ID进行会话保持 (24)

6)单个IP的并发数量限制 (25)

7)DNS Flood 攻击防护 (26)

5.如何编写运行快速的iRules (28)

6.参考资料 (29)

1.iRules介绍及应用领域

1)iRules介绍

iRules是基于F5 TMOS操作系统的开放脚本语言,为F5设备提供灵活强大的定制功能,基于TCL语法的iRules可以方便的加入到F5设备内部,处理通过F5设备的网络流量,控制各种协议和应用数据。每个iRules必须包含事件、命令和逻辑三部分才可以有效运行,通过这三个部分的灵活组合和排序可以定制IP层面以上的数据流量处理功能,提高和增强F5设备的灵活性和功能性。同时,高效的使用iRules定制某些应用功能,可以大大降低应用系统的研发成本,简化研发复杂程度,提高应用系统性能,减少计划内外当机时间。

在开始使用iRules之前,需要了解F5设备的基本功能及配置;同时,根据要实现的不同功能,需要对该功能涉及的相关知识有所了解,比如TCP协议、UDP协议、DNS原理、SSL 证书原理、HTTP协议、安全攻击及防护、Cache、XML等。

那什么时候需要用到iRules语言呢?F5设备支持绝大多数应用交付的标准功能,可以满足绝大部分IT系统对这方面的功能及部署要求,但某些应用系统对数据控制有着更加精细的定制要求,或者对标准协议的功能支持有更高的要求,这些时候需要使用iRules来增强F5设备的功能,实现这些功能要求。比如,F5的LTM设备支持基于源地址、COOKIE、目的

地址、SSL ID等模式的会话保持方式,可以满足大多数应用交付系统对会话保持的要求。但大多数JAVA开发人员希望使用中间件的SESSION ID作为会话保持的依据,这样可以更加方便和准确的控制应用数据的后台走向,这时候,使用iRules编写一段简单的代码并输入到F5设备中,即可高效的实现这一功能,满足应用程序的功能需求。程序如下:

简单的几行iRules程序,即可为F5设备增加基于SESSION ID的会话保持功能,精细控制流量,iRules的功能可谓十分之强大。关于这个程序详细的实现原理,在后面章节有详细的解释说明。

2)iRules开发工具iRule Editor

F5的iRule Editor是一款非常优秀的iRules开发工具,可以从以下站点下载:https://www.doczj.com/doc/2c4177723.html,/。在windows xp及以上操作系统中运行,需要.NET Framework运行环境。

需要注意的是,这款软件是由DevCentral发布的非官方软件,F5不对此软件提供官方服务支持;但这样不代表着iRules的不可靠,事实上,全球大部分的LTM设备都在或多或少的使用iRules精细控制着各种应用流量,运行高效并且稳定。

正常安装后进入使用界面:

iRule Editor支持连接F5设备,读取并存储设备中的iRules。点击“file”-“connect”配置设备信息。

连接后,你可以开始编写你的iRules了。iRule Editor内置一些iRules的模板,可以选择并稍加改动,即可实现相应的功能,非常方便。

iRules写好后,直接save即可存储到F5设备中,绑定VS后即可工作。

更多关于iRule Editor的使用技巧,请到https://www.doczj.com/doc/2c4177723.html, 上查询。

2.iRules编程基础

1)TCL语言和命令结构

a)TCL语言简介

TCL(读作“t i c k l e”)语言是一种解释性脚本语言,是一种嵌入命令的脚本语言,具有使用简单,功能强大,可移植性强的特点。熟悉TCL语法和编程技巧,对编写优秀的iRules

非常重要。

b)iRules的命令结构

iRules遵从TCL语法,每一条执行语句都使用

这样的格式,如:

或者

这其中“ pool ”和” log “都是命令,每个命令后面的部分是参数,参数可以是一个,也可以是多个,由空格分开。

在每条语句中使用多个命令或者将一个命令的输出结果作为另一个命令的输入参数时,需要使用命令置换” [] ”符号,iRules解释器会将” [] ”里面的内容作为命令语句处理,如:

上面例子中,在”[] ”中的内容是一条命令语句,输出HTTP访问协议中header头的User-Agent值,同时,将这个输出值作为string命令的第二个参数输入,配合第一个tolower 参数,整个命令语句输出小写的User-Agent值。

c)iRules的注释语句

iRules的注释语句以”#”符号开头,以“;”符号或者换行符结束。同时需要注意的是,“#”符号必须放在每行的开头,或者前边用“;”符号结束之前的语句。如:

或者

这两种写法都是正确的。

2)变量

变量是一切编程语言的最基本元素,iRules中有两种主要变量,简单变量和数组变量。

a)简单变量

简单变量的组成包含两部分,“变量名”和“变量值”,如:

这是一行赋值语句,“set”是命令,“a”是参数1,代表变量名,“100”是参数2,代表变量值。这行语句执行完后,我们得到了一个值为100的变量a。

b)数组变量

数组变量是一些简单变量的元素集合,由数组变量名和数组变量值组成。其中,数组变量名又由数组的名字和数组中元素的变量名组成,如:

这三条语句中,首先将变量a定义为数组变量,然后将数组变量a中的a(1) 和a(2) 两个数组变量值赋值为100和200。

c)全局变量

iRules是面向过程的脚本语言,也就意味着每个iRules被应用访问触发知道运行结束后

不会对其他应用访问的iRules变量和执行产生任何影响。但实际应用中,经常会遇到需要全局考虑的变量,如访问一个VS的总连接数,这时候就需要使用到全局变量,让这个变量在所有触发相同iRules的应用访问中有着相同的变量值。全局变量的声明符号是“::”。如:

全局变量并不是一种新型变量,只是一种变量的使用声明,全局变量有可能是简单变量,也有可能是数组变量。

d)Class

iRules中的class可以看作是全局数组变量,在F5设备的Data groups配置界面中可以配置,一般分为四种,Address型、String型、Integer型和External File型,分别对应IP地址、字符串、数值和外部文件。使用方法同全局的数组变量。如:

其中的matchclass为匹配语句,将后面的参数1同参数3根据参数2进行匹配,如果参数3的数组中其中有一条满足要求,返回结果为true,否则为false。类似的语句还有

这个命令是搜索数据组的一个某一个以指定参数开始的成员,并且返回这个匹配的Class成员。

上述的例子是BIGIP LC中常用的链路选择iRules。

e)变量的置换

首先定义变量值为100的变量a,然后将变量a的变量值100作为第二行赋值语句的输入,定义变量b,变量值为100。

需要注意的是,要使用变量值时应使用$符,而在设置或改变变量值时不必使用$。

3)数据类型

a)数值和字符串

iRules不支持诸如i n t 、f l o a t 、d o u b l e 或c h a r 之类的变量类型。这意味着,在同一程序中,一个变量可以在不同的时刻分别被设置为数值、字符或字符串。iRules的数字支持整数、八进制(以0开头)、十六进制(以0x开头)和实数。对于字符串,需要使用””进行标明。如:

两行赋值语句执行后,变量a的值为整数100,变量b的数值为字符串”100”。

b)反斜杠置换

iRules中的反斜杠置换符”\”和C语言中的一样,主要用于在单词符号中插入诸如换行符、空格、[、$等被iRules解释器当作特殊符号对待的字符。

iRules中支持以下反斜杠置换:

c)双引号和大括号

iRules解释器对双引号中的各种分隔符将不作处理,但是对换行符及”$”和”[]”两种置换符会照常处理。而”{}”中,所有特殊字符都将失去意义,变成普通字符。如:

返回11,而不是4的倍数。这是因为TCL的语法编译器会最先替换变量b为$a + 2,然后expr命令将计算表达式$a + 2*4。

4)操作符

a)运算符和优先级

下表的运算符蓝色部分按照由高到低的优先级顺序排列:

b)数学函数

iRules中最著名的数学函数是expr,是以表达式作为参数的函数。语法如下:

如:

对表达式”1+2*3”进行数学运算,得到结果为7。

iRules中还支持以下数学函数:

5)事件

事件是iRules构成中的重要的一部分,不同事件代表数据在整个访问过程中的逻辑位置,比如一个iRules中包含以下两个事件:

分别表示client端发起HTTP请求和server端回应HTTP请求的时候。iRules中,每一行语句都应在一个事件声明中,每个iRules可以由一个或者多个事件组成,事件应该按照实际数据的发生顺序排列。需要注意的是:

RULE_INIT 也是一个事件,是每个iRules执行时最先命中的事件,一般用来进行全局变量的定义和赋值。

其他一些常用的事件及触发顺序如下:

Client Request Events -这些事件触发的时间是在客户端连接到Bigip且Bigip负载均衡决定之前。此时,已完成的客户端的数据处理,并准备连接到选择的服务器,但尚未发送数据。这些事件的触发是在客户端这边而言,这意味着它们的行为就好像只能使用客户端的命令。也就意味着local_addr类型的命令是针对客户端而言。在此处,你有机会在客户端发给服务器之前改变用户发送的信息,比如,URI的重写、认证和加密、卸载或检查、服务器模拟(就像是你把LTM当做服务器而深入到交易中去)-这一切动作就在这里发生。

Server Request Events –这类事件的触发时间是在客户端的请求已处理完毕,由Bigip 已做了负载均衡计算且选定了目的服务器,而且同服务器的连接已建立完毕。时间触发时发生在客户端请求实际发送给服务器之前。这是请求处理的最后阶段,紧接着将是第一个服务器响应的事件。这类事件关联在服务器边进行。就像相对于上述客户端一边的事件,这些行为就好像您使用的是每个服务器端的命令。

Server Response Events -这类事件的触发时间,是在请求被发送到服务器,而且服务器处理完请求并且Bigip收到了来自服务器的响应。这类事件当中,您可以将由服务器响应的内容在发送给客户端之前进行处理,比如:信用卡信息的清洗,服务器响应的修改等等。

Disconnect Events –这类事件代表了所有处理完成后对连接终结。

iRules事件查询表:

关于每个事件的详细解释,请到

https://www.doczj.com/doc/2c4177723.html,/wiki/default.aspx/iRules/Events.html

查询。

6)命令

命令也是iRules构成的重要组成部分之一,命令是iRules中对数据进行操作的直接函数,如:

该命令中HTTP代表HTTP协议,uri表示取这个http访问中的uri,他们之间用“::”连接,代表从属关系,uri是属于HTTP这个命令体系的,类似的还有:[IP::addr]、[TCP::payload]、[SSL::handshake]等。

一些常用的命令,我们将会在常用iRules分析中解释。

iRules的命令和解释,请到

https://www.doczj.com/doc/2c4177723.html,/wiki/default.aspx/iRules/iRulesReference.html

查询。

7)逻辑流模型

iRules中最常用的两个逻辑流模型是:

以及

警告iRules 对大括号和空格的使用是十分苛刻的。在i f ,e l s e i f 或e l s e 语句中的开始的大括号必须要和i f ,e l s e i f 或e l s e 在同一行中。而括号外必须是有一个空格。且e l s e 或e l s e i f语句必须要在前一个if 或elseif 的后括号的同一行中。

If模型的使用比较简单,适合简单逻辑判断的使用。如:

同时,必须记住“elseif”和“else”是可选的,在以上的例子中,“elseif”和“else”删除了不会影响代码的功能。

Switch模型更适合精细匹配和较多匹配逻辑的判断。

Switch 模型的options:

-exact

对String和Pattern进行精确匹配,这是默认的选项。

-glob

使用通配符匹配模式(和在”String Match”中使用同样的实现方法)

-regexp

使用正则表达式对字符和Pattern进行匹配(详见re_syntax参考页里的描述)

- -

选项结尾标志,它后面的参数都会被当成String来对待,哪怕它的起始字符是一个破折号(-)。

8)CLIENT SIDE 和SERVER SIDE

iRules中非常容易混淆的是Client Side和Server Side,请看下图:

在不同的事件中,相同的命令可能会返回不同的结果,上图中同样是[IP::remote_addr]

命令,但一个返回的是client ip,一个返回的是server ip,原因是两个命令所执行的声明事件不同。于是,为了取得相同的结果,第二个iRules使用了[clientside] 命令,使得[IP::remote_addr]命令在client side执行。对于各种事件的side定义,见下图:

常见的Client Side和Server Side使用,见下表:

类似的还有:

相关主题
文本预览
相关文档 最新文档