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 variable”。

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

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

示例 2:创建名为“user_privilege_map”的地图。地图将包含最大长度为 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 [键表达式] 用于引 用地图变量。

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

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

示例 2:定义一个名为“set_user_privilege”的分配,该赋值将客户端 IP 地址的条目添加到“user_privilege_map”变量中,其值由“get_user_privilege”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_privilege_map 声明,如果地图已经有 10000 个条目,则最近使用最少的条目之一将被重复用作新的键和值。

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

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

    • $name.value存在(键表达式)。如果键表达式在地图中选择了一个值,则返回 true。否则返回 false。如果地图条目存在,此函数将更新过期和 LRU 信息,但如果该值不存在,则不会创建新的地图条目。

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

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

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-->

分配操作

在 NetScaler 设备中,当策略规则的评估结果为真时,会触发绑定到策略的分配操作。该操作会更新变量中的值,该值可用于后续的策略规则评估。这样,可以更新相同的变量并将其用于同一功能的后续策略评估。以前,只有在评估了功能中的所有策略后,当相关分配操作的策略评估为真时,设备才会执行分配操作。因此,分配操作设置的变量值不能用于功能内的后续策略规则评估。

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

配置分配操作的用例

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

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

    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. 导航到要将任务配置为操作的相应功能区域。
配置和使用变量