수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1689109
  • Today | 111
  • Yesterday | 787

1 Articles, Search for 'net-snmp'

  1. 2007/05/11 SNMP응용 프로그램 제작
Programming/Network Programming2007/05/11 10:33

SNMP응용 프로그램 제작

SNMP를 이용하면 네트워크와 시스템 관리를 위한 유용한 정보를 쉽게 얻어올 수 있다. 이번 기사는 SNMP를 이용해서 네트워크 정보를 얻어오는 방법을 예제를 통해서 제시하고있다.


1절. 소개
2절. SNMP 애플리케이션 작성
2.1절. 준비사항
2.2절. 예제프로그램을 통한 이해
2.3절. 다른 예제 : 비동기 데이타 요청
3절. 결론

--------------------------------------------------------------------------------

1절. 소개
지난번 기사에서 간단하게 SNMP의 개요와 설치및 운용방법에 대해서 알아보았다. 이번에는 실제 SNMP응용프로그램, 더 정확히 말해서 SNMP Manager를 작성하는 내용을 다루게 된다.

이 강좌의 내용은 Tutorial형식을 따르게 될것이다. 어디까지나 SNMP를 응용해서 애플리케이션을 작성하는것에 촛점을 맞출것이며, SNMP프로토콜 차원의 상세한 내용에 대해서는 다루지 않을것이다. 어쨋든 이 문서를 통해서 SNMP애플리케이션 제작의 기본적인 아이디어를 얻을수 있을것이다.


--------------------------------------------------------------------------------

2절. SNMP 애플리케이션 작성
2.1절. 준비사항
먼저 접근할수 있는 SNMP agent가 준비되어 있어야 한다. 자신의 호스트에 설치되어 있다면 테스트하기 편하겠지만 , 자신의 호스트에 설치되어 있지 않다고 하더라도 접근할수 있는 snmp agent가 설치된 호스트가 있으면 관계없다.

이책의 모든 내용은 기본적으로 ucd snmp 4.x를 기준으로 작성되어있다. ucd snmp의 설치와 운영방법에 대해서는 SNMP개요및 설치,운용기사를 참고하기 바란다.

여러분이 ucd snmp를 성공적으로 설치했다면, snmp개발 라이브러리와 헤더파일들이 설치될 것이다. snmp애플리케이션을 만들기 위해서는 이들 라이브러리와 헤더파일의 위치를 알고 있어야 한다. ucd snmp를 컴파일할때, --prefix 옵션을 사용하지 않았다면, 기본설치디렉토리인 /usr/loca/lib, /usr/local/include/ucd-snmp에 설치될것이다. 각자 확인해보기 바란다.


--------------------------------------------------------------------------------

2.2절. 예제프로그램을 통한 이해
앞서 이 문서는 tutorial형식을 따른다고 했음으로, 우선 간단한 예제프로그램을 만들어보고, 예제프로그램을 설명하는 식으로 snmp플밍에 대해서 알아보도록 하겠다.

우리가 만들고자 하는 애플리케이션은 인자로 OID를 주면 agent로 연결해서 OID에 대한 값을 가져오는 프로그램으로 가장단순하지만 snmp플밍의 기본적인 골격을 가지고 있음으로 이 예제를 잘 이해하게 되면 다른 응용도 가능할것이다.

예제 : simple_snmp.cc

                       

코드자체를 이해하는 데에는 별어려움이 없을것이다. 위의 snmp응용 애플리케이션을 제작하는 전형적인 모습을 보여준다.


즉 가정 먼저 snmp agent(이하 에이전트)와 연결을 맺기 위한 세션초기화 작업 으로 여기에는 호스트이름과, 커뮤니티이름, 그리고 SNMP버젼정보가 들어가게 된다. SNMP버젼은 다음과 같이 준비되어 있다.

표 1. SNMP 버젼 정의 상수

SNMP_VERSION_1 snmp 버젼 1
SNMP_VERSION_2c snmp 버젼 2
SNMP_VERSION_2u 정의만되어 있고 사용되어지지는 않는다.
SNMP_VERSION_3 snmp 버젼 3

