ADC

配置和使用变量

您必须先创建一个变量,然后分配一个值或指定必须对变量执行的操作。执行这些操作后,您可以将分配用作策略操作。

注意:一旦配置,变量的设置就无法修改或重置。如果需要更改变量,则必须删除变量和对变量的所有引用(表达式和赋值)。然后可以使用新设置重新添加变量,并且可以重新添加引用(表达式和赋值)。

使用命令行界面配置变量

  1. 创建一个变量。
add ns variable <name> -type <string> [-scope global] [-ifFull ( undef | lru )] [-ifValueTooBig ( undef | truncate )] [-ifNoValue ( undef | init )] [-init <string>] [-expires <positive_integer>] [-comment <string>]
<!--NeedCopy-->

注意:有关命令参数的说明,请参阅手册页“man add ns 变量”。

示例 1:创建一个名为“my_counter”的 ulong 变量并将其初始化为 1。

add ns variable my_counter –type ulong -init 1
<!--NeedCopy-->

示例 2:创建名为“用户特权映射”的映射。映射将包含最长 15 个字符的键和最长 10 个字符的文本值,最多可包含 10000 个条目。

add ns variable user_privilege_map -type map(text(15),text(10),10000)
<!--NeedCopy-->

注意:如果映射包含 10000 个未过期条目,则新密钥的分配将重复使用最近使用最少的条目之一。默认情况下,试图为不存在的键获取值的表达式将初始化一个空文本值。

指定值或指定要对变量执行的操作。这是通过创建任务来完成的。

add ns assignment <name> -variable <expression> [-set <expression> | -add <expression> | -sub <expression> | -append <expression> | -clear] [-comment <string>]
<!--NeedCopy-->

注意:使用变量选择器 ($) 引用变量。因此, $variable1 用于引用文本或 ulong 变量。同样, $variable2[key-expression] 用于引用映射变量。

示例 1:定义一个名为“inc_my_counter”的赋值,该赋值自动将 1 添加到“my_counter”变量。

add ns assignment inc_my_counter -variable $my_counter -add 1
<!--NeedCopy-->

示例 2:定义一个名为“set_user_權限”的赋值,该赋值将客户端 IP 地址的条目添加到“user_權限”HTTP 标注返回的值。

add ns assignment set_user_privilege -variable $user_privilege_map[client.ip.src.typecast_text_t] -set sys.http.callout(get_user_privilege)
<!--NeedCopy-->

注意:如果该密钥的条目已存在,则该值将被替换。否则,将添加密钥和值的新条目。根据 user_privileged ge_map 之前的声明,如果映射已经有 10000 个条目,则最近使用最少的条目之一将被重新用于新的键和值。

  1. 调用策略中的变量分配。

    有两个函数可以对映射变量进行操作。

    • $name.valueExists(key-expression)。如果映射中存在由键表达式选择的值,则返回 true。否则返回 false。如果映射条目存在,此函数将更新过期信息和 LRU 信息,但如果该值不存在,则不会创建新的映射条目。

    • $name.valueCount。返回变量当前保存的值的数量。这是映射中的条目数。对于单例变量,如果变量未初始化,则为 0,否则为 1。

    示例: 使用压缩策略调用名为“set_user_權”的分配。

add cmp policy set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t).not -resAction set_user_privilege
<!--NeedCopy-->

用例在响应端插入 HTTP 标头

以下示例显示了单例变量的示例。

添加文本类型的单例变量。此变量最多可容纳 100 字节数据。

add ns variable http_req_data -type text(100) -scope transaction
<!--NeedCopy-->

添加一个赋值操作,该操作将用于将 HTTP 请求数据存储到变量中。

add ns assignment set_http_req_data -variable $http_req_data -set http.req.body(100)
<!--NeedCopy-->

添加一个重写操作以插入 HTTP 标头,其值将从变量中获取。

add rewrite action act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password")
<!--NeedCopy-->

添加一个重写策略,该策略将在请求时间内进行评估,并采取分配操作来存储数据。当我们执行此策略时,我们将采取赋值操作并将数据存储到 ns 变量 (http_req_data)

