Citrix ADC

配置和使用变量

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

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

使用命令行界面配置变量

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

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

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

添加变量my_counter -type ulong -init 1 

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

添加ns变量user_privilege_map类型map(text(15),text(10),10000) 

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

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

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

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

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

添加ns赋值inc_my_counter -variable $my_counter -add 1 

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

添加ns分配set_user_privilege -variable $user_privilege_map[client.ip.src. map]。-set sys.http.callout(get_user_privilege) 

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

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

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

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

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

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

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

用例在响应端插入HTTP标头

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

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

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

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

添加ns赋值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类型req_dEFAULT 

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

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

分配操作

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

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

配置分配操作的用例

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

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

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

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

    添加ns变量url_list_map类型'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 assign client_access_assn -variable '$client_access_map[CLIENT.IP.SRC. map]-set SYS.HTTP_CALLOUT(client_access_callout)

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

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

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

    $url_list_map.VALUEEXISTS(http . require . url . path)' url_list_assn

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

    添加响应器策略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 REQUESTbind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST

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

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