Citrix ADC

配置和使用变量

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

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

使用命令行界面配置变量

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

请注意:命令参数的说明请参见man add ns variable。

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

添加ns变量my_counter -type ulong -init 1 <! -  caltcopy  - >

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

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

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

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

添加nsassign  -variable  [-set  | -add  | -sub  | -add  | -clear] [-comment ] 

注意:变量是通过使用变量选择器($)来引用的。因此,$变量1用于指文本或ulong变量。相似地,如上所述美元的操作(键表达式)用于引用映射变量。

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

addns赋值inc_my_counter -variable $my_counter -add 1 

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

添加ns赋值set_user_privilege -variable $ user_privilege_map [client.ip.src.typecast_text_t] -set sys.http.callout(get_user_privilege)<! -  caltcopy  - >

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

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

    有两个功能可以在地图变量上运行。

    • 美元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个字节的数据。

添加nsvariable http_req_data -type text(100) -scope transaction 

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

添加nsassign set_http_req_data -variable $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地址>它在身体中返回“块”或“允许”的响应。HTTP标注被配置为包括与传入请求相关联的客户端的IP地址。When the Citrix ADC appliance receives a request from a client, the appliance generates the callout request and sends it to the callout server, which hosts a database of blacklisted IP addresses and an HTTP callout agent that checks whether the client’s IP address is listed in the database. The HTTP callout agent receives the callout request, checks whether the client’s IP address is listed, and sends a response. The response is a status code, 200, 302 along with “BLOCK” or “ALLOW” in the body. Based on the status code, the appliance performs the policy evaluation. If the policy evaluation is true, the assignment action is triggered immediately and action sets the value to the variable. The appliance uses and sets this variable value for subsequent policy evaluation in the same module.

配置分配操作的用例

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

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

    获取/ URL-service> / URL允许?

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

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

  3. 设置一个HTTP调出将访问请求发送到web服务。

    添加策略httpcallout url_list_callout -vserver url_vs -returntype text -urlstemexpr'“/允许的URL?”+ http.req.url.path' -resultexpr'http.res.body(10)'

  4. 设置分配操作以调用呼叫以获取访问决定并将其分配给URL的地图条目。

    添加ns赋值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的访问。通过立即操作增强,前面策略设置的映射条目可以在此策略中使用。在增强之前,映射条目此时仍未设置。

    添加响应器策略client_access_block_pol '$client_access_map[CLIENT.IP.SRC.]TYPECAST_TEXT_T] == "BLOCK"' client_access_block_act .

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

    bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT类型的请求bind lb vserver vs -policyName client_access_block_pol -priority 20 - gotopriityexpression END -type REQUEST

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

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