如何将 F5 iRules 迁移到 Edgenexus flightPATH

How to Migrate F5 iRules to edgeNEXUS flightPATH
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:

如何将 F5 iRules 迁移到 edgeNEXUS flightPATH

 

点击此处放大

 

  1. 通过 Web GUI 创建新的 flightPATH 规则,名称为 IP_Choice_Pool_1。添加一个简明的描述,以便能够识别 flightPATH 规则执行的功能。
  2. 添加新条件,从广泛下拉列表中选择源 IP。从 “意义 “下拉列表中选择 “是否”。一种方法是从下拉列表中选择 “开始”(也可以使用其他选项,如 RegEx,为 IP 地址 “值 “提供更大的灵活性)。在 “值 “框中输入起始 IP 范围。
  3. 添加新操作。从 “操作 “下拉框中选择 “使用服务器 “选项(如果需要,还有 “使用安全服务器 “选项)。在目标框中输入所需目标的 IP 地址和端口,这通常是另一个虚拟服务接口,以便在另一个真实服务器池中实现负载平衡。

HTTP 重定向到 HTTPS

虽然 F5 现在有了使用 iRules 执行 HTTP 到 HTTPs 重定向的替代方案,但仍有许多人在使用 iRules 实现这一功能。

F5:

名称: HTTP_HTTPs 重定向
定义: when HTTP_REQUEST { HTTP::redirect “https://[HTTP::host][HTTP::uri]”}


Edgenexus:

 

点击此处放大

 

  1. 创建新的 flightPATH 规则,名称为通过 Web GUI 将 HTTP 重定向到 HTTPS。添加一个简洁的描述,以便识别 flightPATH 规则执行的功能。
  2. 对于大多数应用程序来说,需要对所有访问 HTTP 服务的流量执行 HTTP 到 HTTPS 重定向。在这种情况下,无需创建条件规则。如果 flightPATH 规则只影响某些流量,则可以非常灵活地创建条件规则。
  3. 添加新操作,从操作下拉框中选择重定向 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:

点击此处放大

 

  1. 创建新的 flightPATH 规则并提供有意义的说明
  2. 这是另一个不需要条件匹配的例子,因为您通常希望保护任何服务器响应。当然,如果需要,也可以使用该选项。
  3. 添加新的 “操作”,并从下拉菜单选项中选择 “正文全部替换”。使用正则表达式可以匹配该动作要替换的目标文本。使用 \b(?:\d[\t-]?){12}\b作为检测和替换信用卡号码前 12 位数字的目标。在数据字段中输入 xxxx-xxxx-xxxxxx 作为替换文本。这将保留惯用的最后 4 位数字作为标识符。
  4. 对于其他敏感数据类型,例如国家保险号码,重复上述过程,使用 \b(?:\d[ \t-]?){7}\b 替换为 xxx-xxxxx 和 \b(?:\d[ \t-]?){6}\b 替换为 xxx.xxx
  5. 通过合理使用正则表达式,只需使用 “正文替换 “操作就能匹配和屏蔽各种字符序列。正文替换第一个和正文替换最后一个是其他操作选项,可用于只替换页面上某个字符序列的第一个或最后一个实例。

删除可能影响安全的 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:

点击此处放大

 

  1. 创建新的 flightPATH 规则,并使用有意义的名称,例如:删除 HTTP 标头
  2. 这是一个 flightPATH 规则的示例,可能不需要条件匹配。如有需要,还可使用一整套选择标准。
  3. 添加新操作 “移除响应标头”,在目标字段中输入要移除的标头值。添加一个 “移除响应标头 “操作条目,以定义需要从服务器响应中屏蔽的每个标头字段。删除所有自定义 X 前缀标头的一揽子操作实际上会产生不利影响,因此 flightPATH 要求您定义需要删除的特定标头。
  4. 将创建的 flightPATH 应用于需要执行操作的每个服务。


将 flightPATH 规则应用于虚拟服务

flightPATH 是一款功能强大但使用简单的 HTTP 操作工具。您可以创建一个 flightPATH 规则 “库”,以便在 HTTP 流量穿越 ALB-X 负载均衡器设备时对其执行各种操作。一个虚拟服务可应用多个 flightPATH 规则。flightPATH 规则按照应用到服务的顺序进行处理。某些 flightPATH 规则会终止处理。您可以使用拖放来重新安排顺序,以确保按要求执行所有操作。edgeNEXUS 可提供专业服务,协助翻译和创建更复杂的 flightPATH 规则。

想了解更多信息?

有关 Edgenexus 流量操纵的更多信息,请单击此处

要下载 ALB-X 的免费试用版,请点击此处

我们希望有机会展示 Edgenexus ALB-X 和 flightPATH 的功能。 在此申请个人快速技术演示。

About Donna Toomey