동적 프로파일의 사용자 정의 변수
사용자 정의 변수
동적 서비스 프로필에서 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 |
연산자의 왼쪽에 있는 문자열 값과 연산자의 오른쪽에 있는 값을 함께 결합하여 새 문자열을 만듭니다. |
| 최대 |
최대(param1,param2) |
왼쪽 |
4 |
매개 변수로 전달된 두 값 중 최대값을 사용합니다. |
| 최소 |
min(param1,param2) |
왼쪽 |
4 |
매개 변수로 전달된 두 값 중 최소값을 사용합니다. |
| 둥근 |
라운드(param1) |
- |
4 |
값을 가장 가까운 정수로 반올림합니다. |
| 자르기 |
trunc(param1) |
- |
4 |
정수가 아닌 값을 소수점 왼쪽 값으로 자릅니다. |
| 문자열로 변환 |
toStr(param1) |
- |
4 |
괄호 안의 변수를 null로 끝나는 문자열로 변환합니다. |
| 정수로 변환 |
toInt(param1) |
- |
4 |
매개 변수를 정수로 변환합니다. 단일 문자열 또는 변수가 매개 변수로 허용됩니다. |
| 랜덤 |
랜드() |
- |
4 |
임의의 숫자 값을 생성합니다. |
| 0이 아닌 경우 |
ifNotZero(param1, param2) |
왼쪽 |
4 |
첫 번째 매개 변수가 0이 아닌 경우 두 번째 매개 변수를 반환합니다. 첫 번째 매개 변수가 0이면 NULL을 반환합니다. |
| 괄호 |
( ) |
- |
5 |
피연산자와 연산자를 그룹화하여 단순한 우선순위와는 다른 결과를 얻습니다. 사실상 가장 높은 우선 순위를 갖습니다. |
표현식은 변수에 값이 채워진 후에 평가됩니다. 평가는 프로파일 인스턴스화하기 직전에 수행되며 값 확인이 포함됩니다. 계산된 값이 허용되지 않거나 식 구문을 관리하는 규칙이 위반된 경우, 식 평가가 실패하고 프로필 인스턴스화가 발생하지 않으며 오류를 설명하는 메시지가 기록됩니다.
표 2 에는 가능한 표현식 오류 시나리오와 라우터 소프트웨어가 취한 조치가 나와 있습니다.
| 오류 |
발생 |
작업 |
변수 값 |
|---|---|---|---|
| 구문 분석 오류 |
커밋 검사 단계 |
커밋 실패 |
해당 사항 없음 |
| 순환 변수 종속성 오류 |
커밋 검사 단계 |
커밋 실패 |
해당 사항 없음 |
| 표현식 내부의 변수가 정의되지 않았습니다. |
커밋 검사 단계 |
커밋 실패 |
해당 사항 없음 |
| 0으로 나눕기 |
프로파일 인스턴스화 |
프로파일 인스턴스화가 실패합니다. |
제로(0) |
| 숫자에 문자열 추가 |
프로파일 인스턴스화 |
프로파일 인스턴스화가 실패합니다. |
제로(0) |
| 오버플로 오류 |
프로파일 인스턴스화 |
프로파일 인스턴스화가 실패합니다. |
정의되지 않음 |
| 언더플로우 오류 |
프로파일 인스턴스화 |
프로파일 인스턴스화가 실패합니다. |
정의되지 않음 |
또한 사용자 정의 변수를 기본값으로 구성할 수도 있습니다. 기본값은 연결된 문에 대한 독립 실행형 구성을 제공하거나 RADIUS 서버에 액세스할 수 없거나 VSA 속성에 값을 포함하지 않는 경우 문 구성에 대한 백업을 제공합니다.
사용자 정의 변수의 변수 표현식에 대한 변경 내역
기능 지원은 사용 중인 플랫폼과 릴리스에 따라 결정됩니다. 기능 탐색기를 사용하여 플랫폼에서 기능이 지원되는지 확인합니다.
| 릴리스 | 설명 |
|---|---|
| 19.3 | Junos OS 릴리스 19.3R1부터는 동적 프로필에서 문에 또한 제한된 수의 표현식을 구성하여 사전 정의된 변수에 대한 기본값을 설정할 수도 있습니다. 동적 클라이언트 프로필에 대한 사전 정의된 변수 기본값을 참조하십시오. |
| 25.2 Junos OS 진화 | Junos OS Evolved 릴리스 25.2R1부터는 BNG-CUPS 사용자 플레인 모드에서 동적 프로파일에 대한 인터페이스 집합 및 패밀리(inet, inet6) 입력 또는 출력 필터 우선 순위를 구성할 수 있습니다. |
또한보십시오
동적 프로필에서 변수 표현식 구성
동적 프로파일 내에서 변수로 사용할 표현식(산술 연산자, 문자열 연산자, 피연산자 그룹)을 생성할 수 있습니다. 이러한 표현식은 동적 가입자 인터페이스를 구성하기 위한 변수 값으로 사용됩니다.
동적 프로필 변수 표현식을 구성하려면:
표 4 에는 지원되는 연산자와 함수를 사용하여 생성할 수 있는 표현식의 몇 가지 예가 나와 있습니다.
예문 |
설명 |
|---|---|
비디오 필터는 "' 필터1' "와 같습니다. |
동적 $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'와 같습니다. |
$host-ip 변수에 문자열 "203.0.113.2"를 할당합니다. |
max-val "최대($max 1,$max 2)" |
$max-val 변수에 "max1" 또는 "max2" 중 더 큰 값을 할당합니다. |
min-val "$min($var 1,30)" |
$min-val 변수에 "var1"과 "30" 중 더 작은 값을 할당합니다. |
rounded-var는 "round($var 1 )"와 같습니다. |
변수 "$var 1"의 값을 가장 가까운 정수로 반올림하고 이 값을 $rounded-var 변수에 할당합니다. |
trunc-var는 "trunc(1234.5)"와 같습니다. |
괄호 안의 값을 소수점 왼쪽으로 자르고 결과 값을 $trunc-var 변수에 할당합니다. |
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 의 값이 외부 서버로부터 수신되지 않고 기본값이 구성되지 않은 경우 변수의 값은 0이 아닌 것으로 처리되고 param2 평가됩니다.함수(, )의 값이 param1 0이면 NULL이 식의 값으로 반환되고 param2 평가되지 않습니다. param2param1
ifNotZero이 경우 조건부 변수의 값은 NULL이 되고 조건부 변수가 참조되는 구성 문은 무시됩니다.의 param1 값이 0 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 , 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-ref 이 예제에서 값이 input-filter-var 0이면 조건부 변수 input-filter-ref 의 값은 NULL이 됩니다. 따라서 조건부 변수가 참조되는 전체 구성 문input “$input-filter-ref” precedence 50은 무시됩니다. 그러나 변수 값이 0이 아닌 경우, 서비스 프로필 인스턴스화 중에 구성 명령문이 처리됩니다.
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 and sch1_ref sch2_ref 는 조건부 변수 forwarding-class best-effort scheduler "$sch1_ref" 이고 and forwarding-class assured-forwarding scheduler "$sch2_ref" 는 조건부 구성 문입니다. 구성 예제의 filter-service 평가와 유사하게, 조건부 변수에서 참조되는 변수의 값이 0인 경우, 조건부 변수가 참조되는 구성 문은 무시되고 CoS 서비스 프로필 인스턴스화 중에 처리되지 않습니다.