ADC

RADIUS 支持重写功能

Citrix ADC 表达式语言包括可从请求和响应中提取信息并操作 RADIUS 消息的表达式。通过这些表达式,您可以在将 RADIUS 消息发送到其目标之前使用重写功能修改其部分。您的重写策略和操作可以使用适合或与 RADIUS 消息相关的任何表达式。通过可用的表达式,您可以识别 RADIUS 消息类型,从连接中提取任何属性-值对 (AVP),并修改 RADIUS AVP。您还可以为 RADIUS 连接创建策略标签。

您可以在“重写”规则中使用新的 RADIUS 表达式出于多种目的。例如,您可以:

  • 删除 RADIUS 用户名 AVP 的域部分,以简化单点登录 (SSO)。
  • 插入供应商特定的 AVP,例如电话公司操作中使用的 MSISDN 字段,以包含订阅者信息。

您还可以创建策略标签,以便通过一系列适用于这些请求的策略路由特定类型的 RADIUS 请求。

注意:

用于重写的 RADIUS 有以下限制:

  • Citrix ADC 不会重新签署重写的 RADIUS 请求或响应。如果 RADIUS 身份验证服务器需要签名的 RADIUS 消息,则身份验证将失败。
  • 当前可用的 RADIUS 表达式不适用于 RADIUS IPv6 属性。

支持 RADIUS 的表达式的 Citrix ADC 文档假定熟悉 RADIUS 通信的基本结构和用途。如果您需要有关 RADIUS 的更多信息,请参阅 RADIUS 服务器文档或在线搜索,了解 RADIUS 协议的简介。

配置 RADIUS 的重写策略

以下过程使用 Citrix ADC 命令行配置重写操作和策略,并将策略绑定到特定于重写的全局绑定点。

要配置重写操作和策略并绑定策略,请执行以下操作:

在命令提示符下,键入以下命令:

  • add rewrite action <actName> <actType>
  • add rewrite policy <polName> <rule> <actName>
  • bind rewrite policy <polName> <priority> <nextExpr> -type <bindPoint>,其中 <bindPoint> 表示特定于重写的全局绑定点之一。

用于重写的 RADIUS 表达式

在重写配置中,您可以使用以下 Citrix ADC 表达式来引用 RADIUS 请求或响应的各个部分。

识别连接类型:

  • RADIUS.IS_CLIENT

    如果连接是 RADIUS 客户端(请求)消息,则返回 TRUE。

  • RADIUS.IS_SERVER

    如果连接是 RADIUS 服务器(响应)消息,则返回 TRUE。

请求表达式:

  • RADIUS.REQ.CODE

    返回与 RADIUS 请求类型对应的数字。num_at 类的衍生物。例如,RADIUS 访问请求将返回 1(一)。RADIUS 会计请求将返回 4。

  • RADIUS.REQ.LENGTH

    返回 RADIUS 请求的长度,包括标头。 num_at 类的衍生物。

  • RADIUS.REQ.IDENTIFIER

    返回 RADIUS 请求标识符,一个分配给每个请求的数字,允许请求与相应响应匹配。 num_at 类的衍生物。

  • RADIUS.REQ.AVP(<AVP Code No>).VALUE

    返回此 AVP 首次出现的值作为 text_t 类型的字符串。

  • RADIUS.REQ.AVP(<AVP code no>).INSTANCE(instance number)

    以 RAVP_t 类型的字符串形式返回 AVP 的指定实例。在 RADIUS 消息中可能会出现多次特定的 RADIUS AVP。INSTANCE (0) 返回第一个实例,INSTANCE (1) 返回第二个实例,依此类促,最多可返回 16 个实例。

  • RADIUS.REQ.AVP(<AVP code no>).VALUE(instance number)

    以 text_t 类型的字符串形式返回 AVP 的指定实例的值。

  • RADIUS.REQ.AVP(<AVP code no>).COUNT

    以整数形式返回 RADIUS 连接中特定 AVP 的实例数。

  • RADIUS.REQ.AVP(<AVP code no>).EXISTS

    如果消息中存在指定类型的 AVP,则返回 TRUE;如果不存在,则返回 FALSE。

响应表达式:

RADIUS 响应表达式与 RADIUS 请求表达式相同,但 RES 替换 REQ。

AVP 值的类型转换:

ADC 支持将 RADIUS AVP 值转换为文本、整数、无符号整数、长、无符号长、ipv4 地址、ipv6 地址、ipv6 前缀和时间数据类型的表达式。语法与其他 Citrix ADC 类型转换表达式的语法相同。

例如:

ADC 支持将 RADIUS AVP 值转换为文本、整数、无符号整数、长、无符号长、ipv4 地址、ipv6 地址、ipv6 前缀和时间数据类型的表达式。语法与其他 Citrix ADC 类型转换表达式的语法相同。

RADIUS.REQ.AVP(8).VALUE(0).typecast_ip_address_at
<!--NeedCopy-->

AVP 类型表达式:

