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 구성과 같은 기능의 완전한 부분 기술
    • 따라야 하는 최소 규칙
      1. 새로운 YANG 모듈과 같은 문장을 식별하는 키워드
      2. 이름 또는 값
      3. ;는 해당 지점에서 명령문을 완성하는 반면, 중괄호는 추가 하위 명령문을 추가할 수 있다.
      4. // 주석으로 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;
          }
        }
        // ...
      }