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