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 타입으로 포트 번호 정의