Edgenexus 的同事们普遍认为,虽然 F5 LTM 负载均衡器非常强大和灵活,但依赖使用 iRules 脚本来执行一些基本功能会导致不必要的复杂性。
您只需在网上搜索一下 F5 iRules,就会发现许多 IT 专业人员在创建功能性 iRules 的过程中不得不经历的痛苦和焦虑。虽然最近发布的 F5 软件中 “本地流量策略 “功能的扩展确实消除了为常见 HTTP 标头操作功能创建 iRules 的部分需求,但仍有许多用户的系统配置中仍保留着传统的 iRules。
本地流量策略似乎不允许对 HTML 数据进行操作,虽然 Stream 策略可以,但它们相当笨拙,难以控制。默认情况下,这些策略会以相同的方式影响任一方向的流量,但这通常并不可取。这就意味着需要重新使用 iRules 来执行一些功能,如将 http:// 替换为 https:// URL 主体文本链接,这可能需要结合使用本地流量策略将 http:// 重定向为 https。
进入 Edgenexus flightPATH – 交通管理更轻松
在 Edgenexus,我们有理由为我们的 flightPATH 第 7 层 HTTP 操作功能的强大功能和简单配置感到自豪。
如果您是使用 iRules 进行 HTTP 或 HTML 操作的现有 F5 用户,我们很高兴有机会为您演示 Edgenexus ALB-X 负载平衡器,并向您展示 flightPATH 是如何简单配置以实现一些相对复杂的功能。我们希望通过测试来帮助您将现有的 iRules 功能转换为 flightPATH 规则。
作为示例,我们在下面复制了部分 F5 iRules 和相应的 Edgenexus flightPATH 规则配置屏幕截图。
源 IP 内容服务器转向
下面举例说明如何使用 F5 iRules 将某个 IP 地址范围内的用户引导到一个服务器池,将另一个 IP 地址范围内的用户引导到另一个服务器池。
F5:
名称: | IP_Choice |
定义: | when HTTP_REQUEST { if { ([IP::addr [IP::client_addr] equals 24.24.15.100] ) or ([IP::addr [IP::client_addr] equals 10.1.1.2] ) }{服务器池 2}} |
Edgenexus:
- 通过 Web GUI 创建新的 flightPATH 规则,名称为 IP_Choice_Pool_1。添加一个简明的描述,以便能够识别 flightPATH 规则执行的功能。
- 添加新条件,从广泛下拉列表中选择源 IP。从 “意义 “下拉列表中选择 “是否”。一种方法是从下拉列表中选择 “开始”(也可以使用其他选项,如 RegEx,为 IP 地址 “值 “提供更大的灵活性)。在 “值 “框中输入起始 IP 范围。
- 添加新操作。从 “操作 “下拉框中选择 “使用服务器 “选项(如果需要,还有 “使用安全服务器 “选项)。在目标框中输入所需目标的 IP 地址和端口,这通常是另一个虚拟服务接口,以便在另一个真实服务器池中实现负载平衡。
HTTP 重定向到 HTTPS
虽然 F5 现在有了使用 iRules 执行 HTTP 到 HTTPs 重定向的替代方案,但仍有许多人在使用 iRules 实现这一功能。
F5:
名称: | HTTP_HTTPs 重定向 |
定义: | when HTTP_REQUEST { HTTP::redirect “https://[HTTP::host][HTTP::uri]”} |
Edgenexus:
- 创建新的 flightPATH 规则,名称为通过 Web GUI 将 HTTP 重定向到 HTTPS。添加一个简洁的描述,以便识别 flightPATH 规则执行的功能。
- 对于大多数应用程序来说,需要对所有访问 HTTP 服务的流量执行 HTTP 到 HTTPS 重定向。在这种情况下,无需创建条件规则。如果 flightPATH 规则只影响某些流量,则可以非常灵活地创建条件规则。
- 添加新操作,从操作下拉框中选择重定向 302(也可选择重定向 301)。Edgenexus ALB-X 会自动为 ALB-X 处理的流量的某些关键参数创建变量,其中包括主机、路径和查询字符串。在 “目标 “框中输入请求重定向到哪里的详细信息。在这种情况下,在条目 https:// 之前,使用 $host$$path$$querystring$ 变量插入原始 http 请求的数据。正如你所看到的,这里可以根据需要灵活定义完全不同的目的地。
屏蔽信用卡号码
下面举例说明 iRules 的复杂性以及 F5 处理 HTML 正文的方式。
F5:
名称: 信用卡号码屏蔽 | 信用卡号码屏蔽 |
定义 | 当 HTTP_REQUEST { # 防止服务器发送压缩响应 # 从客户端移除压缩产品 HTTP::header 移除 “Accept-Encoding”(接受编码 # 不允许对响应数据进行分块处理 if {[HTTP::version] eq “1.1” }}{ # 强制降级到 HTTP 1.0,但仍允许保持连接。 # 因为 HTTP 1.1 默认为 keep-alive,而 1.0 则不是、 # 我们需要确保标头反映 keep-alive 状态。 # 检查这是否是一个保持存活的连接 if {[HTTP::header is_keepalive] }{ # 用 “Keep-Alive “替换连接头值 HTTP::header replace “Connection” “Keep-Alive” (连接) } # 将服务器端请求版本设为 1.0 # 这将迫使服务器在不分块的情况下做出响应 HTTP::version “1.0” } } 当 HTTP_RESPONSE { # 只检查文本内容类型(text/html、text/xml、text/plain 等)的响应。 if {[HTTP::header “Content-Type”] starts_with “text/”}{ # 获取内容长度,以便收集数据(在 HTTP_RESPONSE_DATA 事件中进行处理) # 将收集限制在 1Mb(1048576 减去一点备用容量) – 详见 SOL6578 if {[HTTP::header exists “Content-Length”] }{ if {[HTTP::header “Content-Length”] > 1048000 }{ # 内容长度超过 1Mb,因此收集 1Mb 设置内容长度 1048000 否则 { # 内容长度小于 1Mb,因此收集实际长度 设置内容长度 [HTTP::header “Content-Length”] } 否则 { # 响应没有内容长度标头,因此使用默认值 1Mb 设置内容长度 1048000 } # 如果 Content-Length 标头值为 0,则不收集内容 if { $content_length> 0 }{ HTTP::collect $content_length } } } 当 HTTP_RESPONSE_DATA { # 一次找出所有可能的信用卡号码 set card_indices [regexp -all -inline -indices\ {(?:3[4|7]\d{2})(?:[ ,-]?(?:\d{5}(?:\d{1})?)){2}|(?:4\d{3})(?:[ ,-]?(?:\d{4})){3}|(?:5[1-5]\d{2})(?:[ ,-]?(?:\d{4})){3}|(?:6011)(?:[ ,-]?(?:\d{4})){3}}\ [HTTP::payload]] foreach card_idx $card_indices { 设置 card_start [lindex $card_idx 0] 设置卡结束 [lindex $card_idx 1] set card_len [expr {$card_end – $card_start + 1}] (设置卡片长度 设置卡片编号 [字符串范围[HTTP::payload] $card_start $card_end] # 如果存在破折号或空格,则将其删除,并计算变量剪切中出现的次数。 设置剪裁[regsub -all {[-]}$card_number “” card_number] $card_number “” card_number] $card_number [… # 调整 card_len 变量,但保留它以备后用。 设置 new_card_len [expr {$card_len – $cutouts}] 新卡长度 设置 double [expr {$new_card_len & 1}] (双 [expr {$new_card_len & 1}] )。 设置 chksum 0 设置 isCard 无效 # 计算 MOD10 for { set i 0 }{ $i< $new_card_len }{ incr i }{ 设置 c [string index $card_number $i] 如果 {($i & 1) == $double} { 如果 {[incr c $c] >= 10}{incr c -9} } incr chksum $c } # 确定卡片类型 交换机[string index $card_number 0] { 3 { 设置类型 AmericanExpress } 4 { 设置类型 Visa } 5 { 设置万事达卡类型 } 6 { 设置类型 发现 } 默认 { 设置类型 未知 } } # 如果卡号有效,则用 X 遮住数字 if { ($chksum % 10) == 0 }{ 设置 isCard 有效 HTTP::payload replace $card_start $card_len [string repeat “X” $card_len] } # 日志结果 log local0.”发现 $isCard $type CC# $card_number” } } |
Edgenexus:
- 创建新的 flightPATH 规则并提供有意义的说明
- 这是另一个不需要条件匹配的例子,因为您通常希望保护任何服务器响应。当然,如果需要,也可以使用该选项。
- 添加新的 “操作”,并从下拉菜单选项中选择 “正文全部替换”。使用正则表达式可以匹配该动作要替换的目标文本。使用 \b(?:\d[\t-]?){12}\b作为检测和替换信用卡号码前 12 位数字的目标。在数据字段中输入 xxxx-xxxx-xxxxxx 作为替换文本。这将保留惯用的最后 4 位数字作为标识符。
- 对于其他敏感数据类型,例如国家保险号码,重复上述过程,使用 \b(?:\d[ \t-]?){7}\b 替换为 xxx-xxxxx 和 \b(?:\d[ \t-]?){6}\b 替换为 xxx.xxx
- 通过合理使用正则表达式,只需使用 “正文替换 “操作就能匹配和屏蔽各种字符序列。正文替换第一个和正文替换最后一个是其他操作选项,可用于只替换页面上某个字符序列的第一个或最后一个实例。
删除可能影响安全的 X- 标头
通过删除应用程序或服务器技术默认插入的某些 HTTP 标头,避免在用于应用程序交付的服务器基础架构上提供不必要的信息,通常被视为一种良好做法。黑客对他们想要利用的系统了解得越多,就越容易得手。系统漏洞发布与修补之间往往会有一段滞后期。在这段时间内,系统面临的威胁最大,也正是掩盖应用程序交付平台细节的过程最有用的时候。
许多不必要的信息都包含在 X 头信息中。下面的 iRule 对 X 头信息进行了全面删除,这可能并不可取。
F5:
名称: | HTTP X 服务器标头移除 |
定义 | 当 HTTP_RESPONSE { # 删除服务器标头的所有实例 HTTP::header 移除服务器 # 删除所有以 x- 开头的标头 foreach header_name[HTTP::header names] { if {[string match -nocase x-* $header_name]}{ HTTP::header 移除 $header_name } } } |
Edgenexus:
- 创建新的 flightPATH 规则,并使用有意义的名称,例如:删除 HTTP 标头
- 这是一个 flightPATH 规则的示例,可能不需要条件匹配。如有需要,还可使用一整套选择标准。
- 添加新操作 “移除响应标头”,在目标字段中输入要移除的标头值。添加一个 “移除响应标头 “操作条目,以定义需要从服务器响应中屏蔽的每个标头字段。删除所有自定义 X 前缀标头的一揽子操作实际上会产生不利影响,因此 flightPATH 要求您定义需要删除的特定标头。
- 将创建的 flightPATH 应用于需要执行操作的每个服务。
将 flightPATH 规则应用于虚拟服务
flightPATH 是一款功能强大但使用简单的 HTTP 操作工具。您可以创建一个 flightPATH 规则 “库”,以便在 HTTP 流量穿越 ALB-X 负载均衡器设备时对其执行各种操作。一个虚拟服务可应用多个 flightPATH 规则。flightPATH 规则按照应用到服务的顺序进行处理。某些 flightPATH 规则会终止处理。您可以使用拖放来重新安排顺序,以确保按要求执行所有操作。edgeNEXUS 可提供专业服务,协助翻译和创建更复杂的 flightPATH 规则。
想了解更多信息?
有关 Edgenexus 流量操纵的更多信息,请单击此处。
要下载 ALB-X 的免费试用版,请点击此处。
我们希望有机会展示 Edgenexus ALB-X 和 flightPATH 的功能。 在此申请个人快速技术演示。