SNMP(Simple Network Management Protocol)는 네트웍에 연결되어 있는 장치에서 네트웍에 관련된 정보를 모으고 문제점등을 보고할 수 있는 기능을 제공하는 프로토콜이다. C/S 모델을 기반으로 작동하며 각 네트웍 장비에 Agent 가 있고 중앙(클라이언트)의 Manager에서 정보를 관리한다. 1970년대 후반 네트워크 장치의 연결 정보를 얻기 위한 일종의 관리 프로토콜인 ICMP가 처음 사용되었고 그 이후로 네트워크 자원을 모니터링하기 위한 여러 가지 프로토콜이 발표되었다가 1990년 인터넷 관리 프로토콜의 표준으로 SNMP가 제정되었다. 그러고나서 대부분의 워크스테이션, 브리지, 라우터, 스위치, 허브 등 네트워크 장비에 SNMP agent가 장착되었고 시스템과 여러 응용 프로그램에서 대해서도 이를 SNMP 상에서 관리할 수 있도록 하는 MIB가 정의되었다. 현재 사용하고 있는 SNMP는 SNMPv2를 거쳐 SNMPv3로 기능이 확장되고 있고 관리 영역도 RMON(Remote MONitoring) MIB 등을 통해 확장되고 있는 추세이다. 1989년 처음 발표되어 2001년 현재 버전3까지 발표가 되었다. SNMP의 구조는 아래 그림을 참고하기 바란다. SNMP는 매니저와 에이전트 구조로 되어있다. 에이전트는 각 네트워크 장치에 내장된 형태로 존재하며 각각의 자원에 대한 정보를 수집하고 매니저는 각각의 에이전트가 관리하는 정보를 수집해서 전체 네트워크를 관리하는 역할을 하는 것이다.
위에서 MRTG와 SNMP의 결합에 대해서 이야기를 했는데 여기서 MRTG는 SNMP 에이전트가 탑재된 장치의 트래픽과 각종 시스템 정보를 편리하게 그래픽으로 그려주는 역할을 하는 것이다. SNMP에서 서로 다른 정보를 처리하기 위해 MIB(Management Information Base), OID(OBJECT-IDENTIFIED) 등을 사용한다. 이해가 쉽도록 단순화해서 말을 하면 어떤 정보를 모니터링할 것인지에 대하여 위의 MIB, OID등을 통하여 지정을 하고 지속적으로 이 정보를 수집하는 것이다. 이중 MIB-2는 SNMP 프로토콜이 만들어진 이후 첫 번째로 나온 MIB로 TCP/IP 프로토콜 상에서 관리해야 하는 객체에 대하여 정의를 하고 있으며 일반적으로 네트워크 장비들의 SNMP를 지원한다고 하면 대부분 이 MIB-II에 정의된 객체를 관리한다고 해도 무방할 정도로 가장 대중적인 MIB이다. MIB-II에 정의된 그룹에는 system, interface, ip, tcp, snmp등이 있는데 여기서 system 그룹 객체에 대하여 예를 들자면 시스템의 이름, 시스템을 제작한 회사의 OID, 시스템의 재부팅 시간, 시스템의 위치 등이 있다. 또한 각 하드웨어 벤더, 운영체제에 따라 확장된 형태의 MIB가 존재하며 이에 대해서는 각 벤더의 설명서 등을 참고하여야 한다. SNMP 자체에 대한 내용은 관련자료와 서적을 참고하기 바란다. 참고로 아직 국내에 한글로 된 SNMP 전문 서적은 거의 없다고 보아도 무방하다.
이론적인 내용을 설명하는 자리는 아니므로 실전에 들어가보자. 그러나 SNMP 자체에 대해서 어느정도 알고 있지 못하면 이해하기가 힘들다는 것을 다시 알려준다. 현재 Linux@Work 6월 및 7월호에서 NET-SNMP에 대한 연재를 진행하고 있으니 반드시 이것을 먼저 읽어보고 진행했으면 좋겠다.
리눅스에서 가장 많이 사용되는 SNMP툴은 NET-SNMP로서 UCP-SNMP가 기능을 계속 개선하고 발전해나가면서 최근에 바뀐 이름이다. 웹사이트 주소는 다음과 같다.
사이트에 접속해서 원하는 파일을 다운받는다. rpm파일도 있으며 다운로드 페이지로 이동하면 한글로 된 페이지가 뜰 것이다. sourceforge.net는 리눅스 공개 프로젝트를 후원하는 곳이며 현재 한국에서도 참여하는 사람이 늘어나고 있다. 여기 한글페이지도 그런 작업의 일환인 듯 하다
그림 2) NET-SNMP 다운로드 페이지
# cd ucd-snmp-4.2.1
# ./configure --prefix=/usr/local/snmp (/usr/local/snmp 디렉토리에 프로그램 설치)
압축을 해제하고 압축해제한 디렉토리로 이동하여 ./configure를 실행하면 시스템 상황을 점검하고 몇가지 물어본다. System Contact Information (root@) 에서는 관리자의 이메일 주소등을 기입하면 되고 System Location (Unknown) 에서는 현재 자신의 지역을 입력하면 된다. 다음 나오는 것은 snmpd 로그파일 지정이고 snmp 라이브러리 임시 데이터 디렉토리를 지정하는데 기본값을 사용해도 무방하다.
# make
# make install
# /usr/local/snmp/sbin/snmpd (snmp agent 실행)
컴파일을 마치고 make install을 실행하면 위에서 지정한 디렉토리로 프로그램이 설치가 된다. /usr/local/snmp에 설치를 했다면 sbin 디렉토리로 이동하여 프로그램을 실행하면 된다. ps로 프로그램이 실행되었는지 확인해보고 SNMP 에이전트 프로그램인 snmpwalk 프로그램을 실행해보자. snmpwalk 프로그램은 MIB 트리의 특정한 디렉토리의 모든 정보를 보는 프로그램이다. 현재 상태에서는 아직 snmpd 환경 설정파일을 만들지 않은 상태이며 설정파일이 없다면 기본 설정으로 실행을 한다.
# cd /usr/local/snmp
# ./bin/snmpwalk localhost public system
설치가 제대로 되고 작동을 한다면 snmpd.conf 설정파일을 만들어야 한다. 이전에는 이 파일을 직접 사용자가 만들어주어야 했지만 snmpconf 라는 설정 프로그램이 추가가 되어서 예전에 비해 손쉽게 파일을 만들 수가 있다. 실습을 위해서 snmpconf 프로그램을 실행하여 System Information Setup과 Access Control Setup, Monitor Various Aspects of the Running Host 정도를 설정하여 주면 된다. 프로그램을 실행한 디렉토리에 snmpd.conf 파일이 생성되며 snmp_설치디렉토리/share/snmp 디렉토리(여기서는 /usr/local/snmp/share/snmp)로 옮기면 된다. 이 과정이 어렵다면 필자의 예제 파일을 가지고 snmpd를 실행해도 된다. 다음은 snmpconf를 사용하였을 때 나오는 설정 메뉴이다.
Select configuration section for snmpd.conf to operate on:
1: System Information Setup
2: Access Control Setup
3: Trap Destinations
4: Monitor Various Aspects of the Running Host
5: Extending the Agent
6: Agent Operating Mode
# cat snmpd.conf
###########################################################################
#
# snmpd.conf
#
# - created by the snmpconf configuration program
#
###########################################################################
# SECTION: System Information Setup
#
# This section defines some of the information reported in
# the "system" mib group in the mibII tree.
# syslocation: The [typically physical] location of the system.
# arguments: location_string
syslocation seoul/korea
# syscontact: The contact information for the administrator
# arguments: contact_string
syscontact taejun@tunelinux.pe.kr
###########################################################################
# SECTION: Access Control Setup
#
# This section defines who is allowed to talk to your running
# snmp agent.
# rocommunity: a SNMPv1/SNMPv2c read-only access community name
# arguments: community [default|hostname|network/bits] [oid]
rocommunity taejun_community
###########################################################################
# SECTION: Monitor Various Aspects of the Running Host
#
# The following check up on various aspects of a host.
# load: Check for unreasonable load average values.
# Watch the load average levels on the machine.
#
# load [1MAX=12.0] [5MAX=12.0] [15MAX=12.0]
#
# 1MAX: If the 1 minute load average is above this limit at query
# time, the errorFlag will be set.
# 5MAX: Similar, but for 5 min average.
# 15MAX: Similar, but for 15 min average.
#
# The results are reported in the laTable section of the UCD-SNMP-MIB tree
load 15 10 10
# disk: Check for disk space usage of a partition.
# The agent can check the amount of available disk space, and make
# sure it is above a set limit.
#
# disk PATH [MIN=100000]
#
# PATH: mount path to the disk in question.
# MIN: Disks with space below this value will have the Mib's errorFlag set.
# Can be a raw byte value or a percentage followed by the %
# symbol. Default value = 100000.
#
# The results are reported in the dskTable section of the UCD-SNMP-MIB tree
disk /home 10%
disk /var 10%
# proc: Check for processes that should be running.
# proc NAME [MAX=0] [MIN=0]
#
# NAME: the name of the process to check for. It must match
# exactly (ie, http will not find httpd processes).
# MAX: the maximum number allowed to be running. Defaults to 0.
# MIN: the minimum number to be running. Defaults to 0.
#
# The results are reported in the prTable section of the UCD-SNMP-MIB tree
# Special Case: When the min and max numbers are both 0, it assumes
# you want a max of infinity and a min of 1.
proc httpd 30 5
proc mysqld 20 1
위의 내용에 대해서 간단히 설명을 하겠다. syslocation는 서버의 위치를 말하며 별다른 의미는 없다. syscontact는 관리자의 이메일이나 설명을 지정하면 되며 rocommunity taejun_community 는 읽기전용의 커뮤니티를 taejun_community로 지정한 것이다. 모니터링을 하는데 있어서 community 이름은 보안상 중요한 요소이며 지정하지 않을 경우에는 보통 public으로 되어 있다. 그 다음은 시스템의 상태를 모니터링하기 위한 설정으로 load average, 디스크 사용량, 웹과 Mysql 대몬의 숫자 등을 지정하고 있다.
snmpwalk 프로그램을 이용하여 상세한 내용을 모니터링할 수 있다. 아래 프로그램을 실행했을 때 결과가 나온다면 snmpd 프로그램은 성공적으로 실행이 된 것이다.
# snmpwalk localhost taejun_community system
system.sysDescr.0 = Linux tunelinux.pe.kr 2.4.4 #1 SMP Mon Apr 30 17:14:36 KST 2001 i686
system.sysObjectID.0 = OID: ucdSnmpAgent.linux
system.sysUpTime.0 = Timeticks: (7107526) 19:44:35.26
system.sysContact.0 = taejun@tunelinux.pe.kr
system.sysName.0 = tunelinux.pe.kr
system.sysLocation.0 = seoul/korea
system.sysORLastChange.0 = Timeticks: (1) 0:00:00.01
system.sysORTable.sysOREntry.sysORID.1 = OID: ifMIB
system.sysORTable.sysOREntry.sysORID.2 = OID: .iso.org.dod.internet.snmpV2.snmpModules.snmpMIB
system.sysORTable.sysOREntry.sysORID.3 = OID: tcpMIB
system.sysORTable.sysOREntry.sysORID.4 = OID: ip
system.sysORTable.sysOREntry.sysORID.5 = OID: udpMIB
system.sysORTable.sysOREntry.sysORID.6 = OID: .iso.org.dod.internet.snmpV2.snmpModules.snmpVacmMIB.vacmMIBConformance.vacmMIBGroups.vacmBasicGroup
snmpconf 프로그램에서 시스템을 모니터링하기 위한 여러 가지 설정을 하였는데 모니터링하고자 하는 정보에 대해서 snmp 설치 디렉토리의 share/snmp/mibs/ 디렉토리에 있는 UCD-SNMP.MIB를 참고하기 바란다. 이 파일을 살펴보면 내가 어떤 부분을 모니터링하고 주로 살펴볼 것인지에 대하여 참고가 될 것이다. 프로세스, 메모리, load average, 파일 등 자신에게 필요한 것을 결정한다. 이 글에서는 설명을 하지 않겠지만 SNMP Trap을 이용하면 에이전트에서 특별한 이벤트나 사고가 발생을 했을 때 매니저가 요구하지 않더라도 에이전트 스스로 판단해서 매니저로 메시지를 전달한다. 이를 이용하면 시스템이나 또는 네트웍 장비에서 문제가 생겼을 경우 자동으로 시스템, 네트웍 관리자에게 알려서 문제 해결을 빠른 시일안에 할 수 있을 것이다. 상용 네트웍 모니터링 도구들도 이러한 기능을 활용하고 있는 것으로 안다.