개요

사례

일상에서 흔히 접하는 네트워크 프린터를 예로 들자. 당신은 네트워크 프린터를 제어하는 소프트웨어를 제작해 달라는 고객의 의뢰를 받았다. SNMP에 대해 모르는 개발자라면 윈도우 프린터 큐(Queue)를 이용해 개발하려고 시도할 것이 분명하다. 하지만, 이 방법은 로컬에 연결된 경우에 한정된 방법이다. 즉, USB나 프린터 포트(병렬)에 직접 연결된 경우만 올바른 프린터 상태를 얻을 수 있다. 네트워크로 연결된 프린터는 피드백을 받는 루틴이 없어 성공했는지, 실패했는지 확인이 어렵다. 좀더 상세하게는 프린트할 용지, 토너 잔여량 같은 상태를 얻지 못한다. 이런 경우에 사용가능한 솔루션이 SNMP이다.

SNMP의 역사

SNMP는 1987년도 SGMP에서 발전한 프로토콜이다. 이때부터 네트워크 관리의 필요성이 부각되기 시작했고 SGMP와 더불어 CMOT프로토콜 솔루션이 개발되고 있었다. CMOT는 TCP 기반으로만 동작하다보니 UDP 기반 SGMP에 비해 복잡한 형태를 가졌지만 기능과 성능면에서 우위를 점하고 있었다. 하지만, SGMP가 쉬운 구현과 이식(포팅)의 이점을 내세워 SNMP라는 이름으로 표준 프로토콜로 자리매김했다. CMOT도 완전히 없어진 게 아니라 SNMP를 보완하는 측면에서 계속해서 발전해왔다.SNMP 버전 1부터 보안을 고려한 워킹 그룹과 그렇지 않은 그룹으로 나누어 개발을 진행했고 버전3에서는 어느 정도 보안 기능을 광범위하게 적용할 수 있게 됐다.

기본 개념

MP는 네트워크 관리 시스템을 의미하는 데, 네트워크 모니터링과 제어를 위한 도구 집합체라고 말할 수 있다. SNMP에서 사용하는 네트워크 관리모델에는 매니지먼트 스테이션(Management Station), 매니지먼트 에이전트(Management Agent), 매니지먼트 인포메이션 베이스(Management Information Base, MIB)이 있다.

  • 매니지먼트 스테이션
관리자가 네트워크를 모니터링하고 제어하는 인터페이스를 제공한다. 
데이터분석이나 장애복구가 가능한 중앙관리 시스템으로, MIB라고 불리는 집합체의 정보를 담고 있는 데이터베이스를 포함한다.
  • 매니지먼트 에이전트
객체에 존재하는 에이전트는 매니지먼트 스테이션의 명령을 받아 처리한다.
  • 매니지먼트 인포메이션 베이스
네트워크에 연결된 리소스(프린터, 팩스, 서버 등)는 개별적인 객체(object)라고 표현을 하는데 이 객체에 대한 정보 집합을 MIB라고 한다. 
MIB에서 원하는 리소스의 특정 데이터를 질의(Query)할 수 있는데, 이를 에이전트가 담당한다.

위 그림은 SNMP 통신 계층 구조를 나타낸다. 관리자와 에이전트 사이에 데이터의 요구와 응답이 오고 가는 것을 알 수 있다.

프로토콜

SNMP에서 사용하는 기본적인 함수(프로토콜 명령어)는 다음과 같다.

  • GET

- 매니지먼트 스테이션이 에이전트로 원하는 객체의 특정 정보를 요청

  • GET NEXT

- GET과 동일하며, 다음번 정보를 얻고자 할 때 사용한다. SNMP의 각 정보들은 계층적인 구조를 갖음

  • SET

- 매니지먼트 스테이션이 에이전트로 특정한 값을 설정하기 위해 사용

  • TRAP

- 에이전트가 매니지먼트 스테이션에 어떤 정보를 비동기적(Asynchronous)으로 알리기 위해 사용한다. Notify라고 하며, 콜백(callback)함수와 같은 역할을 한다. TRAP을 제외한 나머지 함수들은 모두 동기적으로 동작한다.

이러한 함수는 다음 그림과 같은 패킷 구조를 갖는다.

PDU은 각 함수마다 다른 형태를 갖는다. 즉 함수마다 인자의 개수와 형식이 다르므로 함수 별로 PDU의 구조가 다른 것이다.

테스트

패키지 설치를 이용한 SNMP 테스트

환경

server와 host 두 개의 pc 또는 가상 머신에 우분투가 설치된 것으로 가정한다.

설치

Server

$ sudo apt-get install snmp snmp-mibs-downloader

Host

$ sudo apt-get install snmpd

설정

snmp 접근을 허용하기 위해 포트 관련 설정을 한다.

host$ sudo vi /etc/snmp/snmpd.conf
agentAddress udp:127.0.0.1:161
다음으로 수정
agentAddress udp:161,udp6:[::1]:161

데몬 시작

host$ sudo /etc/init.d/snmpd restart

실행

server$ snmpwalk -v1 hostIPAddress -c public

hostIPAddress 는 host 서버의 ip 주소를 입력해 주면 된다. ex) 192.168.0.12

참고