動的プロファイルのユーザー定義変数
ユーザー定義変数
動的サービスプロファイルでは、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] 階層レベルで設定します。実行時に、変数式が計算され、動的加入者インターフェイスを設定するための変数値として使用されます。
動的プロファイルで式を設定する場合、以下のルールに従う必要があります。
-
式は、動的プロファイルの可変スタンザ内でのみ設定できます。
-
ユーザー定義変数の式を含む動的プロファイルは、サービスアクティベーションにのみ使用する必要があります。
-
通常、式はユーザー定義の変数にのみ割り当てます。内部変数や定義済み変数に式を割り当てることはできません。
-
式値はデフォルト値よりも優先されます。
-
式全体を引用符(" ")で囲む必要があります。
-
式内の文字列は単一引用符(' ')で囲む必要があります。単一引用符には文字列のみを含めることができます。
-
空白は、すべてのオペランドと演算子の区切り文字として扱われます。式内に作成したスペースを含む文字列は 1 つの文字列として扱われ、先頭または末尾の空白が含まれます。例えば、サービスプロファイルを作成する場合:
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"; } } } } … } -
「default」値または「equals」式を含まない必須変数には、サービスアクティベーションの一部として値を含める必要があります。例えば、動的サービスプロファイル定義「service-video」に2つ以下の必須変数を含む「service-video( value1, value2)」のようなRADIUSサービスVSAは成功します。少なくとも 1 つの必須変数に "default" または "equals" 属性評価による値が関連付けられていない場合、サービスのアクティブ化は失敗します。
表 1 に、式の作成に使用できるサポートされている演算子と関数を示します。優先順位 5 が最高レベルです。
| 操作 |
オペレーター |
関連付け |
優先順位 |
アクション |
|---|---|---|---|---|
| 算術加算 |
+ |
左 |
1 |
運用担当者の左右の要素を合わせて追加します。 |
| 算術減算 |
- |
左 |
1 |
運用担当者の左側の要素から、運用担当者の右側の要素を減算します。 |
| 算術乗算 |
* |
左 |
2 |
運用担当者の左側の要素に、運用担当者の右側の要素を乗算します。 |
| 算術部門 |
/ |
左 |
2 |
運用担当者の左側の要素を、運用担当者の右側の要素で分割します。 |
| 算術モジュロ |
% |
左 |
2 |
運用担当者の左側の要素を運用担当者の右側の要素で除算し、整数の余りを返します。運用担当者の左側の要素が運用担当者の右側の要素よりも小さい場合、結果は運用担当者の左側の要素になります。 |
| 連結 |
## |
左 |
3 |
運用担当者の左側にある文字列値と、オペレーターの右側にある値を結合して、新しい運用担当者を作成します。 |
| 最大値 |
max(param1,param2) |
左 |
4 |
パラメーターとして渡された2つの値のうち最大値を取ります。 |
| 最小 |
min(param1,param2) |
左 |
4 |
パラメーターとして渡された 2 つの値のうちの最小値を取ります。 |
| ラウンド |
ラウンド(param1) |
- |
4 |
値を最も近い整数に丸めます。 |
| 切り捨てる |
trunc(param1) |
- |
4 |
整数以外の値を小数点の左の値に切り捨てます。 |
| 文字列に変換 |
toStr(param1) |
- |
4 |
括弧内の変数を null で終わる文字列に変換します。 |
| 整数に変換 |
toInt(param1) |
- |
4 |
パラメーターを整数に変換します。単一の文字列または変数をパラメーターとして使用できます。 |
| ランダム |
ランド() |
- |
4 |
ランダムな数値を生成します。 |
| ゼロでなければ |
ifNotZero(param1, param2) |
左 |
4 |
最初のパラメーターがゼロでない場合は、2番目のパラメーターを返します。最初のパラメータがゼロの場合はNULLを返します。 |
| 括弧 |
( ) |
- |
5 |
オペランドと演算子をグループ化して、単純な優先順位とは異なる結果を実現します。が効果的に最も高い優先順位を持ちます。 |
式は、変数に値が入力された後に評価されます。評価はプロファイルのインスタンス化の直前に実施され、値のチェックが含まれます。計算された値が許容できない場合、または式構文を管理するルールが壊れている場合、式の評価は失敗し、プロファイルのインスタンス化は行われず、エラーを説明するメッセージがログに記録されます。
表2は 、考えられる式エラーシナリオと、ルーターソフトウェアが実行したアクションを示しています。
| エラー |
発生 |
アクション |
変数値 |
|---|---|---|---|
| 解析エラー |
コミットチェックフェーズ |
コミットに失敗 |
適用外 |
| 循環変数依存関係エラー |
コミットチェックフェーズ |
コミットに失敗 |
適用外 |
| 式内の変数は定義されていません |
コミットチェックフェーズ |
コミットに失敗 |
適用外 |
| ゼロで割る |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
ゼロ(0) |
| 数値に文字列を追加する |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
ゼロ(0) |
| オーバーフローエラー |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
未定義 |
| アンダーフローエラー |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗する |
未定義 |
ユーザー定義変数にデフォルト値を設定することもできます。デフォルト値は、関連するステートメントのスタンドアロン設定、またはRADIUSサーバーにアクセスできない場合やVSA属性に値が含まれていない場合のステートメント設定のバックアップを提供します。
ユーザー定義変数の変数式の変更履歴
サポートされる機能は、使用しているプラットフォームとリリースによって決まります。 機能エクスプローラー を使用して、機能がお使いのプラットフォームでサポートされているかどうかを確認します。
| リリース | の説明 |
|---|---|
| 19.3 | Junos OSリリース19.3R1以降、動的プロファイルの また、限られた数の式を設定して、定義済みの変数のデフォルト値を確立することもできます。 動的クライアントプロファイルの定義済み変数デフォルトを参照してください。 |
| 25.2 Junos OSの進化 | Junos OS Evolvedリリース25.2R1以降、BNG-CUPSユーザープレーンモードで動的プロファイルのインターフェイスセットおよびファミリー(inet、inet6)入力または出力フィルター優先順位を設定できます。 |
関連項目
動的プロファイルでの変数式の設定
動的プロファイル内の変数として使用する式(算術演算子、文字列演算子、オペランドのグループ)を作成できます。これらの式は、動的加入者インターフェイスを設定するための変数値として使用されます。
動的プロファイル変数式を設定するには:
表 4 は、サポートされている演算子と関数を使用して作成できる式の例をいくつか示します。
例文 |
説明 |
|---|---|
video-filter は "' Filter1' " に等しくなります |
動的$videoフィルター変数に文字列" Filter1"を割り当てます。 |
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-val "max($max 1,$max 2)" |
値「max1」または「max2」のいずれか大きい方を$max-val変数に割り当てます。 |
min-val "$min($var 1,30)" |
$min-val変数には、値「var1」と「30」のいずれか小さい方を割り当てます。 |
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変数に割り当てられます。 |
動的プロファイルの条件付き設定の概要
動的プロファイルの条件付き設定ステートメントを設定して、クライアントまたはサービスの加入者情報を動的に取得できます。
条件付き設定には、主に 2 つのステップが含まれます。
条件変数の定義
設定ステートメントでの条件変数の参照
条件変数は、式 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)では、外部サーバーから param1 の値が受信されておらず、デフォルト値が設定されていない場合、変数の値はゼロ以外のものとして扱われ、 param2 が評価されます。関数
ifNotZero(param1, param2) の param1 の値が 0 の場合、式の値として NULL が返され、param2は評価されません。この場合、条件変数の値は 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-ref、policer1-ref、term1は条件変数で、input "$input-filter-ref" precedence 50、output "$output-filter-ref" precedence 50、term $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インスタンス化時に処理されません。