세션을 맺고자 하는 에이전트의 snmp 버젼지원여부와 어느 버젼에서 지원하는 snmp정보를 가지고 올것인지를 확인해서 적당한 버젼으로 선택하면 된다. 보통 SNMP_VERSION_1 혹은 SNMP_VERSION_2c를 사용하면 문제없으며, SNMP_VERSION_2c를 사용하는게 가장무난하다. snmp3에서 포함하는 다른기능들(보안문제, 혹은 확장된 다른정보들)을 이용하지 않는다면 SNMP_VERSION_2c를 사용하도록 하자.

snmp_sess_init()함수를 사용한다.

위에서 만든 세션정보를 사용해서 세션을 연다(open).

snmp_open()함수를 사용한다.

여러분이 에이전트로 부터 정보를 요청하기 위해서는 PDU를 작성해야한다. PDU에는 요청하고자 하는 정보의 OID, 요청종류(GET, GET NEXT, SET등)를 명시해야만 한다.

사용되는 함수는 snmp_pdu_create()와 read_objid()가 있다.

PDU를 작성했다면, 이제 에이전트측에 SNMP요청(패킷)을 보내야 할것이다. 요청을 위해서 snmp_synch_response()함수가 제공된다. 이것은 동기적인 요청을 위해서 사용한다. 비동기적으로 요청할수도 있는데, 이것은 따로 언급하도록 하겠다.

응답이 왔다면 응답데이타를 분석해야 할것이다. 응답데이타는 snmp_pdu 구조체형태로 넘어오게 된다. 응답데이타를 분석할때 중요한 것은 바로 데이타의 타입정보이다. snmp정보를 보면 어떤것은 일반 문자열인 반면 어떤것은 숫자, 혹은 시간등의 정보를 가진다. 이의 구분을 위해서 snmp_pdu구조체에는 해당 데이타의 타입정보를 가지는 변수가 지정되어 있다. 주로 사용되어지는 데이타타입에는 다음과 같은것들이 있다.

표 2. SNMP 데이타 타입

ASN_OCTET_STR 일반 문자열
ASN_GAUGE unsigned 32bit int
ASN_INTEGER signed 32bit int
ASN_IPADDRESS 32bit 인터넷주소
ASN_COUNTER unsigned 32bit int
ASN_TIMETICKS unsigned 32bit int
ASN_OID OID 문자열


위의 SNMP데이타 타입표에서 ASN_TIMETICKS의 경우 1/100초 단위이다. 예를 들어 시스템의 Up타임을 가져오기 위해서 simp_snmp를 실행시켰는데, 다음과 같은 결과가 나왔을 경우  
[root@localhost test]# ./snmp3 system.sysUpTime.0
value #1 is a INTEGER: 32172
                       

321.72초가 된다.

이제 위의 예제프로그램을 컴파일하고 본격적인 테스트 해보도록 하자. 컴파일은 다음과 같이 하면된다. [root@localhost test]# gcc -o simple_snmp simple_snmp.c -I/usr/local/include/ucd-snmp -lsnmp -lcrypto
                       

다음은 테스트 결과이다. 중간중간에 결과에 대한 설명을 달아놓았으니 참고하기 바란다. # 인터페이스 주소가져오기
[root@localhost test]# ./simple_snmp ip.ipAddrTable.ipAddrEntry.ipAdEntAddr.192.168.100.130
value #1 is a IPADDR: 192.168.100.130

# 2번 인터페이스(eth0)에 대한 MTU사이즈 가져오기
# .2 대신에 .1을 사용할경우 1번 인터페이스(loopback)에 대한 MTU사이즈를
# 얻어올수 있다.
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifMtu.2
value #1 is a INTEGER: 1500

# 2번 인터페이스를 통해 바깥으로 전송된 패킷의 갯수
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifOutOctets.2
value #1 is a INTEGER: 1192344

# 시스템부팅후 경과시간  
[root@localhost test]# ./simple_snmp system.sysUpTime.0                      
value #1 is a INTEGER: 166258

# 2번 인터페이스의 속도
# 10Mbps 랜임을 알수 있다.
[root@localhost test]# ./simple_snmp interfaces.ifTable.ifEntry.ifSpeed.2
value #1 is a INTEGER: 10000000
                       

테스트를 위해서 어떤 MIB(OID)가 필요한지 잘 모르겠다면, ucd-snmp에서 제공하는 메니저 프로그램중 snmpwalk를 이용해서 정보를 요청해서 이걸 파일등으로 저장한후 참고하면 된다.  
[root@localhost test]# snmpwalk localhost public > snmp_info.dump  
                       

