动态配置文件中的用户定义变量
用户定义的变量
在动态服务配置文件中,您可以通过 Junos OS 在层次结构级别配置 [edit dynamic-profiles profile-name variables] 自定义变量,并在层次结构中使用 [edit dynamic-profiles] 这些变量。在用户身份验证过程中,动态配置文件从外部服务器(例如 RADIUS)获取并替换这些变量的数据。在运行时,变量将替换为实际值,并用于配置用户接口。
您可以使用以下任一语句配置用户定义的变量:
default-value- 为动态配置文件中的用户定义变量配置默认值。系统用于这些变量的值将在订阅者进行身份验证时应用。指定默认值可为关联语句提供独立配置,如果外部服务器无法访问或不包含变量值,则为语句配置提供备份。equals- 为在运行时计算并作为变量值返回的用户定义变量配置表达式。mandatory- 指定外部服务器(例如 RADIUS)必须返回用户定义变量的值。如果外部服务器未返回变量的值,则动态配置文件将失败。uid- 在为服务创建的动态配置文件中为参数化过滤器和 CoS 配置唯一 ID。uid-reference- 配置一个变量,用于引用为服务创建的动态配置文件中的参数化过滤器或 CoS 的唯一 ID。
定义如何获取变量的顺序很重要。为确保从外部服务器获取任何必需变量,而不是从缺省值或通过变量表达式派生值,必须先定义任何必需变量。
在动态配置文件中配置用户定义的动态变量
本主题讨论如何在动态服务配置文件中配置用户定义的动态变量。您可以在层次结构级别定义 [edit dynamic-profiles profile-name variables] 一个变量,该变量在动态服务配置文件的其他地方使用。您可以选择为动态配置文件主体中显示的任何动态变量指定默认值。如果路由器无法访问外部服务器(例如 RADIUS)或以其他方式获取用作动态变量的值,将使用默认变量值。或者,您可以指定必须使用 RADIUS 返回值;如果未收到该值,则配置文件将失败。
配置任何动态变量默认值之前:
创建基本动态配置文件。
请参阅 配置基本动态配置文件。
确保将路由器配置为启用客户端与 RADIUS 服务器之间的通信。
请参阅 指定订阅者访问的认证和计费方法。
配置您希望配置文件在验证订阅者时使用的所有 RADIUS 值。
请参阅用于 订阅者访问的 RADIUS 服务器和参数
要在动态服务配置文件中配置变量:
在用户定义的变量中使用变量表达式
通过 Junos OS,您可以创建表达式(算术运算符、字符串运算符和作数组),用作动态配置文件中的变量。在层次结构级别配置 [dynamic-profiles profile-name variables] 变量表达式。运行时,计算变量表达式并将其用作配置动态用户接口的变量值。
在动态配置文件中配置表达式时,必须遵循以下规则:
-
只能在动态配置文件的可变节中配置表达式。
-
包含用户定义变量表达式的动态配置文件只能用于服务激活。
-
通常仅将表达式分配给用户定义的变量。不能将表达式分配给内部变量或预定义变量。
-
表达式值优先于默认值。
-
整个表达式必须包含在引号 (“ ”) 中。
-
表达式中的字符串必须用单引号 (' ') 引号括起来,并且单引号只能包含字符串。
-
空格被视为所有作数和运算符的分隔符。在表达式中创建的包含空格的字符串将被视为单个字符串,并包括任何前导或尾随空格。例如,要创建服务配置文件:
dynamic-profiles { service profile { variables { scheduler-name; video-filter equals “ ‘ Filter 1 ’ ” # Everything within the single quotation marks is considered a string, including the leading and trailing white space } } } -
表达式必须是所有算术运算符或所有字符串运算符;除非正确转换为正确的类型,否则不允许混合算术运算符和字符串运算符。
-
表达式可以引用其他系统预定义变量或其他用户定义的变量。但是,不允许在变量之间进行循环引用。例如,以下引用不正确:
dynamic-profiles { Service_Profile_1 { variables { scheduler-name; transmit-rate2 equals “ ( $transmit-rate1 * 2)/3” # refers to transmit-rate1 transmit-rate1 equals “ ( $transmit-rate2 * 2)/3” # refers to transmit-rate2 } } } -
要为 BNG-CUPS 用户平面创建动态接口和接口集,请使用以下格式:
dynamic-profile { <dprof_name> { interfaces { interface-set <dynamic interface-set Name> { interface <interface-name> { unit "$junos-interface-unit"; } } … class-of-service { … interfaces { interface-set <dynamic interface-set Name> { output-traffic-control-profile <TCP Name>; } } } }您可以为 BNG-CUPS 用户平面配置服务过滤器优先级,以控制数据包的服务评估顺序。您可以将优先级配置添加到动态配置文件中。
dynamic-profiles { <dprof_name> { ... interfaces { pp0 { unit "$junos-interface-unit" { ... family inet { filter { input "$in-filter" precedence 20; output "$out-filter" precedence 20; } unnumbered-address "$junos-loopback-interface"; } family inet6 { filter { input "$inv6-filter" precedence 20; output "$outv6-filter" precedence 20; } unnumbered-address "$junos-loopback-interface"; } } } } … } -
任何不包含“默认”值或“等于”表达式的必需变量都必须包含作为服务激活一部分的值。例如,动态服务配置文件定义“service-video”中包含两个或更少必需变量的 “service-video( value1, value2)” 等 RADIUS 服务 VSA 成功。如果至少一个必需变量没有与其关联的任何值(无论是通过“默认”还是“等于”属性评估),则服务激活将失败。
表 1 列出了可用于创建表达式的支持运算符和函数。优先级 5 是最高级别。
| 作 |
作人员 |
关联性 |
优先级 |
行动 |
|---|---|---|---|---|
| 算术加法 |
+ |
左 |
1 |
将运算符右侧和左侧的元素一起添加在一起。 |
| 算术减法 |
- |
左 |
1 |
从运算符左侧的元素中减去运算符右侧的元素。 |
| 算术乘法 |
* |
左 |
2 |
将运算符左侧的元素乘以运算符右侧的元素。 |
| 算术师 |
/ |
左 |
2 |
将运算符左侧的元素除以运算符右侧的元素。 |
| 算术模数 |
% |
左 |
2 |
将运算符左侧的元素除以运算符右侧的元素,并返回整数余数。如果运算符左侧的元素小于运算符右侧的元素,则结果是运算符左侧的元素。 |
| 串联 |
## |
左 |
3 |
通过将运算符左侧的字符串值和运算符右侧的值连接在一起来创建新字符串。 |
| 最大值 |
最大值(参数 1,参数 2) |
左 |
4 |
采用作为参数传递的两个值的最大值。 |
| 最低要求 |
最小值(参数 1,参数 2) |
左 |
4 |
采用作为参数传递的两个值中的最小值。 |
| 圆形 |
round(参数1) |
- |
4 |
将值四舍五入到最接近的整数。 |
| 截断 |
trunc(参数 1) |
- |
4 |
将非整数值截断为小数点左侧的值。 |
| 转换为字符串 |
toStr(参数1) |
- |
4 |
将括号内的变量转换为以空结尾的字符串。 |
| 转换为整数 |
toInt(参数 1) |
- |
4 |
将参数转换为整数。允许单个字符串或变量作为参数。 |
| 随机 |
兰德() |
- |
4 |
生成一个随机数值。 |
| 如果不是零 |
ifNotZero(参数 1, 参数 2) |
左 |
4 |
如果第一个参数不为零,则返回第二个参数。如果第一个参数为零,则返回 NULL。 |
| 括号 |
( ) |
- |
5 |
对作数和运算符进行分组,以获得不同于简单优先级的结果;实际上具有最高的优先级。 |
在用值填充变量后计算表达式。评估在配置文件实例化之前立即进行,包括值检查。如果计算值不可接受,或者管理表达式语法的规则被破坏,则表达式评估将失败,不会进行配置文件实例化,并记录消息以描述错误。
表 2 列出了可能的表达式错误场景以及路由器软件执行的作。
| 错误 |
发生次数 |
行动 |
可变值 |
|---|---|---|---|
| 解析错误 |
提交检查阶段 |
提交失败 |
不适用 |
| 循环变量依赖性错误 |
提交检查阶段 |
提交失败 |
不适用 |
| 表达式内的变量未定义 |
提交检查阶段 |
提交失败 |
不适用 |
| 除以零 |
配置文件实例化 |
配置文件实例化失败 |
零 (0) |
| 向数字添加字符串 |
配置文件实例化 |
配置文件实例化失败 |
零 (0) |
| 溢出错误 |
配置文件实例化 |
配置文件实例化失败 |
未定义 |
| 下溢错误 |
配置文件实例化 |
配置文件实例化失败 |
未定义 |
您还可以使用默认值配置用户定义的变量。如果 RADIUS 服务器不可访问或 VSA 属性不包含值,则默认值为关联语句提供独立配置或为语句配置提供备份。
用户定义变量中变量表达式的更改历史记录
是否支持某项功能取决于您使用的平台和版本。使用 功能资源管理器 确定您的平台是否支持某个功能。
| 版本 | 说明 |
|---|---|
| 19.3 | 从 Junos OS 19.3R1 版开始,您可以在动态配置文件的语句中 您还可以配置有限数量的表达式来为预定义变量建立默认值。请参阅动态 客户端配置文件的预定义变量默认值。 |
| 25.2 Junos OS 演化版 | 从 Junos OS 演化版 25.2R1 开始,您可以为 BNG-CUPS 用户平面模式下的动态配置文件配置接口集和家族(inet、inet6)输入或输出过滤器优先级。 |
也可以看看
在动态配置文件中配置变量表达式
您可以创建表达式(算术运算符、字符串运算符和作数组)以用作动态配置文件中的变量。这些表达式用作配置动态用户接口的变量值。
要配置动态配置文件变量表达式:
表 4 提供了可以使用支持的运算符和函数创建的表达式的几个示例。
示例 |
描述 |
|---|---|
video-filter 等于 “' Filter1' ” |
将字符串“Filter1”分配给动态$video过滤器变量。 |
video-filter2 等于 “$video-filter ## ' filter2' ” |
将动态变量“$video-filter”转换为字符串,并将新字符串与字符串“Filter2”连接起来。结果是分配给 $video-filter2 变量的字符串“$video-filter Filter2”。 |
tempvar 等于“120” |
将“120”转换为整数,并将整数赋值给$tempvar变量。 |
transmit-rate2 等于 “ ( $transmit-rate1 * 2)/3 + $tempvar)” |
将“transmit-rate1”变量乘以 2,然后将该值除以 3 和“$tempvar”值的总和。结果被赋值给 $transmit-rate2 变量。 |
host-ip 等于 “ '203.0.113.2' ” |
将字符串“203.0.113.2”分配给 $host-ip 变量。 |
最大值 “最大值($max 1,$max 2)” |
将值“max1”或“max2”中的较大值分配给$max值变量。 |
最小值 “$min($var 1,30)” |
将值“var1”和“30”中较小的一个分配给$min-val变量。 |
rounded-var 等于 “round($var 1 )” |
将变量“$var 1”的值四舍五入到最接近的整数,并将该值赋值给$rounded变量。 |
trunc-var 等于 “trunc(1234.5)” |
将括号中的值截断到小数点左侧,并将结果值分配给$trunc变量。 |
bwg-shaping-rate 等于“$ancp-downstream - ($ancp-downstream % 2 * (1 - $sp-qos-cell-mode))” |
根据括号中设置的优先级计算表达式。 |
temp-filter1 等于 “ 'Filter1' ## toStr($filter)” |
将“$filter”变量转换为字符串值,并将转换后的字符串连接到字符串“Filter1”。生成的组合字符串被分配给 $temp-filter1 变量。 |
动态配置文件概述的条件配置
您可以为动态配置文件配置条件配置语句,以动态获取客户端或服务的用户信息。
条件配置涉及两个主要步骤:
定义条件变量
在配置语句中引用条件变量
条件变量定义为表达式 ifNotZero (param1, param2)。在此表达式中, param1 是用户定义的变量,其值派生自外部服务器(如 RADIUS param2 ),可以是用户定义的变量、函数、作、数字或字符串。条件变量可以是用户定义或唯一 ID (UID) reference 变量。它不能是预定义或 UID 变量。在 Junos OS 中,仅服务动态配置文件支持条件变量。
引用条件变量的配置语句称为 conditional 配置语句。定义条件变量后,将在配置语句中 dynamic-profiles 引用这些变量,并在实例化服务配置文件时进行处理。以下服务配置文件配置语句支持条件变量:
dynamic-profiles profile-name interfaces interface-name unit unit-no family type filter input filter-namedynamic-profiles profile-name interfaces interface-name unit unit-no family type filter output filter-namedynamic-profiles profile-name firewall family type filter filter-name term term-namedynamic-profiles profile-name firewall family type filter filter-name term term-name then policer policer-namedynamic-profiles profile-name firewall family type filter filter-name term term-name then hierarchical-policer policer-namedynamic-profiles profile-name class-of-service scheduler-maps map-name forwarding-class class-name scheduler scheduler-name
在服务配置文件实例化期间评估条件变量和条件配置语句时,系统遵循以下一组规则:
在函数
ifNotZero(param1, param2)中,如果未从外部服务器接收到a param1 的值,并且未配置默认值,则该变量的值将被视为非零并 param2 被计算。如果函数 (, ) 中的 值param1为 0,则 NULL 将作为表达式的值返回,param2并且不计算。 param2param1
ifNotZero在这种情况下,条件变量的值将变为 NULL,并且引用条件变量的配置语句将被忽略。如果的 param1 值为非零,则 param2 计算其值并将其值作为表达式的值返回。
以下 filter-service 配置 cos-service 示例显示了规则的应用方式:
过滤器服务配置示例
filter-service {
variables {
input-filter-var mandatory;
output-filter-var mandatory;
bw-limit-var mandatory;
term1-var default-value term1;
input-filter-ref {
equals "ifNotZero($input-filter-var,$input-filter-var)";
uid-reference;
}
output-filter-ref {
equals "ifNotZero($output-filter-var,$output-filter-var)";
uid-reference;
}
policer1-ref {
equals "ifNotZero($bw-limit-var,'policer1')";
uid-reference;
}
term1 equals "ifNotZero($term1-var,$term1-var)";
input-filter uid;
output-filter uid;
policer1 uid;
}
interfaces {
pp0 {
unit "$junos-interface-unit" {
family inet {
filter {
input "$input-filter-ref" precedence 50;
output "$output-filter-ref" precedence 50;
}
}
}
}
}
firewall {
family inet {
filter "$input-filter" {
interface-specific;
term $term1 {
then {
policer "$policer1-ref";
service-accounting;
}
}
term rest {
then accept;
}
}
filter "$output-filter" {
interface-specific;
term rest {
then accept;
}
}
}
policer "$policer1" {
if-exceeding {
bandwidth-limit "$bw-limit-var";
burst-size-limit 15k;
}
then discard;
}
}
}
在配置示例中filter-service ,input-filter-ref、output-filter-refpolicer1-ref、 和 term1 是条件变量,而 input "$input-filter-ref" precedence 50、 output "$output-filter-ref" precedence 50term $term1和 policer "$policer1-ref" 是条件配置语句。在此示例中,如果 的input-filter-var值为 0,则条件变量input-filter-ref的值将变为 NULL。因此,引用条件变量的整个配置语句input “$input-filter-ref” precedence 50将被忽略。但是,如果 ,则变量的值为非零,则在服务配置文件实例化期间处理配置语句。
CoS 服务配置示例
cos-service {
variables {
sch1_var mandatory;
sch2_var mandatory;
sch1_ref {
equals "ifNotZero($sch1_var,$sch1_var)";
uid-reference;
}
sch2_ref {
equals "ifNotZero($sch2_var,$sch2_var)";
uid-reference;
}
smap1 uid;
sch1 uid;
sch2 uid;
}
class-of-service {
scheduler-maps {
"$smap1" {
forwarding-class best-effort scheduler "$sch1_ref";
forwarding-class assured-forwarding scheduler "$sch2_ref";
}
}
schedulers {
"$sch1" {
transmit-rate percent 30;
buffer-size percent 30;
priority low;
}
"$sch2" {
transmit-rate percent 10;
buffer-size percent 10;
priority high;
}
}
}
}
在配置示例中 cos-service , sch1_ref 和 sch2_ref 是条件变量,而 forwarding-class best-effort scheduler "$sch1_ref" 和 forwarding-class assured-forwarding scheduler "$sch2_ref" 是条件配置语句。与配置示例中的 filter-service 评估类似,如果条件变量中引用的任何变量的值为 0,则在 CoS 服务配置文件实例化期间,将忽略引用条件变量的配置语句,并且不会进行处理。