Citrix ADC 支持使用 RFC2865 和 RFC2866 中描述的分配整数代码提取 RADIUS AVP 值的表达式。您还可以使用文本别名来完成相同的任务。下面是一些示例。

  • RADIUS.REQ.AVP (1).VALUE or RADIUS.REQ.USERNAME.value

    提取 RADIUS 用户名值。

  • RADIUS.REQ.AVP (4). VALUE or RADIUS.REQ. ACCT\_SESSION\_ID.value

    从消息中提取会话 ID AVP(代码 44)。

  • RADIUS.REQ.AVP (26). VALUE or RADIUS.REQ.VENDOR\_SPECIFIC.VALUE

    提取供应商特定的值。

大多数常用 RADIUS AVP 的值可以以相同的方式提取。

RADIUS 绑定积分:

对于包含 RADIUS 表达式的策略,有四个全局绑定点可用。

  • RADIUS_REQ_OVERRIDE

    优先级/覆盖请求策略队列。

  • RADIUS_REQ_DEFAULT

    标准请求策略队列。

  • RADIUS_RES_OVERRIDE

    优先级/覆盖响应策略队列。

  • RADIUS_RES_DEFAULT

    标准响应策略队列。

RADIUS 重写特定表达式:

  • RADIUS.NEW_AVP

    以字符串形式返回指定的 RADIUS AVP。

  • RADIUS.NEW_AVP_INTEGER32

    以整数形式返回指定的 RADIUS AVP。

  • RADIUS.NEW_AVP_UNSIGNED32

    以无符号整数形式返回指定的 RADIUS AVP。

  • RADIUS.NEW_VENDOR_SPEC_AVP(<ID>, <definition>)

    将指定的扩展供应商特定的 AVP 添加到连接中。对于<ID>, 替代了很长的数字. 对于<definition>,替换包含 AVP 数据的字符串。

  • RADIUS.REQ.AVP_START

    返回 RADIUS 标头末尾和 AVP 开始之间的位置。用于重写操作。

    示例:

    add rewrite action insert1 insert_after radius.req.avp_start radius.new_avp(33, "NEW AVP")
<!--NeedCopy-->
  • RADIUS.REQ.AVP_END

    在 radius 消息中返回 radius 消息(或者换句话说,所有 AVP 的末尾)的位置。执行重写操作时使用。

    示例:

    add rewrite action insert2 insert_before radius.req.avp_end "radius.new_avp(33, "NEW AVP")"
<!--NeedCopy-->
  • RADIUS.REQ.AVP_LIST

    返回 RADIUS 消息中 AVP 开始处的位置,以及 RADIUS 消息的长度(不包括标头)。换句话说,返回 RADIUS 消息中的所有 AVP。用于执行重写操作。

    示例:

    add rewrite action insert3 insert_before_all radius.req.avp_list "radius.new_avp(33, "NEW AVP")" -search "avp(33)"
<!--NeedCopy-->

RADIUS 的有效重写操作类型:

可与 RADIUS 表达式一起使用的重写操作类型为:

  • INSERT_AFTER
  • INSERT_BEFORE
  • INSERT_AFTER_ALL
  • INSERT_BEFORE_ALL
  • DELETE
  • DELETE_ALL
  • REPLACE
  • REPLACE_ALL

所有 INSERT_ actions 可用于将 RADIUS AVP 插入到 RADIUS 连接中。

用例

下面是具有重写的 RADIUS 的用例。

重写用户名 AVP

要将重写功能配置为从 RADIUS 用户名 AVP 中删除域字符串,首先创建重写 RESTE 操作,如下例所示。在选择所有 RADIUS 请求的重写策略中使用操作。将策略绑定到全局绑定点。执行此操作时,请将优先级设置为适当级别,以允许任何阻止或拒绝策略首先生效,但确保重写所有未被阻止或拒绝的请求。将Goto 表达式 (GotopriorityExPR) 设置为 NEXT 以继续策略评估,并将该策略附加到 RADIUS_REQ_DEFAULT 队列。

示例:

add rewrite action rwActRadiusDomainDel replace radius.req.user_name q/RADIUS.NEW_AVP(1,RADIUS.REQ.USER_NAME.VALUE.AFTER_STR(" "))/
add rewrite policy RadiusRemoveDomainPol true rwActRadiusDomainDel
<!--NeedCopy-->

注意:

RADIUS 的重写策略不适用于 Gateway 虚拟服务器。如果使用 Gateway 虚拟服务器进行负载平衡,则需要配置 RADIUS,并且重写策略需要绑定到 RADIUS 负载平衡虚拟服务器。

插入特定于供应商的 AVP

若要配置重写操作以插入包含 MSISDN 字段内容的供应商特定的 AVP,首先创建将 MSISDN 字段插入到请求中的重写插入操作。在 Rewrite 策略中使用选择所有 RADIUS 请求的操作。将策略绑定到全局,将优先级设置为适当的级别和其他参数,如以下示例所示。

示例:

add rewrite action rwActRadiusInsMSISDN insert_after radius.req.avp_start RADIUS.NEW_VENDOR_SPEC_AVP(<VENDOR ID>, "RADIUS.NEW_AVP(<Attribute Code>, <MSISDN>)")
add rewrite policy rwPolRadiusInsMSISDN true rwActRadiusInsMSISDN
bind rewrite global rwPolRadiusInsMSISDN 100 NEXT -type RADIUS_REQ_DEFAULT
<!--NeedCopy-->
RADIUS 支持重写功能