snmpwalk 는 GET NEXT를 이용하며 위의 경우 MIB이름을 지정하지 않았음으로 root노드를 지정했다고 간주하고 모든 MIB데이타를 긁어온다. 만약 system하위에 있는 데이타들을 요청한다면 public 다음에 system을 지정해 주면 될것이다.

만약 외부로 나가는 패킷의 양(트래픽)을 검사하길 원한다면 일정시간간격으로 "interfaces.ifTable.ifEntry.ifOutOctets.2" 정보를 요청해서 통계를 내면 된다. 이런식으로 해서 최소한의 네트워크 관리를 위한 정보수집이 가능해 진다.


--------------------------------------------------------------------------------

2.3절. 다른 예제 : 비동기 데이타 요청
우리는 2.2절에서 snmp응용 애플리케이션을 만들기 위한 기본적인 내용들에 대해서 알아보았다. 위에서 만들어진 예제프로그램은 동기형식을 가진다. 즉 요청을 보내고 응답이 있을때까지 해당영역에서 블럭킹되는데, 이러한 모델은 단지 몇개의 에이전트로 부터 데이타를 받을 경우 문제가 없지만, 여러개의 에이전트로부터 데이타를 받을 경우 문제의 소지가 있다. NMS의 특성상 다수의 에이전트를 하나의 메니저에서 관리해야하는 경우가 많음으로 동기모델로 메니저프로그램을 만드는것은 아무래도 문제가 있어보인다.

이러한 문제의 해결을 위해서 ucd-snmp는 비동기모델로 메니저를 작성할수 있도록 방법을 제공하고 있다. 언뜻 생각해도 udp를 사용하는 snmp에는 비동기모델의 어플리케이션이 더 어울릴거라고 생각할수 있다.

다음은 예제이다. 특별히 어려워보이는 건 없을것이다. 내용에 대한 설명은 주석으로 대신한다.

asynch_snmp.c




여러개의 에이전트를 등록시켜서 테스트할수 있었으면 했으나 사용할 에이전트가 한정된 관계로 하나의 에이전트만을 등록시켜서 테스트했다. 다음은 테스트 결과이다.

만약 에이전트가 실행중이지 않다면 타임아웃 에러가 발생할 것이다.

[root@localhost c_source]# ./snmp_as
23:54:48.463404 localhost: Timeout
                       

에이전트가 실행중이라면 값을 가져오게 될것이다.

[root@localhost c_source]# ./snmp_as
23:55:55.536827 localhost: system.sysUpTime.0 = Timeticks: (6401) 0:01:04.01
23:55:55.539176 localhost: interfaces.ifTable.ifEntry.ifSpeed.2 = Gauge32: 10000000
23:55:55.540540 localhost: interfaces.ifTable.ifEntry.ifOutOctets.2 = Counter32: 4236
                       

--------------------------------------------------------------------------------

3절. 결론
이상 snmp데이타를 가져오기 위한 몇가지 방안들에 대해서 알아보았다. 여기에서는 단지 GET메서드에 대한 내용만 다루고 있는데 GET NEXT는 다음번에 별도로 다루도록 할것이다.

------------
cf :  ucd-snmp, net-snmp 라이브러리가 쓰레드를 지원하지 않는다는 점이 있음.

출처 : http://joinc.co.kr/modules.php?name=new ··· 3Dnested
"Network Programming" 카테고리의 다른 글
  • pcap 을 이용한 id,password 정보가져오기 (0)2007/05/14
  • SNMP개요및 설치,운용 (0)2007/05/11
  • SNMP응용 프로그램 제작 (0)2007/05/11
  • libpcap을 이용한 포트스캐닝 검사 (2)2007/05/11
  • 네트워크관련 정보 얻기 (0)2007/05/11
2007/05/11 10:33 2007/05/11 10:33
Posted by webdizen
Tags net-snmp, SNMP, ucd-snmp
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2928

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Utilities
  • ComboBox
  • 마주앙 소비농
  • 강원대
  • 첨단정보기술연구센터
  • 외국인생활관
  • 대한민국
  • 확장성
  • 준비물
  • Windows Communication Foundation
  • 소프트웨어
  • Template
  • Function Pointer
  • Photography
  • 마드리드
  • Keyword
  • 에러
  • RAISERROR
  • Windows Presentation Foundation
  • 성능 모니터

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08
  • 재밌네요~ 첫번째꺼는 요즘....
    Hybrid 2009

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.