Citrix ADC

配置和使用变量

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

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

通过命令行界面配置变量

  1. 创建一个变量。
add ns变量 -type  [-scope global] [- ifffull (undef | lru)] [-ifValueTooBig (undef | truncate)] [-ifNoValue (undef | init)] [-init ] [-expires ] [-comment ] 

请注意:命令参数说明请参考手册中的“man add ns variable”。

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

添加ns变量my_counter -type ulong -init 1 

例2:创建名为“user_privilege_map”的映射。该映射将包含最大长度为15个字符的键和最大长度为10个字符的文本值,最多包含10000个条目。

添加ns变量user_privilege_map -type map(text(15),text(10),10000) 

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

赋值或指定要对变量执行的操作。这是通过创建一个赋值来实现的。

添加ns赋值 -variable  [-set  | -add  | -sub  | -append  | -clear] [-comment ] 

注意:变量是通过变量选择器($)来引用的。因此,variable1美元用于引用文本或字符串变量。同样的,如上所述美元的操作(键表达式)用于引用映射变量。

例1:定义一个名为“inc_my_counter”的赋值,它会自动给“my_counter”变量加1。

添加ns赋值inc_my_counter -变量$my_counter -add 1 

示例2:定义一个名为“set_user_privilege”的赋值,它向“user_privilege_map”变量添加一个客户端IP地址条目,该条目的值由“get_user_privilege”HTTP调出返回。

增加ns分配set_user_privilege -variable $user_privilege_map[client.ip.src]。设置sys.http.callout(get_user_privilege) 

请注意:如果该键的表项已经存在,该值将被替换。否则,将为键和值添加一个新条目。根据前面对user_privilege_map的声明,如果映射已经有10000个条目,那么将为新的键和值重用最近最少使用的条目之一。

  1. 在策略中调用变量赋值。

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

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

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

    例子:用压缩策略调用名为“set_user_privilege”的赋值。

添加cmp策略set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t)。not -resAction set_user_privilege 

在响应端插入HTTP报头的用例

下面的示例显示了一个单例变量的示例。

添加一个文本类型的单例变量。这个变量最多可以保存100字节的数据。

添加ns变量http_req_data -type text(100) -scope transaction 

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

$http_req_data -set http.req.body(100) 

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

添加重写动作act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password") 

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

添加重写策略pol_set_variable true set_http_req_data绑定重写全局pol_set_variable 10 type req_dEFAULT 

添加一个重写策略,它将评估响应时间,并在响应中添加HTTP头。

添加重写策略pol_ins_header true act_ins_header绑定重写全局pol_ins_header 10 -type res_dEFAULT 

赋值操作

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

使用控制Citrix ADC设备上客户端访问列表的用例可以更好地理解此功能。访问决策由单独的web服务与请求一起提供/客户端访问吗?<客户端ip地址>它返回一个在body中带有“BLOCK”或“ALLOW”的响应。HTTP调出被配置为包含与传入请求相关联的客户机的IP地址。当Citrix ADC设备接收到来自客户机的请求时,该设备生成调出请求并将其发送到调出服务器,该服务器托管一个列入黑名单的IP地址数据库和一个HTTP调出代理,该代理检查客户机的IP地址是否在数据库中列出。HTTP调出代理接收调出请求,检查是否列出了客户端的IP地址,并发送响应。响应是状态码200,302,正文中有“BLOCK”或“ALLOW”。根据状态码,设备执行策略评估。如果策略评估为真,则立即触发分配操作,并将值设置为变量。设备使用并设置该变量值,以便在同一模块中进行后续策略评估。

配置分配操作的用例

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

  1. 访问决策是由一个单独的web服务提供的,请求返回的响应在请求体中带有BLOCK或ALLOW。

    GET / url-service > / url-allowed吗?< URL路径>

  2. 设置一个映射变量来保存url的访问决策。

    添加变量url_list_map -type 'map(text(1000),text(10),10000)'

  3. 设置HTTP调出以向web服务发送访问请求。

    添加策略httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?"+ HTTP.REQ.URL。` ` HTTP.RES.BODY(10) ` `

  4. 设置一个分配操作来调用调出以获得访问决策,并将其分配给URL的映射条目。

    $client_access_map[CLIENT.IP.SRC. js]' -set SYS.HTTP_CALLOUT(client_access_callout)

  5. 设置一个响应器动作,以便在URL请求被阻止时发送403响应。

    添加responder action url_list_block_act respondwith '"HTTP/1.1 403被禁止\\r\\n\\r\\n"'

  6. 设置一个响应器策略来设置URL的映射条目(如果还没有设置)。使用即时操作增强,在评估此策略时设置映射条目值。在增强之前,直到评估了所有响应器策略(决策由单独的web服务提供)之后才进行分配。

    $url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn . path

  7. 设置一个响应器策略来阻止对URL的访问,如果它的映射条目值是block。通过立即动作增强,上述策略设置的映射项可以在此策略中使用。在增强之前,此时地图条目仍然是未设置的。

    添加响应策略client_access_block_pol '$client_access_map。client_access_block_act . txt == "BLOCK"

  8. 将响应器策略绑定到虚拟服务器。请注意:我们不能全局绑定策略,因为我们不想在单独的虚拟服务器上为HTTP调出执行它们。

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

通过使用配置实用程序来配置变量

  1. 导航到AppExpert > NS变量,以创建一个变量。
  2. 导航到AppExpert b> nsassignments,为变量赋值。
  3. 导航到您想要将分配配置为操作的适当特性区域。
配置和使用变量