ADC

RADIUS 对重写功能的支持

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

可以在重写规则中使用新的 RADIUS 表达式有多种用途。例如,您可以:

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

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

注意:

重写的 RADIUS 有以下限制:

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

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

为 RADIUS 配置重写策略

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

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

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

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

用于重写的 RADIUS 表达式

在重写配置中,您可以使用以下 NetScaler 表达式来引用 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

    以 text_t 类型的字符串形式返回此 AVP 首次出现的值。

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

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

  • 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 前缀和时间数据类型的表达式。其语法与其他 NetScaler 类型转换表达式的语法相同。

示例:

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

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

AVP 类型表达式:

NetScaler 支持使用 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

    从消息中提取 Acct-Session-ID AVP(代码 44)。

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

    提取供应商特定的值。

可以使用相同的方式提取最常用的 RADIUS AVP 的值。

半径绑定点:

包含 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 T_AFTER_ALL
  • INSERT T_BEFORE_ALL
  • DELETE
  • DELETE E_ALL
  • REPLACE
  • REPLACE_ALL

全部 INSERT_ actions 可用于将 RADIUS AVP 插入 RADIUS 连接。

用例

以下是带有重写功能的 RADIUS 的用例。

重写用户名 AVP

要配置重写功能以从 RADIUS 用户名 AVP 中删除 Domain\ 字符串,请首先创建重写 REPLACE 操作,如以下示例所示。使用重写策略中的操作来选择所有 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 的重写策略不适用于网关虚拟服务器。如果使用网关虚拟服务器进行负载平衡,则需要配置 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 对重写功能的支持