弘协网络 | F5技术交流

iRules 101-#01-iRules简介

2020-11-06 11:10:36

CUNHUI

原文链接:https://devcentral.f5.com/s/articles/irules-101-01-introduction-to-irules

简介

iRule是一项基于F5独家TMOS架构的BIG-IP上的强大而灵活的特性。iRules为您提供了前所未有的控制,可以直接操作和管理任何IP应用流量。iRules使用易于学习的脚本语法,并允许您自定义如何拦截、检查、转换和引导入站或出站的应用流量。

在这一系列技术文章中,我们将讨论TCL语言,它的用法和控制结构以及TCL语言的iRule扩展。


iRule的构成

一个iRule由一个或多个事件声明组成,每个声明都包含了在事件发生时执行的TCL代码。首先来看一下什么是事件。 


事件

事件是F5添加的TCL扩展,以便基于模块的编程。在连接进入TMOS和从另一端离开之间,有一系列的内部状态由该连接触发。这些状态中的每一个都等同于iRule语言中的事件。这些状态(例如CLIENT_ACCEPTED)可以在全局发生(意味着它们适用于所有连接,而与将哪些配置应用于虚拟服务器Virtual Server无关)。或者它们是基于特定配置的(HTTP_REQUEST,CLIENTSSL_CLIENTCERT,RTSP_RESPONSE等),这意味着它们的状态仅在将特定配置分配给虚拟服务器时才能发生。使用F5添加的“when”语句声明事件。


        when EVENT_NAME {TCL-CODE}


有关可用事件的列表,请参阅https://clouddocs.f5.com/api/irules/Events.html。 

基于事件驱动的关键好处是,它们允许将iRule分成逻辑块并以非串行方式执行。这意味着,只有当特定事件发生时,才执行该事件的代码。


TCL

iRules使用TCL引擎执行脚本。您可以在http://tmml.sourceforge.net/doc/tcl/index.html上找到TCL语言的参考文档。TCL语言可以分为运算符和命令。在TCL中,基本上所有内容都被视为命令。我们把这些命令归为三种类型:函数,语句和命令。


运算符

运算符对其他值进行“运算”。当比较两个值时,将使用比较运算符。除了内置的TCL运算符(==,<=,> =,...)之外,iRule中还添加了诸如"starts_with","contains"和" ends_with"之类的运算符作为常用比较运算。可以在https://clouddocs.f5.com/api/irules/Operators.html中找到iRules添加/增强的运算符的列表。


函数

函数是通常会返回值的程序命令。诸如"findclass"和"matchclass"之类的功能被用于访问数据组,而" findstr","getfield"和 substr"则被用于处理字符串。有关iRules函数的完整列表,可参阅https://clouddocs.f5.com/api/irules/Functions.html。


语句

语句是通常不返回值的命令。语句的基本功能上是“做某事”。您可以使用TCL的“if”和“ switch”语句执行条件判断,也可以使用iRules特定的语句“log”将消息记录到系统日志中,或使用“ pool”将负载平衡分配给指定的服务池(pool)。有关iRules特定语句的完整列表,请参见https://clouddocs.f5.com/api/irules/Statements.html。


命令

命令几乎是您可以在TCL中使用的所有其他控制结构。使用命令,您可以执行以下操作:获取HTTP请求的URI(HTTP::uri),或使用AES密钥加密数据(AES::encrypt)。

iRules实现中禁用了TCL语言中的多个命令。基本上,所有可能导致流量意外中断的命令(例如文件IO,套接字调用,过程等)都已删除。有关iRules禁用命令的列表,请参阅https://clouddocs.f5.com/api/irules/DisabledTclCommands.html。

除了标准的TCL命令集外,F5还添加了其他命令,这些命令在运行时是全局的(TCP::client_port,IP::addr,...)或基于特定配置的(HTTP::uri,SIP::call_id,...)。完整的命令列表可以在https://clouddocs.f5.com/api/irules/Commands.html中找到。


组合在一起

以下iRule包含几个事件,运算符,函数,语句和命令:

when HTTP_REQUEST {

    if { [HTTP::uri] starts_with "/foobar" } { 

        switch -glob [HTTP::uri] {

            "*[0-9].jpg" { pool numbers_pool } 

            default {

                if { [string length [substr [HTTP::uri] 0 "?"]] > 0 } {

                    HTTP::respond 200 content "<html><head><title>Where's the number?</title></head></body><h1>Where's the number?</h1></body></html>" 

                } 

            } 

        }

    } 

 } 

when HTTP_RESPONSE {

    if { [HTTP::header Content-Length] > 100 } {

        log local0. "too much data requested." drop

    } 

}


问题

- 您可以识别所有运算符,函数,语句和命令吗?

- switch语句中的default的作用是什么?

- HTTP响应中Content-Length头为空会怎样?

- switch语句和完整的正则表达式中的-glob有什么区别?

- 什么时候需要在函数,语句和命令周围使用方括号?


结束语

在本文中,我们介绍了iRules语言的基本组成部分。在本系列的后续文章中,我们将更深入地研究iRules的各个组成部分以及如何充分利用这些功能。


链接


TCL参考- http://tmml.sourceforge.net/doc/tcl/index.html

iRules事件- https://clouddocs.f5.com/api/irules/Events.html

iRules函数- https://clouddocs.f5.com/api/irules/Functions.html

iRules语句- https://clouddocs.f5.com/api/irules/Statements.html

iRules命令- https://clouddocs.f5.com/api/irules/Commands.html

iRules运算符-https: //clouddocs.f5.com/api/irules/Operators.html

禁用的TCL命令-https://clouddocs.f5.com/api/irules/DisabledTclCommands.html

发布评论 加入社群

发布评论

相关文章

F5 VSC Extension简介

Will Tang

2022-07-14 14:51:10 144

iRules 101-#03-变量

CUNHUI

2020-12-29 12:22:01 387

Login

手机号
验证码
© 2019 F5 Networks, Inc. 版权所有。京ICP备16013763号-1