SMTP

자바를 이용한 SNMP 데이터 가져오기 - 1 -

bang2001 2013. 7. 25. 17:42

우리가 쉽게 접할 수 있는 SNMP(Simple Network Management Protocol)를 이용한 모니터링 프로그램은 MRTG이다. MRTG에서 SNMP의 데이터를 가져오는 부분은 Perl로 작성되어 있으며 이 데이터를 GD 라이브러리를 사용하여 그래프로 표현해 주는 것이다.


모니터링을 위해 사용한다는 SNMP는 라우터 같은 네트워크 장비나 일반 서버들의 상태를 관리하기 위해 만들어진 프로토콜이다. 물론 장비에 국한하지 않고 대형 응용 프로그램의 관리에도 SNMP를 사용하고 있다. SNMP는 크게 4가지로 구성되어 있다.

◆ SMI(Structure of Management Information)
◆ MIB(Management Information Base)
◆ 프로토콜
◆ 보안과 운영(security and administration)

SMI, MIB 부분은 SNMP를 이용하여 데이터를 교환할 때 어떠한 데이터를 어떠한 형태로 누가 정의했는가에 대한 내용을 담고 있다. 프로토콜은 실제 데이터를 어떻게 요청하고 응답하는지에 대한 내용이며, 보안과 운영은 SNMP에 접근하는 사용자, 패킷에 대한 암호화 같은 부분이 된다. 여기서는 SNMP 에이전트에서 데이터를 가져오는 부분을 자바로 어떻게 구현하는가에 대한 것으로 프로토콜에 대한 부분이다.

자바 SNMP API 
가장 쉽게 구할 수 있는 자바 SNMP API는 대부분이 상용 제품이다. 몇 년 전까지만 해도 오픈 프로젝트는 찾아보기 힘들었지만 최근에는 OpenNMS(http://www.opennms.org), NetSNMPj(http://netsnmpj.sourceforge.org) 같은 프로젝트들이 활발히 진행 중에 있다. 

OpenNMS의 경우에는 이벤트 핸들링을 하기 좋은 방식으로 구성되어 있으며, Net-SNMPj의 경우 net-snmp의 C API를 JNI(Java Native Interface)를 이용하여 접근하는 형태로 작성됐기 때문에 C를 이용한 SNMP 클라이언트를 작성하던 프로그래머들에게 좀더 친숙한 API이다. 

SNMP API를 이용한 프로그램을 테스트하려면 우선 SNMP 에이전트가 설치된 서버가 있어야 한다. SNMP 에이전트는 http://net-snmp.sourceforge.net에서 구할 수 있다. 주의할 것은 netsnmpj API를 사용하려면 Net-SNMP는 5.05 이상을 설치해야 한다는 것이다. Net-SNMP를 설치하면 셸 프롬프트 상에서 SNMP 데이터를 가져오거나(GET) 설정(SET)할 수 있다. 

<표 1> SNMP 메시지 타입
 <표 1> SNMP 메시지 타입
 메시지 타입 설명
 GetRequest 단일 항목 요청
 GetNextRequest 현재 요청된 값의 다음 항목을 요청
 GetBulkRequest 여래 개의 OID를 이용하여 데이터를 가져오기 위한 메시지
 SetRequest 데이터를 SNMP 에이전트로 보내주기 위한 메시지 타입
 Response GET에 대한 응답으로  SNMP 에이전트에서 클라이언트로 전송할 때 사용되는 메시지
 Trap SNMP 에이전트 자신의 상태를 다른 장비나 관리자에게 보내주기 위해 사용되는 메시지


SNMP 데이터를 가져올 수 있는 셸 명령어는 snmpget과 snmpwalk가 있다. API 관점에서 본다면 snmpget은 <표1>에서 GetRequest를 사용하는 것이고, snmpwalk는 GetRequest를 이용하여 가져온 데이터를 GetNextRequest로 데이터가 존재하지 않을 때까지 루프를 계속하는 것이다. 각 셸 명령어 실행 결과는 다음과 같다.

$ snmpget -v2c -c public localhost sysDescr.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux ece.uos.ac.kr 2.4.20-xfs #13 SMP Tue Feb 
25 07:28:16 Local time zone must be set--see zic i686

Snmpget의 결과는 단일 항목에 대한 데이터를 가져오게 된다.

$ snmpwalk -v2c -c public localhost .1 
SNMPv2-MIB::sysDescr.0 = STRING: Linux ece.uos.ac.kr 2.4.20-xfs #13 SMP Tue Feb 
25 07:28:16 Local time zone must be set--see zic i686
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
SNMPv2-MIB::sysUpTime.0 = Timeticks: (101583525) 11 days, 18:10:35.25
SNMPv2-MIB::sysContact.0 = STRING: jsKim 
...중략...

반면에 snmpwalk의 결과는 .1로 시작하는 OID 이하의 서브 노드들의 데이터를 계속해서 보여주게 된다.
 
출처 : http://silent1002.blog.me/12426113