add rewrite policy pol_set_variable true set_http_req_data

bind rewrite global pol_set_variable 10 -type req_dEFAULT
<!--NeedCopy-->

添加将在响应时间进行评估的重写策略,并在响应中添加 HTTP 标头。

add rewrite policy pol_ins_header true act_ins_header

bind rewrite global pol_ins_header 10 -type res_dEFAULT
<!--NeedCopy-->

分配操作

在 Citrix ADC 设备中,当策略规则的计算结果为 true 时,将触发绑定到策略的分配操作。操作更新可用于后续策略规则评估的变量中的值。通过这种方式,同一个变量可以更新并用于同一功能中的后续策略评估。以前,设备仅在评估功能中的所有策略后才执行分配操作,当关联的分配操作的策略评估为 true 时。因此,由分配操作设置的变量值不能用于功能内的后续策略规则评估。

通过控制 Citrix ADC 设备上客户端访问列表的用例,可以更好地理解此功能。访问决策由一个单独的 Web 服务提供,请求 GET /client-access?<client-IP-address> 在正文中返回“BLOCK”或“ALLOCK”的响应。HTTP 标注配置为包括与传入请求关联的客户端的 IP 地址。Citrix ADC 设备收到来自客户端的请求时,该设备将生成标注请求并将其发送到标注服务器,该服务器托管一个包含列入黑名单的 IP 地址的数据库和一个 HTTP 标注代理,用于检查客户端的 IP 地址是否列在数据库中。HTTP 标注代理接收标注请求,检查是否列出了客户端的 IP 地址,并发送响应。响应是状态代码 200、302 以及正文中的“阻止”或“允许”。设备根据状态代码执行策略评估。如果策略评估为 true,则会立即触发分配操作,并且操作将值设置为变量。设备在同一模块中为后续策略评估使用并设置此变量值。

配置分配操作的用例

请按照以下步骤配置分配操作并将变量用于后续策略:

  1. 访问决策由单独的 Web 服务提供,请求在正文中返回带有 BLOCK 或 ALLOCK 的响应。

    GET /url-service>/url-allowed?<URL path>

  2. 设置映射变量以保存 URL 的访问决策。

    add ns variable url_list_map -type 'map(text(1000),text(10),10000)'

  3. 设置 HTTP 标注以将访问请求发送到 Web 服务。

    add policy httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?" + HTTP.REQ.URL.PATH' -resultExpr 'HTTP.RES.BODY(10)'

  4. 设置分配操作以调用标注以获取访问决策,并将其分配给 URL 的映射条目。

    add ns assignment client_access_assn -variable '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T]' -set SYS.HTTP_CALLOUT(client_access_callout)

  5. 设置响应程序操作,以便在 URL 请求被阻止时发送 403 响应。

    add responder action url_list_block_act respondwith '"HTTP/1.1 403 Forbidden\\r\\n\\r\\n"'

  6. 设置响应程序策略以设置 URL 的映射条目(如果尚未设置)。通过立即操作增强功能,在评估此策略时会设置映射条目值。在增强之前,在评估所有响应程序策略的决策由单独的 Web 服务提供之前,才会完成分配。

    add responder policy url_list_assn_pol '!$url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn

  7. 如果 URL 的映射条目值为 BLOCK,则设置响应程序策略以阻止对 URL 的访问。通过立即操作增强功能,上述策略设置的映射条目可用于此策略。在增强之前,此时仍将取消设置映射条目。

    add responder policy client_access_block_pol '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T] == "BLOCK"' client_access_block_act

  8. 将响应程序策略绑定到虚拟服务器。注意:我们无法全局绑定策略,因为我们不希望在单独的虚拟服务器上为 HTTP 标注执行策略。

    bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT -type REQUEST bind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST

使用配置实用程序配置变量

  1. 导航到 AppExpert > NS 变量,以创建一个变量。
  2. 导航到 AppExpert > NS 分配,将值分配给变量。
  3. 导航到要将任务配置为操作的相应功能区域。
配置和使用变量