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 对重写功能的支持