Modeling data with YANG
NSO를 사용하여 YANG 모델 테스트 구동
- NSO는 장치 모델에서 생성된 단일 네트워크 전체 CLI를 제공하고, NSO 시스템에서 각 장치를 중앙에서 구성하는데 사용
- NSO 준비 및 NSO 서버 프로세스 시작
cd ~/src ncs-setup --dest nso-run cd nso-run && ncs
- 서비스 패키지 만들기 및 불필요한 파일 제거
cd packages && ncs-make-package --service-skeleton template my-models rm -f my-models/templates/* my-models/src/yang/* cd my-models/src/yang
YANG 언어를 이용한 ACL 모델 생성
- ACL
- 어떤 종류의 트래픽을 허용할지, 어떤 종류의 트래픽을 차단할지 등을 정의함.
- 장치 포트포워딩 동작을 구성하는 기본 요소이며, 다양한 장비에서 사용
- YANG 모듈 정의
- 모든 데이터 모델링 정의는 YANG 모듈 내에 존재
- 단일 모듈은 BGP 또는 인터페이스 IP 구성과 같은 기능의 완전한 부분 기술
- 따라야 하는 최소 규칙
- 새로운 YANG 모듈과 같은 문장을 식별하는 키워드
- 이름 또는 값
- ;는 해당 지점에서 명령문을 완성하는 반면, 중괄호는 추가 하위 명령문을 추가할 수 있다.
- // 주석으로 c++ 스타일
- 파일 오류 확인
pyang --strict ip-access-list.yang
- YANG 모듈 예시
- organization : 모듈을 만든 엔티티를 식별합니다.
- contact : 모듈 담당자를 식별합니다.
- description : 모듈의 목적에 대한 개요 역할을 합니다.
- revision : 버전 관리에 사용되며, 변경 사항을 자세히 설명하는 하위 문을 포함합니다.
organization "Example, Inc."; contact "Example, Inc. Customer Service E-mail: cs-yang@example.org"; description "Access Control List (ACL) YANG model."; revision 2021-07-06 { description "Initial revision"; }
YANG 문장
- 노드 타입 선택
- 여러 관련 노드를 묶을 때는 container 노드 사용
- 단순한 데이터를 저장할 때는 leaf 노드 사용
- Container 노드 정의
- container 키워드 사용 및 정의
- 자체적으로 값을 가지지 않으며, 여러 종류의 자식노드(container, list, leaf 등)를 포함
- 각 노드에 description 삽입 가능변경사항 적용
container acl { description "Access Control Lists"; }
make -C ..
- leaf 노드 정의
- leaf 키워드를 사용
- 특정 데이터 타입의 단일 값을 가지며, 자식 노드를 가질 수 없다.
- tpye 문을 사용하여 데이터 타입 지정
- 컨테이너와 마찬가지로 description 삽입 가능
- pattern, length 등의 제한 구문 사용 가능
container acl { description "Access Control Lists"; leaf acl-description { type string { length "0..64"; pattern "[0-9a-zA-Z]*"; } description "Purpose of ACL"; } }
- 모델 변경 사항 발생 했을 때
- 사용자 진입 및 패키지 리로드
ncs_cli -u admin -C packages reload
- 설정 모드 진입 및 노드 확인
config ? 또는 <노드 이름> ?
- acl 생성 이후 설명 작성 및 반영
acl acl-description "Test1" commit
- 사용자 진입 및 패키지 리로드
YANG 데이터 타입
- 일반적인 데이터 타입
유형 이름 유형 설명 binary
텍스트 모든 이진 데이터 bits
텍스트/숫자 비트 또는 플래그 세트 boolean
텍스트 "참" 또는 "거짓" decimal64
숫자 64비트 고정 소수점 실수 empty
비어 있는 아무런 가치도 없는 잎 enumeration
텍스트/숫자 연관된 숫자 값이 있는 열거형 문자열 identityref
텍스트 추상적 정체성에 대한 참조 instance-identifier
텍스트 데이터 트리 노드를 참조합니다 int8
숫자 8비트 부호 있는 정수 int16
숫자 16비트 부호 있는 정수 int32
숫자 32비트 부호 있는 정수 int64
숫자 64비트 부호 있는 정수 leafref
텍스트/숫자 리프 인스턴스에 대한 참조 string
텍스트 사람이 읽을 수 있는 문자열 uint8
숫자 8비트 부호 없는 정수 uint16
숫자 16비트 부호 없는 정수 uint32
숫자 32비트 부호 없는 정수 uint64
숫자 64비트 부호 없는 정수 union
텍스트/숫자 회원 유형 선택 - enumeration
- 제한된 옵션 중에서 선택할 때 사용
- NSO CLI에서 입력 옵션을 제한하는데 사용
- enum 키워드를 사용하여 각 옵션 정의
- enum 데이터 타입 지정
- 시퀀스 번호 아래에 작업 지정
- permit : 지정된 트래픽이 라우터 통과 허용
- deny : 지정된 트래픽이 라우터 통과 거부
기본 모델 완성
- ip-acccess-list 모듈 완성을 위해선 소스 대상 ip 주소와 포트 번호 지정 기능을 추가
- 소스 및 대상 IPv4주소 : 트래픽 필터링을 위해 사용
- 대상 포트 번호 : SSH, HTTP 등 특정 대상 포트를 통해 트래픽을 허용하거나 거부하는데 사용
- Import statements
- 사용자 정의 데이터 유형 정의 생성
- 다른 모듈에서 기존 유형 가져오기
- ip-access-list.yang 파일의 module 정의 아래에 import 구문을 추가하여 ietf-inet-types 모듈을 임포트하고, inet 이라는 prefix 지정
module ip-access-list { namespace "http://example.com/ns/yang/ip-access-list"; prefix acl; import ietf-inet-types { prefix inet; } // ... }
- import 한 inet:ipv4-address 타입을 entry 리스트 아래의 source-ip 및 destination-ip 리프 노드에 사용
container acl { // ... list entry { // ... leaf action { // ... } leaf source-ip { type inet:ipv4-address; description "Source IPv4 address."; } leaf destination-ip { type inet:ipv4-address; description "Destination IPv4 address."; } } // ... }
- 대상(destination) 포트 추가
- 대상 포트 옵션을 entry 리스트 내의 마지막 leaf 아래에 추가. uint16 타입으로 포트 번호 정의
container acl { // ... list entry { // ... leaf destination-ip { // ... } leaf destination-port { type uint16; } } // ... }
- 대상 포트 옵션을 entry 리스트 내의 마지막 leaf 아래에 추가. uint16 타입으로 포트 번호 정의