動的プロファイルのユーザー定義変数
ユーザー定義変数
動的サービスプロファイルでは、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]
。実行時には、変数式が計算され、変数値として使用され、動的加入者インターフェイスを設定します。
動的プロファイルで式を設定する場合は、以下のルールに従う必要があります。
動的プロファイルの可変スタンザ内でのみ式を設定できます。
メモ:Junos OS リリース 19.3R1 以降、動的プロファイルの ステートメントで
predefined-variable-defaults
式を設定できるようになりました。 動的クライアントプロファイルの事前定義変数デフォルトを参照してください。ユーザー定義変数の式を含む動的プロファイルは、サービスのアクティブ化にのみ使用する必要があります。
一般に、式はユーザー定義変数にのみ割り当てます。内部変数または事前定義変数に式を割り当てることはできません。
メモ:Junos OS リリース 19.3R1 以降、定義済み変数のデフォルト値を設定するように、制限された数の式を設定できるようになりました。 動的クライアントプロファイルの事前定義変数デフォルトを参照してください。
式の値は、デフォルト値よりも優先されます。
式全体を引用符(" ")に含める必要があります。
式内の文字列は単一引用符(' ')内で引用符で囲む必要があり、単一引用符には文字列のみを含めることができます。
空白は、すべてのオペランドと演算子の区切り文字として扱われます。式内で作成したスペースを含む文字列は、単一の文字列として扱われ、先頭または末尾の空白が含まれます。例えば:
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 } } }
「default」値や「equals」式を含まない必須変数には、サービスアクティベーションの一環として値を含める必要があります。たとえば、動的サービス プロファイル定義「service-video」に必須変数を 2 つ以下含む「service-video(value1、value2)」などの RADIUS サービス VSA は成功します。少なくとも1つの必須変数が「デフォルト」または「等しい」属性評価を通じて、少なくとも1つの必須変数に関連付けられていない場合、サービスアクティベーションは失敗します。
表 1 は、式の作成に使用できる、サポートされている演算子と関数の一覧です。
優先度 5 は最高レベルです。
操作 |
演算子 |
結合 |
優先 順位 |
アクション |
---|---|---|---|---|
算術加算 |
+ |
左 |
1 |
演算子の左右に要素を一緒に追加します。 |
算術減算 |
- |
左 |
1 |
要素から演算子の左側に、演算子の右にある要素を減算します。 |
算術乗算 |
* |
左 |
2 |
演算子の左側にある要素を演算子の右にある要素で乗算します。 |
算術分割 |
/ |
左 |
2 |
要素を演算子の左側に、要素を演算子の右に分割します。 |
算術係数 |
% |
左 |
2 |
演算子の左側にある要素を演算子の右にある要素で分割し、整数の剰余を返します。演算子の左側の要素が演算子の右にある要素よりも小さい場合、結果は演算子の左側の要素になります。 |
連結 |
## |
左 |
3 |
演算子の左側に文字列値を結合し、演算子の右側の値を結合して、新しい文字列を作成します。 |
最大 |
max(param1,param2) |
左 |
4 |
パラメーターとして渡される 2 つの値の最大値を取得します。 |
最小 |
分(param1,param2) |
左 |
4 |
パラメーターとして渡される 2 つの値の最小値を取得します。 |
ラウンド |
ラウンド(param1) |
- |
4 |
最も近い整数に値を丸めます。 |
切り捨て |
trunc(param1) |
- |
4 |
非整数の値を小数点の左側の値に切り捨てます。 |
文字列への変換 |
toStr(param1) |
- |
4 |
括弧内の変数を null 終了文字列に変換します。 |
整数への変換 |
toInt(param1) |
- |
4 |
パラメータを整数に変換します。1 つの文字列または変数をパラメーターとして使用できます。 |
ランダム |
Rand() |
- |
4 |
ランダムな数値を生成します。 |
ゼロでない場合 |
ifNotZero(param1、param2) |
左 |
4 |
最初のパラメーターがゼロでない場合は、2 番目のパラメーターを返します。最初のパラメーターがゼロの場合は NULL を返します。 |
かっこ |
( ) |
- |
5 |
オペランドと演算子をグループ化して、単純な優先順位とは異なる結果を達成します。効果的に最も高い優先度を持っています。 |
変数に値が入力された後、式が評価されます。この評価は、プロファイルのインスタンス化の直前に実施され、値チェックが含まれます。計算された値が受け入れられない場合、または式構文を制御するルールが壊れている場合、式の評価は失敗し、プロファイルのインスタンス化は行われず、エラーを説明するメッセージが記録されます。
表 2 は、考えられる式のエラー シナリオと、ルーター ソフトウェアが実行したアクションを示しています。
エラー |
発生 |
アクション |
変数値 |
---|---|---|---|
解析エラー |
コミット チェック フェーズ |
コミットが失敗する |
適用されません |
循環変数依存関係エラー |
コミット チェック フェーズ |
コミットが失敗する |
適用されません |
式内の変数は定義されていません |
コミット チェック フェーズ |
コミットが失敗する |
適用されません |
ゼロで除算 |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗 |
ゼロ(0) |
数値への文字列の追加 |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗 |
ゼロ(0) |
オーバーフロー エラー |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗 |
未定義 |
アンダーフローエラー |
プロファイルのインスタンス化 |
プロファイルのインスタンス化に失敗 |
未定義 |
ユーザー定義変数をデフォルト値で設定することもできます。RADIUSサーバーにアクセスできない場合、またはVSA属性に値が含まれていない場合、デフォルト値は、関連するステートメントのスタンドアロン設定、またはステートメント設定のバックアップを提供します。
動的プロファイルでの変数式の設定
動的プロファイル内で変数として使用する式(算術演算子、文字列演算子、オペランドのグループ)を作成できます。これらの式は、動的加入者インターフェイスを設定する変数値として使用されます。
動的プロファイル変数式を設定するには:
表 3 は、サポートされている演算子と関数を使用して作成できる式の例をいくつか示しています。
例 |
説明 |
---|---|
video-filter は"' Filter1' に等しい |
動的$videoフィルター変数に文字列「 Filter1」を割り当てます。 |
video-filter2 は"$video-filter ## ' Filter2' に等しい |
動的変数「$videoフィルター」を文字列に変換し、新しい文字列を文字列「Filter2」と連結します。結果は、$video-filter2 変数に割り当てられた文字列 "$video-filter Filter2" です。 |
tempvar は "120" に等しい |
"120" を整数に変換し、整数を $tempvar 変数に割り当てます。 |
送信レート2は、 " ( $transmit-rate1 * 2)/3 + $tempvar)に等しい |
「送信レート1」変数を2ずつ掛け、その値を3の合計と「$tempvar」の値で除算します。結果は、$transmit-rate2変数に割り当てられます。 |
host-ip equals " "203.0.113.2" |
文字列 "203.0.113.2" を $host-ip 変数に割り当てます。 |
max-val "max($max 1,$max 2) |
$max-val変数に値"max1"または"max2"の大きい値を割り当てます。 |
min-val "$min($var 1,30) |
値の小さい「var1」と「30」を$min-val変数に割り当てます。 |
round-var は "round($var 1) に等しい |
変数 "$var 1" の値を最も近い整数に丸め、値を $rounded-var 変数に割り当てます。 |
trunc-var は"trunc(1234.5)"に相当します。 |
10 進数の左側には括弧で囲んだ値を切り捨て、結果の値を $trunc-var 変数に割り当てます。 |
bwg-シェーピングレートは、「$ancpダウンストリーム - ($ancpダウンストリーム % 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-name
dynamic-profiles profile-name interfaces interface-name unit unit-no family type filter output filter-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name then policer policer-name
dynamic-profiles profile-name firewall family type filter filter-name term term-name then hierarchical-policer policer-name
dynamic-profiles profile-name class-of-service scheduler-maps map-name forwarding-class class-name scheduler scheduler-name
システムは、サービスプロファイルのインスタンス化中に条件付き変数と条件付き設定ステートメントを評価しながら、以下のルールのセットに従います。
関数
ifNotZero
(param1、 param2では、外部サーバーからa param1 の値を受信できない場合、デフォルト値が設定されていない場合、変数の値はゼロ以外として扱われ、 param2 評価されます。関数内の param1 値 (param1、 param2) が 0 の場合、式の値として NULL が返され、param2評価
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-ref
、 policer1-ref
、 および term1
は条件付き変数で、 output "$output-filter-ref" precedence 50
input "$input-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 assured-forwarding scheduler "$sch2_ref"
forwarding-class best-effort scheduler "$sch1_ref"
は条件付き設定ステートメントです。設定例の評価と同様に、条件付き変数でfilter-service参照される変数の値が0の場合、条件付き変数が参照される設定ステートメントは無視され、CoSサービスプロファイルのインスタンス化時には処理されません。