Citrix 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

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")
  • RADIUS.REQ.AVP_END

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

    示例:

    add rewrite action insert2 insert_before radius.req.avp_end "radius.new_avp(33, "NEW AVP")"
  • 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)"

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

注意

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

RADIUS 支持重写功能